exec: increase maximum execution time to 120s
authorJo-Philipp Wich <jo@mein.io>
Thu, 22 Nov 2018 13:04:45 +0000 (14:04 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 22 Nov 2018 13:28:28 +0000 (14:28 +0100)
Increase the maximum possible execution time to 120 seconds and add a new
command line flag `-t` which allows overwriting the default value.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
exec.c
include/rpcd/exec.h
main.c

diff --git a/exec.c b/exec.c
index f7bfcb2f5e16f550b03e2521c95c3931277e6b91..146e62b6fd4bf9b01d413a3cf8e9b7e292134ef8 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -350,7 +350,7 @@ rpc_exec(const char **args, rpc_exec_write_cb_t in,
                uloop_process_add(&c->process);
 
                c->timeout.cb = rpc_exec_timeout_cb;
-               uloop_timeout_set(&c->timeout, RPC_EXEC_MAX_RUNTIME);
+               uloop_timeout_set(&c->timeout, exec_timeout);
 
                if (c->stdin_cb)
                {
index efe4ccace509e89e2982c839ca0f3a75c348604f..01981fe34e5d389b1e5591930f7bdb865905ca04 100644 (file)
@@ -24,7 +24,7 @@
 #include <libubox/ustream.h>
 
 #define RPC_EXEC_MAX_SIZE              (4096 * 64)
-#define RPC_EXEC_MAX_RUNTIME   (30 * 1000)
+#define RPC_EXEC_DEFAULT_TIMEOUT       (120 * 1000)
 
 #define ustream_for_each_read_buffer(stream, ptr, len) \
        for (ptr = ustream_get_read_buf(stream, &len);     \
@@ -50,6 +50,7 @@
                ustream_fd_init(&us, fd);                             \
        } while(0)
 
+extern int exec_timeout;
 
 typedef int (*rpc_exec_write_cb_t)(struct ustream *, void *);
 typedef int (*rpc_exec_read_cb_t)(struct blob_buf *, char *, int, void *);
diff --git a/main.c b/main.c
index 7c161b5e5a5347820c5d4d744effcf1cae9d4906..b24699765f92792824e3941d78e732aaff62b647 100644 (file)
--- a/main.c
+++ b/main.c
@@ -18,6 +18,7 @@
  */
 
 #include <unistd.h>
+#include <stdlib.h>
 
 #include <libubox/blobmsg_json.h>
 #include <libubus.h>
@@ -32,6 +33,8 @@
 static struct ubus_context *ctx;
 static bool respawn = false;
 
+int exec_timeout = RPC_EXEC_DEFAULT_TIMEOUT;
+
 static void
 handle_signal(int sig)
 {
@@ -64,16 +67,28 @@ int main(int argc, char **argv)
        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':
+                       exec_timeout = strtol(optarg, NULL, 0);
+                       break;
+
                default:
                        break;
                }
        }
 
+       if (exec_timeout < 1 || exec_timeout > 600) {
+               fprintf(stderr, "Invalid execution timeout specified\n");
+               return -1;
+       }
+
+       exec_timeout *= 1000;
+
        if (stat(RPC_UCI_DIR_PREFIX, &s))
                mkdir(RPC_UCI_DIR_PREFIX, 0700);