X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain-afb-daemon.c;h=c2a5351375b36f34597a2888dcdfd5a593e7ca2e;hb=901a38c28bf3fe7cc3e58e3fad36190fbae585be;hp=0a8e018686a663cdeafbc41cf47c1143367d95f8;hpb=043c27c3a8fd323d59e41288b6fd24f0e9bfa9a3;p=src%2Fapp-framework-binder.git diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c index 0a8e0186..c2a53513 100644 --- a/src/main-afb-daemon.c +++ b/src/main-afb-daemon.c @@ -38,7 +38,7 @@ #include -#include "afb-config.h" +#include "afb-args.h" #include "afb-hswitch.h" #include "afb-apiset.h" #include "afb-autoset.h" @@ -55,8 +55,10 @@ #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) # include "afb-supervision.h" @@ -66,6 +68,7 @@ #include "wrap-json.h" #include "jobs.h" #include "sig-monitor.h" +#include "watchdog.h" #if !defined(DEFAULT_BINDER_INTERFACE) # define DEFAULT_BINDER_INTERFACE NULL @@ -396,6 +399,17 @@ static struct afb_hsrv *start_http_server() | execute_command +--------------------------------------------------------- */ +static void wait_child_and_exit() +{ + pid_t pidchld = childpid; + + childpid = 0; + if (!SELF_PGROUP) + killpg(pidchld, SIGKILL); + waitpid(pidchld, NULL, 0); + exit(0); +} + static void on_sigchld(int signum, siginfo_t *info, void *uctx) { if (info->si_pid == childpid) { @@ -403,11 +417,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_exit(wait_child_and_exit); + default: + break; } } } @@ -674,7 +686,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; @@ -691,19 +709,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, @@ -718,7 +737,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, @@ -727,7 +746,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"); @@ -791,6 +812,7 @@ static void start(int signum, void *arg) } #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); @@ -809,6 +831,7 @@ 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"); @@ -861,6 +884,13 @@ static void start(int signum, void *arg) /* ready */ sd_notify(1, "READY=1"); + + /* activate the watchdog */ +#if HAS_WATCHDOG + if (watchdog_activate() < 0) + ERROR("can't start the watchdog"); +#endif + return; error: exit(1); @@ -877,7 +907,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) {