X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=bffcb38854419285c8f7ecdee37c980b8e1e9688;hb=4d5ce1b0b3b41b8fb53126a0c67534db7d010a75;hp=01c06095923c35099f3f445d65cf594aaa3e090e;hpb=a8e971702f23ee67e02b4716ad4159f12cefdca6;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 01c06095..bffcb388 100644 --- a/src/main.c +++ b/src/main.c @@ -17,23 +17,26 @@ */ #define _GNU_SOURCE -#define NO_BINDING_VERBOSE_MACRO +#define AFB_BINDING_PRAGMA_NO_VERBOSE_MACRO #include #include +#include +#include #include #include #include #include #include +#if !defined(NO_CALL_PERSONALITY) +#include +#endif + #include -#include #include -#include - #include "afb-config.h" #include "afb-hswitch.h" #include "afb-apiset.h" @@ -41,16 +44,17 @@ #include "afb-api-dbus.h" #include "afb-api-ws.h" #include "afb-hsrv.h" -#include "afb-context.h" #include "afb-hreq.h" #include "afb-xreq.h" -#include "afb-cred.h" #include "jobs.h" #include "afb-session.h" #include "verbose.h" #include "afb-common.h" +#include "afb-monitor.h" #include "afb-hook.h" #include "sd-fds.h" +#include "afb-debug.h" +#include "process-name.h" /* if SELF_PGROUP == 0 the launched command is the group leader @@ -115,7 +119,6 @@ static void exit_handler() killpg(0, SIGTERM); else if (childpid > 0) killpg(childpid, SIGTERM); - exit(0); } static void on_sigterm(int signum, siginfo_t *info, void *uctx) @@ -349,7 +352,7 @@ static char *instanciate_string(char *arg, const char *port, const char *token) switch(*++it) { case 'p': wr = stpcpy(wr, port); break; case 't': wr = stpcpy(wr, token); break; - default: *wr++ = SUBST_CHAR; + default: *wr++ = SUBST_CHAR; /*@fallthrough@*/ case SUBST_CHAR: *wr++ = *it; } arg = ++it; @@ -394,6 +397,7 @@ static int execute_command() { struct sigaction siga; char port[20]; + const char *token; int rc; /* check whether a command is to execute or not */ @@ -424,8 +428,9 @@ static int execute_command() } else { /* instanciate arguments and environment */ - if (instanciate_command_args(port, config->token) >= 0 - && instanciate_environ(port, config->token) >= 0) { + token = afb_session_initial_token(); + if (instanciate_command_args(port, token) >= 0 + && instanciate_environ(port, token) >= 0) { /* run */ if (!SELF_PGROUP) setpgid(0, 0); @@ -450,11 +455,11 @@ struct startup_req struct afb_session *session; }; -static void startup_call_reply(struct afb_xreq *xreq, int iserror, struct json_object *obj) +static void startup_call_reply(struct afb_xreq *xreq, int status, struct json_object *obj) { struct startup_req *sreq = CONTAINER_OF_XREQ(struct startup_req, xreq); - if (!iserror) + if (status >= 0) NOTICE("startup call %s returned %s", sreq->current->value, json_object_get_string(obj)); else { ERROR("startup call %s ERROR! %s", sreq->current->value, json_object_get_string(obj)); @@ -471,7 +476,6 @@ static void startup_call_unref(struct afb_xreq *xreq) free(sreq->api); free(sreq->verb); json_object_put(sreq->xreq.json); - afb_cred_unref(sreq->xreq.cred); sreq->current = sreq->current->next; if (sreq->current) startup_call_current(sreq); @@ -497,11 +501,9 @@ static void startup_call_current(struct startup_req *sreq) if (verb) { json = strchr(verb, ':'); if (json) { - memset(&sreq->xreq, 0, sizeof sreq->xreq); afb_xreq_init(&sreq->xreq, &startup_xreq_itf); afb_context_init(&sreq->xreq.context, sreq->session, NULL); sreq->xreq.context.validated = 1; - sreq->xreq.cred = afb_cred_current(); sreq->api = strndup(api, verb - api); sreq->verb = strndup(verb + 1, json - verb - 1); sreq->xreq.api = sreq->api; @@ -535,10 +537,17 @@ static void run_startup_calls() | job for starting the daemon +--------------------------------------------------------- */ -static void start() +static void start(int signum) { struct afb_hsrv *hsrv; + afb_debug("start-entry"); + + if (signum) { + ERROR("start aborted: received signal %s", strsignal(signum)); + exit(1); + } + // ------------------ sanity check ---------------------------------------- if (config->httpdPort <= 0) { ERROR("no port is defined"); @@ -557,14 +566,18 @@ static void start() } /* configure the daemon */ - main_apiset = afb_apiset_create("main", config->apiTimeout, NULL); + 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; + } + main_apiset = afb_apiset_create("main", config->apiTimeout); if (!main_apiset) { ERROR("can't create main api set"); goto error; } - 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"); + if (afb_monitor_init() < 0) { + ERROR("failed to setup monitor"); goto error; } @@ -573,12 +586,18 @@ static void start() afb_hook_create_xreq(NULL, NULL, NULL, config->tracereq, NULL, NULL); if (config->traceditf) afb_hook_create_ditf(NULL, config->traceditf, NULL, NULL); + if (config->tracesvc) + afb_hook_create_svc(NULL, config->tracesvc, NULL, NULL); + if (config->traceevt) + afb_hook_create_evt(NULL, config->traceevt, NULL, NULL); /* load bindings */ + afb_debug("start-load"); + apiset_start_list(config->so_bindings, afb_api_so_add_binding, "the binding"); apiset_start_list(config->dbus_clients, afb_api_dbus_add_client, "the afb-dbus client"); apiset_start_list(config->ws_clients, afb_api_ws_add_client, "the afb-websocket client"); - apiset_start_list(config->ldpaths, afb_api_so_add_pathset, "the binding path set"); - apiset_start_list(config->so_bindings, afb_api_so_add_binding, "the binding"); + apiset_start_list(config->ldpaths, afb_api_so_add_pathset_fails, "the binding path set"); + apiset_start_list(config->weak_ldpaths, afb_api_so_add_pathset_nofails, "the weak binding path set"); apiset_start_list(config->dbus_servers, afb_api_dbus_add_server, "the afb-dbus service"); apiset_start_list(config->ws_servers, afb_api_ws_add_server, "the afb-websocket service"); @@ -586,25 +605,32 @@ static void start() DEBUG("Init config done"); /* start the services */ + afb_debug("start-start"); +#if !defined(NO_CALL_PERSONALITY) + personality((unsigned long)-1L); +#endif if (afb_apiset_start_all_services(main_apiset, 1) < 0) goto error; /* start the HTTP server */ + afb_debug("start-http"); if (!config->noHttpd) { hsrv = start_http_server(); if (hsrv == NULL) goto error; } + /* run the startup calls */ + afb_debug("start-call"); + run_startup_calls(); + /* run the command */ + afb_debug("start-exec"); if (execute_command() < 0) goto error; /* ready */ sd_notify(1, "READY=1"); - - /* run the startup calls */ - run_startup_calls(); return; error: exit(1); @@ -617,6 +643,8 @@ error: int main(int argc, char *argv[]) { + afb_debug("main-entry"); + // let's run this program with a low priority nice(20); @@ -624,7 +652,12 @@ int main(int argc, char *argv[]) // ------------- Build session handler & init config ------- config = afb_config_parse_arguments(argc, argv); - INFO("running with pid %d", getpid()); + if (config->name) { + verbose_set_name(config->name, 0); + process_name_set_name(config->name); + process_name_replace_cmdline(argv, config->name); + } + afb_debug("main-args"); // --------- run ----------- if (config->background) { @@ -635,10 +668,13 @@ int main(int argc, char *argv[]) // ---- in foreground mode -------------------- INFO("entering foreground mode"); } + INFO("running with pid %d", getpid()); /* set the daemon environment */ setup_daemon(); + afb_debug("main-start"); + /* enter job processing */ jobs_start(3, 0, 50, start); WARNING("hoops returned from jobs_enter! [report bug]");