X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=cee559694041e0399cad0dacab47321126ac83c4;hb=9fe2dfd3c4df334607083f989346090e1051a565;hp=05805e2dad27989080519d534b4a7eabc2158189;hpb=f5ce0df45f5ce9f0b57b250dfd44513d085f1e54;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 05805e2d..cee55969 100644 --- a/src/main.c +++ b/src/main.c @@ -41,8 +41,7 @@ #include "afb-hsrv.h" #include "afb-context.h" #include "afb-hreq.h" -#include "afb-sig-handler.h" -#include "afb-thread.h" +#include "jobs.h" #include "afb-session.h" #include "verbose.h" #include "afb-common.h" @@ -100,11 +99,10 @@ static void start_list(struct afb_config_list *list, +--------------------------------------------------------- */ static void exit_handler() { - /* TODO: check whether using SIGHUP isn't better */ if (SELF_PGROUP) - killpg(0, SIGKILL); + killpg(0, SIGHUP); else if (childpid > 0) - killpg(childpid, SIGKILL); + killpg(childpid, SIGHUP); } /*---------------------------------------------------------- @@ -394,121 +392,110 @@ static int execute_command() } /*--------------------------------------------------------- - | main - | Parse option and launch action + | job for starting the daemon +--------------------------------------------------------- */ -int main(int argc, char *argv[]) +static void start() { struct afb_hsrv *hsrv; - struct sd_event *eventloop; - - LOGAUTH("afb-daemon"); - - sd_fds_init(); - - // ------------- Build session handler & init config ------- - config = afb_config_parse_arguments(argc, argv); - atexit(exit_handler); // ------------------ sanity check ---------------------------------------- if (config->httpdPort <= 0) { ERROR("no port is defined"); - exit(1); + goto error; } mkdir(config->workdir, S_IRWXU | S_IRGRP | S_IXGRP); if (chdir(config->workdir) < 0) { ERROR("Can't enter working dir %s", config->workdir); - exit(1); + goto error; } - afb_api_so_set_timeout(config->apiTimeout); + 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"); start_list(config->so_bindings, afb_api_so_add_binding, "the binding"); - afb_session_init(config->nbSessionMax, config->cntxTimeout, config->token, afb_apis_count()); + 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"); - exit(1); - } - - if (afb_sig_handler_init() < 0) { - ERROR("failed to initialise signal handlers"); - return 1; + goto error; } // set the root dir if (afb_common_rootdir_set(config->rootdir) < 0) { ERROR("failed to set common root directory"); - return 1; + goto error; } - if (afb_thread_init(3, 1, 20) < 0) { - ERROR("failed to initialise threading"); - return 1; - } - // let's run this program with a low priority - nice(20); - - // ------------------ Finaly Process Commands ----------------------------- - // let's not take the risk to run as ROOT - //if (getuid() == 0) goto errorNoRoot; - DEBUG("Init config done"); - // --------- run ----------- - if (config->background) { - // --------- in background mode ----------- - INFO("entering background mode"); - daemonize(); - } else { - // ---- in foreground mode -------------------- - INFO("entering foreground mode"); - } - - /* ignore any SIGPIPE */ - signal(SIGPIPE, SIG_IGN); - /* 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) - exit(1); + goto error; /* start the HTTP server */ if (!config->noHttpd) { hsrv = start_http_server(); if (hsrv == NULL) - exit(1); + goto error; } /* run the command */ if (execute_command() < 0) - exit(1); + goto error; + + /* ready */ + sd_notify(1, "READY=1"); + return; +error: + exit(1); +} +/*--------------------------------------------------------- + | main + | Parse option and launch action + +--------------------------------------------------------- */ + +int main(int argc, char *argv[]) +{ + // let's run this program with a low priority + nice(20); + + LOGAUTH("afb-daemon"); + + sd_fds_init(); - /* signal that ready */ - if (config->readyfd != 0) { - static const char readystr[] = "READY=1"; - write(config->readyfd, readystr, sizeof(readystr) - 1); - close(config->readyfd); + // ------------- Build session handler & init config ------- + config = afb_config_parse_arguments(argc, argv); + + // --------- run ----------- + if (config->background) { + // --------- in background mode ----------- + INFO("entering background mode"); + daemonize(); + } else { + // ---- in foreground mode -------------------- + INFO("entering foreground mode"); } - // infinite loop - eventloop = afb_common_get_event_loop(); - sd_notify(1, "READY=1"); - for (;;) - sd_event_run(eventloop, 30000000); + /* handle groups */ + atexit(exit_handler); - WARNING("hoops returned from infinite loop [report bug]"); + /* ignore any SIGPIPE */ + signal(SIGPIPE, SIG_IGN); - return 0; + /* enter job processing */ + jobs_start(3, 0, 50, start); + WARNING("hoops returned from jobs_enter! [report bug]"); + return 1; } +