Update copyright dates
[src/app-framework-binder.git] / src / afb-export.c
index 8ebe8e0..800ee77 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016-2019 "IoT.bzh"
+ * Copyright (C) 2015-2020 "IoT.bzh"
  * Author: José Bollo <jose.bollo@iot.bzh>
  *
  * 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"
@@ -170,7 +170,7 @@ struct afb_export
        } export;
 
        /* initial name */
-       char name[1];
+       char name[];
 };
 
 /*****************************************************************************/
@@ -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 + 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);
 }