*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,
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;
}
#define SUBST_CHAR '@'
#define SUBST_STR "@"
-static char *instanciate_string(const char *arg, const char *port, const char *token)
+static char *instanciate_string(char *arg, const char *port, const char *token)
{
- char *resu, *it, *wr;
+ char *resu, *it, *wr, c;
int chg, dif;
/* get the changes */
dif = 0;
it = strchrnul(arg, SUBST_CHAR);
while (*it) {
- switch(*++it) {
- case 'p': chg++; dif += (int)strlen(port) - 2; break;
- case 't': chg++; dif += (int)strlen(token) - 2; break;
- case SUBST_CHAR: it++; chg++; dif--; break;
- default: break;
+ c = *++it;
+ if (c == 'p' && port) {
+ chg++;
+ dif += (int)strlen(port) - 2;
+ } else if (c == 't' && token) {
+ chg++;
+ dif += (int)strlen(token) - 2;
+ } else if (c == SUBST_CHAR) {
+ it++;
+ chg++;
+ dif--;
}
it = strchrnul(it, SUBST_CHAR);
}
/* return arg when no change */
if (!chg)
- return strdup(arg);
+ return arg;
/* allocates the result */
resu = malloc((it - arg) + dif + 1);
wr = mempcpy(wr, arg, it - arg);
if (!*it)
break;
- switch(*++it) {
- case 'p': wr = stpcpy(wr, port); break;
- case 't': wr = stpcpy(wr, token); break;
- default: *wr++ = SUBST_CHAR; /*@fallthrough@*/
- case SUBST_CHAR: *wr++ = *it;
+ c = *++it;
+ if (c == 'p' && port)
+ wr = stpcpy(wr, port);
+ else if (c == 't' && token)
+ wr = stpcpy(wr, token);
+ else {
+ if (c != SUBST_CHAR)
+ *wr++ = SUBST_CHAR;
+ *wr++ = *it;
}
arg = ++it;
}
static char **instanciate_command_args(struct json_object *exec, const char *port, const char *token)
{
char **result;
- char *repl;
+ char *repl, *item;
int i, n;
/* allocates the result */
/* instanciate the arguments */
for (i = 0 ; i < n ; i++) {
- repl = instanciate_string(json_object_get_string(json_object_array_get_idx(exec, i)), port, token);
+ item = (char*)json_object_get_string(json_object_array_get_idx(exec, i));
+ repl = instanciate_string(item, port, token);
if (!repl) {
- while(i)
- free(result[--i]);
free(result);
return NULL;
}
static int execute_command()
{
- struct json_object *exec, *oport;
+ struct json_object *exec, *oport, *otok;
struct sigaction siga;
- char port[20];
- const char *token;
+ const char *token, *port;
char **args;
- int rc;
/* check whether a command is to execute or not */
if (!json_object_object_get_ex(main_config, "exec", &exec))
/* compute the string for port */
if (json_object_object_get_ex(main_config, "port", &oport))
- rc = snprintf(port, sizeof port, "%s", json_object_get_string(oport));
+ port = json_object_get_string(oport);
else
- rc = snprintf(port, sizeof port, "%cp", SUBST_CHAR);
- if (rc < 0 || rc >= (int)(sizeof port)) {
- ERROR("port->txt failed");
- }
- else {
- /* instantiate arguments and environment */
- token = afb_session_initial_token();
- args = instanciate_command_args(exec, port, token);
- if (args && instanciate_environ(port, token) >= 0) {
- /* run */
- if (!SELF_PGROUP)
- setpgid(0, 0);
- execv(args[0], args);
- ERROR("can't launch %s: %m", args[0]);
- }
+ port = 0;
+ /* instantiate arguments and environment */
+ if (json_object_object_get_ex(main_config, "token", &otok))
+ token = json_object_get_string(otok);
+ else
+ token = 0;
+ args = instanciate_command_args(exec, port, token);
+ if (args && instanciate_environ(port, token) >= 0) {
+ /* run */
+ if (!SELF_PGROUP)
+ setpgid(0, 0);
+ execv(args[0], args);
+ ERROR("can't launch %s: %m", args[0]);
}
exit(1);
return -1;
json = strchr(verb, ':');
if (json) {
afb_xreq_init(&sreq->xreq, &startup_xreq_itf);
- afb_context_init_validated(&sreq->xreq.context, sreq->session);
+ 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;
"ss ss s?s"
"si si si"
"s?b s?i s?s"
-#if WITH_AFB_HOOK
-#if !defined(REMOVE_LEGACY_TRACE)
- "s?s s?s"
-#endif
- "s?s s?s s?s s?s s?s"
-#endif
"s?o"
"}",
"port", &http_port,
"rootapi", &rootapi,
+ "set", &settings
+ );
+ if (rc < 0) {
+ ERROR("Unable to get start config");
+ exit(1);
+ }
+
#if WITH_AFB_HOOK
+ rc = wrap_json_unpack(main_config, "{"
+#if !defined(REMOVE_LEGACY_TRACE)
+ "s?s s?s"
+#endif
+ "s?s s?s s?s s?s s?s"
+ "}",
+
#if !defined(REMOVE_LEGACY_TRACE)
"tracesvc", &tracesvc,
"traceditf", &traceditf,
"traceapi", &traceapi,
"traceevt", &traceevt,
"traceses", &traceses,
- "traceglob", &traceglob,
-#endif
- "set", &settings
+ "traceglob", &traceglob
);
if (rc < 0) {
- ERROR("Unable to get start config");
+ ERROR("Unable to get hook config");
exit(1);
}
+#endif
/* 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;
}
/* setup HTTP */
if (!no_httpd) {
- if (http_port < 0) {
- ERROR("no port is defined");
- goto error;
- }
if (http_port == 0) {
ERROR("random port is not implemented");
goto error;
}
- if (addenv_int("AFB_PORT", http_port)
- || addenv("AFB_TOKEN", afb_session_initial_token())) {
+ if ((http_port > 0 && addenv_int("AFB_PORT", http_port))
+ || (token && addenv("AFB_TOKEN", token))) {
ERROR("can't set HTTP environment");
goto error;
}
/* run the command */
afb_debug("start-exec");
- if (execute_command() < 0)
+ if (execute_command(http_port, token) < 0)
goto error;
/* ready */