afb-export: Manage path of libraries
[src/app-framework-binder.git] / src / afb-api-v3.c
index 11bc35f..660fac1 100644 (file)
@@ -179,23 +179,25 @@ struct json_object *afb_api_v3_make_description_openAPIv3(struct afb_api_v3 *api
        return r;
 }
 
-struct afb_api_v3 *afb_api_v3_create(
-               struct afb_apiset *declare_set,
+struct afb_api_v3 *afb_api_v3_create(struct afb_apiset *declare_set,
                struct afb_apiset *call_set,
                const char *apiname,
                const char *info,
                int noconcurrency,
                int (*preinit)(void*, struct afb_api_x3 *),
                void *closure,
-               int copy_info
-)
+               int copy_info,
+               struct afb_export* creator,
+               const char* path)
 {
        struct afb_api_v3 *api;
 
        /* allocates the description */
        api = calloc(1, sizeof *api + (copy_info && info ? 1 + strlen(info) : 0));
-       if (!api)
+       if (!api) {
+               ERROR("out of memory");
                goto oom;
+       }
        api->refcount = 1;
        if (!info)
                api->info = &nulchar;
@@ -204,7 +206,7 @@ struct afb_api_v3 *afb_api_v3_create(
        else
                api->info = info;
 
-       api->export = afb_export_create_v3(declare_set, call_set, apiname, api);
+       api->export = afb_export_create_v3(declare_set, call_set, apiname, api, creator, path);
        if (!api->export)
                goto oom2;
 
@@ -223,7 +225,6 @@ oom3:
 oom2:
        free(api);
 oom:
-       ERROR("out of memory");
        return NULL;
 }
 
@@ -238,6 +239,9 @@ void afb_api_v3_unref(struct afb_api_v3 *api)
 {
        if (api && !__atomic_sub_fetch(&api->refcount, 1, __ATOMIC_RELAXED)) {
                afb_export_destroy(api->export);
+               while (api->count)
+                       free(api->verbs[--api->count]);
+               free(api->verbs);
                free(api);
        }
 }
@@ -321,19 +325,16 @@ int afb_api_v3_del_verb(
                const char *verb,
                void **vcbdata)
 {
-       struct afb_verb_v3 **v, **e, *i;
+       struct afb_verb_v3 *v;
+       int i;
 
-       v = api->verbs;
-       e = &v[api->count];
-       while (v != e) {
-               i = *v++;
-               if (!strcasecmp(i->verb, verb)) {
-                       api->count--;
+       for (i = 0 ; i < api->count ; i++) {
+               v = api->verbs[i];
+               if (!strcasecmp(verb, v->verb)) {
+                       api->verbs[i] = api->verbs[--api->count];
                        if (vcbdata)
-                               *vcbdata = i->vcbdata;
-                       if (v != e)
-                               *--v = *--e;
-                       free(i);
+                               *vcbdata = v->vcbdata;
+                       free(v);
                        return 0;
                }
        }
@@ -399,6 +400,6 @@ static int init_binding(void *closure, struct afb_api_x3 *api)
 
 struct afb_api_v3 *afb_api_v3_from_binding(const struct afb_binding_v3 *desc, struct afb_apiset *declare_set, struct afb_apiset * call_set)
 {
-       return afb_api_v3_create(declare_set, call_set, desc->api, desc->info, desc->noconcurrency, init_binding, (void*)desc, 0);
+       return afb_api_v3_create(declare_set, call_set, desc->api, desc->info, desc->noconcurrency, init_binding, (void*)desc, 0, NULL, NULL);
 }