[Pkg-utopia-commits] r1866 - in /packages/unstable/dbus/debian: changelog patches/04_dbus_launch.patch

sjoerd at users.alioth.debian.org sjoerd at users.alioth.debian.org
Sun Nov 18 18:04:23 UTC 2007


Author: sjoerd
Date: Sun Nov 18 18:04:23 2007
New Revision: 1866

URL: http://svn.debian.org/wsvn/pkg-utopia/?sc=1&rev=1866
Log:
* debian/patches/04_dbus_launch.patch
  - Added. Also save the session bus info in X11 on a normally launched bus.
    This ensures apps that don't have a session bus address in their
    environment can still properly connect to a DISPLAY's normal session bus.
    Making hacks to determine which dbus address belongs to a DISPLAY as
    used by some obsolete.

Added:
    packages/unstable/dbus/debian/patches/04_dbus_launch.patch
Modified:
    packages/unstable/dbus/debian/changelog

Modified: packages/unstable/dbus/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/dbus/debian/changelog?rev=1866&op=diff
==============================================================================
--- packages/unstable/dbus/debian/changelog (original)
+++ packages/unstable/dbus/debian/changelog Sun Nov 18 18:04:23 2007
@@ -20,6 +20,12 @@
   * debian/patches/03_uuid_nul.patch
     - Added. Don't accidentally overwrite the last byte of the uuid with nul
       while autostarting. (From upstream GIT)
+  * debian/patches/04_dbus_launch.patch
+    - Added. Also save the session bus info in X11 on a normally launched bus.
+      This ensures apps that don't have a session bus address in their
+      environment can still properly connect to a DISPLAY's normal session bus.
+      Making hacks to determine which dbus address belongs to a DISPLAY as
+      used by some obsolete.
 
  -- Michael Biebl <biebl at debian.org>  Wed, 14 Nov 2007 18:08:42 +0100
 

