X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain-afb-daemon.c;h=a8d99ff539f4bf5c59fc760fc933448e0cc8f969;hb=b70caad7da2eaea85db06dec8377b1cbebcec997;hp=7b92905fbb12358911322b99dc8be6b0dc68dc8b;hpb=248ec5dafada74c829dbe197888166c5807e22e2;p=src%2Fapp-framework-binder.git diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c index 7b92905f..a8d99ff5 100644 --- a/src/main-afb-daemon.c +++ b/src/main-afb-daemon.c @@ -403,15 +403,25 @@ static struct afb_hsrv *start_http_server() | execute_command +--------------------------------------------------------- */ -static void wait_child_and_exit() +static void exit_at_end() { + exit(0); +} + +static void wait_child(int signum, void* arg) +{ + pid_t pid = (pid_t)(intptr_t)arg; pid_t pidchld = childpid; - childpid = 0; - if (!SELF_PGROUP) - killpg(pidchld, SIGKILL); - waitpid(pidchld, NULL, 0); - exit(0); + if (pidchld == pid) { + childpid = 0; + if (!SELF_PGROUP) + killpg(pidchld, SIGKILL); + waitpid(pidchld, NULL, 0); + jobs_exit(exit_at_end); + } else { + waitpid(pid, NULL, 0); + } } static void on_sigchld(int signum, siginfo_t *info, void *uctx) @@ -421,7 +431,7 @@ static void on_sigchld(int signum, siginfo_t *info, void *uctx) case CLD_EXITED: case CLD_KILLED: case CLD_DUMPED: - jobs_exit(wait_child_and_exit); + jobs_queue_lazy(0, 0, wait_child, (void*)(intptr_t)info->si_pid); default: break; } @@ -534,7 +544,7 @@ static char **instanciate_command_args(struct json_object *exec, const char *por static int execute_command() { - struct json_object *exec, *oport; + struct json_object *exec, *oport, *otok; struct sigaction siga; char port[20]; const char *token; @@ -569,7 +579,10 @@ static int execute_command() } else { /* instantiate arguments and environment */ - token = afb_session_initial_token(); + 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 */ @@ -649,8 +662,7 @@ static void startup_call_current(struct startup_req *sreq) json = strchr(verb, ':'); if (json) { afb_xreq_init(&sreq->xreq, &startup_xreq_itf); - afb_context_init(&sreq->xreq.context, sreq->session, NULL); - sreq->xreq.context.validated = 1; + afb_context_init_validated(&sreq->xreq.context, sreq->session, NULL, NULL); sreq->api = strndup(api, verb - api); sreq->verb = strndup(verb + 1, json - verb - 1); sreq->xreq.request.called_api = sreq->api; @@ -760,7 +772,7 @@ static void start(int signum, void *arg) } /* initialize session handling */ - if (afb_session_init(max_session_count, session_timeout, token)) { + if (afb_session_init(max_session_count, session_timeout)) { ERROR("initialisation of session manager failed"); goto error; } @@ -792,7 +804,7 @@ static void start(int signum, void *arg) goto error; } if (addenv_int("AFB_PORT", http_port) - || addenv("AFB_TOKEN", afb_session_initial_token())) { + || addenv("AFB_TOKEN", token?:"")) { ERROR("can't set HTTP environment"); goto error; } @@ -885,7 +897,7 @@ static void start(int signum, void *arg) /* run the command */ afb_debug("start-exec"); - if (execute_command() < 0) + if (execute_command(http_port, token) < 0) goto error; /* ready */