From 3cfbc305b8c5e713b16d966bb8e8d4e7e35cb52b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 10 May 2016 18:02:53 -0400 Subject: s/socket/daemon/ --- Makefile | 2 +- src/daemon.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/daemon.h | 22 +++++++ src/runes.h | 4 +- src/runesc.c | 2 +- src/runesd.c | 8 +-- src/socket.c | 194 ---------------------------------------------------------- src/socket.h | 22 ------- src/util.c | 2 +- src/util.h | 2 +- 10 files changed, 227 insertions(+), 226 deletions(-) create mode 100644 src/daemon.c create mode 100644 src/daemon.h delete mode 100644 src/socket.c delete mode 100644 src/socket.h diff --git a/Makefile b/Makefile index 73fd5b2..40cd003 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ DOBJ = $(BUILD)runesd.o \ $(BUILD)pty-unix.o \ $(BUILD)loop.o \ $(BUILD)util.o \ - $(BUILD)socket.o + $(BUILD)daemon.o COBJ = $(BUILD)runesc.o \ $(BUILD)util.o LIBS = cairo cairo-xlib libuv pangocairo diff --git a/src/daemon.c b/src/daemon.c new file mode 100644 index 0000000..8e1249a --- /dev/null +++ b/src/daemon.c @@ -0,0 +1,195 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "runes.h" +#include "daemon.h" + +#include "loop.h" +#include "term.h" + +static int runes_daemon_open_socket(char *sock_name); +static void runes_daemon_close_socket(RunesDaemon *sock); +static void runes_daemon_socket_accept(void *t); +static int runes_daemon_handle_request(void *t); + +RunesDaemon *runes_daemon_new(RunesLoop *loop, RunesWindowBackendGlobal *wg) +{ + RunesDaemon *daemon; + + daemon = calloc(1, sizeof(RunesDaemon)); + daemon->loop = loop; + daemon->wg = wg; + daemon->sock_name = runes_get_daemon_socket_name(); + daemon->sock = runes_daemon_open_socket(daemon->sock_name); + runes_daemon_init_loop(daemon, loop); + + return daemon; +} + +void runes_daemon_init_loop(RunesDaemon *daemon, RunesLoop *loop) +{ + runes_loop_start_work(loop, daemon, runes_daemon_socket_accept, + runes_daemon_handle_request); +} + +void runes_socket_delete(RunesDaemon *daemon) +{ + runes_daemon_close_socket(daemon); + free(daemon->sock_name); + + free(daemon); +} + +static int runes_daemon_open_socket(char *sock_name) +{ + char *dir, *slash; + int s; + struct sockaddr_un server; + + if (strlen(sock_name) + 1 > MAX_SOCKET_PATH_LEN) { + runes_die("socket path %s is too long", sock_name); + } + + dir = strdup(sock_name); + slash = strrchr(dir, '/'); + if (slash == NULL) { + runes_die("socket path %s must be an absolute path", sock_name); + } + *slash = '\0'; + runes_mkdir_p(dir); + free(dir); + + unlink(sock_name); + + s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s < 0) { + runes_die("couldn't create socket: %s", strerror(errno)); + } + + server.sun_family = AF_UNIX; + strcpy(server.sun_path, sock_name); + if (bind(s, (struct sockaddr*)(&server), sizeof(struct sockaddr_un))) { + runes_die("couldn't bind to socket %s: %s", sock_name, + strerror(errno)); + } + + if (chmod(sock_name, S_IRUSR|S_IWUSR)) { + runes_die("couldn't chmod socket %s: %s", sock_name, + strerror(errno)); + } + + if (listen(s, 5)) { + runes_die("couldn't listen on socket %s: %s", sock_name, + strerror(errno)); + } + + return s; +} + +static void runes_daemon_close_socket(RunesDaemon *daemon) +{ + close(daemon->sock); + unlink(daemon->sock_name); +} + +static void runes_daemon_socket_accept(void *t) +{ + RunesDaemon *daemon = (RunesDaemon *)t; + struct sockaddr_un client; + socklen_t len = sizeof(client); + + daemon->client_sock = accept( + daemon->sock, (struct sockaddr*)(&client), &len); +} + +static int runes_daemon_handle_request(void *t) +{ + RunesDaemon *daemon = (RunesDaemon *)t; + ssize_t bytes; + uint32_t argc, argv_len; + char **argv, *argv_buf; + + if (daemon->client_sock < 0) { + runes_die("couldn't accept connection: %s", strerror(errno)); + } + + bytes = recv(daemon->client_sock, (void*)(&argc), sizeof(argc), 0); + if (bytes < (int)sizeof(argc)) { + runes_warn("invalid message received: got %d bytes, expected 4", + bytes); + close(daemon->client_sock); + return 1; + } + + argc = ntohl(argc); + if (argc > 1024) { + runes_warn("invalid message received: argc = %d, must be < 1024", + argc); + close(daemon->client_sock); + return 1; + } + argv = malloc(argc * sizeof(char*)); + + bytes = recv(daemon->client_sock, (void*)(&argv_len), sizeof(argv_len), 0); + if (bytes < (int)sizeof(argc)) { + runes_warn("invalid message received: got %d bytes, expected 4", + bytes); + close(daemon->client_sock); + free(argv); + return 1; + } + + argv_len = ntohl(argv_len); + if (argv_len > 131072) { + runes_warn("invalid message received: argv_len = %d, must be < %d", + argv_len, 131072); + close(daemon->client_sock); + free(argv); + return 1; + } + argv_buf = malloc(argv_len + 1); + + bytes = recv(daemon->client_sock, argv_buf, argv_len, 0); + if (bytes < argv_len) { + runes_warn("invalid message received: got %d bytes, expected %d", + bytes, argv_len); + close(daemon->client_sock); + free(argv); + free(argv_buf); + return 1; + } + + close(daemon->client_sock); + + if (argc > 0) { + size_t offset = 0; + int i; + + for (i = 0; i < (int)argc; ++i) { + char *next_null; + + if (offset >= argv_len) { + runes_die("args in argv_buf don't match argc of %d", argc); + } + argv[i] = argv_buf + offset; + next_null = memchr(argv_buf + offset, '\0', argv_len - offset); + if (!next_null) { + runes_die("args in argv_buf don't match argc of %d", argc); + } + offset = next_null - argv_buf + 1; + } + + runes_term_register_with_loop( + runes_term_new(argc, argv, daemon->wg), daemon->loop); + } + + free(argv); + free(argv_buf); + + return 1; +} diff --git a/src/daemon.h b/src/daemon.h new file mode 100644 index 0000000..fc2e801 --- /dev/null +++ b/src/daemon.h @@ -0,0 +1,22 @@ +#ifndef _RUNES_DAEMON_H +#define _RUNES_DAEMON_H + +#include + +struct runes_daemon { + RunesLoop *loop; + RunesWindowBackendGlobal *wg; + char *sock_name; + int sock; + int client_sock; +}; + +RunesDaemon *runes_daemon_new(RunesLoop *loop, RunesWindowBackendGlobal *wg); +void runes_daemon_init_loop(RunesDaemon *daemon, RunesLoop *loop); +void runes_daemon_send_client_message(int argc, char **argv); +void runes_daemon_delete(RunesDaemon *daemon); + +#define MAX_SOCKET_PATH_LEN \ + (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)) + +#endif diff --git a/src/runes.h b/src/runes.h index ad33725..aa966a0 100644 --- a/src/runes.h +++ b/src/runes.h @@ -7,7 +7,7 @@ struct runes_pty; struct runes_config; struct runes_display; struct runes_loop; -struct runes_socket; +struct runes_daemon; typedef struct runes_term RunesTerm; typedef struct runes_window RunesWindowBackend; @@ -16,7 +16,7 @@ typedef struct runes_pty RunesPtyBackend; typedef struct runes_config RunesConfig; typedef struct runes_display RunesDisplay; typedef struct runes_loop RunesLoop; -typedef struct runes_socket RunesSocket; +typedef struct runes_daemon RunesDaemon; #include "util.h" diff --git a/src/runesc.c b/src/runesc.c index 81f6c36..e18478e 100644 --- a/src/runesc.c +++ b/src/runesc.c @@ -21,7 +21,7 @@ int main (int argc, char *argv[]) size_t len, offset; uint32_t argc32 = argc, argv_len; - name = runes_get_socket_name(); + name = runes_get_daemon_socket_name(); s = runes_socket_open_client(name); len = sizeof(argc32) + sizeof(argv_len); diff --git a/src/runesd.c b/src/runesd.c index 344e834..5398a74 100644 --- a/src/runesd.c +++ b/src/runesd.c @@ -3,13 +3,13 @@ #include "runes.h" #include "loop.h" -#include "socket.h" +#include "daemon.h" #include "window-xlib.h" int main (int argc, char *argv[]) { RunesLoop *loop; - RunesSocket *socket; + RunesDaemon *daemon; RunesWindowBackendGlobal *wg; UNUSED(argv); @@ -22,8 +22,8 @@ int main (int argc, char *argv[]) loop = runes_loop_new(); wg = runes_window_backend_global_init(); - socket = runes_socket_new(loop, wg); - UNUSED(socket); + daemon = runes_daemon_new(loop, wg); + UNUSED(daemon); runes_loop_run(loop); diff --git a/src/socket.c b/src/socket.c deleted file mode 100644 index 5758ab0..0000000 --- a/src/socket.c +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "runes.h" -#include "socket.h" - -#include "loop.h" -#include "term.h" - -static int runes_socket_open(RunesSocket *sock); -static void runes_socket_close(RunesSocket *sock); -static void runes_socket_accept(void *t); -static int runes_socket_handle_request(void *t); - -RunesSocket *runes_socket_new(RunesLoop *loop, RunesWindowBackendGlobal *wg) -{ - RunesSocket *sock; - - sock = calloc(1, sizeof(RunesSocket)); - sock->loop = loop; - sock->wg = wg; - sock->name = runes_get_socket_name(); - sock->sock = runes_socket_open(sock); - runes_socket_init_loop(sock, loop); - - return sock; -} - -void runes_socket_init_loop(RunesSocket *sock, RunesLoop *loop) -{ - runes_loop_start_work(loop, sock, runes_socket_accept, - runes_socket_handle_request); -} - -void runes_socket_delete(RunesSocket *sock) -{ - runes_socket_close(sock); - free(sock->name); - - free(sock); -} - -static int runes_socket_open(RunesSocket *sock) -{ - char *dir, *slash; - int s; - struct sockaddr_un server; - - if (strlen(sock->name) + 1 > MAX_SOCKET_PATH_LEN) { - runes_die("socket path %s is too long", sock->name); - } - - dir = strdup(sock->name); - slash = strrchr(dir, '/'); - if (slash == NULL) { - runes_die("socket path %s must be an absolute path", sock->name); - } - *slash = '\0'; - runes_mkdir_p(dir); - free(dir); - - unlink(sock->name); - - s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s < 0) { - runes_die("couldn't create socket: %s", strerror(errno)); - } - - server.sun_family = AF_UNIX; - strcpy(server.sun_path, sock->name); - if (bind(s, (struct sockaddr*)(&server), sizeof(struct sockaddr_un))) { - runes_die("couldn't bind to socket %s: %s", sock->name, - strerror(errno)); - } - - if (chmod(sock->name, S_IRUSR|S_IWUSR)) { - runes_die("couldn't chmod socket %s: %s", sock->name, - strerror(errno)); - } - - if (listen(s, 5)) { - runes_die("couldn't listen on socket %s: %s", sock->name, - strerror(errno)); - } - - return s; -} - -static void runes_socket_close(RunesSocket *sock) -{ - close(sock->sock); - unlink(sock->name); -} - -static void runes_socket_accept(void *t) -{ - RunesSocket *sock = (RunesSocket *)t; - struct sockaddr_un client; - socklen_t len = sizeof(client); - - sock->client_sock = accept(sock->sock, (struct sockaddr*)(&client), &len); -} - -static int runes_socket_handle_request(void *t) -{ - RunesSocket *sock = (RunesSocket *)t; - ssize_t bytes; - uint32_t argc, argv_len; - char **argv, *argv_buf; - - if (sock->client_sock < 0) { - runes_die("couldn't accept connection: %s", strerror(errno)); - } - - bytes = recv(sock->client_sock, (void*)(&argc), sizeof(argc), 0); - if (bytes < (int)sizeof(argc)) { - runes_warn("invalid message received: got %d bytes, expected 4", - bytes); - close(sock->client_sock); - return 1; - } - - argc = ntohl(argc); - if (argc > 1024) { - runes_warn("invalid message received: argc = %d, must be < 1024", - argc); - close(sock->client_sock); - return 1; - } - argv = malloc(argc * sizeof(char*)); - - bytes = recv(sock->client_sock, (void*)(&argv_len), sizeof(argv_len), 0); - if (bytes < (int)sizeof(argc)) { - runes_warn("invalid message received: got %d bytes, expected 4", - bytes); - close(sock->client_sock); - free(argv); - return 1; - } - - argv_len = ntohl(argv_len); - if (argv_len > 131072) { - runes_warn("invalid message received: argv_len = %d, must be < %d", - argv_len, 131072); - close(sock->client_sock); - free(argv); - return 1; - } - argv_buf = malloc(argv_len + 1); - - bytes = recv(sock->client_sock, argv_buf, argv_len, 0); - if (bytes < argv_len) { - runes_warn("invalid message received: got %d bytes, expected %d", - bytes, argv_len); - close(sock->client_sock); - free(argv); - free(argv_buf); - return 1; - } - - close(sock->client_sock); - - if (argc > 0) { - size_t offset = 0; - int i; - - for (i = 0; i < (int)argc; ++i) { - char *next_null; - - if (offset >= argv_len) { - runes_die("args in argv_buf don't match argc of %d", argc); - } - argv[i] = argv_buf + offset; - next_null = memchr(argv_buf + offset, '\0', argv_len - offset); - if (!next_null) { - runes_die("args in argv_buf don't match argc of %d", argc); - } - offset = next_null - argv_buf + 1; - } - - runes_term_register_with_loop( - runes_term_new(argc, argv, sock->wg), sock->loop); - } - - free(argv); - free(argv_buf); - - return 1; -} diff --git a/src/socket.h b/src/socket.h deleted file mode 100644 index a2d453a..0000000 --- a/src/socket.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _RUNES_SOCKET_H -#define _RUNES_SOCKET_H - -#include - -struct runes_socket { - RunesLoop *loop; - RunesWindowBackendGlobal *wg; - char *name; - int sock; - int client_sock; -}; - -RunesSocket *runes_socket_new(RunesLoop *loop, RunesWindowBackendGlobal *wg); -void runes_socket_init_loop(RunesSocket *sock, RunesLoop *loop); -void runes_socket_send_client_message(int argc, char **argv); -void runes_socket_delete(RunesSocket *sock); - -#define MAX_SOCKET_PATH_LEN \ - (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)) - -#endif diff --git a/src/util.c b/src/util.c index 39b08a6..8737f11 100644 --- a/src/util.c +++ b/src/util.c @@ -27,7 +27,7 @@ void runes_die(const char *fmt, ...) exit(1); } -char *runes_get_socket_name() +char *runes_get_daemon_socket_name() { char *home, *runtime_dir, *socket_dir, *socket_file; diff --git a/src/util.h b/src/util.h index 1e3bc63..cd857d2 100644 --- a/src/util.h +++ b/src/util.h @@ -5,7 +5,7 @@ void runes_warn(const char *fmt, ...); void runes_die(const char *fmt, ...); -char *runes_get_socket_name(); +char *runes_get_daemon_socket_name(); int runes_sprintf_dup(char **out, const char *fmt, ...); void runes_mkdir_p(char *dir); -- cgit v1.2.3-54-g00ecf