]> git.ozlabs.org Git - ccan-lca-2011.git/blobdiff - ccan/oserver/oserver.c
lca2011: dump, re-exec with --restore on restart.
[ccan-lca-2011.git] / ccan / oserver / oserver.c
index 50b49bd5f94746c8259fb3c609c285c5d68684c9..d4266eda1ef5ead9329ecd5e4136e307a8a162d4 100644 (file)
@@ -305,6 +305,8 @@ static void dump(struct tevent_context *ev,
        write(fd, str, strlen(str));
        close(fd);
        talloc_free(str);
+       if (oserver->argv)
+               execvp(oserver->argv[0], oserver->argv);
 }
 
 static bool load_file(struct oserver *oserver, const char *file)
@@ -358,18 +360,25 @@ struct oserver *oserver_restore(struct tevent_context *ev, const char *dumpfile)
                return NULL;
        }
 
-       /* Restore ignored fields in clients (fde and oserver). */
+       /* Restore ignored fields in clients, and talloc hierarchy. */
        for (i = 0; i < ARRAY_SIZE(oserver->clients); i++) {
                struct client *client = oserver->clients[i];
                if (!client)
                        continue;
+               /* These two were marked CDUMP_IGNORE. */
                client->oserver = oserver;
                client->fde = tevent_add_fd(ev, client, client->fd,
                                            state_flag_map[client->state],
                                            service_client, client);
                tevent_fd_set_auto_close(client->fde);
+               /* cdump knows nothing of talloc. */
+               talloc_steal(oserver, client);
+               talloc_steal(client, client->question);
+               talloc_steal(client, client->answer);
+               talloc_set_destructor(client, cleanup_client);
        }
 
+       talloc_set_destructor(oserver, destroy_oserver);
        if (!complete_server(ev, oserver, dumpfile)) {
                talloc_free(oserver);
                return NULL;
@@ -378,7 +387,7 @@ struct oserver *oserver_restore(struct tevent_context *ev, const char *dumpfile)
 }
 
 struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port,
-                             const char *dumpfile)
+                             const char *dumpfile, char *argv[])
 {
        struct oserver *oserver;
        int one = 1;
@@ -388,6 +397,14 @@ struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port,
        } u;
 
        oserver = talloc(ev, struct oserver);
+       oserver->argv = argv;
+       if (argv) {
+               /* Count the terminal NULL in argv_len. */
+               for (oserver->argv_len = 1;
+                    argv[oserver->argv_len - 1];
+                    oserver->argv_len++);
+       } else
+               oserver->argv_len = 0;
        clear_clients(oserver);
        oserver->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (oserver->fd < 0) {