X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=18f5e5ef97564737fe14a4e0a157b2036b00daf8;hb=ca9807f73646f536ac58c002d963a8bb8d245f5d;hp=a1b09c1e9c7d7943c07bce032bb4f5f282033e33;hpb=b529ded85a3e50a1aa6529e870b2e2f43e377ca2;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index a1b09c1e..18f5e5ef 100644 --- a/src/main.c +++ b/src/main.c @@ -99,10 +99,49 @@ static void start_list(struct afb_config_list *list, +--------------------------------------------------------- */ static void exit_handler() { + struct sigaction siga; + + memset(&siga, 0, sizeof siga); + siga.sa_handler = SIG_IGN; + sigaction(SIGTERM, &siga, NULL); + if (SELF_PGROUP) - killpg(0, SIGHUP); + killpg(0, SIGTERM); else if (childpid > 0) - killpg(childpid, SIGHUP); + killpg(childpid, SIGTERM); +} + +static void on_sigterm(int signum, siginfo_t *info, void *uctx) +{ + NOTICE("Received SIGTERM"); + exit(0); +} + +static void on_sighup(int signum, siginfo_t *info, void *uctx) +{ + NOTICE("Received SIGHUP"); + /* TODO */ +} + +static void setup_daemon() +{ + struct sigaction siga; + + /* install signal handlers */ + memset(&siga, 0, sizeof siga); + siga.sa_flags = SA_SIGINFO; + + siga.sa_sigaction = on_sigterm; + sigaction(SIGTERM, &siga, NULL); + + siga.sa_sigaction = on_sighup; + sigaction(SIGHUP, &siga, NULL); + + /* handle groups */ + atexit(exit_handler); + + /* ignore any SIGPIPE */ + signal(SIGPIPE, SIG_IGN); } /*---------------------------------------------------------- @@ -221,7 +260,7 @@ static struct afb_hsrv *start_http_server() } NOTICE("Waiting port=%d rootdir=%s", config->httpdPort, config->rootdir); - NOTICE("Browser URL= http:/*localhost:%d", config->httpdPort); + NOTICE("Browser URL= http://localhost:%d", config->httpdPort); rc = afb_hsrv_start(hsrv, (uint16_t) config->httpdPort, 15); if (!rc) { @@ -405,11 +444,24 @@ static void start() goto error; } + /* set the directories */ mkdir(config->workdir, S_IRWXU | S_IRGRP | S_IXGRP); if (chdir(config->workdir) < 0) { ERROR("Can't enter working dir %s", config->workdir); goto error; } + if (afb_common_rootdir_set(config->rootdir) < 0) { + ERROR("failed to set common root directory"); + goto error; + } + + /* configure the daemon */ + afb_apis_set_timeout(config->apiTimeout); + afb_session_init(config->nbSessionMax, config->cntxTimeout, config->token); + if (!afb_hreq_init_cookie(config->httpdPort, config->rootapi, config->cntxTimeout)) { + ERROR("initialisation of cookies failed"); + goto error; + } /* install hooks */ if (config->tracereq) @@ -417,28 +469,15 @@ static void start() if (config->traceditf) afb_hook_create_ditf(NULL, config->traceditf, NULL, NULL); - afb_apis_set_timeout(config->apiTimeout); + /* load bindings */ start_list(config->dbus_clients, afb_api_dbus_add_client, "the afb-dbus client"); start_list(config->ws_clients, afb_api_ws_add_client, "the afb-websocket client"); start_list(config->ldpaths, afb_api_so_add_pathset, "the binding path set"); start_list(config->so_bindings, afb_api_so_add_binding, "the binding"); - afb_session_init(config->nbSessionMax, config->cntxTimeout, config->token); - start_list(config->dbus_servers, afb_api_dbus_add_server, "the afb-dbus service"); start_list(config->ws_servers, afb_api_ws_add_server, "the afb-websocket service"); - if (!afb_hreq_init_cookie(config->httpdPort, config->rootapi, config->cntxTimeout)) { - ERROR("initialisation of cookies failed"); - goto error; - } - - // set the root dir - if (afb_common_rootdir_set(config->rootdir) < 0) { - ERROR("failed to set common root directory"); - goto error; - } - DEBUG("Init config done"); /* start the services */ @@ -462,6 +501,7 @@ static void start() error: exit(1); } + /*--------------------------------------------------------- | main | Parse option and launch action @@ -488,11 +528,8 @@ int main(int argc, char *argv[]) INFO("entering foreground mode"); } - /* handle groups */ - atexit(exit_handler); - - /* ignore any SIGPIPE */ - signal(SIGPIPE, SIG_IGN); + /* set the daemon environment */ + setup_daemon(); /* enter job processing */ jobs_start(3, 0, 50, start);