X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Foserver%2Foserver.c;fp=ccan%2Foserver%2Foserver.c;h=b65fe6b1f3069fd90dae4cda0895210bda37a649;hb=33b799969447a818cd99749aa937a59c88e4f83f;hp=8a5fdceecf1a0c2c4f7ddf1ac278ad8c61f7e793;hpb=5f78385c979ad6eea953587c0ecafa0a914ba3c0;p=ccan-lca-2011.git diff --git a/ccan/oserver/oserver.c b/ccan/oserver/oserver.c index 8a5fdce..b65fe6b 100644 --- a/ccan/oserver/oserver.c +++ b/ccan/oserver/oserver.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -306,6 +307,53 @@ static void dump(struct tevent_context *ev, talloc_free(str); } +static bool load_file(struct oserver *oserver, const char *file) +{ + char *str; + + if (!file) + return false; + + str = grab_file(oserver, file, NULL); + if (!str) + return false; + + if (!cdump_unbundle(oserver, cdump_struct_oserver, oserver, str)) { + talloc_free(str); + return false; + } + talloc_free(str); + return true; +} + +static void complete_server(struct tevent_context *ev, + struct oserver *oserver, const char *dumpfile) +{ + /* Re-set this even if restored from file, in case it changed. */ + 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); + + /* Show talloc tree on SIGUSR1. */ + tevent_add_signal(ev, oserver, SIGUSR1, SA_RESTART, + talloc_dump, oserver); +} + +struct oserver *oserver_restore(struct tevent_context *ev, const char *dumpfile) +{ + struct oserver *oserver = talloc(ev, struct oserver); + if (!load_file(oserver, dumpfile)) { + talloc_free(oserver); + return NULL; + } + complete_server(ev, oserver, dumpfile); + return oserver; +} + struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port, const char *dumpfile) { @@ -350,18 +398,6 @@ 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); - - /* Show talloc tree on SIGUSR1. */ - tevent_add_signal(ev, oserver, SIGUSR1, SA_RESTART, - talloc_dump, oserver); - + complete_server(ev, oserver, dumpfile); return oserver; }