Re: [Utopia] [patch] Allow one to enable g-v-m's mount command at compile time



On Wed, Nov 17, 2004 at 06:24:28PM +0100, Sjoerd Simons wrote:
> Hi,
> 
>  Attaches patch allows some to specify the mount and umount programs at
>  compile time.  Using the same substitutions as the commands given in the gui.
> 
>  This is usefull for Debian and Ubuntu, which use pmount-hal %h and pmount %d
>  as mount and umount programs.

Updated so you can also specify the patch to nautilus. Usefull for compiling
when nautilus is not installed, like say a debian buildd.

  Sjoerd
-- 
For your penance, say five Hail Marys and one loud BLAH!
Index: configure.in
===================================================================
RCS file: /cvs/gnome/gnome-volume-manager/configure.in,v
retrieving revision 1.73
diff -u -r1.73 configure.in
--- configure.in	30 Oct 2004 15:10:51 -0000	1.73
+++ configure.in	19 Nov 2004 19:54:05 -0000
@@ -8,12 +8,25 @@
 AC_PROG_CC
 
 
-AC_PATH_PROG(mount_path, mount, no)
-AC_PATH_PROG(umount_path, umount, no)
+AC_PATH_PROG(mount_program, mount, no)
+mount_program="${mount_program} %d"
+AC_PATH_PROG(umount_program, umount, no)
+umount_program="${umount_program} %d"
 AC_PATH_PROG(nautilus_path, nautilus, no)
 
-AC_DEFINE_UNQUOTED([BIN_MOUNT], ["${mount_path}"], [path to mount])
-AC_DEFINE_UNQUOTED([BIN_UMOUNT], ["${umount_path}"], [path to umount])
+AC_ARG_WITH(mount-program, 
+            [  --with-mount-program=program Program to run to mount a device],
+            mount_program="$withval",)
+AC_ARG_WITH(umount-program, 
+            [  --with-umount-program=program Program to run to umount a device],
+            umount_program="$withval",)
+AC_ARG_WITH(nautilus, 
+            [  --with-nautilus=path Path to nautilus],
+            nautilus_path="$withval",)
+
+
+AC_DEFINE_UNQUOTED([BIN_MOUNT], ["${mount_program}"], [mount program])
+AC_DEFINE_UNQUOTED([BIN_UMOUNT], ["${umount_program}"], [umount program])
 AC_DEFINE_UNQUOTED([BIN_NAUTILUS], ["${nautilus_path}"], [nautilus command])
 
 
Index: src/manager.c
===================================================================
RCS file: /cvs/gnome/gnome-volume-manager/src/manager.c,v
retrieving revision 1.35
diff -u -r1.35 manager.c
--- src/manager.c	25 Oct 2004 19:12:11 -0000	1.35
+++ src/manager.c	19 Nov 2004 19:54:06 -0000
@@ -141,20 +141,20 @@
 				 gvm_config_changed, NULL, NULL, NULL);
 }
 
-/*
- * gvm_run_command - run the given command, replacing %d with the device node,
- * %h with the HAL UDI and %m with the given path. Bails out if the command
- * requires a given %d,%h or %m and this is NULL.
+/* parses the given command into a command string. It replaces %d with the 
+ * device node, * %h with the HAL UDI and %m with the given path. 
+ *
+ * Returns NULL f the command * requires a given %d,%h or %m and this is NULL.
  */
-static void
-gvm_run_command (const char *device, const char *command, 
-		 const char *path, const char *udi)
-{
-	char *argv[4];
+
+static gchar *
+gvm_parse_command(const char *device, const char *command, 
+                  const char *path, const char *udi) {
 	gchar *new_command;
 	GError *error = NULL;
 	GString *exec = g_string_new (NULL);
 	char *p, *q;
+  gchar *result;
 
 	/* perform s/%d/device/, s/%m/path/ and s/%h/udi/ */
 	new_command = g_strdup (command);
@@ -190,26 +190,69 @@
 		}
 	}
 	g_string_append (exec, q);
+  result = exec->str;
 
-	argv[0] = "/bin/sh";
-	argv[1] = "-c";
-	argv[2] = exec->str;
-	argv[3] = NULL;
-
-	g_spawn_async (g_get_home_dir (), argv, NULL, 0, NULL, NULL,
-		       NULL, &error);
-	if (error)
-		warn ("failed to exec %s: %s\n", exec->str, error->message);
-
-	g_string_free (exec, TRUE);
+	g_string_free (exec, FALSE);
 	g_free (new_command);
-	return;
+	return result;
 
 error:
 	warn ("command '%s' required unavailable parameter; " 
 	      "%%d='%s' %%m='%s' %%h='%s'\n", command, device, path, udi);
 	g_string_free (exec, TRUE);
 	g_free (new_command);	
