main: store session data to disk on receipt of SIGUSR1 or SIGHUP. On HUP terminate self and re-exec
This commit is contained in:
parent
aa2afdb739
commit
524032c291
3 changed files with 36 additions and 4 deletions
2
exec.c
2
exec.c
|
@ -50,7 +50,7 @@ rpc_errno_status(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
const char *
|
||||||
rpc_exec_lookup(const char *cmd)
|
rpc_exec_lookup(const char *cmd)
|
||||||
{
|
{
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
|
|
@ -78,6 +78,8 @@ struct rpc_exec_context {
|
||||||
rpc_exec_done_cb_t finish_cb;
|
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,
|
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_read_cb_t out, rpc_exec_read_cb_t err,
|
||||||
rpc_exec_done_cb_t end, void *priv, struct ubus_context *ctx,
|
rpc_exec_done_cb_t end, void *priv, struct ubus_context *ctx,
|
||||||
|
|
36
main.c
36
main.c
|
@ -26,8 +26,34 @@
|
||||||
#include <rpcd/session.h>
|
#include <rpcd/session.h>
|
||||||
#include <rpcd/uci.h>
|
#include <rpcd/uci.h>
|
||||||
#include <rpcd/plugin.h>
|
#include <rpcd/plugin.h>
|
||||||
|
#include <rpcd/exec.h>
|
||||||
|
|
||||||
static struct ubus_context *ctx;
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -45,9 +71,8 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
signal(SIGHUP, handle_signal);
|
||||||
argc -= optind;
|
signal(SIGUSR1, handle_signal);
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
uloop_init();
|
uloop_init();
|
||||||
|
|
||||||
|
@ -63,9 +88,14 @@ int main(int argc, char **argv)
|
||||||
rpc_uci_api_init(ctx);
|
rpc_uci_api_init(ctx);
|
||||||
rpc_plugin_api_init(ctx);
|
rpc_plugin_api_init(ctx);
|
||||||
|
|
||||||
|
rpc_session_thaw();
|
||||||
|
|
||||||
uloop_run();
|
uloop_run();
|
||||||
ubus_free(ctx);
|
ubus_free(ctx);
|
||||||
uloop_done();
|
uloop_done();
|
||||||
|
|
||||||
|
if (respawn)
|
||||||
|
exec_self(argc, argv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue