summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main-afb-daemon.c54
1 files changed, 42 insertions, 12 deletions
diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c
index 65481c43..4fb4792c 100644
--- a/src/main-afb-daemon.c
+++ b/src/main-afb-daemon.c
@@ -116,6 +116,21 @@ static int addenv_realpath(const char *name, const char *path)
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
+--------------------------------------------------------- */
@@ -526,7 +541,7 @@ static int execute_command()
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) {
@@ -667,7 +682,8 @@ static void start(int signum, void *arg)
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"
@@ -707,6 +723,12 @@ static void start(int signum, void *arg)
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) {
@@ -719,16 +741,29 @@ static void start(int signum, void *arg)
}
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");
@@ -794,11 +829,6 @@ static void start(int signum, void *arg)
/* 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;