+  return NULL;
+}
+
+/*
+ * gvm_run_command - run the given command, replacing %d with the device node,
+ * %h with the HAL UDI and %m with the given path. Bails out if the command
+ * requires a given %d,%h or %m and this is NULL.
+ */
+static void
+gvm_run_command (const char *device, const char *command, 
+		 const char *path, const char *udi)
+{
+  char *cmd;
+  GError *error = NULL;
+
+  cmd = gvm_parse_command(device, command, path, udi);
+  if (cmd == NULL) {
+    return;
+  }
+	if (!g_spawn_command_line_async (cmd, &error)) 
+		warn ("failed to exec %s: %s\n", cmd, error->message);
+
+	g_free (cmd);
+	return;
+}
+
+/*
+ * gvm_run_command_sync - run the given command, replacing %d with the device
+ * node, %h with the HAL UDI and %m with the given path. Bails out if the
+ * command requires a given %d,%h or %m and this is NULL.
+ *
+ * Returns the exitcode of the command if run and -1 if failed
+ */
+static gint 
+gvm_run_command_sync (const char *device, const char *command, 
+		 const char *path, const char *udi)
+{
+  char *cmd;
+  gint exit_status;
+  GError *error = NULL;
+
+  cmd = gvm_parse_command(device, command, path, udi);
+  if (cmd == NULL) {
+    return -1;
+  }
+	if (!g_spawn_command_line_sync (cmd, NULL, NULL, &exit_status, &error)) {
+		warn ("failed to exec %s: %s\n", cmd, error->message);
+	  g_free (cmd);
+    return -1;
+  }
+	g_free (cmd);
+  return exit_status;
 }
 
 /*
@@ -455,23 +498,9 @@
  * @return TRUE iff the mount was succesful
  */
 static gboolean
-gvm_device_mount (char *device)
+gvm_device_mount (const char *udi, const char *device)
 {
-	char *argv[3];
-	GError *error = NULL;
-	gint exit_status;
-
-	argv[0] = BIN_MOUNT;
-	argv[1] = device;
-	argv[2] = NULL;
-
-	if (!g_spawn_sync (g_get_home_dir (), argv, NULL, 0, NULL,
-			   NULL, NULL, NULL, &exit_status, &error)) {
-		warn ("failed to exec " BIN_MOUNT ": %s\n", error->message);
-		return FALSE;
-	}
-
-	return (exit_status == 0);
+  return (gvm_run_command_sync(device , BIN_MOUNT, NULL, udi) == 0);
 }
 
 /*
@@ -483,23 +512,8 @@
  * @return TRUE iff the mount was succesful
  */
 static gboolean
-gvm_device_unmount (char *device)
-{
-	char *argv[3];
-	GError *error = NULL;
-	gint exit_status;
-
-	argv[0] = BIN_UMOUNT;
-	argv[1] = device;
-	argv[2] = NULL;
-
-	if (!g_spawn_sync (g_get_home_dir (), argv, NULL, 0, NULL,
-			   NULL, NULL, NULL, &exit_status, &error)) {
-		warn ("failed to exec " BIN_MOUNT ": %s\n", error->message);
-		return FALSE;
-	}
-
-	return (exit_status == 0);
+gvm_device_unmount (const char *udi, const char *device) {
+  return (gvm_run_command_sync(device, BIN_UMOUNT, NULL, udi) == 0);
 }
 
 /*
@@ -556,7 +570,7 @@
 
 	switch (action) {
 	case MOUNT:
-		gvm_device_mount (device);
+		gvm_device_mount (udi, device);
 		mounted_volumes_policy_queue = g_slist_append (mounted_volumes_policy_queue, g_strdup (udi));
 		break;
 	case PLAY:
@@ -633,7 +647,7 @@
 		gvm_ask_mixed (udi);
 	} else if (has_data) {
 		if (config.automount_media) {
-			gvm_device_mount (device);
+			gvm_device_mount (udi, device);
 			mounted_volumes_policy_queue = g_slist_append (mounted_volumes_policy_queue, g_strdup (udi));
 		}
 	} else if (is_blank) {
@@ -691,7 +705,7 @@
 		dbg ("Added: %s\n", device);
 		
 		if (config.automount_drives) {
-			gvm_device_mount (device);
+			gvm_device_mount (udi, device);
 			mounted_volumes_policy_queue = g_slist_append (mounted_volumes_policy_queue, g_strdup (udi));
 		}
 	}
@@ -755,7 +769,7 @@
 	dbg ("Added: %s\n", device);
 	
 	if (config.automount_drives) {
-		gvm_device_mount (device);
+		gvm_device_mount (udi, device);
 		mounted_volumes_policy_queue = g_slist_append (mounted_volumes_policy_queue, g_strdup (udi));
 	}
 	
@@ -835,7 +849,7 @@
 
 		policy_udi = g_slist_find_custom (mounted_volumes_policy_queue, 
 						  udi, 
-						  g_ascii_strcasecmp);
+						  (GCompareFunc)g_ascii_strcasecmp);
 		if (policy_udi != NULL) {
 			g_free (policy_udi->data);
 			mounted_volumes_policy_queue = g_slist_delete_link (mounted_volumes_policy_queue, 
@@ -973,7 +987,7 @@
 
 			dbg ("mount_all: mounting %s\n", device_file);
 
-			gvm_device_mount (device_file);
+			gvm_device_mount (udi, device_file);
 
 			hal_free_string (device_file);
 		} else
@@ -1007,7 +1021,7 @@
 
 			dbg ("unmount_all: unmounting %s\n", device_file);
 
-			gvm_device_unmount (device_file);
+			gvm_device_unmount (udi, device_file);
 			hal_free_string (device_file);
 		} else {
 			warn ("no device_file for udi=%s\n", udi);


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