From f3d855e9bc118f0b2fad8c1ff3e539ba77e1eabb Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 16 May 2016 03:30:35 -0400 Subject: add a message type for killing the daemon and make ./runesc --kill-daemon send that message --- src/daemon.c | 8 ++++++-- src/loop.c | 5 +++++ src/loop.h | 1 + src/protocol.h | 1 + src/runesc.c | 54 ++++++++++++++++++++++++++++++++++++++++++------------ 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/daemon.c b/src/daemon.c index c354d67..b3cd11a 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -50,7 +50,7 @@ void runes_socket_delete(RunesDaemon *daemon) static int runes_daemon_handle_request(void *t) { RunesDaemon *daemon = (RunesDaemon *)t; - int client_sock, type; + int client_sock, type, ret = 1; char *buf; size_t len; @@ -61,6 +61,10 @@ static int runes_daemon_handle_request(void *t) case RUNES_PROTOCOL_NEW_TERM: runes_daemon_handle_new_term_message(daemon, buf, len); break; + case RUNES_PROTOCOL_KILL_DAEMON: + ret = 0; + runes_loop_stop(daemon->loop); + break; default: runes_warn("unknown packet type: %d", type); break; @@ -74,7 +78,7 @@ static int runes_daemon_handle_request(void *t) runes_socket_client_close(client_sock); - return 1; + return ret; } static void runes_daemon_handle_new_term_message( diff --git a/src/loop.c b/src/loop.c index a352e1b..c40d52c 100644 --- a/src/loop.c +++ b/src/loop.c @@ -35,6 +35,11 @@ void runes_loop_run(RunesLoop *loop) event_base_dispatch(loop->base); } +void runes_loop_stop(RunesLoop *loop) +{ + event_base_loopbreak(loop->base); +} + void runes_loop_start_work( RunesLoop *loop, int fd, void *t, int (*cb)(void*)) { diff --git a/src/loop.h b/src/loop.h index ccbfdd3..bc21a4d 100644 --- a/src/loop.h +++ b/src/loop.h @@ -9,6 +9,7 @@ struct runes_loop { RunesLoop *runes_loop_new(void); void runes_loop_run(RunesLoop *loop); +void runes_loop_stop(RunesLoop *loop); void runes_loop_start_work( RunesLoop *loop, int fd, void *t, int (*cb)(void*)); void runes_loop_timer_set( diff --git a/src/protocol.h b/src/protocol.h index 67d6be0..1a4ad7c 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -14,6 +14,7 @@ struct runes_protocol_new_term_message { enum runes_protocol_message_type { RUNES_PROTOCOL_NEW_TERM, + RUNES_PROTOCOL_KILL_DAEMON, RUNES_PROTOCOL_NUM_MESSAGE_TYPES }; diff --git a/src/runesc.c b/src/runesc.c index 7cbc456..dc4e69f 100644 --- a/src/runesc.c +++ b/src/runesc.c @@ -1,5 +1,6 @@ #include #include +#include #include "runes.h" @@ -8,33 +9,62 @@ extern char **environ; +static void runes_client_send_kill_daemon_message(int s); +static void runes_client_send_new_term_message(int s, int argc, char *argv[]); + int main (int argc, char *argv[]) { - char *name, *buf; + char *name; int s; - size_t len; + + name = runes_get_daemon_socket_name(); + s = runes_socket_client_open(name); + + if (argc > 1 && !strcmp(argv[1], "--kill-daemon")) { + runes_client_send_kill_daemon_message(s); + } + else { + runes_client_send_new_term_message(s, argc, argv); + } + + runes_socket_client_close(s); + +#ifdef RUNES_VALGRIND + free(name); +#endif + + return 0; +} + +static void runes_client_send_kill_daemon_message(int s) +{ + if (!runes_protocol_send_packet(s, RUNES_PROTOCOL_KILL_DAEMON, "", 0)) { + runes_warn("couldn't send packet"); + } +} + +static void runes_client_send_new_term_message(int s, int argc, char *argv[]) +{ struct runes_protocol_new_term_message msg; + char *buf; + size_t len; msg.argc = argc; msg.argv = argv; msg.envp = environ; msg.cwd = runes_getcwd(); - name = runes_get_daemon_socket_name(); - s = runes_socket_client_open(name); - if (!runes_protocol_create_new_term_message(&msg, &buf, &len)) { - runes_warn("couldn't create message"); - } - else { + if (runes_protocol_create_new_term_message(&msg, &buf, &len)) { if (!runes_protocol_send_packet(s, RUNES_PROTOCOL_NEW_TERM, buf, len)) { runes_warn("couldn't send packet"); - free(buf); } } + else { + runes_warn("couldn't create message"); + } +#ifdef RUNES_VALGRIND free(buf); free(msg.cwd); - runes_socket_client_close(s); - - return 0; +#endif } -- cgit v1.2.3-54-g00ecf