X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-apis.c;h=7dcb101ade2bec61ae7d4bcd4c330e3fda1849ea;hb=70558f02b1c030c4290a0146313e3052fc0ea715;hp=3dcad65156fa668d46779299bd4909cefb51e983;hpb=ca208671cc79bbc05c574df788035878e5d39382;p=src%2Fapp-framework-binder.git diff --git a/src/afb-apis.c b/src/afb-apis.c index 3dcad651..7dcb101a 100644 --- a/src/afb-apis.c +++ b/src/afb-apis.c @@ -32,9 +32,14 @@ #include #include #include +#include +#include +#include +#include -#include "../include/local-def.h" +#include "local-def.h" +#include "afb-req-itf.h" #include "afb-apis.h" struct api_desc { @@ -44,6 +49,7 @@ struct api_desc { void *handle; /* context of dlopen */ }; +static int api_timeout = 15; static struct api_desc *apis_array = NULL; static int apis_count = 0; @@ -278,3 +284,91 @@ int afb_apis_add_pathset(const char *pathset) }; } +// Check of apiurl is declare in this plugin and call it +extern __thread sigjmp_buf *error_handler; +static void trapping_handle(struct afb_req req, void(*cb)(struct afb_req)) +{ + volatile int signum, timerset; + timer_t timerid; + sigjmp_buf jmpbuf, *older; + struct sigevent sevp; + struct itimerspec its; + + // save context before calling the API + timerset = 0; + older = error_handler; + signum = setjmp(jmpbuf); + if (signum != 0) { + afb_req_fail_f(req, "aborted", "signal %d caught", signum); + } + else { + error_handler = &jmpbuf; + if (api_timeout > 0) { + timerset = 1; /* TODO: check statuses */ + sevp.sigev_notify = SIGEV_THREAD_ID; + sevp.sigev_signo = SIGALRM; +#if defined(sigev_notify_thread_id) + sevp.sigev_notify_thread_id = (pid_t)syscall(SYS_gettid); +#else + sevp._sigev_un._tid = (pid_t)syscall(SYS_gettid); +#endif + timer_create(CLOCK_THREAD_CPUTIME_ID, &sevp, &timerid); + its.it_interval.tv_sec = 0; + its.it_interval.tv_nsec = 0; + its.it_value.tv_sec = api_timeout; + its.it_value.tv_nsec = 0; + timer_settime(timerid, 0, &its, NULL); + } + + cb(req); + } + if (timerset) + timer_delete(timerid); + error_handler = older; +} + +static void handle(struct afb_req req, const struct api_desc *api, const struct AFB_restapi *verb) +{ + switch(verb->session) { + case AFB_SESSION_CREATE: + case AFB_SESSION_RENEW: + /*if (check) new*/ + break; + case AFB_SESSION_CLOSE: + case AFB_SESSION_CHECK: + /*check*/ + break; + case AFB_SESSION_NONE: + default: + req.context = NULL; + break; + } + trapping_handle(req, verb->callback); + + if (verb->session == AFB_SESSION_CLOSE) + /*close*/; +} + +int afb_apis_handle(struct afb_req req, const char *api, size_t lenapi, const char *verb, size_t lenverb) +{ + int i, j; + const struct api_desc *a; + const struct AFB_restapi *v; + + a = apis_array; + for (i = 0 ; i < apis_count ; i++, a++) { + if (a->prefixlen == lenapi && !strncasecmp(a->prefix, api, lenapi)) { + v = a->plugin->apis; + for (j = 0 ; v->name ; j++, v++) { + if (!strncasecmp(v->name, verb, lenverb) && !v->name[lenverb]) { + handle(req, a, v); + return 1; + } + } + afb_req_fail_f(req, "unknown-verb", "verb %.*s unknown within api %s", (int)lenverb, verb, a->prefix); + return 1; + } + } + return 0; +} +