rc: add option to get info for a single script in list method
authorChristian Marangi <ansuelsmth@gmail.com>
Tue, 31 Jan 2023 14:45:18 +0000 (15:45 +0100)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 31 Jan 2023 15:11:24 +0000 (16:11 +0100)
Add option to get info for a single script in list method.

To get info of a particular script pass the name arg to the list method.

If the script doesn't exist an empty table is returned.

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

diff --git a/rc.c b/rc.c
index 60ec4bfa64e9a2595409d29bc7e11bd61fd2528d..3d192f17a587115b81eeb3b5604d4322cdb5ead7 100644 (file)
--- a/rc.c
+++ b/rc.c
 #define RC_LIST_EXEC_TIMEOUT_MS                        3000
 
 enum {
+       RC_LIST_NAME,
        RC_LIST_SKIP_RUNNING_CHECK,
        __RC_LIST_MAX
 };
 
 static const struct blobmsg_policy rc_list_policy[] = {
+       [RC_LIST_NAME] = { "name", BLOBMSG_TYPE_STRING },
        [RC_LIST_SKIP_RUNNING_CHECK] = { "skip_running_check", BLOBMSG_TYPE_BOOL },
 };
 
@@ -48,6 +50,7 @@ struct rc_list_context {
        struct blob_buf *buf;
        DIR *dir;
        bool skip_running_check;
+       const char *req_name;
 
        /* Info about currently processed init.d entry */
        struct {
@@ -181,7 +184,12 @@ static void rc_list_readdir(struct rc_list_context *c)
        FILE *fp;
 
        e = readdir(c->dir);
-       if (!e) {
+       /* 
+        * If scanning for a specific script and entry.d_name is set
+        * we can assume we found a matching one in the previous
+        * iteration since entry.d_name is set only if a match is found.
+        */
+       if (!e || (c->req_name && c->entry.d_name)) {
                closedir(c->dir);
                ubus_send_reply(c->ctx, &c->req, c->buf->head);
                ubus_complete_deferred_request(c->ctx, &c->req, UBUS_STATUS_OK);
@@ -191,6 +199,9 @@ static void rc_list_readdir(struct rc_list_context *c)
        if (!strcmp(e->d_name, ".") || !strcmp(e->d_name, ".."))
                goto next;
 
+       if (c->req_name && strcmp(e->d_name, c->req_name))
+               goto next;
+
        memset(&c->entry, 0, sizeof(c->entry));
        c->entry.start = -1;
        c->entry.stop = -1;
@@ -271,6 +282,8 @@ static int rc_list(struct ubus_context *ctx, struct ubus_object *obj,
        }
        if (tb[RC_LIST_SKIP_RUNNING_CHECK])
                c->skip_running_check = blobmsg_get_bool(tb[RC_LIST_SKIP_RUNNING_CHECK]);
+       if (tb[RC_LIST_NAME])
+               c->req_name = blobmsg_get_string(tb[RC_LIST_NAME]);
 
        ubus_defer_request(ctx, req, &c->req);