X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain-afb-daemon.c;h=077c71631f04c4257c222b6b1d77d1e6794e8c28;hb=5ac7bb0d9d16260d2235820e97ab47943ffc307b;hp=beb08d38827645d6d68307a2db8accc27264a266;hpb=418ba126a955ee38804152c6c905ff200bbc1a92;p=src%2Fapp-framework-binder.git diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c index beb08d38..077c7163 100644 --- a/src/main-afb-daemon.c +++ b/src/main-afb-daemon.c @@ -38,12 +38,12 @@ #include -#include "afb-config.h" +#include "afb-args.h" #include "afb-hswitch.h" #include "afb-apiset.h" #include "afb-autoset.h" #include "afb-api-so.h" -#if defined(WITH_DBUS_TRANSPARENCY) +#if WITH_DBUS_TRANSPARENCY # include "afb-api-dbus.h" #endif #include "afb-api-ws.h" @@ -55,10 +55,12 @@ #include "afb-common.h" #include "afb-export.h" #include "afb-monitor.h" +#if WITH_AFB_HOOK #include "afb-hook.h" #include "afb-hook-flags.h" +#endif #include "afb-debug.h" -#if defined(WITH_SUPERVISION) +#if WITH_SUPERVISION # include "afb-supervision.h" #endif @@ -356,8 +358,12 @@ static struct afb_hsrv *start_http_server() } if (afb_hreq_init_download_path(uploaddir)) { - ERROR("unable to set the upload directory %s", uploaddir); - return NULL; + static const char fallback_uploaddir[] = "/tmp"; + WARNING("unable to set the upload directory %s", uploaddir); + if (afb_hreq_init_download_path(fallback_uploaddir)) { + ERROR("unable to fallback to upload directory %s", fallback_uploaddir); + return NULL; + } } hsrv = afb_hsrv_create(); @@ -397,6 +403,27 @@ static struct afb_hsrv *start_http_server() | execute_command +--------------------------------------------------------- */ +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; + + 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) { if (info->si_pid == childpid) { @@ -404,11 +431,9 @@ static void on_sigchld(int signum, siginfo_t *info, void *uctx) case CLD_EXITED: case CLD_KILLED: case CLD_DUMPED: - childpid = 0; - if (!SELF_PGROUP) - killpg(info->si_pid, SIGKILL); - waitpid(info->si_pid, NULL, 0); - exit(0); + jobs_queue_lazy(0, 0, wait_child, (void*)(intptr_t)info->si_pid); + default: + break; } } } @@ -519,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; @@ -554,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 */ @@ -634,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); sreq->api = strndup(api, verb - api); sreq->verb = strndup(verb + 1, json - verb - 1); sreq->xreq.request.called_api = sreq->api; @@ -675,7 +702,13 @@ static void run_startup_calls() static void start(int signum, void *arg) { - const char *tracereq, *traceapi, *traceevt, *traceses, *tracesvc, *traceditf, *traceglob; +#if WITH_AFB_HOOK + const char *tracereq = NULL, *traceapi = NULL, *traceevt = NULL, +#if !defined(REMOVE_LEGACY_TRACE) + *tracesvc = NULL, *traceditf = NULL, +#endif + *traceses = NULL, *traceglob = NULL; +#endif const char *workdir, *rootdir, *token, *rootapi; struct json_object *settings; struct afb_hsrv *hsrv; @@ -692,19 +725,20 @@ static void start(int signum, void *arg) } settings = NULL; - token = rootapi = tracesvc = traceditf = tracereq = - traceapi = traceevt = traceses = traceglob = NULL; no_httpd = 0; http_port = -1; + rootapi = token = NULL; rc = wrap_json_unpack(main_config, "{" "ss ss s?s" "si si si" "s?b s?i s?s" - "s?o" +#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" "}", "rootdir", &rootdir, @@ -719,7 +753,7 @@ static void start(int signum, void *arg) "port", &http_port, "rootapi", &rootapi, - "set", &settings, +#if WITH_AFB_HOOK #if !defined(REMOVE_LEGACY_TRACE) "tracesvc", &tracesvc, "traceditf", &traceditf, @@ -728,7 +762,9 @@ static void start(int signum, void *arg) "traceapi", &traceapi, "traceevt", &traceevt, "traceses", &traceses, - "traceglob", &traceglob + "traceglob", &traceglob, +#endif + "set", &settings ); if (rc < 0) { ERROR("Unable to get start config"); @@ -736,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; } @@ -768,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; } @@ -785,13 +821,14 @@ static void start(int signum, void *arg) ERROR("failed to setup monitor"); goto error; } -#if defined(WITH_SUPERVISION) +#if WITH_SUPERVISION if (afb_supervision_init(main_apiset, main_config) < 0) { ERROR("failed to setup supervision"); goto error; } #endif +#if WITH_AFB_HOOK /* install hooks */ if (tracereq) afb_hook_create_xreq(NULL, NULL, NULL, afb_hook_flags_xreq_from_text(tracereq), NULL, NULL); @@ -810,14 +847,17 @@ static void start(int signum, void *arg) afb_hook_create_session(NULL, afb_hook_flags_session_from_text(traceses), NULL, NULL); if (traceglob) afb_hook_create_global(afb_hook_flags_global_from_text(traceglob), NULL, NULL); +#endif /* load bindings and apis */ afb_debug("start-load"); +#if WITH_DYNAMIC_BINDING apiset_start_list("binding", afb_api_so_add_binding, "the binding"); apiset_start_list("ldpaths", afb_api_so_add_pathset_fails, "the binding path set"); apiset_start_list("weak-ldpaths", afb_api_so_add_pathset_nofails, "the weak binding path set"); +#endif apiset_start_list("auto-api", afb_autoset_add_any, "the automatic api path set"); -#if defined(WITH_DBUS_TRANSPARENCY) +#if WITH_DBUS_TRANSPARENCY apiset_start_list("dbus-client", afb_api_dbus_add_client, "the afb-dbus client"); #endif apiset_start_list("ws-client", afb_api_ws_add_client_weak, "the afb-websocket client"); @@ -834,7 +874,7 @@ static void start(int signum, void *arg) /* export started apis */ apiset_start_list("ws-server", afb_api_ws_add_server, "the afb-websocket service"); -#if defined(WITH_DBUS_TRANSPARENCY) +#if WITH_DBUS_TRANSPARENCY apiset_start_list("dbus-server", afb_api_dbus_add_server, "the afb-dbus service"); #endif @@ -857,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 */ @@ -885,7 +925,7 @@ int main(int argc, char *argv[]) afb_debug("main-entry"); // ------------- Build session handler & init config ------- - main_config = afb_config_parse_arguments(argc, argv); + main_config = afb_args_parse(argc, argv); if (sig_monitor_init( !json_object_object_get_ex(main_config, "trap-faults", &obj) || json_object_get_boolean(obj)) < 0) { @@ -911,7 +951,7 @@ int main(int argc, char *argv[]) afb_debug("main-start"); /* enter job processing */ - jobs_start(3, 0, 50, start, NULL); + jobs_start(3, 0, 100, start, NULL); WARNING("hoops returned from jobs_enter! [report bug]"); return 1; }