# include "afb-api-dbus.h"
#endif
#include "afb-api-ws.h"
+#include "afb-api-js.h"
#include "afb-hsrv.h"
#include "afb-hreq.h"
#include "afb-xreq.h"
| execute_command
+--------------------------------------------------------- */
-static void wait_child_and_exit()
+static void exit_at_end()
{
+ exit(0);
+}
+
+static void wait_child(int signum, void* arg)
+{
+ pid_t pid = (pid_t)(intptr_t)arg;
pid_t pidchld = childpid;
- childpid = 0;
- if (!SELF_PGROUP)
- killpg(pidchld, SIGKILL);
- waitpid(pidchld, NULL, 0);
- exit(0);
+ if (pidchld == pid) {
+ childpid = 0;
+ if (!SELF_PGROUP)
+ killpg(pidchld, SIGKILL);
+ waitpid(pidchld, NULL, 0);
+ jobs_exit(exit_at_end);
+ } else {
+ waitpid(pid, NULL, 0);
+ }
}
static void on_sigchld(int signum, siginfo_t *info, void *uctx)
case CLD_EXITED:
case CLD_KILLED:
case CLD_DUMPED:
- jobs_exit(wait_child_and_exit);
+ jobs_queue_lazy(0, 0, wait_child, (void*)(intptr_t)info->si_pid);
default:
break;
}
json = strchr(verb, ':');
if (json) {
afb_xreq_init(&sreq->xreq, &startup_xreq_itf);
- afb_context_init(&sreq->xreq.context, sreq->session, NULL);
- sreq->xreq.context.validated = 1;
+ afb_context_init_validated(&sreq->xreq.context, sreq->session);
sreq->api = strndup(api, verb - api);
sreq->verb = strndup(verb + 1, json - verb - 1);
sreq->xreq.request.called_api = sreq->api;
apiset_start_list("weak-ldpaths", afb_api_so_add_pathset_nofails, "the weak binding path set");
#endif
apiset_start_list("auto-api", afb_autoset_add_any, "the automatic api path set");
+ apiset_start_list("jsapi", afb_api_js_add, "the jsapi");
#if WITH_DBUS_TRANSPARENCY
apiset_start_list("dbus-client", afb_api_dbus_add_client, "the afb-dbus client");
#endif