Re: [PATCH] add -l option to gvfs-mount + crash report



David Zeuthen wrote:
Hi,

Using CamelCase names such as gFileRoot, mountName and so on is probably
not the best idea. Suggest to follow the coding standards.

It would also be useful to display the drives and volumes much like the
side bar in Nautilus current does (see the Nautilus source code for
details), e.g. sorta like this

 Drive0
  Volume0
   Mount0
  Volume1
   Mount1
  Volume2
 Drive1

 Volume_without_drive10
 Volume_without_drive11
  Mount11

 Mount_without_volume20
 Mount_without_volume21
Here is a patch which also lists drives and volumes. Additionally it tries to fix the crash in gmounttracker.c, caused by an empty DBus reply when gvfsd is not running.

Cheers,
Norbert


Index: common/gmounttracker.c
===================================================================
--- common/gmounttracker.c	(revision 1085)
+++ common/gmounttracker.c	(working copy)
@@ -386,18 +386,25 @@
   dbus_pending_call_unref (pending);
 
   b = dbus_message_iter_init (reply, &iter);
-  dbus_message_iter_recurse (&iter, &array_iter);
-
-  do
+  if (b && dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY)
     {
-      info = g_mount_info_from_dbus (&array_iter);
-      if (info)
-	{
-	  g_mount_tracker_add_mount (tracker, info);
-	  g_mount_info_unref (info);
-	}
+      dbus_message_iter_recurse (&iter, &array_iter);
+    
+      do
+        {
+          info = g_mount_info_from_dbus (&array_iter);
+          if (info)
+    	{
+    	  g_mount_tracker_add_mount (tracker, info);
+    	  g_mount_info_unref (info);
+    	}
+        }
+      while (dbus_message_iter_next (&array_iter));
     }
-  while (dbus_message_iter_next (&array_iter));
+  else
+    {
+      /* list_mounts_reply problem - gvfsd not running? */
+    }
   
   dbus_message_unref (reply);
 }
Index: programs/gvfs-mount.c
===================================================================
--- programs/gvfs-mount.c	(revision 1085)
+++ programs/gvfs-mount.c	(working copy)
@@ -35,11 +35,13 @@
 
 static gboolean mount_mountable = FALSE;
 static gboolean mount_unmount = FALSE;
+static gboolean mount_list = FALSE;
 
 static GOptionEntry entries[] = 
 {
 	{ "mountable", 'm', 0, G_OPTION_ARG_NONE, &mount_mountable, "Mount as mountable", NULL },
-        { "unmount", 'u', 0, G_OPTION_ARG_NONE, &mount_unmount, "Unmount", NULL},
+  { "unmount", 'u', 0, G_OPTION_ARG_NONE, &mount_unmount, "Unmount", NULL},
+  { "list", 'l', 0, G_OPTION_ARG_NONE, &mount_list, "List", NULL},
 	{ NULL }
 };
 
@@ -212,6 +214,129 @@
   outstanding_mounts++;
 }
 
+// =============== list mounts ==================
+
+static GMainLoop *main_loop;
+
+const char indentstr[] = "                               ";
+
+#define get_indent_str(x) indentstr + (sizeof(indentstr)-x-1)
+
+static gboolean iterate_gmain_timeout_function(gpointer data)
+{
+  g_main_loop_quit (main_loop);
+  return FALSE;
+}
+
+static void iterate_gmain()
+{
+  g_timeout_add(500, iterate_gmain_timeout_function, NULL);  
+  
+  main_loop = g_main_loop_new (NULL, FALSE);
+  g_main_loop_run (main_loop);
+  g_main_loop_unref(main_loop);
+}
+
+static void list_mounts(GVolumeMonitor* volume_monitor, int indent, GDrive * forDrive, GVolume * forVolume)
+{
+  GList* mount_list = g_volume_monitor_get_mounts(volume_monitor);
+  
+  GList* mount_list_el = mount_list;
+  int c=0;
+  for(;mount_list_el != NULL; mount_list_el = g_list_next(mount_list_el), c++)
+    {
+      GMount * mount = (GMount *) mount_list_el->data;
+
+      if (forDrive && g_mount_get_drive(mount)!=forDrive)
+          continue;
+      if (forVolume && g_mount_get_volume(mount)!=forVolume)
+          continue;
+      if (!forDrive && !forVolume && (g_mount_get_volume(mount) || g_mount_get_drive(mount)))
+          continue;
+      
+      char * mount_uuid = g_mount_get_uuid(mount);
+      char * mount_name = g_mount_get_name(mount);
+      GFile * file_root = g_mount_get_root(mount);
+      
+      char * points_to_uri = g_file_get_uri(file_root);
+      
+      printf("%sMount(%d) : %s -> %s\n", get_indent_str(indent), c, mount_name, points_to_uri);
+      
+      g_object_unref(file_root);
+      g_free(mount_uuid);
+      g_free(mount_name);
+      g_free(points_to_uri);
+    }
+}
+
+
+static void list_volumes(GVolumeMonitor* volume_monitor, int indent, GDrive * forDrive)
+{
+  
+  GList* volume_list = g_volume_monitor_get_volumes(volume_monitor);
+  GList* volume_list_el = volume_list;
+  
+  int c=0;
+  for(;volume_list_el!=NULL;volume_list_el = g_list_next(volume_list_el), c++)
+    {
+      GVolume * volume = (GVolume *) volume_list_el->data;
+
+      if (forDrive && g_volume_get_drive(volume)!=forDrive)
+          continue;
+      if (!forDrive && g_volume_get_drive(volume))
+          continue;
+      
+      char * volume_name = g_volume_get_name(volume);
+      
+      printf("%sVolume(%d) : %s\n", get_indent_str(indent), c, volume_name);
+      g_free(volume_name);
+      
+      list_mounts(volume_monitor, indent+2, NULL, volume);      
+      
+    }  
+}
+
+
+static void list_drives(GVolumeMonitor* volume_monitor, int indent)
+{
+  GList* drive_list = g_volume_monitor_get_connected_drives(volume_monitor);
+  
+  GList* drive_list_el = drive_list;
+  
+  int c=0;
+  while(drive_list_el)
+    {
+      GDrive * drive = (GDrive *) drive_list_el->data;
+
+      char * drive_name = g_drive_get_name(drive);
+      
+      printf("%sDrive(%d) : %s\n", get_indent_str(indent), c, drive_name);
+      g_free(drive_name);
+
+      list_mounts(volume_monitor, indent+2, drive, NULL);
+      list_volumes(volume_monitor, indent+2, drive);
+      
+      drive_list_el = g_list_next(drive_list_el);
+      c++;
+    }
+}
+
+
+
+static void list_monitor_items()
+{
+  GVolumeMonitor* volume_monitor = g_volume_monitor_get();
+  
+  // populate gvfs network mounts
+  iterate_gmain();
+
+  list_drives(volume_monitor, 0);
+  list_volumes(volume_monitor, 0, NULL);
+  list_mounts(volume_monitor, 0, NULL, NULL);
+  
+}
+
+
 int
 main (int argc, char *argv[])
 {
@@ -229,6 +354,9 @@
   g_option_context_parse (context, &argc, &argv, &error);
   g_option_context_free (context);
   
+  if (mount_list)
+    list_monitor_items();
+  else
   if (argc > 1)
     {
       int i;


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