diff options
author | Simon McVittie <smcv@collabora.com> | 2022-03-16 13:30:33 +0000 |
---|---|---|
committer | Simon McVittie <smcv@collabora.com> | 2022-03-29 14:38:43 +0000 |
commit | 363919696a9621c8afe265768388aabaa641f446 (patch) | |
tree | 18779fb56d9fefc10214cde3d3a14bed5f60d56f /tools | |
parent | d847b5f6ae994c408c166ed51752ed9f550df600 (diff) | |
download | dbus-363919696a9621c8afe265768388aabaa641f446.tar.gz |
dbus-launch: If no X11, look for existing bus before failing
What we are aiming for here is that `dbus-launch --autolaunch` will
exit with an error if it would have been unable to advertise the bus
in a way that will be picked up by other instances of itself, so that
we don't get a proliferation of autolaunched dbus-launch instances,
each with its own dbus-daemon, and none of them talking to the others.
However, we don't need to do that *immediately*: we can try to look for
an existing instance first. If we find one, then we can assume that
it's suitable for use, even if X11 autolaunching was disabled at
compile-time or if connecting to the X server failed at runtime. We
only need to bail out if we get to the point where we are ready to start
forking child processes.
This lets systemd users run `dbus-launch --autolaunch` to find a
systemd-managed dbus-daemon, even if X11 autolaunching is disabled.
When combined with the previous commit, it also lets macOS users run
`dbus-launch --autolaunch` to find a launchd-managed dbus-daemon.
Resolves: dbus/dbus#385
Signed-off-by: Simon McVittie <smcv@collabora.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/dbus-launch.c | 80 |
1 files changed, 48 insertions, 32 deletions
diff --git a/tools/dbus-launch.c b/tools/dbus-launch.c index 78bd97d4..6b9fbe07 100644 --- a/tools/dbus-launch.c +++ b/tools/dbus-launch.c @@ -1009,19 +1009,6 @@ main (int argc, char **argv) if (autolaunch) { -#ifndef DBUS_BUILD_X11 - fprintf (stderr, "Autolaunch requested, but X11 support not compiled in.\n" - "Cannot continue.\n"); - exit (1); -#else /* DBUS_BUILD_X11 */ -#ifndef DBUS_ENABLE_X11_AUTOLAUNCH - fprintf (stderr, "X11 autolaunch support disabled at compile time.\n"); - exit (1); -#else /* DBUS_ENABLE_X11_AUTOLAUNCH */ - char *address; - pid_t pid; - long wid; - if (get_machine_uuid () == NULL) { fprintf (stderr, "Machine UUID not provided as arg to --autolaunch\n"); @@ -1062,6 +1049,7 @@ main (int argc, char **argv) _dbus_string_free (&existing_bus); } +#if defined(DBUS_BUILD_X11) && defined(DBUS_ENABLE_X11_AUTOLAUNCH) verbose ("Autolaunch enabled (using X11).\n"); if (!exit_with_x11) { @@ -1069,27 +1057,38 @@ main (int argc, char **argv) exit_with_x11 = TRUE; } - if (!x11_init ()) - { - fprintf (stderr, "Autolaunch error: X11 initialization failed.\n"); - exit (1); - } + if (x11_init ()) + { + char *address; + pid_t pid; + long wid; - if (!x11_get_address (&address, &pid, &wid)) - { - fprintf (stderr, "Autolaunch error: X11 communication error.\n"); - exit (1); - } + _dbus_assert (xdisplay != NULL); + verbose ("Connected to X11 display\n"); - if (address != NULL) - { - verbose ("dbus-daemon is already running. Returning existing parameters.\n"); - pass_info (runprog, address, pid, wid, c_shell_syntax, - bourne_shell_syntax, binary_syntax, argc, argv, remaining_args); - exit (0); - } -#endif /* DBUS_ENABLE_X11_AUTOLAUNCH */ -#endif /* DBUS_BUILD_X11 */ + if (!x11_get_address (&address, &pid, &wid)) + { + fprintf (stderr, "dbus-launch: Autolaunch error: X11 communication error.\n"); + exit (1); + } + + if (address != NULL) + { + verbose ("dbus-daemon is already running. Returning existing parameters.\n"); + pass_info (runprog, address, pid, wid, c_shell_syntax, + bourne_shell_syntax, binary_syntax, argc, argv, + remaining_args); + exit (0); + } + } + else + { + verbose ("Failed to connect to X11 display\n"); + _dbus_assert (xdisplay == NULL); + } +#else + verbose ("X11 autolaunch disabled at compile time, skipping that.\n"); +#endif /* DBUS_BUILD_X11 && DBUS_ENABLE_X11_AUTOLAUNCH */ } else if (exit_with_x11) { @@ -1124,6 +1123,23 @@ main (int argc, char **argv) } #endif /* DBUS_BUILD_X11 */ + if (autolaunch && !existing_bus_supported) + { +#if defined(DBUS_BUILD_X11) && defined(DBUS_ENABLE_X11_AUTOLAUNCH) + if (xdisplay == NULL) + { + fprintf (stderr, + "dbus-launch: No existing session bus was found, and " + "failed to connect to X11 display.\n"); + exit (1); + } +#else + fprintf (stderr, + "dbus-launch: No existing session bus was found, and X11 " + "autolaunch support was disabled at compile time.\n"); + exit (1); +#endif + } if (pipe (bus_pid_to_launcher_pipe) < 0 || pipe (bus_address_to_launcher_pipe) < 0 || |