[Utopia] Debian/Ubuntu bug fixes for gnome-volume-manager



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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]