From 277f0b536819389785b168a03ed73dfe652b55e2 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 7 Feb 2012 16:58:01 +0000 Subject: [PATCH 3/8] dbus-launch: add --exit-with-x11 option This is more suitable for distributions' Xsession scripts: it verifies that X is already available, and so never results in an attempt to poll stdin. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=39197 --- doc/dbus-launch.1 | 26 ++++++++++++++++++++------ tools/dbus-launch.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/doc/dbus-launch.1 b/doc/dbus-launch.1 index 089e0f2..2fbb9e2 100644 --- a/doc/dbus-launch.1 +++ b/doc/dbus-launch.1 @@ -7,7 +7,7 @@ dbus\-launch \- Utility to start a message bus from a shell script .SH SYNOPSIS .PP -.B dbus\-launch [\-\-version] [\-\-sh\-syntax] [\-\-csh\-syntax] [\-\-auto\-syntax] [\-\-exit\-with\-session] [\-\-autolaunch=MACHINEID] [\-\-config\-file=FILENAME] [PROGRAM] [ARGS...] +.B dbus\-launch [\-\-version] [\-\-sh\-syntax] [\-\-csh\-syntax] [\-\-auto\-syntax] [\-\-exit\-with\-session] [\-\-exit\-with\-x11] [\-\-autolaunch=MACHINEID] [\-\-config\-file=FILENAME] [PROGRAM] [ARGS...] .SH DESCRIPTION @@ -152,11 +152,25 @@ the \-\-session argument. See the man page for dbus\-daemon Emit csh compatible code to set up environment variables. .TP -.I "\-\-exit\-with\-session" -If this option is provided, a persistent "babysitter" process will be -created that watches stdin for HUP and tries to connect to the X -server. If this process gets a HUP on stdin or loses its X connection, -it kills the message bus daemon. +.I \-\-exit\-with\-x11 +If this option is provided, a persistent "babysitter" process will be +created, and will connect to the X server. If it cannot do so, launching +fails. If the "babysitter" process loses its X connection, +it kills the message bus daemon, disconnecting all of its clients (which +should exit in response). This avoids having leftover daemon +processes from a user X session, after the X session has ended. + +.TP +.I \-\-exit\-with\-session +If this option is provided, a persistent "babysitter" process will be +created, as if for +.BR \-\-exit\-with\-x11 . +If it cannot connect to the X server, it will monitor the terminal from which +.B dbus-launch +was started instead, and if it gets a HUP on stdin, the message bus daemon +will be killed. This option is not recommended, since it will consume input +from the terminal where it was started; it is mainly provided for +backwards compatibility. .TP .I "\-\-autolaunch=MACHINEID" diff --git a/tools/dbus-launch.c b/tools/dbus-launch.c index 1ec9ae5..dcce646 100644 --- a/tools/dbus-launch.c +++ b/tools/dbus-launch.c @@ -181,7 +181,7 @@ verbose (const char *format, static void usage (int ecode) { - fprintf (stderr, "dbus-launch [--version] [--help] [--sh-syntax] [--csh-syntax] [--auto-syntax] [--exit-with-session]\n"); + fprintf (stderr, "dbus-launch [--version] [--help] [--sh-syntax] [--csh-syntax] [--auto-syntax] [--exit-with-session] [--exit-with-x11]\n"); exit (ecode); } @@ -809,6 +809,7 @@ main (int argc, char **argv) const char *runprog = NULL; int remaining_args = 0; int exit_with_session; + int exit_with_x11 = FALSE; int binary_syntax = FALSE; int c_shell_syntax = FALSE; int bourne_shell_syntax = FALSE; @@ -850,6 +851,8 @@ main (int argc, char **argv) version (); else if (strcmp (arg, "--exit-with-session") == 0) exit_with_session = TRUE; + else if (strcmp (arg, "--exit-with-x11") == 0) + exit_with_x11 = TRUE; else if (strcmp (arg, "--close-stderr") == 0) close_stderr = TRUE; else if (strstr (arg, "--autolaunch=") == arg) @@ -961,6 +964,9 @@ main (int argc, char **argv) if (exit_with_session) verbose ("--exit-with-session enabled\n"); + if (exit_with_x11) + verbose ("--exit-with-x11 enabled\n"); + if (autolaunch) { #ifndef DBUS_BUILD_X11 @@ -983,10 +989,10 @@ main (int argc, char **argv) } verbose ("Autolaunch enabled (using X11).\n"); - if (!exit_with_session) + if (!exit_with_x11) { - verbose ("--exit-with-session automatically enabled\n"); - exit_with_session = TRUE; + verbose ("--exit-with-x11 automatically enabled\n"); + exit_with_x11 = TRUE; } if (!x11_init ()) @@ -1009,12 +1015,27 @@ main (int argc, char **argv) exit (0); } #endif /* DBUS_ENABLE_X11_AUTOLAUNCH */ +#endif /* DBUS_BUILD_X11 */ + } + else if (exit_with_x11) + { +#ifndef DBUS_BUILD_X11 + fprintf (stderr, "Session lifetime based on X11 requested, but X11 support not compiled in.\n"); + exit (1); +#else /* DBUS_BUILD_X11 */ + if (!x11_init ()) + { + fprintf (stderr, "Session lifetime based on X11 requested, but X11 initialization failed.\n"); + exit (1); + } +#endif /* DBUS_BUILD_X11 */ } +#ifdef DBUS_BUILD_X11 else if (read_machine_uuid_if_needed()) { x11_init(); -#endif /* DBUS_BUILD_X11 */ } +#endif /* DBUS_BUILD_X11 */ if (pipe (bus_pid_to_launcher_pipe) < 0 || @@ -1076,7 +1097,7 @@ main (int argc, char **argv) * and will also reap the pre-forked bus * daemon */ - babysit (exit_with_session, ret, + babysit (exit_with_session || exit_with_x11, ret, bus_pid_to_babysitter_pipe[READ_END]); exit (0); } -- 1.7.9