aboutsummaryrefslogtreecommitdiffstats
path: root/src/runesc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runesc.c')
-rw-r--r--src/runesc.c75
1 files changed, 22 insertions, 53 deletions
diff --git a/src/runesc.c b/src/runesc.c
index 5046b98..88adec3 100644
--- a/src/runesc.c
+++ b/src/runesc.c
@@ -1,71 +1,40 @@
-#include <arpa/inet.h>
-#include <errno.h>
#include <stddef.h>
#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
#include "runes.h"
-#define MAX_SOCKET_PATH_LEN \
- (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))
+#include "protocol.h"
+#include "socket.h"
-static int runes_socket_open_client(char *name);
+extern char **environ;
int main (int argc, char *argv[])
{
char *name, *buf;
- int s, i;
- size_t len, offset;
- uint32_t argc32 = argc, argv_len;
+ int s;
+ size_t len;
+ struct runes_protocol_message msg;
- name = runes_get_daemon_socket_name();
- s = runes_socket_open_client(name);
+ msg.argc = argc;
+ msg.argv = argv;
+ msg.envp = environ;
+ msg.cwd = runes_getcwd();
- len = sizeof(argc32) + sizeof(argv_len);
- for (i = 0; i < argc; ++i) {
- len += strlen(argv[i]) + 1;
+ name = runes_get_daemon_socket_name();
+ s = runes_socket_client_open(name);
+ if (!runes_protocol_create_message(&msg, &buf, &len)) {
+ runes_warn("couldn't create message");
}
-
- buf = malloc(len);
- ((uint32_t*)buf)[0] = htonl(argc32);
- offset = sizeof(argc32) + sizeof(argv_len);
- ((uint32_t*)buf)[1] = htonl(len - offset);
-
- for (i = 0; i < argc; ++i) {
- size_t arg_len = strlen(argv[i]) + 1;
- memcpy(buf + offset, argv[i], arg_len);
- offset += arg_len;
+ else {
+ if (!runes_protocol_send_packet(s, buf, len)) {
+ runes_warn("couldn't send packet");
+ free(buf);
+ }
}
- send(s, buf, offset, 0);
free(buf);
- shutdown(s, SHUT_RDWR);
- return 0;
-}
+ free(msg.cwd);
+ runes_socket_client_close(s);
-static int runes_socket_open_client(char *name)
-{
- int s;
- struct sockaddr_un client;
-
- if (strlen(name) + 1 > MAX_SOCKET_PATH_LEN) {
- runes_die("socket path %s is too long", name);
- }
-
- s = socket(AF_UNIX, SOCK_STREAM, 0);
- if (s < 0) {
- runes_die("couldn't create socket: %s", strerror(errno));
- }
-
- client.sun_family = AF_UNIX;
- strcpy(client.sun_path, name);
- if (connect(s, (struct sockaddr*)(&client), sizeof(struct sockaddr_un))) {
- runes_die(
- "couldn't connect to socket at %s: %s", name, strerror(errno));
- }
-
- return s;
+ return 0;
}