X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-export.c;h=e9d5d9ad08a21617655f5f536b97ccc6e693994f;hb=b4455a71edcf9030c3b64c8bc13f9d50f1624aa4;hp=fbf77f8660b541822a2cef01a3b23ee99a9710f8;hpb=4521c1e7ae5371ab9d639adc617d17fb4e8ded0c;p=src%2Fapp-framework-binder.git diff --git a/src/afb-export.c b/src/afb-export.c index fbf77f86..e9d5d9ad 100644 --- a/src/afb-export.c +++ b/src/afb-export.c @@ -24,6 +24,9 @@ #include #include +#if !defined(JSON_C_TO_STRING_NOSLASHESCAPE) +#define JSON_C_TO_STRING_NOSLASHESCAPE 0 +#endif #define AFB_BINDING_VERSION 0 #include @@ -47,6 +50,7 @@ #include "afb-calls.h" #include "jobs.h" #include "verbose.h" +#include "sig-monitor.h" /************************************************************************* * internal types @@ -251,7 +255,8 @@ static int event_broadcast_cb(struct afb_api_x3 *closure, const char *name, stru /* check daemon state */ if (export->state == Api_State_Pre_Init) { - ERROR("[API %s] Bad call to 'afb_daemon_event_broadcast(%s, %s)', must not be in PreInit", export->api.apiname, name, json_object_to_json_string(object)); + ERROR("[API %s] Bad call to 'afb_daemon_event_broadcast(%s, %s)', must not be in PreInit", + export->api.apiname, name, json_object_to_json_string_ext(object, JSON_C_TO_STRING_NOSLASHESCAPE)); errno = EINVAL; return 0; } @@ -1148,7 +1153,7 @@ int afb_export_event_handler_add( } /* create the event */ - handler = malloc(strlen(pattern) + strlen(pattern)); + handler = malloc(strlen(pattern) + sizeof * handler); if (!handler) { ERROR("[API %s] can't allocate event handler %s", export->api.apiname, pattern); errno = ENOMEM; @@ -1160,7 +1165,7 @@ int afb_export_event_handler_add( handler->callback = callback; handler->closure = closure; strcpy(handler->pattern, pattern); - export->event_handlers = handler; + *previous = handler; return 0; } @@ -1511,28 +1516,63 @@ void afb_export_userdata_set(struct afb_export *export, void *data) ****************************************************************************** ******************************************************************************/ -int afb_export_start(struct afb_export *export, int share_session, int onneed) +struct init +{ + int return_code; + struct afb_export *export; +}; + +static void do_init(int sig, void *closure) { + int rc = -1; + struct init *init = closure; + struct afb_export *export; + + if (sig) + errno = EFAULT; + else { + export = init->export; + switch (export->version) { +#if defined(WITH_LEGACY_BINDING_V1) + case Api_Version_1: + rc = export->init.v1 ? export->init.v1( + (struct afb_service_x1){ + .itf = &hooked_service_itf, + .closure = to_api_x3(export) }) : 0; + break; +#endif + case Api_Version_2: + rc = export->init.v2 ? export->init.v2() : 0; + break; + case Api_Version_3: + rc = export->init.v3 ? export->init.v3(to_api_x3(export)) : 0; + break; + default: + errno = EINVAL; + break; + } + } + init->return_code = rc; +}; + + +int afb_export_start(struct afb_export *export) +{ + struct init init; int rc; /* check state */ - if (export->state != Api_State_Pre_Init) { - /* not an error when onneed */ - if (onneed != 0) - goto done; + switch (export->state) { + case Api_State_Run: + return 0; - /* already started: it is an error */ - ERROR("Service of API %s already started", export->api.apiname); + case Api_State_Init: + /* starting in progress: it is an error */ + ERROR("Service of API %s required started while starting", export->api.apiname); return -1; - } - /* unshare the session if asked */ - if (!share_session) { - rc = afb_export_unshare_session(export); - if (rc < 0) { - ERROR("Can't unshare the session for %s", export->api.apiname); - return -1; - } + default: + break; } /* set event handling */ @@ -1541,9 +1581,11 @@ int afb_export_start(struct afb_export *export, int share_session, int onneed) case Api_Version_1: #endif case Api_Version_2: - if (export->on_any_event_v12) + if (export->on_any_event_v12) { rc = afb_export_handle_events_v12(export, export->on_any_event_v12); - break; + break; + } + /*@fallthrough@*/ default: rc = 0; break; @@ -1558,23 +1600,9 @@ int afb_export_start(struct afb_export *export, int share_session, int onneed) afb_hook_api_start_before(export); export->state = Api_State_Init; - switch (export->version) { -#if defined(WITH_LEGACY_BINDING_V1) - case Api_Version_1: - rc = export->init.v1 ? export->init.v1((struct afb_service_x1){ .itf = &hooked_service_itf, .closure = to_api_x3(export) }) : 0; - break; -#endif - case Api_Version_2: - rc = export->init.v2 ? export->init.v2() : 0; - break; - case Api_Version_3: - rc = export->init.v3 ? export->init.v3(to_api_x3(export)) : 0; - break; - default: - errno = EINVAL; - rc = -1; - break; - } + init.export = export; + sig_monitor(0, do_init, &init); + rc = init.return_code; export->state = Api_State_Run; if (export->hooksvc & afb_hook_flag_api_start) @@ -1586,7 +1614,6 @@ int afb_export_start(struct afb_export *export, int share_session, int onneed) return rc; } -done: return 0; } @@ -1638,11 +1665,11 @@ static struct json_object *api_describe_cb(void *closure) return result; } -static int api_service_start_cb(void *closure, int share_session, int onneed) +static int api_service_start_cb(void *closure) { struct afb_export *export = closure; - return afb_export_start(export, share_session, onneed); + return afb_export_start(export); } static void api_update_hooks_cb(void *closure) @@ -1739,5 +1766,6 @@ void afb_export_process_xreq(struct afb_export *export, struct afb_xreq *xreq) void afb_export_context_init(struct afb_export *export, struct afb_context *context) { afb_context_init(context, export->session, NULL); + context->validated = 1; }