iwinfo: add 802.11ac hw mode
[project/rpcd.git] / main.c
diff --git a/main.c b/main.c
index 11a7cdd..3b6841b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,8 +1,8 @@
 /*
- * luci-rpcd - LuCI UBUS RPC server
+ * rpcd - UBUS RPC server
  *
  *   Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
- *   Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
+ *   Copyright (C) 2013-2014 Jo-Philipp Wich <jow@openwrt.org>
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
 #include <libubox/blobmsg_json.h>
 #include <libubus.h>
 #include <signal.h>
+#include <sys/stat.h>
 
-#include "session.h"
-#include "file.h"
-#include "uci.h"
-#include "iwinfo.h"
-#include "luci2.h"
+#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];
+
+       setenv("RPC_HANGUP", "1", 1);
+       execv(cmd, (char * const *)args);
+}
 
 int main(int argc, char **argv)
 {
+       struct stat s;
+       const char *hangup;
        const char *ubus_socket = NULL;
        int ch;
 
@@ -46,10 +74,14 @@ int main(int argc, char **argv)
                }
        }
 
-       signal(SIGPIPE, SIG_IGN);
+       if (stat("/var/run/rpcd", &s))
+               mkdir("/var/run/rpcd", 0700);
 
-       argc -= optind;
-       argv += optind;
+       umask(0077);
+
+       signal(SIGPIPE, SIG_IGN);
+       signal(SIGHUP,  handle_signal);
+       signal(SIGUSR1, handle_signal);
 
        uloop_init();
 
@@ -62,14 +94,22 @@ int main(int argc, char **argv)
        ubus_add_uloop(ctx);
 
        rpc_session_api_init(ctx);
-       rpc_file_api_init(ctx);
        rpc_uci_api_init(ctx);
-       rpc_iwinfo_api_init(ctx);
-       rpc_luci2_api_init(ctx);
+       rpc_plugin_api_init(ctx);
+
+       hangup = getenv("RPC_HANGUP");
+
+       if (!hangup || strcmp(hangup, "1"))
+               rpc_uci_purge_savedirs();
+       else
+               rpc_session_thaw();
 
        uloop_run();
        ubus_free(ctx);
        uloop_done();
 
+       if (respawn)
+               exec_self(argc, argv);
+
        return 0;
 }