Added: packages/unstable/dbus/debian/patches/04_dbus_launch.patch
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/dbus/debian/patches/04_dbus_launch.patch?rev=1866&op=file
==============================================================================
--- packages/unstable/dbus/debian/patches/04_dbus_launch.patch (added)
+++ packages/unstable/dbus/debian/patches/04_dbus_launch.patch Sun Nov 18 18:04:23 2007
@@ -1,0 +1,330 @@
+commit 7fa3ebc355a8f36c916d5f2e1eee4c6577843e66
+Author: Sjoerd Simons <sjoerd at luon.net>
+Date:   Sun Nov 18 18:19:56 2007 +0100
+
+    let both a normal dbus-launch and an autolaunch save their parameters in X11 if possible.
+    
+    This makes the autolaunch and non-autolaunch behaviour more similar. With the
+    exception that on a normal launch there will always be a new session bus
+    and not being able to save parameters is not fatal.
+    
+    Also enables to launch programs directly with autolaunch (not very usefull though).
+
+diff --git a/tools/dbus-launch.c b/tools/dbus-launch.c
+index 9f4c94a..894847e 100644
+--- a/tools/dbus-launch.c
++++ b/tools/dbus-launch.c
+@@ -23,6 +23,7 @@
+  */
+ #include "dbus-launch.h"
+ #include <stdlib.h>
++#include <ctype.h>
+ #include <unistd.h>
+ #include <fcntl.h>
+ #include <signal.h>
+@@ -61,6 +62,49 @@ save_machine_uuid (const char *uuid_arg)
+   machine_uuid = xstrdup (uuid_arg);
+ }
+ 
++#define UUID_MAXLEN 40
++/* Read the machine uuid from file if needed. Returns TRUE if machine_uuid is
++ * set after this function */
++static int
++read_machine_uuid_if_needed (void)
++{
++  FILE *f;
++  char uuid[UUID_MAXLEN];
++  size_t len;
++  int ret = FALSE;
++
++  if (machine_uuid != NULL)
++    return TRUE;
++
++  f = fopen (DBUS_MACHINE_UUID_FILE, "r");
++  if (f == NULL)
++    return FALSE;
++
++  if (fgets (uuid, UUID_MAXLEN, f) == NULL)
++    goto out;
++
++  len = strlen (uuid);
++  if (len < 32)
++    goto out;
++
++  /* rstrip the read uuid */
++  while (len > 31 && isspace(uuid[len - 1]))
++    len--;
++
++  if (len != 32)
++    goto out;
++
++  uuid[len] = '\0';
++  machine_uuid = xstrdup (uuid);
++  verbose ("UID: %s\n", machine_uuid);
++  ret = TRUE;
++
++out:
++  fclose(f);
++  return ret;
++}
++
++
+ void
+ verbose (const char *format,
+          ...)
+@@ -290,19 +334,24 @@ do_waitpid (pid_t pid)
+ 
+ static pid_t bus_pid_to_kill = -1;
+ 
++static void
++kill_bus()
++{
++  verbose ("Killing message bus and exiting babysitter\n");
++  kill (bus_pid_to_kill, SIGTERM);
++  sleep (3);
++  kill (bus_pid_to_kill, SIGKILL);
++}
++
+ void
+ kill_bus_and_exit (int exitcode)
+ {
+-  verbose ("Killing message bus and exiting babysitter\n");
+-  
+   /* in case these point to any NFS mounts, get rid of them immediately */
+   close (0);
+   close (1);
+   close (2);
+ 
+-  kill (bus_pid_to_kill, SIGTERM);
+-  sleep (3);
+-  kill (bus_pid_to_kill, SIGKILL);
++  kill_bus();
+ 
+   exit (exitcode);
+ }
+@@ -621,6 +670,63 @@ do_close_stderr (void)
+   close (fd);
+ }
+ 
++static void
++pass_info (const char *runprog, const char *bus_address, pid_t bus_pid,
++           long bus_wid, int c_shell_syntax, int bourne_shell_syntax,
++           int binary_syntax,
++           int argc, char **argv, int remaining_args)
++{
++  if (runprog)
++    {
++      char *envvar;
++      char **args;
++      int i;
++
++      envvar = malloc (strlen ("DBUS_SESSION_BUS_ADDRESS=") +
++          strlen (bus_address) + 1);
++      args = malloc (sizeof (char *) * ((argc-remaining_args)+2));
++
++      if (envvar == NULL || args == NULL)
++        goto oom;
++
++     args[0] = xstrdup (runprog);
++      if (!args[0])
++        goto oom;
++     for (i = 1; i <= (argc-remaining_args); i++)
++      {
++        size_t len = strlen (argv[remaining_args+i-1])+1;
++        args[i] = malloc (len);
++        if (!args[i])
++          goto oom;
++        strncpy (args[i], argv[remaining_args+i-1], len);
++       }
++     args[i] = NULL;
++
++     strcpy (envvar, "DBUS_SESSION_BUS_ADDRESS=");
++     strcat (envvar, bus_address);
++     putenv (envvar);
++
++     execvp (runprog, args);
++     fprintf (stderr, "Couldn't exec %s: %s\n", runprog, strerror (errno));
++     exit (1);
++    }
++   else
++    {
++      print_variables (bus_address, bus_pid, bus_wid, c_shell_syntax,
++         bourne_shell_syntax, binary_syntax);
++    }
++  verbose ("dbus-launch exiting\n");
++
++  fflush (stdout);
++  fflush (stderr);
++  close (1);
++  close (2);
++  exit (0);
++oom:
++  fprintf (stderr, "Out of memory!");
++  exit (1);
++}
++
+ #define READ_END  0
+ #define WRITE_END 1
+ 
+@@ -801,16 +907,6 @@ main (int argc, char **argv)
+           exit (1);
+         }
+ 
+-      /* FIXME right now autolaunch always does print_variables(), but it should really
+-       * exec the child program instead if a child program was specified. For now
+-       * we just exit if this conflict arises.
+-       */
+-      if (runprog)
+-        {
+-          fprintf (stderr, "Currently --autolaunch does not support running a program\n");
+-          exit (1);
+-        }
+-      
+       verbose ("Autolaunch enabled (using X11).\n");
+       if (!exit_with_session)
+ 	{
+@@ -831,15 +927,20 @@ main (int argc, char **argv)
+ 	}
+ 
+       if (address != NULL)
+-	{          
++	{
+ 	  verbose ("dbus-daemon is already running. Returning existing parameters.\n");
+-	  print_variables (address, pid, wid, c_shell_syntax,
+-			   bourne_shell_syntax, binary_syntax);
++	  pass_info (runprog, address, pid, wid, c_shell_syntax,
++			   bourne_shell_syntax, binary_syntax, argc, argv, remaining_args);
+ 	  exit (0);
+ 	}
++    }
++   else if (read_machine_uuid_if_needed())
++    {
++      x11_init();
+ #endif
+     }
+ 
++
+   if (pipe (bus_pid_to_launcher_pipe) < 0 ||
+       pipe (bus_address_to_launcher_pipe) < 0 ||
+       pipe (bus_pid_to_babysitter_pipe) < 0)
+@@ -1052,37 +1153,35 @@ main (int argc, char **argv)
+       close (bus_pid_to_launcher_pipe[READ_END]);
+ 
+ #ifdef DBUS_BUILD_X11
+-      /* FIXME the runprog == NULL is broken - we need to launch the runprog with the existing bus,
+-       * instead of just doing print_variables() if there's an existing bus.
+-       */
+-      if (xdisplay != NULL && runprog == NULL)
++      if (xdisplay != NULL)
+         {
++          verbose("Saving x11 address\n");
+           ret2 = x11_save_address (bus_address, bus_pid, &wid);
+-          if (ret2 == 0)
++          /* Only get an existing dbus session when autolaunching */
++          if (autolaunch)
+             {
+-              /* another window got added. Return its address */
+-              char *address;
+-              pid_t pid;
+-              long wid;
+-              
+-              if (x11_get_address (&address, &pid, &wid) && address != NULL)
++              if (ret2 == 0)
+                 {
+-                  verbose ("dbus-daemon is already running. Returning existing parameters.\n");
+-                  print_variables (address, pid, wid, c_shell_syntax,
+-                                   bourne_shell_syntax, binary_syntax);
+-                  free (address);
+-                  
++                  char *address = NULL;
++                  /* another window got added. Return its address */
+                   bus_pid_to_kill = bus_pid;
+-                  kill_bus_and_exit (0);
++                  if (x11_get_address (&address, &bus_pid, &wid)
++                       && address != NULL)
++                    {
++                      verbose ("dbus-daemon is already running. Returning existing parameters.\n");
++                      /* Kill the old bus */
++                      kill_bus();
++                      pass_info (runprog, address, bus_pid, wid,
++                         c_shell_syntax, bourne_shell_syntax, binary_syntax,
++                         argc, argv, remaining_args);
++                    }
++                  }
++              if (ret2 < 0)
++                {
++                  fprintf (stderr, "Error saving bus information.\n");
++                  bus_pid_to_kill = bus_pid;
++                  kill_bus_and_exit (1);
+                 }
+-              
+-              /* if failed, fall through */
+-            }
+-          if (ret2 <= 0)
+-            {
+-              fprintf (stderr, "Error saving bus information.\n");
+-              bus_pid_to_kill = bus_pid;
+-              kill_bus_and_exit (1);
+             }
+         }
+ #endif
+@@ -1091,56 +1190,9 @@ main (int argc, char **argv)
+       write_pid (bus_pid_to_babysitter_pipe[WRITE_END], bus_pid);
+       close (bus_pid_to_babysitter_pipe[WRITE_END]);
+ 
+-      if (runprog)
+-	{
+-	  char *envvar;
+-	  char **args;
+-
+-	  envvar = malloc (strlen ("DBUS_SESSION_BUS_ADDRESS=") + strlen (bus_address) + 1);
+-	  args = malloc (sizeof (char *) * ((argc-remaining_args)+2));
+-
+-	  if (envvar == NULL || args == NULL)
+-	    goto oom;
+-
+-	  args[0] = xstrdup (runprog);
+-	  if (!args[0])
+-	    goto oom;
+-	  for (i = 1; i <= (argc-remaining_args); i++)
+-	    {
+-	      size_t len = strlen (argv[remaining_args+i-1])+1;
+-	      args[i] = malloc (len);
+-	      if (!args[i])
+-		goto oom;
+-	      strncpy (args[i], argv[remaining_args+i-1], len);
+-	    }
+-	  args[i] = NULL;
+-
+-	  strcpy (envvar, "DBUS_SESSION_BUS_ADDRESS=");
+-	  strcat (envvar, bus_address);
+-	  putenv (envvar);
+-
+-	  execvp (runprog, args);
+-	  fprintf (stderr, "Couldn't exec %s: %s\n", runprog, strerror (errno));
+-	  exit (1);
+-	}
+-      else
+-	{
+-	  print_variables (bus_address, bus_pid, wid, c_shell_syntax,
+-			   bourne_shell_syntax, binary_syntax);
+-	}
+-	  
+-      verbose ("dbus-launch exiting\n");
++       pass_info (runprog, bus_address, bus_pid, wid, c_shell_syntax,
++              bourne_shell_syntax, binary_syntax, argc, argv, remaining_args);
++    }
+ 
+-      fflush (stdout);
+-      fflush (stderr);
+-      close (1);
+-      close (2);
+-      
+-      exit (0);
+-    } 
+-  
+   return 0;
+- oom:
+-  fprintf (stderr, "Out of memory!");
+-  exit (1);
+ }




More information about the Pkg-utopia-commits mailing list