From d5b52a1302ef4409424ec0633ccf9bd72359ea32 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 14 May 2016 22:03:43 -0400 Subject: refactor/rewrite the client/server protocol handling also pass the environment and current directory over as well --- src/runesc.c | 75 ++++++++++++++++++------------------------------------------ 1 file changed, 22 insertions(+), 53 deletions(-) (limited to 'src/runesc.c') 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 -#include #include #include -#include -#include -#include -#include #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; } -- cgit v1.2.3-54-g00ecf