From 5f78385c979ad6eea953587c0ecafa0a914ba3c0 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 25 Jan 2011 11:01:48 +1030 Subject: [PATCH] lca2011: dump on SIGHUP. --- ccan/oserver/_info | 2 +- ccan/oserver/oserver.c | 31 ++++++++++++++++++- ccan/oserver/oserver.h | 6 ++-- ccan/oserver/oserver_types.h | 1 + ccan/oserver/test/run-one-client-disconnect.c | 3 +- ccan/oserver/test/run.c | 3 +- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/ccan/oserver/_info b/ccan/oserver/_info index 4f54687..9107e66 100644 --- a/ccan/oserver/_info +++ b/ccan/oserver/_info @@ -30,7 +30,7 @@ * if (argc != 1) * opt_log_stderr_exit("Unknown extra arguments"); * - * if (!oserver_setup(ev, port)) + * if (!oserver_setup(ev, port, "/var/run/oserver/dump")) * err(1, "Failed to set up server"); * * while (tevent_loop_wait(ev) == 0); diff --git a/ccan/oserver/oserver.c b/ccan/oserver/oserver.c index 0ec1b68..8a5fdce 100644 --- a/ccan/oserver/oserver.c +++ b/ccan/oserver/oserver.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -17,6 +18,9 @@ #include #include #include +#include +#include +#include static uint16_t state_flag_map[] = { [SENDING_GREETING] = TEVENT_FD_WRITE, @@ -284,7 +288,26 @@ static void talloc_dump(struct tevent_context *ev, } } -struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port) +static void dump(struct tevent_context *ev, + struct tevent_signal *se, + int signum, + int count, + void *siginfo, + void *_oserver) +{ + struct oserver *oserver = _oserver; + char *str; + int fd; + + str = cdump_bundle(ev, cdump_struct_oserver, oserver); + fd = open(oserver->dumpfile, O_CREAT|O_TRUNC|O_WRONLY, 0600); + write(fd, str, strlen(str)); + close(fd); + talloc_free(str); +} + +struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port, + const char *dumpfile) { struct oserver *oserver; int one = 1; @@ -327,6 +350,12 @@ struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port) return NULL; } + oserver->dumpfile = dumpfile; + if (oserver->dumpfile) { + tevent_add_signal(ev, oserver, SIGHUP, SA_RESTART, + dump, oserver); + } + /* Don't kill us if client dies. */ signal(SIGPIPE, SIG_IGN); diff --git a/ccan/oserver/oserver.h b/ccan/oserver/oserver.h index a465b2d..3342ba8 100644 --- a/ccan/oserver/oserver.h +++ b/ccan/oserver/oserver.h @@ -7,6 +7,7 @@ * oserver_setup - set up an oserver * @ev: tevent context to use. * @port: port to use (usually OSERVER_PORT) + * @dumpfile: file to save state to on SIGHUP (if non-NULL). * * Opens a socket and binds it to @port, then sets it up to listen * for connections. talloc_free() the pointer returned to shut it down @@ -17,14 +18,15 @@ * struct tevent_context *ev; * * ev = tevent_context_init(NULL); - * oserver = oserver_setup(ev, OSERVER_PORT); + * oserver = oserver_setup(ev, OSERVER_PORT, "oserver.dump"); * if (!oserver) * err(1, "Failed to set up server"); * * while (tevent_loop_wait(ev) == 0); * err(1, "Event loop failed"); */ -struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port); +struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port, + const char *dumpfile); #define OSERVER_PORT 2828 #endif /* CCAN_OSERVER_H */ diff --git a/ccan/oserver/oserver_types.h b/ccan/oserver/oserver_types.h index 72717e8..8e99892 100644 --- a/ccan/oserver/oserver_types.h +++ b/ccan/oserver/oserver_types.h @@ -41,5 +41,6 @@ CDUMP_SAVED struct oserver { struct client *clients[5]; int fd; struct tevent_fd *fde CDUMP_IGNORE; + const char *dumpfile; }; #endif /* CCAN_OSERVER_TYPES_H */ diff --git a/ccan/oserver/test/run-one-client-disconnect.c b/ccan/oserver/test/run-one-client-disconnect.c index 8367aad..6023f78 100644 --- a/ccan/oserver/test/run-one-client-disconnect.c +++ b/ccan/oserver/test/run-one-client-disconnect.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -104,7 +105,7 @@ int main(int argc, char *argv[]) /* This is how many tests you plan to run */ plan_tests(2); - oserver = oserver_setup(ev, OSERVER_PORT); + oserver = oserver_setup(ev, OSERVER_PORT, NULL); if (!oserver) err(1, "Failed to set up server"); diff --git a/ccan/oserver/test/run.c b/ccan/oserver/test/run.c index 03180c9..a8eb6f2 100644 --- a/ccan/oserver/test/run.c +++ b/ccan/oserver/test/run.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -19,7 +20,7 @@ static void run_server(int readyfd, int exitfd) { struct tevent_context *ev = tevent_context_init(NULL); - if (oserver_setup(ev, OSERVER_PORT) == NULL) + if (oserver_setup(ev, OSERVER_PORT, NULL) == NULL) exit(1); tevent_add_fd(ev, ev, exitfd, TEVENT_FD_READ, exit_quietly, NULL); -- 2.39.2