hal/hald hald.c, 1.32, 1.33 hald_dbus.c, 1.32, 1.33 hald_dbus.h, 1.6, 1.7 util.c, 1.13, 1.14

David Zeuthen david at freedesktop.org
Fri Apr 8 11:10:22 PDT 2005


Update of /cvs/hal/hal/hald
In directory gabe:/tmp/cvs-serv32581/hald

Modified Files:
	hald.c hald_dbus.c hald_dbus.h util.c 
Log Message:
2005-04-08  David Zeuthen  <davidz at redhat.com>

	Make all hal helpers use a direct connection to hald rather than
	going through the bus. This is for both performance and security
	reasons. Also, fix the reconnect issue and don't connect to the
	system message bus before probing is done.

	* configure.in: Require dbus 0.33; that, for now, means D-BUS CVS
	HEAD since it requires the patch in fd.o bug #2889 and D-BUS made
	a post-release version bump. I'll look into doing a D-BUS release
	soon.

	* libhal/libhal.h: Export prototype for libhal_ctx_init_direct()

	* libhal/libhal.c (libhal_ctx_init_direct): New convenience function
	for connecting directly to hald instead of going through the message
	bus (requires the address in the HALD_DIRECT_ADDR environment variable)

	* hald/util.c (hal_util_helper_invoke): Export the local hald dbus
	server address in HALD_DIRECT_ADDR

	* hald/hald_dbus.c (manager_send_signal_device_added): Handle the
	case where we're not connected to the system message bus
	(manager_send_signal_device_removed): -do-
	(manager_send_signal_new_capability): -do-
	(device_property_atomic_update_end): -do-
	(device_send_signal_property_modified): -do-
	(device_send_signal_condition): -do-
	(device_set_property): Always allow local interface
	(device_add_capability): -do-
	(device_remove_property): -do-
	(device_rescan): -do-
	(device_reprobe): -do-
	(device_emit_condition): -do-
	(hald_dbus_filter_handle_methods): New function
	(hald_dbus_filter_function): Move bulk of functionality to the new
	hald_dbus_filter_handle_methods() and pass local_interface==FALSE.
	Handle Disconnect from local libdbus properly and attempt to
	reconnect to the system message bus every so often (every 3 secs)
	(local_server_message_handler): New function
	(local_server_unregister_handler): New function
	(local_server_handle_connection): New function
	(hald_dbus_local_server_addr): New function
	(hald_dbus_local_server_init): New function

	* hald/hald.c (main): Register a local dbus server instead of
	connection to the system bus as startup
	(osspec_probe_done): Only connect to the system bus once probing
	is done

	* tools/fstab-sync.c (main): Use direct connection

	* hald/linux2/probing/probe-volume.c (main): Use direct connection

	* hald/linux2/probing/probe-storage.c (main): Use direct connection

	* hald/linux2/probing/probe-smbios.c (main): Use direct connection

	* hald/linux2/probing/probe-printer.c (main): Use direct connection

	* hald/linux2/probing/probe-hiddev.c (main): Use direct connection

	* hald/linux2/probing/probe-input.c (main): Use direct connection

	* hald/linux2/addons/addon-usb-csr.c (main): Use direct connection

	* hald/linux2/addons/addon-storage.c (main): Use direct connection

	* hald/linux2/addons/addon-hid-ups.c (main): Use direct connection

	* hald/linux2/addons/addon-acpi.c (main): Use direct connection

	* hald/linux2/probing/probe-pc-floppy.c (main): Remove all references
	to hal and dbus since this program just returns the result in the
	exit code



Index: hald.c
===================================================================
RCS file: /cvs/hal/hal/hald/hald.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- hald.c	28 Feb 2005 19:43:29 -0000	1.32
+++ hald.c	8 Apr 2005 18:10:19 -0000	1.33
@@ -586,8 +586,8 @@
 	/* Finally, setup unix signal handler for TERM */
 	signal (SIGTERM, handle_sigterm);
 
-	/* set up the dbus services */
-	if (!hald_dbus_init ())
+	/* set up the local dbus server */
+	if (!hald_dbus_local_server_init ())
 		return 1;
 
 	/* initialize operating system specific parts */
