Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4cdd13f authored by San Mehat's avatar San Mehat
Browse files

init: Clean up dynamic argument handling for services



Signed-off-by: default avatarSan Mehat <san@google.com>
parent e6be8706
Loading
Loading
Loading
Loading
+10 −34
Original line number Diff line number Diff line
@@ -193,7 +193,8 @@ void service_start(struct service *svc, const char *dynamic_args)
    }

    if ((!(svc->flags & SVC_ONESHOT)) && dynamic_args) {
        ERROR("service '%s' must be one-shot to use dynamic args, disabling\n", svc->args[0]);
        ERROR("service '%s' must be one-shot to use dynamic args, disabling\n",
               svc->args[0]);
        svc->flags |= SVC_DISABLED;
        return;
    }
@@ -258,42 +259,18 @@ void service_start(struct service *svc, const char *dynamic_args)
            execve(svc->args[0], (char**) svc->args, (char**) ENV);
        else {
            char *arg_ptrs[SVC_MAXARGS+1];
            int arg_idx;
            int arg_idx = svc->nargs;
            char *tmp = strdup(dynamic_args);
            char *p = tmp;
            char *next = tmp;
            char *bword;

            /* Copy the static arguments */
            for (arg_idx = 0; arg_idx < svc->nargs; arg_idx++) {
                arg_ptrs[arg_idx] = svc->args[arg_idx];
            }

            int done = 0;
            while(!done) {
            memcpy(arg_ptrs, svc->args, (svc->nargs * sizeof(char *)));

            while((bword = strsep(&next, " "))) {
                arg_ptrs[arg_idx++] = bword;
                if (arg_idx == SVC_MAXARGS)
                    break;

                /* Advance over any leading whitespace */
                if (*p == ' ') {
                    for (p; *p != ' '; p++);
                    p++;
                }
                /* Locate next argument */
                char *q = p;
                while(1) {
                    if (*q == ' ') {
                        *q = '\0';
                        break;
                    } else if (*q == '\0') {
                        done = 1;
                        break;
                    }
                    q++;
                }
                arg_ptrs[arg_idx++] = p;

                q++; // Advance q to the next string
                p = q;
            }
            arg_ptrs[arg_idx] = '\0';
            execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);
@@ -462,7 +439,6 @@ static void msg_start(const char *name)
        svc = service_find_by_name(name);
    else {
        tmp = strdup(name);
        strcpy(tmp, name);
        args = strchr(tmp, ':');
        *args = '\0';
        args++;