*/
#include <unistd.h>
+#include <stdlib.h>
#include <libubox/blobmsg_json.h>
#include <libubus.h>
#include <signal.h>
#include <sys/stat.h>
+#include <rpcd/exec.h>
+#include <rpcd/plugin.h>
+#include <rpcd/rc.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;
+int rpc_exec_timeout = RPC_EXEC_DEFAULT_TIMEOUT;
+
static void
handle_signal(int sig)
{
exec_self(int argc, char **argv)
{
int i;
- const char *cmd = rpc_exec_lookup(argv[0]);
- char **args = calloc(argc + 1, sizeof(char *));
+ const char *cmd;
+ char **args;
+
+ cmd = rpc_exec_lookup(argv[0]);
+ if (!cmd)
+ return;
- if (!cmd || !args)
+ args = calloc(argc + 1, sizeof(char *));
+ if (!args)
return;
for (i = 0; i < argc; i++)
const char *ubus_socket = NULL;
int ch;
- while ((ch = getopt(argc, argv, "s:")) != -1) {
+ while ((ch = getopt(argc, argv, "s:t:")) != -1) {
switch (ch) {
case 's':
ubus_socket = optarg;
break;
+
+ case 't':
+ rpc_exec_timeout = 1000 * strtol(optarg, NULL, 0);
+ break;
+
default:
break;
}
}
- if (stat("/var/run/rpcd", &s))
- mkdir("/var/run/rpcd", 0700);
+ if (rpc_exec_timeout < 1000 || rpc_exec_timeout > 600000) {
+ fprintf(stderr, "Invalid execution timeout specified\n");
+ return -1;
+ }
+
+ if (stat(RPC_UCI_DIR_PREFIX, &s))
+ mkdir(RPC_UCI_DIR_PREFIX, 0700);
umask(0077);
rpc_session_api_init(ctx);
rpc_uci_api_init(ctx);
+ rpc_rc_api_init(ctx);
rpc_plugin_api_init(ctx);
hangup = getenv("RPC_HANGUP");