summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2012-02-07 16:58:01 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2012-06-15 13:10:16 +0100
commitfcc656d430f53ad62c25e41d7e7bd880cbb726a0 (patch)
tree216e9c040be7e31ff72c36bbed2fd98db9b3d6c7
parent1785b37e430efd912ef9dda0c728984a3eba4f09 (diff)
downloaddbus-fcc656d430f53ad62c25e41d7e7bd880cbb726a0.tar.gz
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. Reviewed-by: Will Thompson <will.thompson@collabora.co.uk> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=39197
-rw-r--r--doc/dbus-launch.126
-rw-r--r--tools/dbus-launch.c33
2 files changed, 47 insertions, 12 deletions
diff --git a/doc/dbus-launch.1 b/doc/dbus-launch.1
index a7687cad..53d69f6d 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 1ec9ae59..dcce646e 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);
}