X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain-afb-daemon.c;h=bb2f0a5638e80f1542fb2f294df8e42f42caadc4;hb=refs%2Fheads%2Fsandbox%2FDDTLK%2Fpakage;hp=77d7ab299ee4742ce741708b98ca261f5f25a74c;hpb=e11e8fbe65c6d57716c96bc6dd2b503a310dca67;p=src%2Fapp-framework-binder.git diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c index 77d7ab29..bb2f0a56 100644 --- a/src/main-afb-daemon.c +++ b/src/main-afb-daemon.c @@ -67,6 +67,10 @@ #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 @@ -116,6 +120,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 +--------------------------------------------------------- */ @@ -215,13 +234,14 @@ static void setup_daemon() +--------------------------------------------------------- */ 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); @@ -241,6 +261,8 @@ static void daemonize() } if (pid != 0) _exit(0); + + nostdin = 1; } /* closes the input */ @@ -253,8 +275,8 @@ static void daemonize() close(fd); } - /* after that ctrl+C still works */ - close(0); + if (nostdin) + close(0); /* except if 'daemon', ctrl+C still works after that */ } /*--------------------------------------------------------- @@ -353,13 +375,20 @@ static struct afb_hsrv *start_http_server() 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; } @@ -523,7 +552,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) { @@ -664,7 +693,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" @@ -704,6 +734,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) { @@ -716,16 +752,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"); @@ -791,11 +840,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;