/*
- * Copyright (C) 2015-2018 "IoT.bzh"
+ * Copyright (C) 2015-2019 "IoT.bzh"
* Author "Fulup Ar Foll"
* Author José Bollo <jose.bollo@iot.bzh>
*
#include "jobs.h"
#include "sig-monitor.h"
+#if !defined(DEFAULT_BINDER_INTERFACE)
+# define DEFAULT_BINDER_INTERFACE NULL
+#endif
+
/*
if SELF_PGROUP == 0 the launched command is the group leader
if SELF_PGROUP != 0 afb-daemon is the group leader
return p ? addenv(name, p) : -1;
}
+/**
+ * Tiny helper around addenv that export an integer
+ *
+ * @param name name of the variable to set
+ * @param value the integer value to export
+ *
+ * @return 0 in case of success or -1 in case of error (with errno set to ENOMEM)
+ */
+static int addenv_int(const char *name, int value)
+{
+ char buffer[64];
+ snprintf(buffer, sizeof buffer, "%d", value);
+ return addenv(name, buffer);
+}
+
/*----------------------------------------------------------
| helpers for handling list of arguments
+--------------------------------------------------------- */
+--------------------------------------------------------- */
static void daemonize()
{
- int fd = 0, daemon;
+ int fd = 0, daemon, nostdin;
const char *output;
pid_t pid;
daemon = 0;
output = NULL;
wrap_json_unpack(main_config, "{s?b s?s}", "daemon", &daemon, "output", &output);
+ nostdin = 0;
if (output) {
fd = open(output, O_WRONLY | O_APPEND | O_CREAT, 0640);
}
if (pid != 0)
_exit(0);
+
+ nostdin = 1;
}
/* closes the input */
close(fd);
}
- /* after that ctrl+C still works */
- close(0);
+ if (nostdin)
+ close(0); /* except if 'daemon', ctrl+C still works after that */
}
/*---------------------------------------------------------
NOTICE("Waiting port=%d rootdir=%s", http_port, rootdir);
NOTICE("Browser URL= http://localhost:%d", http_port);
- rc = afb_hsrv_start(hsrv, (uint16_t) http_port, 15);
+ rc = afb_hsrv_start(hsrv, 15);
if (!rc) {
ERROR("starting of httpd failed");
afb_hsrv_put(hsrv);
return NULL;
}
+ 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;
+ }
+
return hsrv;
}
ERROR("port->txt failed");
}
else {
- /* instanciate arguments and environment */
+ /* instantiate arguments and environment */
token = afb_session_initial_token();
args = instanciate_command_args(exec, port, token);
if (args && instanciate_environ(port, token) >= 0) {
settings = NULL;
token = rootapi = tracesvc = traceditf = tracereq =
traceapi = traceevt = traceses = traceglob = NULL;
- no_httpd = http_port = 0;
+ no_httpd = 0;
+ http_port = -1;
rc = wrap_json_unpack(main_config, "{"
"ss ss s?s"
"si si si"
exit(1);
}
+ /* initialize session handling */
+ if (afb_session_init(max_session_count, session_timeout, token)) {
+ ERROR("initialisation of session manager failed");
+ goto error;
+ }
+
/* set the directories */
mkdir(workdir, S_IRWXU | S_IRGRP | S_IXGRP);
if (chdir(workdir) < 0) {
}
if (addenv_realpath("AFB_WORKDIR", "." /* resolved by realpath */)
|| addenv_realpath("AFB_ROOTDIR", rootdir /* relative to current directory */)) {
- ERROR("can't set environment");
+ ERROR("can't set DIR environment");
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())) {
+ ERROR("can't set HTTP environment");
+ goto error;
+ }
+ }
+
/* configure the daemon */
afb_export_set_config(settings);
- if (afb_session_init(max_session_count, session_timeout, token)) {
- ERROR("initialisation of session manager failed");
- goto error;
- }
main_apiset = afb_apiset_create("main", api_timeout);
if (!main_apiset) {
ERROR("can't create main api set");
/* start the HTTP server */
afb_debug("start-http");
if (!no_httpd) {
- if (http_port <= 0) {
- ERROR("no port is defined");
- goto error;
- }
-
if (!afb_hreq_init_cookie(http_port, rootapi, session_timeout)) {
ERROR("initialisation of HTTP cookies failed");
goto error;