rc: add support for scanning USE_PROCD and skip running if not supported
authorChristian Marangi <ansuelsmth@gmail.com>
Tue, 31 Jan 2023 14:32:59 +0000 (15:32 +0100)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 31 Jan 2023 15:11:23 +0000 (16:11 +0100)
Running check is supported only in procd scripts. This cause prolonged
execution time since the function needs to timeout.

To fix this check if the script USE_PROCD and run running check only if
supported.

Also provide running info only if the running check is supported.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
rc.c

diff --git a/rc.c b/rc.c
index 431d3a50d86a013a46af615e7956c3b78d506e55..35b47e9cd5c415d5bbfa408cbef71e647700f792 100644 (file)
--- a/rc.c
+++ b/rc.c
@@ -47,6 +47,7 @@ struct rc_list_context {
                int stop;
                bool enabled;
                bool running;
+               bool use_procd;
        } entry;
 };
 
@@ -81,7 +82,8 @@ static void rc_list_add_table(struct rc_list_context *c)
        if (c->entry.stop >= 0)
                blobmsg_add_u16(c->buf, "stop", c->entry.stop);
        blobmsg_add_u8(c->buf, "enabled", c->entry.enabled);
-       blobmsg_add_u8(c->buf, "running", c->entry.running);
+       if (c->entry.use_procd)
+               blobmsg_add_u8(c->buf, "running", c->entry.running);
 
        blobmsg_close_table(c->buf, e);
 }
@@ -112,6 +114,9 @@ static int rc_list_exec(struct rc_list_context *c, const char *action, uloop_pro
        case -1:
                return -errno;
        case 0:
+               if (!c->entry.use_procd)
+                       exit(-EOPNOTSUPP);
+
                /* Set stdin, stdout & stderr to /dev/null */
                fd = open("/dev/null", O_RDWR);
                if (fd >= 0) {
@@ -192,13 +197,15 @@ static void rc_list_readdir(struct rc_list_context *c)
                int count = 0;
 
                beginning = true;
-               while ((c->entry.start < 0 || c->entry.stop < 0) &&
+               while ((c->entry.start < 0 || c->entry.stop < 0 || !c->entry.use_procd) &&
                       count <= 10 && fgets(line, sizeof(line), fp)) {
                        if (beginning) {
                                if (!strncmp(line, "START=", 6)) {
                                        c->entry.start = strtoul(line + 6, NULL, 0);
                                } else if (!strncmp(line, "STOP=", 5)) {
                                        c->entry.stop = strtoul(line + 5, NULL, 0);
+                               } else if (!c->skip_running_check && !strncmp(line, "USE_PROCD=", 10)) {
+                                       c->entry.use_procd = !!strtoul(line + 10, NULL, 0);
                                }
                                count++;
                        }