]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
dbus-launch: add --exit-with-x11 option
authorSimon McVittie <smcv@debian.org>
Mon, 11 Jul 2016 11:10:39 +0000 (12:10 +0100)
committerSimon McVittie <smcv@debian.org>
Wed, 20 Jul 2016 12:32:36 +0000 (13:32 +0100)
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.

We read the machine UUID because it is needed to set the X atoms.
x11_init() assumes that the machine UUID (global variable) has been
set, either via read_machine_uuid_if_needed() or save_machine_uuid().
This is pretty tangled, but to make The Right Thing happen
automatically, we'd need to redo dbus-launch in terms of DBusError.

Reviewed-by: Will Thompson
Reviewed-by: Thiago Macieira
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=39197
Signed-off-by: Simon McVittie <smcv@debian.org>
doc/dbus-launch.1.xml.in
tools/dbus-launch.c

index 5135d9ca40c506de8279539283517d9474357704..2fcea03f209535577a3ba4346bc4f293157472b8 100644 (file)
@@ -29,6 +29,7 @@
     <arg choice='opt'>--binary-syntax </arg>
     <arg choice='opt'>--close-stderr </arg>
     <arg choice='opt'>--exit-with-session </arg>
+    <arg choice='opt'>--exit-with-x11 </arg>
     <arg choice='opt'>--autolaunch=<replaceable>MACHINEID</replaceable></arg>
     <arg choice='opt'>--config-file=<replaceable>FILENAME</replaceable></arg>
     <arg choice='opt'><replaceable>PROGRAM</replaceable></arg>
@@ -216,16 +217,35 @@ the --session argument. See the man page for dbus-daemon</para>
 
   </listitem>
   </varlistentry>
+
   <varlistentry>
-  <term><option>--exit-with-session</option></term>
-  <listitem>
-<para>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.</para>
+    <term><option>--exit-with-x11</option></term>
+    <listitem>
+      <para>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.</para>
+    </listitem>
+  </varlistentry>
 
-  </listitem>
+  <varlistentry>
+    <term><option>--exit-with-session</option></term>
+    <listitem>
+      <para>
+        If this option is provided, a persistent "babysitter" process will
+        be created, as if for --exit-with-x11. If it cannot connect to
+        the X server, it will monitor the terminal from which 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.
+      </para>
+    </listitem>
   </varlistentry>
+
   <varlistentry>
   <term><option>--autolaunch=MACHINEID</option></term>
   <listitem>
index 1b6550271c9fecbdb36fbdee57a1411f5fe1ee4d..800c1123acc0ecbec7bafc566128d6fa2df899e3 100644 (file)
@@ -169,7 +169,7 @@ usage (int ecode)
 {
   fprintf (stderr, "dbus-launch [--version] [--help] [--sh-syntax]"
            " [--csh-syntax] [--auto-syntax] [--binary-syntax] [--close-stderr]"
-           " [--exit-with-session] [--autolaunch=MACHINEID]"
+           " [--exit-with-session|--exit-with-x11] [--autolaunch=MACHINEID]"
            " [--config-file=FILENAME] [PROGRAM] [ARGS...]\n");
   exit (ecode);
 }
@@ -827,6 +827,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;
@@ -870,6 +871,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)
@@ -981,6 +984,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
@@ -1035,10 +1041,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 ())
@@ -1061,12 +1067,33 @@ 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 (!read_machine_uuid_if_needed())
+        {
+          fprintf (stderr, "Session lifetime based on X11 requested, but machine UUID unavailable.\n");
+          exit (1);
+        }
+
+      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 ||
@@ -1128,7 +1155,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);
         }