Code Review
/
src
/
app-framework-binder.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
work in progress (tbf)
[src/app-framework-binder.git]
/
src
/
afb-apis.c
diff --git
a/src/afb-apis.c
b/src/afb-apis.c
index
effef8a
..
8fbd9fc
100644
(file)
--- a/
src/afb-apis.c
+++ b/
src/afb-apis.c
@@
-37,7
+37,7
@@
#include <sys/syscall.h>
#include <setjmp.h>
#include <sys/syscall.h>
#include <setjmp.h>
-#include "
../include/
local-def.h"
+#include "local-def.h"
#include "afb-req-itf.h"
#include "afb-apis.h"
#include "afb-req-itf.h"
#include "afb-apis.h"
@@
-49,6
+49,7
@@
struct api_desc {
void *handle; /* context of dlopen */
};
void *handle; /* context of dlopen */
};
+static int api_timeout = 15;
static struct api_desc *apis_array = NULL;
static int apis_count = 0;
static struct api_desc *apis_array = NULL;
static int apis_count = 0;
@@
-285,9
+286,9
@@
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;
// Check of apiurl is declare in this plugin and call it
extern __thread sigjmp_buf *error_handler;
-static
int callPluginApi(AFB_request * request
)
+static
void trapping_handle(AFB_request * request, struct json_object *(*cb)(AFB_request *,void*)
)
{
{
- volatile int s
tatus
, timerset;
+ volatile int s
ignum
, timerset;
timer_t timerid;
sigjmp_buf jmpbuf, *older;
struct sigevent sevp;
timer_t timerid;
sigjmp_buf jmpbuf, *older;
struct sigevent sevp;
@@
-296,43
+297,38
@@
static int callPluginApi(AFB_request * request)
// save context before calling the API
timerset = 0;
older = error_handler;
// save context before calling the API
timerset = 0;
older = error_handler;
- s
tatus
= setjmp(jmpbuf);
- if (s
tatus
!= 0) {
-
status = 0
;
+ s
ignum
= setjmp(jmpbuf);
+ if (s
ignum
!= 0) {
+
afb_req_fail_f(*request->areq, "aborted", "signal %d caught", signum)
;
}
else {
error_handler = &jmpbuf;
}
else {
error_handler = &jmpbuf;
- if (
request->config->apiT
imeout > 0) {
+ if (
api_t
imeout > 0) {
timerset = 1; /* TODO: check statuses */
sevp.sigev_notify = SIGEV_THREAD_ID;
sevp.sigev_signo = SIGALRM;
#if defined(sigev_notify_thread_id)
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 = syscall(SYS_gettid);
+ sevp.sigev_notify_thread_id =
(pid_t)
syscall(SYS_gettid);
#else
#else
- sevp._sigev_un._tid = syscall(SYS_gettid);
+ 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;
#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 =
15
;
+ its.it_value.tv_sec =
api_timeout
;
its.it_value.tv_nsec = 0;
timer_settime(timerid, 0, &its, NULL);
}
its.it_value.tv_nsec = 0;
timer_settime(timerid, 0, &its, NULL);
}
- //doCallPluginApi(request, apiidx, verbidx, context);
- status = 1;
+ cb(request, NULL);
}
if (timerset)
timer_delete(timerid);
error_handler = older;
}
if (timerset)
timer_delete(timerid);
error_handler = older;
-
- return status;
}
static void handle(struct afb_req req, const struct api_desc *api, const struct AFB_restapi *verb)
{
}
static void handle(struct afb_req req, const struct api_desc *api, const struct AFB_restapi *verb)
{
- json_object *jresp, *jcall, *jreqt;
-
AFB_request request;
request.uuid = request.url = "fake";
AFB_request request;
request.uuid = request.url = "fake";
@@
-357,7
+353,7
@@
static void handle(struct afb_req req, const struct api_desc *api, const struct
default:
break;
}
default:
break;
}
-
verb->callback(&request, NULL
);
+
trapping_handle(&request, verb->callback
);
if (verb->session == AFB_SESSION_CLOSE)
/*close*/;
if (verb->session == AFB_SESSION_CLOSE)
/*close*/;
@@
-369,20
+365,18
@@
int afb_apis_handle(struct afb_req req, const char *api, size_t lenapi, const ch
const struct api_desc *a;
const struct AFB_restapi *v;
const struct api_desc *a;
const struct AFB_restapi *v;
-//fprintf(stderr,"afb_apis_handle prefix:%.*s verb:%.*s\n",(int)lenapi,api,(int)lenverb,verb);
a = apis_array;
for (i = 0 ; i < apis_count ; i++, a++) {
if (a->prefixlen == lenapi && !strncasecmp(a->prefix, api, lenapi)) {
a = apis_array;
for (i = 0 ; i < apis_count ; i++, a++) {
if (a->prefixlen == lenapi && !strncasecmp(a->prefix, api, lenapi)) {
-//fprintf(stderr,"afb_apis_handle found prefix:%.*s -> %s\n",(int)lenapi,api,a->prefix);
v = a->plugin->apis;
for (j = 0 ; v->name ; j++, v++) {
if (!strncasecmp(v->name, verb, lenverb) && !v->name[lenverb]) {
v = a->plugin->apis;
for (j = 0 ; v->name ; j++, v++) {
if (!strncasecmp(v->name, verb, lenverb) && !v->name[lenverb]) {
-//fprintf(stderr,"afb_apis_handle found prefix:%.*s verb:%.*s -> %s/%s\n",(int)lenapi,api,(int)lenverb,verb,a->prefix,v->name);
handle(req, a, v);
return 1;
}
}
handle(req, a, v);
return 1;
}
}
- break;
+ afb_req_fail_f(req, "unknown-verb", "verb %.*s unknown within api %s", (int)lenverb, verb, a->prefix);
+ return 1;
}
}
return 0;
}
}
return 0;