X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-export.c;h=800ee77bdf9ee1adadddb5776acd6faa655c233e;hb=65353dce81a629e042800bb7b86fcd869a76727e;hp=b46e6a085251b3df3ab150c622c584d725a23316;hpb=60cd11786766ebc148b7ec088962dd6e112f8762;p=src%2Fapp-framework-binder.git diff --git a/src/afb-export.c b/src/afb-export.c index b46e6a08..800ee77b 100644 --- a/src/afb-export.c +++ b/src/afb-export.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016-2019 "IoT.bzh" + * Copyright (C) 2015-2020 "IoT.bzh" * Author: José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -41,7 +41,6 @@ #endif #include "afb-api-v3.h" #include "afb-common.h" -#include "afb-cred.h" #include "afb-evt.h" #include "afb-export.h" #include "afb-hook.h" @@ -49,6 +48,7 @@ #include "afb-session.h" #include "afb-xreq.h" #include "afb-calls.h" +#include "afb-error-text.h" #include "systemd.h" #include "jobs.h" @@ -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; @@ -1194,7 +1206,7 @@ static const struct afb_api_x3_itf hooked_api_x3_itf = { /* * Propagates the event to the service */ -static void listener_of_events(void *closure, const char *event, int eventid, struct json_object *object) +static void listener_of_events(void *closure, const char *event, uint16_t eventid, struct json_object *object) { const struct globset_handler *handler; void (*callback)(void *, const char*, struct json_object*, struct afb_api_x3*); @@ -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, uint16_t 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 { @@ -1796,12 +1818,12 @@ static void api_call_cb(void *closure, struct afb_xreq *xreq) afb_api_v3_process_call(export->desc.v3, xreq); break; default: - afb_xreq_reply(xreq, NULL, "bad-api-type", NULL); + afb_xreq_reply(xreq, NULL, afb_error_text_internal_error, NULL); break; } } -static struct json_object *api_describe_cb(void *closure) +static void api_describe_cb(void *closure, void (*describecb)(void *, struct json_object *), void *clocb) { struct afb_export *export = closure; struct json_object *result; @@ -1824,7 +1846,7 @@ static struct json_object *api_describe_cb(void *closure) result = NULL; break; } - return result; + describecb(clocb, result); } static int api_service_start_cb(void *closure) @@ -1915,12 +1937,12 @@ void afb_export_undeclare(struct afb_export *export) int afb_export_subscribe(struct afb_export *export, struct afb_event_x2 *event) { - return afb_evt_event_x2_add_watch(export->listener, event); + return afb_evt_listener_watch_x2(export->listener, event); } int afb_export_unsubscribe(struct afb_export *export, struct afb_event_x2 *event) { - return afb_evt_event_x2_remove_watch(export->listener, event); + return afb_evt_listener_unwatch_x2(export->listener, event); } void afb_export_process_xreq(struct afb_export *export, struct afb_xreq *xreq) @@ -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, NULL, NULL); }