main: store session data to disk on receipt of SIGUSR1 or SIGHUP. On HUP terminate...
authorJo-Philipp Wich <jow@openwrt.org>
Wed, 4 Sep 2013 15:09:51 +0000 (17:09 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 5 Sep 2013 12:37:56 +0000 (14:37 +0200)
exec.c
include/rpcd/exec.h
main.c

diff --git a/exec.c b/exec.c
index a5f6561cbefb405d9de9fcf03750c93d2a9cf6d1..3d2ec716bda9b686ea8daea37262cde3662fe6df 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -50,7 +50,7 @@ rpc_errno_status(void)
        }
 }
 
-static const char *
+const char *
 rpc_exec_lookup(const char *cmd)
 {
        struct stat s;
index 05ba3caaf2ed86936847b1633fb486f9e6bcdfd3..dca1bad95260e47bbaa41c6ddb4e1e582d841503 100644 (file)
@@ -78,6 +78,8 @@ struct rpc_exec_context {
        rpc_exec_done_cb_t finish_cb;
 };
 
+const char *rpc_exec_lookup(const char *cmd);
+
 int rpc_exec(const char **args, rpc_exec_write_cb_t in,
              rpc_exec_read_cb_t out, rpc_exec_read_cb_t err,
              rpc_exec_done_cb_t end, void *priv, struct ubus_context *ctx,
diff --git a/main.c b/main.c
index 7335780bba067f383166ab871be6150058d66cca..9bebd3e4fe18768b543a2bbf291c959ff4a96576 100644 (file)
--- a/main.c
+++ b/main.c
 #include <rpcd/session.h>
 #include <rpcd/uci.h>
 #include <rpcd/plugin.h>
+#include <rpcd/exec.h>
 
 static struct ubus_context *ctx;
+static bool respawn = false;
+
+static void
+handle_signal(int sig)
+{
+       rpc_session_freeze();
+       uloop_cancelled = true;
+       respawn = (sig == SIGHUP);
+}
+
+static void
+exec_self(int argc, char **argv)
+{
+       int i;
+       const char *cmd = rpc_exec_lookup(argv[0]);
+       char **args = calloc(argc + 1, sizeof(char *));
+
+       if (!cmd || !args)
+               return;
+
+       for (i = 0; i < argc; i++)
+               args[i] = argv[i];
+
+       execv(cmd, (char * const *)args);
+}
 
 int main(int argc, char **argv)
 {
@@ -45,9 +71,8 @@ int main(int argc, char **argv)
        }
 
        signal(SIGPIPE, SIG_IGN);
-
-       argc -= optind;
-       argv += optind;
+       signal(SIGHUP,  handle_signal);
+       signal(SIGUSR1, handle_signal);
 
        uloop_init();
 
@@ -63,9 +88,14 @@ int main(int argc, char **argv)
        rpc_uci_api_init(ctx);
        rpc_plugin_api_init(ctx);
 
+       rpc_session_thaw();
+
        uloop_run();
        ubus_free(ctx);
        uloop_done();
 
+       if (respawn)
+               exec_self(argc, argv);
+
        return 0;
 }