Blob Blame History Raw
diff -u -r dbus-1.2.16/bus/activation.c hacked/bus/activation.c
--- dbus-1.2.16/bus/activation.c	2009-07-14 13:06:31.000000000 -0400
+++ hacked/bus/activation.c	2009-12-17 21:36:56.447546354 -0500
@@ -736,6 +736,101 @@
 }
 
 BusActivation*
+bus_activation_reload (BusActivation     *activation,
+                       const DBusString  *address,
+                       DBusList         **directories,
+                       DBusError         *error)
+{
+  DBusList      *link;
+  char          *dir;
+
+  dbus_free (activation->server_address);
+  if (!_dbus_string_copy_data (address, &activation->server_address))
+    {
+      BUS_SET_OOM (error);
+      goto failed;
+    }
+
+  _dbus_hash_table_unref (activation->entries);
+  activation->entries = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
+                                             (DBusFreeFunction)bus_activation_entry_unref);
+  if (activation->entries == NULL)
+    {
+      BUS_SET_OOM (error);
+      goto failed;
+    }
+
+  _dbus_hash_table_unref (activation->directories);
+  activation->directories = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
+                                                  (DBusFreeFunction)bus_service_directory_unref);
+
+  if (activation->directories == NULL)
+    {
+      BUS_SET_OOM (error);
+      goto failed;
+    }
+
+  link = _dbus_list_get_first_link (directories);
+  while (link != NULL)
+    {
+      BusServiceDirectory *s_dir;
+
+      dir = _dbus_strdup ((const char *) link->data);
+      if (!dir)
+        {
+          BUS_SET_OOM (error);
+          goto failed;
+        }
+
+      s_dir = dbus_new0 (BusServiceDirectory, 1);
+      if (!s_dir)
+        {
+          dbus_free (dir);
+          BUS_SET_OOM (error);
+          goto failed;
+        }
+
+      s_dir->refcount = 1;
+      s_dir->dir_c = dir;
+
+      s_dir->entries = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
+                                             (DBusFreeFunction)bus_activation_entry_unref);
+
+      if (!s_dir->entries)
+        {
+          bus_service_directory_unref (s_dir);
+          BUS_SET_OOM (error);
+          goto failed;
+        }
+
+      if (!_dbus_hash_table_insert_string (activation->directories, s_dir->dir_c, s_dir))
+        {
+          bus_service_directory_unref (s_dir);
+          BUS_SET_OOM (error);
+          goto failed;
+        }
+
+      /* only fail on OOM, it is ok if we can't read the directory */
+      if (!update_directory (activation, s_dir, error))
+        {
+          if (dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY))
+            goto failed;
+          else
+            dbus_error_free (error);
+        }
+
+      link = _dbus_list_get_next_link (directories, link);
+    }
+
+  return activation;
+
+ failed:
+  if (activation)
+    bus_activation_unref (activation);
+  return NULL;
+}
+
+BusActivation*
 bus_activation_new (BusContext        *context,
                     const DBusString  *address,
                     DBusList         **directories,
diff -u -r dbus-1.2.16/bus/activation.h hacked/bus/activation.h
--- dbus-1.2.16/bus/activation.h	2009-07-14 13:06:31.000000000 -0400
+++ hacked/bus/activation.h	2009-12-17 20:02:53.347545761 -0500
@@ -32,6 +32,10 @@
 						const DBusString  *address,
 						DBusList         **directories,
 						DBusError         *error);
+BusActivation* bus_activation_reload           (BusActivation     *activation,
+						const DBusString  *address,
+						DBusList         **directories,
+						DBusError         *error);
 BusActivation* bus_activation_ref              (BusActivation     *activation);
 void           bus_activation_unref            (BusActivation     *activation);
 
diff -u -r dbus-1.2.16/bus/bus.c hacked/bus/bus.c
--- dbus-1.2.16/bus/bus.c	2009-07-14 13:06:31.000000000 -0400
+++ hacked/bus/bus.c	2009-12-17 20:04:08.006546566 -0500
@@ -503,19 +503,17 @@
     }
   
   /* Create activation subsystem */
-  new_activation = bus_activation_new (context, &full_address,
-                                       dirs, error);
-  if (new_activation == NULL)
+  if (context->activation)
+    bus_activation_reload (context->activation, &full_address, dirs, error);
+  else
+    context->activation = bus_activation_new (context, &full_address, dirs, error);
+
+  if (context->activation == NULL)
     {
       _DBUS_ASSERT_ERROR_IS_SET (error);
       goto failed;
     }
 
-  if (is_reload)
-    bus_activation_unref (context->activation);
-
-  context->activation = new_activation;
-
   /* Drop existing conf-dir watches (if applicable) */