From 212fd061b1ef12444ed6440705c50b7847db1309 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Sun, 8 Feb 2009 07:23:46 +0000 Subject: [PATCH] Add a patch to deal with the hald/xorg startup race. With this patch it should be safe for hald to start even after the Xserver. Obtained from: xorg-devel --- x11-servers/xorg-server/Makefile | 2 +- .../xorg-server/files/patch-config-hal.c | 143 ++++++++++++++++++ 2 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 x11-servers/xorg-server/files/patch-config-hal.c diff --git a/x11-servers/xorg-server/Makefile b/x11-servers/xorg-server/Makefile index 133cbc7caa3f..5558cd3c3726 100644 --- a/x11-servers/xorg-server/Makefile +++ b/x11-servers/xorg-server/Makefile @@ -8,7 +8,7 @@ PORTNAME= xorg-server PORTVERSION= 1.5.3 PORTEPOCH= 1 -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= x11-servers MASTER_SITES= http://xorg.freedesktop.org/releases/individual/xserver/ DISTFILES= xorg-server-${PORTVERSION}.tar.bz2 diff --git a/x11-servers/xorg-server/files/patch-config-hal.c b/x11-servers/xorg-server/files/patch-config-hal.c new file mode 100644 index 000000000000..69ec0d6f3112 --- /dev/null +++ b/x11-servers/xorg-server/files/patch-config-hal.c @@ -0,0 +1,143 @@ +--- config/hal.c.orig 2008-11-14 16:27:05.000000000 -0500 ++++ config/hal.c 2009-02-08 01:17:28.000000000 -0500 +@@ -467,11 +467,10 @@ + info->system_bus = NULL; + } + +-static void +-connect_hook(DBusConnection *connection, void *data) ++static BOOL ++connect_and_register(DBusConnection *connection, struct config_hal_info *info) + { + DBusError error; +- struct config_hal_info *info = data; + char **devices; + int num_devices, i; + +@@ -479,8 +478,10 @@ + + dbus_error_init(&error); + +- if (!info->hal_ctx) +- info->hal_ctx = libhal_ctx_new(); ++ if (info->hal_ctx) ++ return TRUE; /* already registered, pretend we did something */ ++ ++ info->hal_ctx = libhal_ctx_new(); + if (!info->hal_ctx) { + LogMessage(X_ERROR, "config/hal: couldn't create HAL context\n"); + goto out_err; +@@ -512,7 +513,7 @@ + + dbus_error_free(&error); + +- return; ++ return TRUE; + + out_ctx2: + if (!libhal_ctx_shutdown(info->hal_ctx, &error)) +@@ -526,6 +527,104 @@ + info->hal_ctx = NULL; + info->system_bus = NULL; + ++ return FALSE; ++} ++ ++ ++/** ++ * Handle NewOwnerChanged signals to deal with HAL startup at X server runtime. ++ * ++ * NewOwnerChanged is send once when HAL shuts down, and once again when it ++ * comes back up. Message has three arguments, first is the name ++ * (org.freedesktop.Hal), the second one is the old owner, third one is new ++ * owner. ++ */ ++static DBusHandlerResult ++ownerchanged_handler(DBusConnection *connection, DBusMessage *message, void *data) ++{ ++ int ret = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; ++ ++ if (dbus_message_is_signal(message, ++ "org.freedesktop.DBus", ++ "NameOwnerChanged")) { ++ DBusError error; ++ char *name, *old_owner, *new_owner; ++ ++ dbus_error_init(&error); ++ dbus_message_get_args(message, &error, ++ DBUS_TYPE_STRING, &name, ++ DBUS_TYPE_STRING, &old_owner, ++ DBUS_TYPE_STRING, &new_owner, ++ DBUS_TYPE_INVALID); ++ ++ if (dbus_error_is_set(&error)) { ++ ErrorF("[config/hal] failed to get NameOwnerChanged args: %s (%s)\n", ++ error.name, error.message); ++ } else if (name && strcmp(name, "org.freedesktop.Hal") == 0) { ++ ++ if (!old_owner || !strlen(old_owner)) { ++ DebugF("[config/hal] HAL startup detected.\n"); ++ if (connect_and_register(connection, (struct config_hal_info*)data)) ++ dbus_connection_unregister_object_path(connection, ++ "/org/freedesktop/DBus"); ++ else ++ ErrorF("[config/hal] Failed to connect to HAL bus.\n"); ++ } ++ ++ ret = DBUS_HANDLER_RESULT_HANDLED; ++ } ++ dbus_error_free(&error); ++ } ++ ++ return ret; ++} ++ ++/** ++ * Register a handler for the NameOwnerChanged signal. ++ */ ++static BOOL ++listen_for_startup(DBusConnection *connection, void *data) ++{ ++ DBusObjectPathVTable vtable = { .message_function = ownerchanged_handler, }; ++ DBusError error; ++ const char MATCH_RULE[] = "sender='org.freedesktop.DBus'," ++ "interface='org.freedesktop.DBus'," ++ "type='signal'," ++ "path='/org/freedesktop/DBus'," ++ "member='NameOwnerChanged'"; ++ int rc = FALSE; ++ ++ dbus_error_init(&error); ++ dbus_bus_add_match(connection, MATCH_RULE, &error); ++ if (!dbus_error_is_set(&error)) { ++ if (dbus_connection_register_object_path(connection, ++ "/org/freedesktop/DBus", ++ &vtable, ++ data)) ++ rc = TRUE; ++ else ++ ErrorF("[config/hal] cannot register object path.\n"); ++ } else { ++ ErrorF("[config/hal] couldn't add match rule: %s (%s)\n", error.name, ++ error.message); ++ ErrorF("[config/hal] cannot detect a HAL startup.\n"); ++ } ++ ++ dbus_error_free(&error); ++ ++ return rc; ++} ++ ++static void ++connect_hook(DBusConnection *connection, void *data) ++{ ++ struct config_hal_info *info = data; ++ ++ if (listen_for_startup(connection, data) && ++ connect_and_register(connection, info)) ++ dbus_connection_unregister_object_path(connection, ++ "/org/freedesktop/DBus"); ++ + return; + } +