* 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);
#include <ccan/oserver/oserver.h>
#include <ccan/oserver/oserver_types.h>
+#include <ccan/oserver/oserver_cdump.h>
#include <ccan/read_write_all/read_write_all.h>
#include <ccan/opt/opt.h>
#include <ccan/tevent/tevent.h>
#include <errno.h>
#include <signal.h>
#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
static uint16_t state_flag_map[] = {
[SENDING_GREETING] = TEVENT_FD_WRITE,
}
}
-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;
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);
* 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
* 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 */
struct client *clients[5];
int fd;
struct tevent_fd *fde CDUMP_IGNORE;
+ const char *dumpfile;
};
#endif /* CCAN_OSERVER_TYPES_H */
#include <ccan/oserver/oserver.c>
+#include <ccan/oserver/oserver_cdump.c>
#include <ccan/oserver/oserver.h>
#include <ccan/str/str.h>
#include <ccan/tap/tap.h>
/* 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");
#include <ccan/oserver/oserver.c>
+#include <ccan/oserver/oserver_cdump.c>
#include <ccan/oserver/oserver.h>
#include <ccan/str/str.h>
#include <ccan/tap/tap.h>
{
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);