afb-stub-ws: Enforce asynchronous describe
[src/app-framework-binder.git] / src / afb-apiset.c
index 2df3c59..9fddd46 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016, 2017, 2018 "IoT.bzh"
+ * Copyright (C) 2016-2019 "IoT.bzh"
  * Author José Bollo <jose.bollo@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <stdint.h>
 
-#include "afb-session.h"
 #include "verbose.h"
 #include "afb-api.h"
 #include "afb-apiset.h"
 #include "afb-context.h"
 #include "afb-xreq.h"
+#include "jobs.h"
 
 #define INCR 8         /* CAUTION: must be a power of 2 */
 
@@ -73,7 +74,7 @@ struct api_alias
 {
        struct api_alias *next;
        struct api_desc *api;
-       char name[1];
+       char name[];
 };
 
 /**
@@ -83,7 +84,7 @@ struct api_class
 {
        struct api_class *next;
        struct api_array providers;
-       char name[1];
+       char name[];
 };
 
 /**
@@ -92,7 +93,7 @@ struct api_class
 struct api_depend
 {
        struct afb_apiset *set;
-       char name[1];
+       char name[];
 };
 
 /**
@@ -110,7 +111,7 @@ struct afb_apiset
        } onlack;                       /** not found handler */
        int timeout;                    /**< the timeout in second for the apiset */
        int refcount;                   /**< reference count for freeing resources */
-       char name[1];                   /**< name of the apiset */
+       char name[];                    /**< name of the apiset */
 };
 
 /**
@@ -215,7 +216,7 @@ static struct api_class *class_search(const char *name, int create)
        if (!create)
                return NULL;
 
-       c = calloc(1, strlen(name) + sizeof *c);
+       c = calloc(1, strlen(name) + 1 + sizeof *c);
        if (!c)
                errno = ENOMEM;
        else {
@@ -341,7 +342,7 @@ struct afb_apiset *afb_apiset_create(const char *name, int timeout)
 {
        struct afb_apiset *set;
 
-       set = calloc(1, (name ? strlen(name) : 0) + sizeof *set);
+       set = calloc(1, (name ? strlen(name) : 0) + 1 + sizeof *set);
        if (set) {
                set->timeout = timeout;
                set->refcount = 1;
@@ -545,7 +546,7 @@ int afb_apiset_add_alias(struct afb_apiset *set, const char *name, const char *a
        }
 
        /* allocates and init the struct */
-       ali = malloc(sizeof *ali + strlen(alias));
+       ali = malloc(sizeof *ali + strlen(alias) + 1);
        if (ali == NULL) {
                ERROR("out of memory");
                errno = ENOMEM;
@@ -870,6 +871,7 @@ int afb_apiset_start_all_services(struct afb_apiset *set)
        return ret;
 }
 
+#if WITH_AFB_HOOK
 /**
  * Ask to update the hook flags of the 'api'
  * @param set the api set
@@ -893,6 +895,7 @@ void afb_apiset_update_hooks(struct afb_apiset *set, const char *name)
                        d->api.itf->update_hooks(d->api.closure);
        }
 }
+#endif
 
 /**
  * Set the logmask of the 'api' to 'mask'
@@ -939,20 +942,25 @@ int afb_apiset_get_logmask(struct afb_apiset *set, const char *name)
        return i->api.itf->get_logmask(i->api.closure);
 }
 
-/**
- * Get the description of the API of 'name'
- * @param set the api set
- * @param name the api whose description is required
- * @return the description or NULL
- */
-struct json_object *afb_apiset_describe(struct afb_apiset *set, const char *name)
+void afb_apiset_describe(struct afb_apiset *set, const char *name, void (*describecb)(void *, struct json_object *), void *closure)
 {
        const struct api_desc *i;
-
-       i = name ? searchrec(set, name) : NULL;
-       return i && i->api.itf->describe ? i->api.itf->describe(i->api.closure) : NULL;
+       struct json_object *r;
+
+       r = NULL;
+       if (name) {
+               i = searchrec(set, name);
+               if (i) {
+                       if (i->api.itf->describe) {
+                               i->api.itf->describe(i->api.closure, describecb, closure);
+                               return;
+                       }
+               }
+       }
+       describecb(closure, r);
 }
 
+
 struct get_names {
        union  {
                struct {
@@ -1077,7 +1085,7 @@ int afb_apiset_require(struct afb_apiset *set, const char *name, const char *req
        if (!a)
                errno = ENOENT;
        else {
-               d = malloc(strlen(required) + sizeof *d);
+               d = malloc(strlen(required) + 1 + sizeof *d);
                if (!d)
                        errno = ENOMEM;
                else {