#define SET_DAEMON 'D'
#define SET_EXEC 'e'
#define GET_HELP 'h'
+#define ADD_INTERFACE 'i'
#define SET_LOG 'l'
#if defined(WITH_MONITORING_OPTION)
#define SET_MONITORING 'M'
{SET_NAME, 1, "name", "Set the visible name"},
- {SET_PORT, 1, "port", "HTTP listening TCP port [default " d2s(DEFAULT_HTTP_PORT) "]"},
+ {SET_PORT, 1, "port", "HTTP listening TCP port of all interfaces [default " d2s(DEFAULT_HTTP_PORT) "]"},
+ {ADD_INTERFACE, 1, "interface", "Add HTTP listening interface (ex: tcp:localhost:8080)"},
{SET_ROOT_HTTP, 1, "roothttp", "HTTP Root Directory [default no root http (files not served but apis still available)]"},
{SET_ROOT_BASE, 1, "rootbase", "Angular Base Root URL [default /opa]"},
{SET_ROOT_API, 1, "rootapi", "HTML Root API URL [default /api]"},
int optid;
int valdef;
} default_optint_values[] = {
- { SET_PORT, DEFAULT_HTTP_PORT },
{ SET_API_TIMEOUT, DEFAULT_API_TIMEOUT },
{ SET_CACHE_TIMEOUT, DEFAULT_CACHE_TIMEOUT },
{ SET_SESSION_TIMEOUT, DEFAULT_SESSION_TIMEOUT },
case ADD_WS_CLIENT:
case ADD_WS_SERVICE:
case ADD_AUTO_API:
+ case ADD_INTERFACE:
config_add_optstr(config, optid);
break;
if (!config_has(config, default_optstr_values[i].optid))
config_set_str(config, default_optstr_values[i].optid, default_optstr_values[i].valdef);
+ if (!config_has(config, SET_PORT) && !config_has(config, ADD_INTERFACE) && !config_has_bool(config, SET_NO_HTTPD))
+ config_set_int(config, SET_PORT, DEFAULT_HTTP_PORT);
+
// default AUTH_TOKEN
if (config_has_bool(config, SET_RANDOM_TOKEN))
config_del(config, SET_TOKEN);
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
int rgni;
- itf->fdev = afb_socket_open_fdev(itf->uri, 1);
+ itf->fdev = afb_socket_open_fdev_scheme(itf->uri, 1, "tcp");
if (!itf->fdev) {
ERROR("can't create socket %s", itf->uri);
return 0;
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;
}