X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-api-v3.c;h=11bc35ff244819552e83031857c621b67e0c232b;hb=10ac2105ecc20251b13bdc6f6c78c3e2edb8dfef;hp=8c755f9430050c19d8e67918bae8d63cf0c7321d;hpb=4521c1e7ae5371ab9d639adc617d17fb4e8ded0c;p=src%2Fapp-framework-binder.git diff --git a/src/afb-api-v3.c b/src/afb-api-v3.c index 8c755f94..11bc35ff 100644 --- a/src/afb-api-v3.c +++ b/src/afb-api-v3.c @@ -35,6 +35,7 @@ #include "afb-export.h" #include "afb-xreq.h" #include "verbose.h" +#include "sig-monitor.h" /* * Description of a binding @@ -119,11 +120,34 @@ void afb_api_v3_process_call(struct afb_api_v3 *api, struct afb_xreq *xreq) afb_xreq_reply_unknown_verb(xreq); } +static struct json_object *describe_verb_v3(const struct afb_verb_v3 *verb) +{ + struct json_object *f, *a, *g; + + f = json_object_new_object(); + + g = json_object_new_object(); + json_object_object_add(f, "get", g); + + a = afb_auth_json_v2(verb->auth, verb->session); + if (a) + json_object_object_add(g, "x-permissions", a); + + a = json_object_new_object(); + json_object_object_add(g, "responses", a); + g = json_object_new_object(); + json_object_object_add(a, "200", g); + json_object_object_add(g, "description", json_object_new_string(verb->info?:verb->verb)); + + return f; +} + struct json_object *afb_api_v3_make_description_openAPIv3(struct afb_api_v3 *api, const char *apiname) { char buffer[256]; - struct afb_verb_v3 **iter, **end, *verb; - struct json_object *r, *f, *a, *i, *p, *g; + struct afb_verb_v3 **iter, **end; + const struct afb_verb_v3 *verb; + struct json_object *r, *i, *p; r = json_object_new_object(); json_object_object_add(r, "openapi", json_object_new_string("3.0.0")); @@ -142,22 +166,16 @@ struct json_object *afb_api_v3_make_description_openAPIv3(struct afb_api_v3 *api verb = *iter++; buffer[0] = '/'; strncpy(buffer + 1, verb->verb, sizeof buffer - 1); - buffer[sizeof buffer - 1] = 0; - f = json_object_new_object(); - json_object_object_add(p, buffer, f); - g = json_object_new_object(); - json_object_object_add(f, "get", g); - - a = afb_auth_json_v2(verb->auth, verb->session); - if (a) - json_object_object_add(g, "x-permissions", a); - - a = json_object_new_object(); - json_object_object_add(g, "responses", a); - f = json_object_new_object(); - json_object_object_add(a, "200", f); - json_object_object_add(f, "description", json_object_new_string(verb->info?:verb->verb)); + json_object_object_add(p, buffer, describe_verb_v3(verb)); } + verb = api->verbsv3; + if (verb) + while(verb->verb) { + buffer[0] = '/'; + strncpy(buffer + 1, verb->verb, sizeof buffer - 1); + json_object_object_add(p, buffer, describe_verb_v3(verb)); + verb++; + } return r; } @@ -342,12 +360,40 @@ int afb_api_v3_set_binding_fields(const struct afb_binding_v3 *desc, struct afb_ return rc; } +struct safe_preinit_data +{ + int (*preinit)(struct afb_api_x3 *); + struct afb_api_x3 *api; + int result; +}; + +static void safe_preinit(int sig, void *closure) +{ + struct safe_preinit_data *spd = closure; + if (!sig) + spd->result = spd->preinit(spd->api); + else { + spd->result = -1; + errno = EFAULT; + } +} + +int afb_api_v3_safe_preinit(struct afb_api_x3 *api, int (*preinit)(struct afb_api_x3 *)) +{ + struct safe_preinit_data spd; + + spd.preinit = preinit; + spd.api = api; + sig_monitor(60, safe_preinit, &spd); + return spd.result; +} + static int init_binding(void *closure, struct afb_api_x3 *api) { const struct afb_binding_v3 *desc = closure; int rc = afb_api_v3_set_binding_fields(desc, api); if (!rc && desc->preinit) - rc = desc->preinit(api); + rc = afb_api_v3_safe_preinit(api, desc->preinit); return rc; }