summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2018-11-08 15:25:11 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2018-11-08 15:29:25 +0100
commit83c9e99afda0f18e01b9f6dead29d81877568ef4 (patch)
treeaf4b08ec3d828e609dc0aeef42ad80988bba8fba
parenta868fc272224cc8737e2925aa5cc94f0dd0bc8d6 (diff)
main-afb-daemon: Export variables to connect to binder
Two new variables are exported that will allow to connect to the binder: - AFB_PORT: the HTTP port that the binder listen - AFB_TOKEN: the initial token that the binder expects These variables are defined only if the HTTP server is started. They are available during initialisation of bindings, even if it is before the real start of the HTTP server. Change-Id: I1b7c8572e3d77b7036a32af47b2a2f1d95803a41 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-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;