X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-export.c;h=3cf1fc94fef624a75a2dde116c760ab4884935d5;hb=29ae81fa15c6080fd27929f4cc78e1289cb920e9;hp=b46e6a085251b3df3ab150c622c584d725a23316;hpb=60cd11786766ebc148b7ec088962dd6e112f8762;p=src%2Fapp-framework-binder.git diff --git a/src/afb-export.c b/src/afb-export.c index b46e6a08..3cf1fc94 100644 --- a/src/afb-export.c +++ b/src/afb-export.c @@ -345,9 +345,11 @@ static int require_api_cb(struct afb_api_x3 *closure, const char *name, int init char *iter, *end, save; /* emit a warning about unexpected require in preinit */ - if (export->state == Api_State_Pre_Init) - WARNING("[API %s] requiring apis in pre-init may lead to unexpected result (requires%s: %s)", - export->api.apiname, initialized ? " initialized" : "", name); + if (export->state == Api_State_Pre_Init && initialized) { + ERROR("[API %s] requiring initialized apis in pre-init is forbiden", export->api.apiname); + errno = EINVAL; + return -1; + } /* scan the names in a local copy */ rc = 0; @@ -367,10 +369,20 @@ static int require_api_cb(struct afb_api_x3 *closure, const char *name, int init *end = 0; /* check the required api */ - if (export->state == Api_State_Pre_Init) - rc2 = afb_apiset_require(export->declare_set, export->api.apiname, name); - else + if (export->state == Api_State_Pre_Init) { + rc2 = afb_apiset_require(export->declare_set, export->api.apiname, iter); + if (rc2 < 0) { + if (rc == 0) + WARNING("[API %s] requiring apis pre-init may lead to unexpected result", export->api.apiname); + ERROR("[API %s] requiring api %s in pre-init failed", export->api.apiname, iter); + } + } else { rc2 = -!((initialized ? afb_apiset_lookup_started : afb_apiset_lookup)(export->call_set, iter, 1)); + if (rc2 < 0) { + ERROR("[API %s] requiring api %s%s failed", export->api.apiname, + iter, initialized ? " initialized" : ""); + } + } if (rc2 < 0) rc = rc2; @@ -1238,10 +1250,20 @@ static void listener_of_events(void *closure, const char *event, int eventid, st json_object_put(object); } +static void listener_of_pushed_events(void *closure, const char *event, int eventid, struct json_object *object) +{ + listener_of_events(closure, event, eventid, object); +} + +static void listener_of_broadcasted_events(void *closure, const char *event, struct json_object *object, const uuid_binary_t uuid, uint8_t hop) +{ + listener_of_events(closure, event, 0, object); +} + /* the interface for events */ static const struct afb_evt_itf evt_itf = { - .broadcast = listener_of_events, - .push = listener_of_events + .broadcast = listener_of_broadcasted_events, + .push = listener_of_pushed_events }; /* ensure an existing listener */ @@ -1372,7 +1394,7 @@ static struct afb_export *create( return NULL; } lenapi = strlen(apiname); - export = calloc(1, sizeof *export + 1 + lenapi + (path == apiname || !path ? 0 : strlen(path))); + export = calloc(1, sizeof *export + 1 + lenapi + (path == apiname || !path ? 0 : 1 + strlen(path))); if (!export) errno = ENOMEM; else { @@ -1930,7 +1952,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; + afb_context_init_validated(context, export->session); }