X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=a989a702ff30d7a64786a31c94558225e58d3e2c;hb=846e952260278225b79de4062fff1f8f2145a544;hp=6684ed5e98928ff2dde58e96150fbd3e64c75635;hpb=a138fda9841c46e28de93e32aee62956e26556b1;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 6684ed5e..a989a702 100644 --- a/src/main.c +++ b/src/main.c @@ -17,10 +17,12 @@ */ #define _GNU_SOURCE -#define NO_BINDING_VERBOSE_MACRO +#define AFB_BINDING_PRAGMA_NO_VERBOSE_MACRO #include #include +#include +#include #include #include #include @@ -29,28 +31,25 @@ #include -#include #include -#include - #include "afb-config.h" #include "afb-hswitch.h" -#include "afb-apis.h" +#include "afb-apiset.h" #include "afb-api-so.h" #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" /* if SELF_PGROUP == 0 the launched command is the group leader @@ -58,6 +57,8 @@ */ #define SELF_PGROUP 1 +struct afb_apiset *main_apiset; + static struct afb_config *config; static pid_t childpid; @@ -83,12 +84,12 @@ static struct afb_config_list *run_for_list(struct afb_config_list *list, static int run_start(void *closure, char *value) { - int (*starter) (const char *value) = closure; - return starter(value) >= 0; + int (*starter) (const char *value, struct afb_apiset *apiset) = closure; + return starter(value, main_apiset) >= 0; } -static void start_list(struct afb_config_list *list, - int (*starter) (const char *value), const char *message) +static void apiset_start_list(struct afb_config_list *list, + int (*starter) (const char *value, struct afb_apiset *apiset), const char *message) { list = run_for_list(list, run_start, starter); if (list) { @@ -215,11 +216,11 @@ static int init_alias(void *closure, char *spec) static int init_http_server(struct afb_hsrv *hsrv) { if (!afb_hsrv_add_handler - (hsrv, config->rootapi, afb_hswitch_websocket_switch, NULL, 20)) + (hsrv, config->rootapi, afb_hswitch_websocket_switch, main_apiset, 20)) return 0; if (!afb_hsrv_add_handler - (hsrv, config->rootapi, afb_hswitch_apis, NULL, 10)) + (hsrv, config->rootapi, afb_hswitch_apis, main_apiset, 10)) return 0; if (run_for_list(config->aliases, init_alias, hsrv)) @@ -447,11 +448,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)); @@ -468,7 +469,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); @@ -494,19 +494,16 @@ 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; sreq->xreq.verb = sreq->verb; sreq->xreq.json = json_tokener_parse(json + 1); if (sreq->api && sreq->verb && sreq->xreq.json) { - afb_apis_call(&sreq->xreq); - afb_xreq_unref(&sreq->xreq); + afb_xreq_process(&sreq->xreq, main_apiset); return; } } @@ -533,10 +530,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"); @@ -555,50 +559,67 @@ static void start() } /* 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; } + main_apiset = afb_apiset_create("main", config->apiTimeout); + if (!main_apiset) { + ERROR("can't create main api set"); + goto error; + } + if (afb_monitor_init() < 0) { + ERROR("failed to setup monitor"); + goto error; + } /* 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); + 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 */ - 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_debug("start-load"); + 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"); - 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"); + 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"); DEBUG("Init config done"); /* start the services */ - if (afb_apis_start_all_services(1) < 0) + afb_debug("start-start"); + 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); @@ -611,6 +632,8 @@ error: int main(int argc, char *argv[]) { + afb_debug("main-entry"); + // let's run this program with a low priority nice(20); @@ -618,7 +641,8 @@ int main(int argc, char *argv[]) // ------------- Build session handler & init config ------- config = afb_config_parse_arguments(argc, argv); - INFO("running with pid %d", getpid()); + + afb_debug("main-args"); // --------- run ----------- if (config->background) { @@ -629,10 +653,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]");