X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=b5d92814d765fd3bffd449e399e89950386bc86b;hb=3634c468ec7de94f6911c532a606625418fa5133;hp=32b12dd308f5ec2d33d97c674c0dba79a0051b89;hpb=52d837d3964307375018c728120ed649ef0fbb8c;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 32b12dd3..b5d92814 100644 --- a/src/main.c +++ b/src/main.c @@ -20,7 +20,8 @@ #define NO_BINDING_VERBOSE_MACRO #include -#include +#include +#include #include #include #include @@ -29,19 +30,15 @@ #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" @@ -57,6 +54,8 @@ */ #define SELF_PGROUP 1 +struct afb_apiset *main_apiset; + static struct afb_config *config; static pid_t childpid; @@ -82,12 +81,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 +111,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 +214,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 +446,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 +460,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 +492,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,7 +550,11 @@ static void start() } /* configure the daemon */ - afb_apis_set_timeout(config->apiTimeout); + 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"); @@ -568,18 +568,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 */