]> 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 405a576c63d103003970e17c9b6e2fe477bf3c71..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)
@@ -385,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;
@@ -395,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) {