X-Git-Url: http://git.archive.openwrt.org/?p=project%2Frpcd.git;a=blobdiff_plain;f=main.c;h=3b6841baca861bd4772feb9f825fe54231098f26;hp=c8b6d41bca5fcfc01a7e314ceb3a99370fcb1c74;hb=835b8b768da374075af56f624537d03d8ec97647;hpb=a86ef267a4fb8ce72477a916952bc69ff68d63d4 diff --git a/main.c b/main.c index c8b6d41..3b6841b 100644 --- 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 - * Copyright (C) 2013 Jo-Philipp Wich + * Copyright (C) 2013-2014 Jo-Philipp Wich * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -22,18 +22,45 @@ #include #include #include +#include -#include "session.h" -#include "file.h" -#include "uci.h" -#include "iwinfo.h" -#include "luci2.h" -#include "plugin.h" +#include +#include +#include +#include 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; @@ -47,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(); @@ -63,15 +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; }