aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2019-12-12 14:37:52 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2019-12-12 14:37:52 +0100
commit6422dd2e6bee2903690fe430b0e7a666179ec163 (patch)
treec1c7100388ca43696193f3e951b0f876de90919f
parent82a9d796219de863253b96340bb03c4506c8c676 (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.c115
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;
}