aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-05-16 03:30:35 -0400
committerJesse Luehrs <doy@tozt.net>2016-05-16 03:30:35 -0400
commitf3d855e9bc118f0b2fad8c1ff3e539ba77e1eabb (patch)
tree81d770bf1a020891743933cda842fe655d5707df
parenteabb10d017c312c5fac5446fbac5a1c23af94ae3 (diff)
downloadrunes-f3d855e9bc118f0b2fad8c1ff3e539ba77e1eabb.tar.gz
runes-f3d855e9bc118f0b2fad8c1ff3e539ba77e1eabb.zip
add a message type for killing the daemon
and make ./runesc --kill-daemon send that message
-rw-r--r--src/daemon.c8
-rw-r--r--src/loop.c5
-rw-r--r--src/loop.h1
-rw-r--r--src/protocol.h1
-rw-r--r--src/runesc.c54
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 <stddef.h>
#include <stdlib.h>
+#include <string.h>
#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
}