X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=d605f2b01469ff85fd2ce7a72cec41041b1f8196;hb=66451a0d658eabab18f37995659d81d429e0138e;hp=32b12dd308f5ec2d33d97c674c0dba79a0051b89;hpb=52d837d3964307375018c728120ed649ef0fbb8c;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 32b12dd3..d605f2b0 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,25 +31,22 @@ #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 "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" @@ -57,6 +56,8 @@ */ #define SELF_PGROUP 1 +struct afb_apiset *main_apiset; + static struct afb_config *config; static pid_t childpid; @@ -82,12 +83,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) { @@ -112,6 +113,7 @@ 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) @@ -214,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)) @@ -446,9 +448,9 @@ struct startup_req struct afb_session *session; }; -static void startup_call_reply(void *closure, int iserror, struct json_object *obj) +static void startup_call_reply(struct afb_xreq *xreq, int iserror, struct json_object *obj) { - struct startup_req *sreq = closure; + struct startup_req *sreq = CONTAINER_OF_XREQ(struct startup_req, xreq); if (!iserror) NOTICE("startup call %s returned %s", sreq->current->value, json_object_get_string(obj)); @@ -460,9 +462,9 @@ static void startup_call_reply(void *closure, int iserror, struct json_object *o static void startup_call_current(struct startup_req *sreq); -static void startup_call_unref(void *closure) +static void startup_call_unref(struct afb_xreq *xreq) { - struct startup_req *sreq = closure; + struct startup_req *sreq = CONTAINER_OF_XREQ(struct startup_req, xreq); free(sreq->api); free(sreq->verb); @@ -492,20 +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->api = strndup(api, verb - api); - sreq->xreq.api = sreq->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); - sreq->xreq.refcount = 1; - sreq->xreq.query = sreq; - sreq->xreq.queryitf = &startup_xreq_itf; 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; } } @@ -554,12 +552,20 @@ 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) @@ -568,18 +574,18 @@ static void start() afb_hook_create_ditf(NULL, config->traceditf, 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"); + 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) + if (afb_apiset_start_all_services(main_apiset, 1) < 0) goto error; /* start the HTTP server */