diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-12-12 14:37:52 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2019-12-12 14:37:52 +0100 |
commit | 6422dd2e6bee2903690fe430b0e7a666179ec163 (patch) | |
tree | c1c7100388ca43696193f3e951b0f876de90919f | |
parent | 82a9d796219de863253b96340bb03c4506c8c676 (diff) |
afb-daemon: Fix optionnal port
Since:
- introduction of interface to set the
listening port(s) and address(es)
- use of nss-localuser for discriminating
binders
there is no more strict need for exporting
the port and substituting it. So the
substitution is make only if needed.
Since removal of token generation, there is no
more need to propoagate any token.
The two possibilities are kept for being used
whene needed and to ensure sweet transition.
Bug-AGL: SPEC-2968
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Change-Id: I1d2b4d765f244e46de3071baddd8b3d0817b9436
-rw-r--r-- | src/main-afb-daemon.c | 115 |
1 files changed, 60 insertions, 55 deletions
diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c index 31bf4f76..1e8b3544 100644 --- a/src/main-afb-daemon.c +++ b/src/main-afb-daemon.c @@ -474,9 +474,9 @@ static void on_sigchld(int signum, siginfo_t *info, void *uctx) #define SUBST_CHAR '@' #define SUBST_STR "@" -static char *instanciate_string(const char *arg, const char *port, const char *token) +static char *instanciate_string(char *arg, const char *port, const char *token) { - char *resu, *it, *wr; + char *resu, *it, *wr, c; int chg, dif; /* get the changes */ @@ -484,18 +484,24 @@ static char *instanciate_string(const char *arg, const char *port, const char *t dif = 0; it = strchrnul(arg, SUBST_CHAR); while (*it) { - switch(*++it) { - case 'p': chg++; dif += (int)strlen(port) - 2; break; - case 't': chg++; dif += (int)strlen(token) - 2; break; - case SUBST_CHAR: it++; chg++; dif--; break; - default: break; + c = *++it; + if (c == 'p' && port) { + chg++; + dif += (int)strlen(port) - 2; + } else if (c == 't' && token) { + chg++; + dif += (int)strlen(token) - 2; + } else if (c == SUBST_CHAR) { + it++; + chg++; + dif--; } it = strchrnul(it, SUBST_CHAR); } /* return arg when no change */ if (!chg) - return strdup(arg); + return arg; /* allocates the result */ resu = malloc((it - arg) + dif + 1); @@ -511,11 +517,15 @@ static char *instanciate_string(const char *arg, const char *port, const char *t wr = mempcpy(wr, arg, it - arg); if (!*it) break; - switch(*++it) { - case 'p': wr = stpcpy(wr, port); break; - case 't': wr = stpcpy(wr, token); break; - default: *wr++ = SUBST_CHAR; /*@fallthrough@*/ - case SUBST_CHAR: *wr++ = *it; + c = *++it; + if (c == 'p' && port) + wr = stpcpy(wr, port); + else if (c == 't' && token) + wr = stpcpy(wr, token); + else { + if (c != SUBST_CHAR) + *wr++ = SUBST_CHAR; + *wr++ = *it; } arg = ++it; } @@ -543,7 +553,7 @@ static int instanciate_environ(const char *port, const char *token) static char **instanciate_command_args(struct json_object *exec, const char *port, const char *token) { char **result; - char *repl; + char *repl, *item; int i, n; /* allocates the result */ @@ -556,10 +566,9 @@ static char **instanciate_command_args(struct json_object *exec, const char *por /* instanciate the arguments */ for (i = 0 ; i < n ; i++) { - repl = instanciate_string(json_object_get_string(json_object_array_get_idx(exec, i)), port, token); + item = (char*)json_object_get_string(json_object_array_get_idx(exec, i)); + repl = instanciate_string(item, port, token); if (!repl) { - while(i) - free(result[--i]); free(result); return NULL; } @@ -573,10 +582,8 @@ static int execute_command() { struct json_object *exec, *oport, *otok; struct sigaction siga; - char port[20]; - const char *token; + const char *token, *port; char **args; - int rc; /* check whether a command is to execute or not */ if (!json_object_object_get_ex(main_config, "exec", &exec)) @@ -598,26 +605,21 @@ static int execute_command() /* compute the string for port */ if (json_object_object_get_ex(main_config, "port", &oport)) - rc = snprintf(port, sizeof port, "%s", json_object_get_string(oport)); + port = json_object_get_string(oport); else - rc = snprintf(port, sizeof port, "%cp", SUBST_CHAR); - if (rc < 0 || rc >= (int)(sizeof port)) { - ERROR("port->txt failed"); - } - else { - /* instantiate arguments and environment */ - if (json_object_object_get_ex(main_config, "token", &otok)) - token = json_object_get_string(otok); - else - token = SUBST_STR"p"; - args = instanciate_command_args(exec, port, token); - if (args && instanciate_environ(port, token) >= 0) { - /* run */ - if (!SELF_PGROUP) - setpgid(0, 0); - execv(args[0], args); - ERROR("can't launch %s: %m", args[0]); - } + port = 0; + /* instantiate arguments and environment */ + if (json_object_object_get_ex(main_config, "token", &otok)) + token = json_object_get_string(otok); + else + token = 0; + args = instanciate_command_args(exec, port, token); + if (args && instanciate_environ(port, token) >= 0) { + /* run */ + if (!SELF_PGROUP) + setpgid(0, 0); + execv(args[0], args); + ERROR("can't launch %s: %m", args[0]); } exit(1); return -1; @@ -759,12 +761,6 @@ static void start(int signum, void *arg) "ss ss s?s" "si si si" "s?b s?i s?s" -#if WITH_AFB_HOOK -#if !defined(REMOVE_LEGACY_TRACE) - "s?s s?s" -#endif - "s?s s?s s?s s?s s?s" -#endif "s?o" "}", @@ -780,7 +776,21 @@ static void start(int signum, void *arg) "port", &http_port, "rootapi", &rootapi, + "set", &settings + ); + if (rc < 0) { + ERROR("Unable to get start config"); + exit(1); + } + #if WITH_AFB_HOOK + rc = wrap_json_unpack(main_config, "{" +#if !defined(REMOVE_LEGACY_TRACE) + "s?s s?s" +#endif + "s?s s?s s?s s?s s?s" + "}", + #if !defined(REMOVE_LEGACY_TRACE) "tracesvc", &tracesvc, "traceditf", &traceditf, @@ -789,14 +799,13 @@ static void start(int signum, void *arg) "traceapi", &traceapi, "traceevt", &traceevt, "traceses", &traceses, - "traceglob", &traceglob, -#endif - "set", &settings + "traceglob", &traceglob ); if (rc < 0) { - ERROR("Unable to get start config"); + ERROR("Unable to get hook config"); exit(1); } +#endif /* initialize session handling */ if (afb_session_init(max_session_count, session_timeout)) { @@ -822,16 +831,12 @@ static void start(int signum, void *arg) /* setup HTTP */ if (!no_httpd) { - if (http_port < 0) { - ERROR("no port is defined"); - goto error; - } if (http_port == 0) { ERROR("random port is not implemented"); goto error; } - if (addenv_int("AFB_PORT", http_port) - || addenv("AFB_TOKEN", token?:"")) { + if ((http_port > 0 && addenv_int("AFB_PORT", http_port)) + || (token && addenv("AFB_TOKEN", token))) { ERROR("can't set HTTP environment"); goto error; } |