*path++ = 0;
INFO("Alias for url=%s to path=%s", spec, path);
return afb_hsrv_add_alias(hsrv, spec, afb_common_rootdir_get_fd(), path,
- 0, 0);
+ 0, 1);
}
static int init_http_server(struct afb_hsrv *hsrv)
return 1;
}
+static int add_interface(void *closure, const char *value)
+{
+ struct afb_hsrv *hsrv = closure;
+ int rc;
+
+ rc = afb_hsrv_add_interface(hsrv, value);
+ return rc > 0;
+}
+
static struct afb_hsrv *start_http_server()
{
int rc;
- const char *uploaddir, *rootdir;
+ const char *uploaddir, *rootdir, *errs;
struct afb_hsrv *hsrv;
int cache_timeout, http_port;
+ struct json_object *junk;
- rc = wrap_json_unpack(main_config, "{ss ss si si}",
+ http_port = -1;
+ rc = wrap_json_unpack(main_config, "{ss ss si s?i}",
"uploaddir", &uploaddir,
"rootdir", &rootdir,
"cache-eol", &cache_timeout,
}
if (afb_hreq_init_download_path(uploaddir)) {
- ERROR("unable to set the upload directory %s", uploaddir);
- return NULL;
+ static const char fallback_uploaddir[] = "/tmp";
+ WARNING("unable to set the upload directory %s", uploaddir);
+ if (afb_hreq_init_download_path(fallback_uploaddir)) {
+ ERROR("unable to fallback to upload directory %s", fallback_uploaddir);
+ return NULL;
+ }
+ uploaddir = fallback_uploaddir;
}
hsrv = afb_hsrv_create();
return NULL;
}
- NOTICE("Waiting port=%d rootdir=%s", http_port, rootdir);
- NOTICE("Browser URL= http://localhost:%d", http_port);
-
rc = afb_hsrv_start(hsrv, 15);
if (!rc) {
ERROR("starting of httpd failed");
return NULL;
}
- rc = afb_hsrv_add_interface_tcp(hsrv, DEFAULT_BINDER_INTERFACE, (uint16_t) http_port);
- if (!rc) {
- ERROR("setting interface failed");
+ NOTICE("Serving rootdir=%s uploaddir=%s", rootdir, uploaddir);
+
+ /* check if port is set */
+ if (http_port < 0) {
+ /* not set, check existing interfaces */
+ if (!json_object_object_get_ex(main_config, "interface", &junk)) {
+ ERROR("No port and no interface ");
+ }
+ } else {
+ rc = afb_hsrv_add_interface_tcp(hsrv, DEFAULT_BINDER_INTERFACE, (uint16_t) http_port);
+ if (!rc) {
+ ERROR("setting interface failed");
+ afb_hsrv_put(hsrv);
+ return NULL;
+ }
+ NOTICE("Browser URL= http://localhost:%d", http_port);
+ }
+
+ errs = run_for_config_array_opt("interface", add_interface, hsrv);
+ if (errs) {
+ ERROR("setting interface %s failed", errs);
afb_hsrv_put(hsrv);
return NULL;
}
| 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;
}
static int execute_command()
{
- struct json_object *exec, *oport;
+ struct json_object *exec, *oport, *otok;
struct sigaction siga;
char port[20];
const char *token;
}
else {
/* instantiate arguments and environment */
- token = afb_session_initial_token();
+ if (json_object_object_get_ex(main_config, "token", &otok))
+ token = json_object_get_string(otok);
+ else
+ token = SUBST_STR"p";
args = instanciate_command_args(exec, port, token);
if (args && instanciate_environ(port, token) >= 0) {
/* run */
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, NULL, NULL);
sreq->api = strndup(api, verb - api);
sreq->verb = strndup(verb + 1, json - verb - 1);
sreq->xreq.request.called_api = sreq->api;
}
/* initialize session handling */
- if (afb_session_init(max_session_count, session_timeout, token)) {
+ if (afb_session_init(max_session_count, session_timeout)) {
ERROR("initialisation of session manager failed");
goto error;
}
goto error;
}
if (addenv_int("AFB_PORT", http_port)
- || addenv("AFB_TOKEN", afb_session_initial_token())) {
+ || addenv("AFB_TOKEN", token?:"")) {
ERROR("can't set HTTP environment");
goto error;
}
/* load bindings and apis */
afb_debug("start-load");
+#if WITH_DYNAMIC_BINDING
apiset_start_list("binding", afb_api_so_add_binding, "the binding");
apiset_start_list("ldpaths", afb_api_so_add_pathset_fails, "the binding path set");
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");
#if WITH_DBUS_TRANSPARENCY
apiset_start_list("dbus-client", afb_api_dbus_add_client, "the afb-dbus client");
/* run the command */
afb_debug("start-exec");
- if (execute_command() < 0)
+ if (execute_command(http_port, token) < 0)
goto error;
/* ready */
afb_debug("main-start");
/* enter job processing */
- jobs_start(3, 0, 50, start, NULL);
+ jobs_start(3, 0, 100, start, NULL);
WARNING("hoops returned from jobs_enter! [report bug]");
return 1;
}