@@ -637,6 +637,11 @@
 
 	HAL_INFO (("Device probing completed"));
 
+	if (!hald_dbus_init ()) {
+		hal_util_kill_all_helpers ();
+		exit (1);
+	}
+
 	/* tell parent to exit */
 	write (startup_daemonize_pipe[1], buf, sizeof (buf));
 	close (startup_daemonize_pipe[0]);

Index: hald_dbus.c
===================================================================
RCS file: /cvs/hal/hal/hald/hald_dbus.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- hald_dbus.c	2 Mar 2005 19:19:12 -0000	1.32
+++ hald_dbus.c	8 Apr 2005 18:10:19 -0000	1.33
@@ -43,7 +43,7 @@
 #include "logger.h"
 #include "osspec.h"
 
-static DBusConnection *dbus_connection;
+static DBusConnection *dbus_connection = NULL;
 
 /**
  * @defgroup DaemonErrors Error conditions
@@ -581,6 +581,9 @@
 	DBusMessage *message;
 	DBusMessageIter iter;
 
+	if (dbus_connection == NULL)
+		goto out;
+
 	HAL_TRACE (("entering, udi=%s", udi));
 
 	message = dbus_message_new_signal ("/org/freedesktop/Hal/Manager",
@@ -594,6 +597,9 @@
 		DIE (("error broadcasting message"));
 
 	dbus_message_unref (message);
+
+out:
+	;
 }
 
 /** Send signal DeviceRemoved(string udi) on the org.freedesktop.Hal.Manager
@@ -608,6 +614,9 @@
 	DBusMessage *message;
 	DBusMessageIter iter;
 
+	if (dbus_connection == NULL)
+		goto out;
+
 	HAL_TRACE (("entering, udi=%s", udi));
 
 	message = dbus_message_new_signal ("/org/freedesktop/Hal/Manager",
@@ -621,6 +630,8 @@
 		DIE (("error broadcasting message"));
 
 	dbus_message_unref (message);
+out:
+	;
 }
 
 /** Send signal NewCapability(string udi, string capability) on the 
@@ -638,6 +649,9 @@
 	DBusMessage *message;
 	DBusMessageIter iter;
 
+	if (dbus_connection == NULL)
+		goto out;
+
 	HAL_TRACE (("entering, udi=%s, cap=%s", udi, capability));
 
 	message = dbus_message_new_signal ("/org/freedesktop/Hal/Manager",
@@ -652,6 +666,8 @@
 		DIE (("error broadcasting message"));
 
 	dbus_message_unref (message);
+out:
+	;
 }
 
 /** @} */
@@ -1153,7 +1169,7 @@
  *  @return                     What to do with the message
  */
 DBusHandlerResult
-device_set_property (DBusConnection * connection, DBusMessage * message)
+device_set_property (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface)
 {
 	const char *udi;
 	char *key;
@@ -1175,7 +1191,7 @@
 	}
 	dbus_message_iter_get_basic (&iter, &key);
 
