X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafm-user-daemon.c;h=d0bef188f4a8ea57fd14176849ce09f41b7453af;hb=c31038db1cff938d7fa1f12f757c1c57ab51c0bd;hp=e051c97583f891ce72850de7776cc54e0adaca29;hpb=62a07cae0e40181daafdb0204c275af66d0f6d64;p=src%2Fapp-framework-main.git diff --git a/src/afm-user-daemon.c b/src/afm-user-daemon.c index e051c97..d0bef18 100644 --- a/src/afm-user-daemon.c +++ b/src/afm-user-daemon.c @@ -49,6 +49,8 @@ static const char usagestr[] = " -r rootdir adds a root directory of applications\n" " -m mode set default launch mode (local or remote)\n" " -d run as a daemon\n" + " -u addr address of user D-Bus to use\n" + " -s addr address of system D-Bus to use\n" " -q quiet\n" " -v verbose\n" "\n"; @@ -61,6 +63,8 @@ static struct option options_l[] = { { "root", required_argument, NULL, 'r' }, { "application", required_argument, NULL, 'a' }, { "mode", required_argument, NULL, 'm' }, + { "user-dbus", required_argument, NULL, 'u' }, + { "system-dbus", required_argument, NULL, 's' }, { "daemon", no_argument, NULL, 'd' }, { "quiet", no_argument, NULL, 'q' }, { "verbose", no_argument, NULL, 'v' }, @@ -379,6 +383,45 @@ static int daemonize() return 0; } +/* + * Opens a sd-bus connection and returns it in 'ret'. + * The sd-bus connexion is intended to be for user if 'isuser' + * is not null. The adress is the default address when 'address' + * is NULL or, otherwise, the given address. + * It might be necessary to pass the address as an argument because + * library systemd uses secure_getenv to retrieves the default + * addresses and secure_getenv might return NULL in some cases. + */ +static int open_bus(sd_bus **ret, int isuser, const char *address) +{ + sd_bus *b; + int rc; + + if (address == NULL) + return (isuser ? sd_bus_open_user : sd_bus_open_system)(ret); + + rc = sd_bus_new(&b); + if (rc < 0) + return rc; + + rc = sd_bus_set_address(b, address); + if (rc < 0) + goto fail; + + sd_bus_set_bus_client(b, 1); + + rc = sd_bus_start(b); + if (rc < 0) + goto fail; + + *ret = b; + return 0; + +fail: + sd_bus_unref(b); + return rc; +} + /* * ENTRY POINT OF AFM-USER-DAEMON */ @@ -388,11 +431,13 @@ int main(int ac, char **av) enum afm_launch_mode mode; struct sd_event *evloop; struct sd_bus *sysbus, *usrbus; - + const char *sys_bus_addr, *usr_bus_addr; LOGAUTH(appname); /* first interpretation of arguments */ + sys_bus_addr = NULL; + usr_bus_addr = NULL; while ((i = getopt_long(ac, av, options_s, options_l, NULL)) >= 0) { switch (i) { case 'h': @@ -420,6 +465,12 @@ int main(int ac, char **av) } set_default_launch_mode(mode); break; + case 'u': + usr_bus_addr = optarg; + break; + case 's': + sys_bus_addr = optarg; + break; case ':': ERROR("missing argument value"); return 1; @@ -486,7 +537,7 @@ int main(int ac, char **av) ERROR("can't create event loop"); return 1; } - rc = sd_bus_open_system(&sysbus); + rc = open_bus(&sysbus, 0, sys_bus_addr); if (rc < 0) { ERROR("can't create system bus"); return 1; @@ -496,7 +547,7 @@ int main(int ac, char **av) ERROR("can't attach system bus to event loop"); return 1; } - rc = sd_bus_open_user(&usrbus); + rc = open_bus(&usrbus, 1, usr_bus_addr); if (rc < 0) { ERROR("can't create user bus"); return 1; @@ -559,3 +610,17 @@ int main(int ac, char **av) return 0; } + + + + + + + + + + + + + +