Hi Jeffrey! First, thanks for giving g-v-m some love, it was badly needed. 1.3.2 looks great! During the last year, Debian and Ubuntu accumulated many patches; in the beginning we tried to submit them upstream, but we never got much feedback. However, looking at your recent activity I hope that you might consider applying them upstream. So instead of letting them rot in Gnome's bugzilla further, I'll just wrap them up here: 01_fix_nonmountable_media.patch: - Fix a regression of 1.3.2, it does not autoplay audio CDs any more. Do not require that a device is mountable for exercising the removable media policy. - This seems highly important to get upstream. 03_kernel_hint.patch: - If g-v-properties fails, tell the user that kernel 2.6 is required. - Purely cosmetical, but wouldn't hurt upstream. 04_reconnect_on_dbus_exit.patch: - Reconnect to dbus after restarting dbus and hal, instead of just crashing. - Important in package-based system when you want to continue to use your Gnome session while doing a system upgrade. 05_mount_at_start.patch: - Do not mount devices at g-v-m start if g-v-properties configured to not mount devices automatically. 07_automount_enabled_hint.patch: - Do not mount a device if storage.automount_enabled_hint == false on the volume or drive. - This is not really a bug fix, but rather an enhancement, see http://mail.gnome.org/archives/utopia-list/2004-November/msg00003.html and Gnome bug #155636. Do you consider applying them upstream? Thanks and have a nice day! Martin -- Martin Pitt http://www.piware.de Ubuntu Developer http://www.ubuntu.com Debian Developer http://www.debian.org
diff -ruN gnome-volume-manager-1.3.2-old/src/manager.c gnome-volume-manager-1.3.2/src/manager.c --- gnome-volume-manager-1.3.2-old/src/manager.c 2005-06-30 22:12:29.000000000 +0200 +++ gnome-volume-manager-1.3.2/src/manager.c 2005-07-04 17:11:08.779349472 +0200 @@ -1180,7 +1180,7 @@ * Does this device support removable media? Note that we * check storage_device and not our own UDI */ - if (mountable && libhal_device_get_property_bool (hal_ctx, storage_device, "storage.removable", NULL)) { + if (libhal_device_get_property_bool (hal_ctx, storage_device, "storage.removable", NULL)) { /* we handle media change events separately */ dbg ("Changed: %s\n", device); gvm_media_changed (udi, storage_device, device);
diff -ruN gnome-volume-manager-1.3.2-old/src/properties.c gnome-volume-manager-1.3.2/src/properties.c --- gnome-volume-manager-1.3.2-old/src/properties.c 2005-06-30 22:12:29.000000000 +0200 +++ gnome-volume-manager-1.3.2/src/properties.c 2005-07-04 14:40:13.333986416 +0200 @@ -443,7 +443,8 @@ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), _("The \"hald\" service is required but not currently " "running. Enable the service and rerun this applet, " - "or contact your system administrator.")); + "or contact your system administrator. Note: You " + "need Linux kernel 2.6 for volume management to work.")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog);
diff -ruN gnome-volume-manager-1.3.2-old/src/manager.c gnome-volume-manager-1.3.2/src/manager.c --- gnome-volume-manager-1.3.2-old/src/manager.c 2005-06-30 22:12:29.000000000 +0200 +++ gnome-volume-manager-1.3.2/src/manager.c 2005-07-04 14:43:15.822243984 +0200 @@ -48,7 +48,8 @@ #define NAUTILUS_COMMAND BIN_NAUTILUS" -n --no-desktop %m" static struct gvm_configuration config; -static LibHalContext *hal_ctx; +static LibHalContext *hal_ctx = NULL; +static DBusConnection *dbus_connection = NULL; #ifndef ASSUME_SUBMOUNT /** List of UDI's for volumes mounted by g-v-m that we need to apply policy to*/ @@ -1332,6 +1333,73 @@ { } +static LibHalContext * gvm_do_hal_init (); + +/** Invoked by gvm_do_filter_dbus_msg in response to a D-BUS disconnect event. + * + * @param data Context pointer + * @return true if it should be tried again, false if success or failure. + */ +static gboolean +gvm_reconnect_to_hal (gpointer data __attribute__((__unused__))) +{ + static unsigned int retries = 0; + DBusError error; + + dbg ("Trying a reconnect ...\n"); + hal_ctx = gvm_do_hal_init (); + if (hal_ctx != NULL) { + dbg ("Reconnected OK.\n"); + retries = 0; + return FALSE; + } else if (dbus_connection){ + /* shut down dbus connection to try it again */ + dbus_connection_unref (dbus_connection); + dbus_connection = NULL; + } + + /* Retry later if it failed. */ + if (retries++ < 100) + return TRUE; + + /* Too many retries; clean up and bail. */ + warn("gvm_reconnect_to_hal: no reconnection after 100 retries, exiting\n"); + libhal_ctx_shutdown (hal_ctx, &error); + libhal_ctx_free (hal_ctx); + hal_ctx = NULL; + gtk_main_quit (); + return FALSE; +} + +/** Invoked by D-BUS to filter messages. + * + * @param connection D-BUS connection + * @param message D-BUS message + * @param user_data Context pointer + */ +static DBusHandlerResult +gvm_do_filter_dbus_msg (DBusConnection *connection __attribute__((__unused__)), + DBusMessage *message, + void *user_data __attribute__((__unused__))) +{ + DBusError error; + + if (dbus_message_is_signal (message, + DBUS_INTERFACE_LOCAL, + "Disconnected")) { + dbg("gvm_do_filter_dbus_msg: received Disconnected message\n"); + g_timeout_add(500, gvm_reconnect_to_hal, NULL); + libhal_ctx_shutdown (hal_ctx, &error); + libhal_ctx_free (hal_ctx); + hal_ctx = NULL; + dbus_connection_unref (dbus_connection); + dbus_connection = NULL; + return DBUS_HANDLER_RESULT_HANDLED; + } + else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + /** Integrate a dbus mainloop. * * @param ctx LibHal context @@ -1342,14 +1410,15 @@ static dbus_bool_t hal_mainloop_integration (LibHalContext *ctx, DBusError *error) { - DBusConnection *dbus_connection; - dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, error); if (dbus_error_is_set (error)) return FALSE; + + dbus_connection_set_exit_on_disconnect (dbus_connection, FALSE); dbus_connection_setup_with_g_main (dbus_connection, NULL); + dbus_connection_add_filter (dbus_connection, gvm_do_filter_dbus_msg, NULL, NULL); libhal_ctx_set_dbus_connection (ctx, dbus_connection); @@ -1492,6 +1561,10 @@ DBusError error; GSList *l; + if (ctx == NULL) { + warn("unmount_all: No hal connection! can't unmount volumes\n"); + return; + } dbg ("unmounting all volumes that we saw mounted in our life\n"); dbus_error_init (&error); for (l = all_mounted_volumes; l != NULL; l = g_slist_next (l)) {
diff -ruN gnome-volume-manager-1.3.2-old/src/manager.c gnome-volume-manager-1.3.2/src/manager.c --- gnome-volume-manager-1.3.2-old/src/manager.c 2005-07-04 14:44:53.636373000 +0200 +++ gnome-volume-manager-1.3.2/src/manager.c 2005-07-04 14:49:45.811956536 +0200 @@ -1533,6 +1533,20 @@ continue; } libhal_free_string (prop); + + /* Check if configured policy disables mounting */ + gboolean do_mount = TRUE; + gchar* drive_udi = libhal_device_get_property_string(ctx, udi, "info.parent", NULL); + if (libhal_device_property_exists(ctx, drive_udi, "storage.hotpluggable", NULL) && + libhal_device_get_property_bool(ctx, drive_udi, "storage.hotpluggable", NULL)) { + do_mount = config.automount_drives; + } else if ( + libhal_device_property_exists(ctx, drive_udi, "storage.removable", NULL) && + libhal_device_get_property_bool(ctx, drive_udi, "storage.removable", NULL)) { + do_mount = config.automount_media; + } + libhal_free_string(drive_udi); + if (!do_mount) continue; /* mount the device */ if (!(dev = libhal_device_get_property_string (ctx, udi, "block.device", &error))) {
diff -ruN gnome-volume-manager-1.3.2-old/src/manager.c gnome-volume-manager-1.3.2/src/manager.c --- gnome-volume-manager-1.3.2-old/src/manager.c 2005-07-04 16:51:55.233715000 +0200 +++ gnome-volume-manager-1.3.2/src/manager.c 2005-07-04 16:52:29.355527760 +0200 @@ -1134,6 +1134,31 @@ libhal_free_string (media_type); } +/** Return the value of storage.automount_enabled_hint. First check the given + * volume's parent (which is the drive), then the volume itself. Default to + * true if the property is not set on either node. + */ +static gboolean +gvm_get_automount_enabled_hint (const char* udi) +{ + gchar *parent; + gboolean ret = TRUE; + + parent = libhal_device_get_property_string(hal_ctx, udi, "info.parent", NULL); + if (libhal_device_property_exists (hal_ctx, parent, + "storage.automount_enabled_hint", NULL)) { + ret = libhal_device_get_property_bool (hal_ctx, parent, + "storage.automount_enabled_hint", NULL); + } + if (libhal_device_property_exists (hal_ctx, udi, + "storage.automount_enabled_hint", NULL)) { + ret = libhal_device_get_property_bool (hal_ctx, udi, + "storage.automount_enabled_hint", NULL); + } + libhal_free_string (parent); + return ret; +} + /** Invoked when a device is added to the Global Device List. * * @param ctx LibHal context @@ -1190,7 +1215,10 @@ #ifndef ASSUME_SUBMOUNT if (config.automount_drives && mountable) { - gvm_device_mount (udi, device, NULL); + if (!gvm_get_automount_enabled_hint (udi)) + gvm_device_mount (udi, device, NULL); + else + dbg("%s has storage.automount_enabled_hint == false, not mounting\n", udi); mounted_volumes_policy_queue = g_slist_append (mounted_volumes_policy_queue, g_strdup (udi)); } #else
Attachment:
signature.asc
Description: Digital signature