-	if (!sender_has_privileges (connection, message)) {
+	if (!local_interface && !sender_has_privileges (connection, message)) {
 		raise_permission_denied (connection, message, "SetProperty: not privileged");
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
@@ -1297,7 +1313,7 @@
  *  @return                     What to do with the message
  */
 DBusHandlerResult
-device_add_capability (DBusConnection * connection, DBusMessage * message)
+device_add_capability (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface)
 {
 	const char *udi;
 	const char *capability;
@@ -1307,7 +1323,7 @@
 
 	HAL_TRACE (("entering"));
 
-	if (!sender_has_privileges (connection, message)) {
+	if (!local_interface && !sender_has_privileges (connection, message)) {
 		raise_permission_denied (connection, message, "AddCapability: not privileged");
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
@@ -1417,7 +1433,7 @@
  *  @return                     What to do with the message
  */
 DBusHandlerResult
-device_remove_property (DBusConnection * connection, DBusMessage * message)
+device_remove_property (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface)
 {
 	const char *udi;
 	char *key;
@@ -1429,7 +1445,7 @@
 
 	udi = dbus_message_get_path (message);
 
-	if (!sender_has_privileges (connection, message)) {
+	if (!local_interface && !sender_has_privileges (connection, message)) {
 		raise_permission_denied (connection, message, "RemoveProperty: not privileged");
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
@@ -1905,9 +1921,11 @@
 			g_free (pu_iter->udi);
 			dbus_message_iter_close_container (&iter, &iter_array);
 
-			if (!dbus_connection_send
-			    (dbus_connection, message, NULL))
-				DIE (("error broadcasting message"));
+			if (dbus_connection != NULL) {
+				if (!dbus_connection_send (dbus_connection, message, NULL))
+					DIE (("error broadcasting message"));
+			}
+
 			dbus_message_unref (message);
 
 		already_processed:
@@ -1954,6 +1972,9 @@
 		dbus_int32_t i;
 		DBusMessageIter iter_struct;
 		DBusMessageIter iter_array;
+
+		if (dbus_connection == NULL)
+			goto out;
 		
 		message = dbus_message_new_signal (udi,
 						  "org.freedesktop.Hal.Device",
@@ -1989,6 +2010,8 @@
 
 		dbus_message_unref (message);
 	}
+out:
+	;
 }
 
 /** Emits a condition on a device; the device has to be in the GDL for
@@ -2017,6 +2040,9 @@
 	DBusMessage *message;
 	DBusMessageIter iter;
 
+	if (dbus_connection == NULL)
+		goto out;
+
 	message = dbus_message_new_signal (udi,
 					   "org.freedesktop.Hal.Device",
 					   "Condition");
@@ -2032,6 +2058,8 @@
 		DIE (("error broadcasting message"));
 
 	dbus_message_unref (message);
+out:
+	;
 }
 
 
@@ -2039,6 +2067,7 @@
 static gboolean
 reinit_dbus (gpointer user_data)
 {
+	HAL_INFO (("entering!"));
 	if (hald_dbus_init ())
 		return FALSE;
 	else
@@ -2072,7 +2101,7 @@
 }
 
 static DBusHandlerResult
-device_rescan (DBusConnection * connection, DBusMessage * message)
+device_rescan (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface)
 {
 	const char *udi;
 	HalDevice *device;
@@ -2080,11 +2109,11 @@
 	DBusMessageIter iter;
 	gboolean res;	
 
-	HAL_TRACE (("entering"));
+	HAL_INFO (("entering, local_interface=%d", local_interface));
 
 	udi = dbus_message_get_path (message);
 
-	if (!sender_has_privileges (connection, message)) {
+	if (!local_interface && !sender_has_privileges (connection, message)) {
 		raise_permission_denied (connection, message, "Rescan: not privileged");
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
@@ -2116,7 +2145,7 @@
 }
 
 static DBusHandlerResult
-device_reprobe (DBusConnection * connection, DBusMessage * message)
+device_reprobe (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface)
 {
 	const char *udi;
 	HalDevice *device;
@@ -2128,7 +2157,7 @@
 
 	udi = dbus_message_get_path (message);
 
-	if (!sender_has_privileges (connection, message)) {
+	if (!local_interface && !sender_has_privileges (connection, message)) {
 		raise_permission_denied (connection, message, "Reprobe: not privileged");
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
@@ -2161,7 +2190,7 @@
 
 
 static DBusHandlerResult
-device_emit_condition (DBusConnection * connection, DBusMessage * message)
+device_emit_condition (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface)
 {
 	const char *udi;
 	HalDevice *device;
@@ -2176,8 +2205,8 @@
 
 	udi = dbus_message_get_path (message);
 
-	if (!sender_has_privileges (connection, message)) {
-		raise_permission_denied (connection, message, "Reprobe: not privileged");
+	if (!local_interface && !sender_has_privileges (connection, message)) {
+		raise_permission_denied (connection, message, "EmitCondition: not privileged");
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
 
@@ -2220,39 +2249,11 @@
 }
 
 
-/** Message handler for method invocations. All invocations on any object
- *  or interface is routed through this function.
- *
- *  @param  connection          D-BUS connection
- *  @param  message             Message
- *  @param  user_data           User data
- *  @return                     What to do with the message
- */
-DBusHandlerResult
-hald_dbus_filter_function (DBusConnection * connection,
-			   DBusMessage * message, void *user_data)
+static DBusHandlerResult
+hald_dbus_filter_handle_methods (DBusConnection *connection, DBusMessage *message, 
+				 void *user_data, dbus_bool_t local_interface)
 {
-	/*HAL_INFO (("obj_path=%s interface=%s method=%s", 
-		   dbus_message_get_path(message), 
-		   dbus_message_get_interface(message),
-		   dbus_message_get_member(message)));*/
-
-	if (dbus_message_is_signal (message,
-				    DBUS_INTERFACE_DBUS,
-				    "Disconnected") &&
-	    strcmp (dbus_message_get_path (message),
-		    DBUS_PATH_LOCAL) == 0) {
-
-		dbus_connection_unref (dbus_connection);
-		g_timeout_add (3000, reinit_dbus, NULL);
-
-	} else if (dbus_message_is_signal (message,
-					   DBUS_INTERFACE_DBUS,
-					   "NameOwnerChanged")) {
-
-		if (services_with_locks != NULL)
-			service_deleted (message);
-	} else if (dbus_message_is_method_call (message,
+	if (dbus_message_is_method_call (message,
 					 "org.freedesktop.Hal.Manager",
 					 "GetAllDevices") &&
 		   strcmp (dbus_message_get_path (message),
@@ -2271,12 +2272,11 @@
 			   "/org/freedesktop/Hal/Manager") == 0) {
 		return manager_find_device_string_match (connection,
 							 message);
-	} else
-	    if (dbus_message_is_method_call
-		(message, "org.freedesktop.Hal.Manager",
-		 "FindDeviceByCapability")
-		&& strcmp (dbus_message_get_path (message),
-			   "/org/freedesktop/Hal/Manager") == 0) {
+	} else if (dbus_message_is_method_call
+		   (message, "org.freedesktop.Hal.Manager",
+		    "FindDeviceByCapability")
+		   && strcmp (dbus_message_get_path (message),
+			      "/org/freedesktop/Hal/Manager") == 0) {
 		return manager_find_device_by_capability (connection,
 							  message);
 	}
@@ -2312,27 +2312,27 @@
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"SetProperty")) {
-		return device_set_property (connection, message);
+		return device_set_property (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"SetPropertyString")) {
-		return device_set_property (connection, message);
+		return device_set_property (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"SetPropertyInteger")) {
-		return device_set_property (connection, message);
+		return device_set_property (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"SetPropertyBoolean")) {
-		return device_set_property (connection, message);
+		return device_set_property (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"SetPropertyDouble")) {
-		return device_set_property (connection, message);
+		return device_set_property (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"RemoveProperty")) {
-		return device_remove_property (connection, message);
+		return device_remove_property (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"GetPropertyType")) {
@@ -2344,7 +2344,7 @@
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"AddCapability")) {
-		return device_add_capability (connection, message);
+		return device_add_capability (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"QueryCapability")) {
@@ -2368,26 +2368,169 @@
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"Rescan")) {
-		return device_rescan (connection, message);
+		return device_rescan (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"Reprobe")) {
-		return device_reprobe (connection, message);
+		return device_reprobe (connection, message, local_interface);
 	} else if (dbus_message_is_method_call (message,
 						"org.freedesktop.Hal.Device",
 						"EmitCondition")) {
-		return device_emit_condition (connection, message);
+		return device_emit_condition (connection, message, local_interface);
 	} else
 		osspec_filter_function (connection, message, user_data);
 
 	return DBUS_HANDLER_RESULT_HANDLED;
 }
 
+/** Message handler for method invocations. All invocations on any object
+ *  or interface is routed through this function.
+ *
+ *  @param  connection          D-BUS connection
+ *  @param  message             Message
+ *  @param  user_data           User data
+ *  @return                     What to do with the message
+ */
+DBusHandlerResult
+hald_dbus_filter_function (DBusConnection * connection,
+			   DBusMessage * message, void *user_data)
+{
+	HAL_INFO (("obj_path=%s interface=%s method=%s", 
+		   dbus_message_get_path(message), 
+		   dbus_message_get_interface(message),
+		   dbus_message_get_member(message)));
+
+	if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected") &&
+	    strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) {
+
+		/* this is a local message; e.g. from libdbus in this process */
+
+		HAL_INFO (("Got disconnected from the system message bus; "
+			   "retrying to reconnect every 3000 ms"));
+		dbus_connection_unref (dbus_connection);
+		dbus_connection = NULL;
+
+		g_timeout_add (3000, reinit_dbus, NULL);
+
+	} else if (dbus_message_is_signal (message,
+					   DBUS_INTERFACE_DBUS,
+					   "NameOwnerChanged")) {
+
+		if (services_with_locks != NULL)
+			service_deleted (message);
+	} else 
+		return hald_dbus_filter_handle_methods (connection, message, user_data, FALSE);
+
+	return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+
+
+static DBusHandlerResult 
+local_server_message_handler (DBusConnection *connection, 
+			      DBusMessage *message, 
+			      void *user_data)
+{
+	HAL_INFO (("local_server_message_handler: destination=%s obj_path=%s interface=%s method=%s", 
+		   dbus_message_get_destination (message), 
+		   dbus_message_get_path (message), 
+		   dbus_message_get_interface (message),
+		   dbus_message_get_member (message)));
+
+	if (dbus_message_is_method_call (message, "org.freedesktop.DBus", "AddMatch")) {
+		DBusMessage *reply;
+
+                /* cheat, and handle AddMatch since libhal will try to invoke this method */
+		reply = dbus_message_new_method_return (message);
+		if (reply == NULL)
+			DIE (("No memory"));
+		if (!dbus_connection_send (connection, reply, NULL))
+			DIE (("No memory"));
+		dbus_message_unref (reply);
+		return DBUS_HANDLER_RESULT_HANDLED;
+	} else if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected") &&
+		   strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) {
+		
+		HAL_INFO (("Client to local_server was disconnected"));
+		dbus_connection_unref (connection);
+		return DBUS_HANDLER_RESULT_HANDLED;
+	} 
+	else return hald_dbus_filter_handle_methods (connection, message, user_data, TRUE);
+}
+
+static void
+local_server_unregister_handler (DBusConnection *connection, void *user_data)
+{
+	HAL_INFO (("unregistered"));
+}
+
+static void
+local_server_handle_connection (DBusServer *server,
+			  DBusConnection *new_connection,
+			  void *data)
+{
+	DBusObjectPathVTable vtable = { &local_server_unregister_handler, 
+					&local_server_message_handler, 
+					NULL, NULL, NULL, NULL};
+
+	HAL_INFO (("%d: Got a connection", getpid ()));
+	HAL_INFO (("dbus_connection_get_is_connected = %d", dbus_connection_get_is_connected (new_connection)));
+
+	/*dbus_connection_add_filter (new_connection, server_filter_function, NULL, NULL);*/
+
+	dbus_connection_register_fallback (new_connection, 
+					   "/org/freedesktop",
+					   &vtable,
+					   NULL);
+	dbus_connection_ref (new_connection);
+	dbus_connection_setup_with_g_main (new_connection, NULL);
+}
+
+
+static DBusServer *local_server = NULL;
+
+char *
+hald_dbus_local_server_addr (void)
+{
+	if (local_server == NULL)
+		return NULL;
+
+	return dbus_server_get_address (local_server);
+}
+
+gboolean
+hald_dbus_local_server_init (void)
+{
+	gboolean ret;
+	DBusError error;
+
+	ret = FALSE;
+
+	/* setup a server listening on a socket so we can do point to point
+	 * connections for programs spawned by hald
+	 */
+	dbus_error_init (&error);
+	if ((local_server = dbus_server_listen ("unix:tmpdir=/tmp/hald-local", &error)) == NULL) { 
+		HAL_ERROR (("Cannot create D-BUS server"));
+		goto out;
+	}
+	HAL_INFO (("local server is listening at %s", dbus_server_get_address (local_server)));
+	dbus_server_setup_with_g_main (local_server, NULL);
+	dbus_server_set_new_connection_function (local_server, local_server_handle_connection, NULL, NULL);	
+
+	ret = TRUE;
+
+out:
+	return ret;
+}
+
 gboolean
 hald_dbus_init (void)
 {
 	DBusError dbus_error;
 
+	HAL_INFO (("entering"));
+
 	dbus_connection_set_change_sigpipe (TRUE);
 
 	dbus_error_init (&dbus_error);
@@ -2408,8 +2551,7 @@
 		return FALSE;
 	}
 
-	dbus_connection_add_filter (dbus_connection, hald_dbus_filter_function, NULL,
-				    NULL);
+	dbus_connection_add_filter (dbus_connection, hald_dbus_filter_function, NULL, NULL);
 
 	dbus_bus_add_match (dbus_connection,
 			    "type='signal'"

Index: hald_dbus.h
===================================================================
RCS file: /cvs/hal/hal/hald/hald_dbus.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- hald_dbus.h	23 Feb 2005 18:25:43 -0000	1.6
+++ hald_dbus.h	8 Apr 2005 18:10:20 -0000	1.7
@@ -45,13 +45,13 @@
 DBusHandlerResult device_get_property_type          (DBusConnection *conn,
 						     DBusMessage    *msg);
 DBusHandlerResult device_set_property               (DBusConnection *conn,
-						     DBusMessage    *msg);
+						     DBusMessage    *msg, dbus_bool_t local_interface);
 DBusHandlerResult device_add_capability             (DBusConnection *conn,
-						     DBusMessage    *msg);
+						     DBusMessage    *msg, dbus_bool_t local_interface);
 DBusHandlerResult device_remove_capability          (DBusConnection *conn,
-						     DBusMessage    *msg);
+						     DBusMessage    *msg, dbus_bool_t local_interface);
 DBusHandlerResult device_remove_property            (DBusConnection *conn,
-						     DBusMessage    *msg);
+						     DBusMessage    *msg, dbus_bool_t local_interface);
 DBusHandlerResult device_property_exists            (DBusConnection *conn,
 						     DBusMessage    *msg);
 DBusHandlerResult device_query_capability           (DBusConnection *conn,
@@ -89,7 +89,11 @@
 
 gboolean hald_dbus_init (void);
 
+gboolean hald_dbus_local_server_init (void);
+
 DBusHandlerResult hald_dbus_filter_function (DBusConnection * connection, DBusMessage * message, void *user_data);
 
+char *hald_dbus_local_server_addr (void);
+
 
 #endif /* HAL_DBUS_H */

Index: util.c
===================================================================
RCS file: /cvs/hal/hal/hald/util.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- util.c	17 Mar 2005 17:19:43 -0000	1.13
+++ util.c	8 Apr 2005 18:10:20 -0000	1.14
@@ -554,6 +554,7 @@
 	guint i, j;
 	guint num_properties;
 	guint num_extras;
+	char *local_addr;
 
 	ed = g_new0 (HalHelperData, 1);
 	ed->data1 = data1;
@@ -573,6 +574,8 @@
 		num_env_vars++;
 	if (hald_is_initialising)
 		num_env_vars++;
+	if ((local_addr = hald_dbus_local_server_addr ()) != NULL)
+		num_env_vars++;
 
 	envp = g_new (char *, num_env_vars);
 	ienvp = envp;
@@ -583,6 +586,8 @@
 		envp[i++] = g_strdup ("HALD_VERBOSE=1");
 	if (hald_is_initialising)
 		envp[i++] = g_strdup ("HALD_STARTUP=1");
+	if (local_addr != NULL)
+		envp[i++] = g_strdup_printf ("HALD_DIRECT_ADDR=%s", local_addr);
 	for (j = 0; j < num_extras; j++) {
 		envp[i++] = g_strdup (extra_env[j]);
 	}




More information about the hal-commit mailing list