X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=6db1e2a8329457cba48ac57ccb40b0cfb5ef8401;hb=0bf1d7e7427fb7165dfb547d4de1c84da6f963ea;hp=3809400f18858289911aa7076dc52ba81235f26d;hpb=391ada39d89f9f90d186aed8e1d825be9c17a328;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 3809400f..6db1e2a8 100644 --- a/src/main.c +++ b/src/main.c @@ -41,7 +41,6 @@ #include "afb-hsrv.h" #include "afb-context.h" #include "afb-hreq.h" -#include "sig-monitor.h" #include "jobs.h" #include "afb-session.h" #include "verbose.h" @@ -100,11 +99,49 @@ static void start_list(struct afb_config_list *list, +--------------------------------------------------------- */ static void exit_handler() { - /* TODO: check whether using SIGHUP isn't better */ + struct sigaction siga; + + memset(&siga, 0, sizeof siga); + siga.sa_handler = SIG_IGN; + sigaction(SIGTERM, &siga, NULL); + if (SELF_PGROUP) - killpg(0, SIGKILL); + killpg(0, SIGTERM); else if (childpid > 0) - killpg(childpid, SIGKILL); + 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); } /*---------------------------------------------------------- @@ -223,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) { @@ -393,22 +430,11 @@ static int execute_command() return -1; } -/*--------------------------------------------------------- - | main event processing - +--------------------------------------------------------- */ - -static void main_event_wait_and_dispatch(int signum, void *closure) -{ - struct sd_event *event = closure; - if (signum == 0) - sd_event_run(event, 30000000); -} - /*--------------------------------------------------------- | job for starting the daemon +--------------------------------------------------------- */ -static void start(int signum) +static void start() { struct afb_hsrv *hsrv; @@ -424,7 +450,13 @@ static void start(int signum) goto error; } - afb_api_so_set_timeout(config->apiTimeout); + /* install hooks */ + if (config->tracereq) + afb_hook_create_xreq(NULL, NULL, NULL, config->tracereq, NULL, NULL); + if (config->traceditf) + afb_hook_create_ditf(NULL, config->traceditf, NULL, NULL); + + afb_apis_set_timeout(config->apiTimeout); 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"); @@ -448,10 +480,6 @@ static void start(int signum) DEBUG("Init config done"); - /* install trace of requests */ - if (config->tracereq) - afb_hook_req_create(NULL, NULL, NULL, config->tracereq, NULL, NULL); - /* start the services */ if (afb_apis_start_all_services(1) < 0) goto error; @@ -473,6 +501,7 @@ static void start(int signum) error: exit(1); } + /*--------------------------------------------------------- | main | Parse option and launch action @@ -483,12 +512,11 @@ int main(int argc, char *argv[]) // let's run this program with a low priority nice(20); - LOGAUTH("afb-daemon"); - sd_fds_init(); // ------------- Build session handler & init config ------- config = afb_config_parse_arguments(argc, argv); + INFO("running with pid %d", getpid()); // --------- run ----------- if (config->background) { @@ -500,39 +528,12 @@ int main(int argc, char *argv[]) INFO("entering foreground mode"); } - /* handle groups */ - atexit(exit_handler); - - /* ignore any SIGPIPE */ - signal(SIGPIPE, SIG_IGN); - - /* start */ - if (sig_monitor_init() < 0) { - ERROR("failed to initialise signal handlers"); - return 1; - } - - /* init job processing */ - if (jobs_init(3, 1, 20) < 0) { - ERROR("failed to initialise threading"); - return 1; - } - - /* records the loop */ - if (jobs_add_events(NULL, 0, main_event_wait_and_dispatch, afb_common_get_event_loop()) < 0) { - ERROR("failed to set main_event_wait_and_dispatch"); - return 1; - } + /* set the daemon environment */ + setup_daemon(); - /* queue the start job */ - if (jobs_queue0(NULL, 0, start) < 0) { - ERROR("failed to set main_event_wait_and_dispatch"); - return 1; - } - - /* turn as processing thread */ - jobs_add_me(); - WARNING("hoops returned from jobs_add_me! [report bug]"); - return 0; + /* enter job processing */ + jobs_start(3, 0, 50, start); + WARNING("hoops returned from jobs_enter! [report bug]"); + return 1; }