[Xfce4-commits] <exo:xfce-4.6> Read mount options from a rc file (bug #2891).

Nick Schermer noreply at xfce.org
Sat Oct 17 13:16:01 CEST 2009


Updating branch refs/heads/xfce-4.6
         to 54ffc5d16920b60ecddb66777fcff90d9e6251c2 (commit)
       from 4a66d865f20ba2167377c7f239337b0a488cb6be (commit)

commit 54ffc5d16920b60ecddb66777fcff90d9e6251c2
Author: Nick Schermer <nick at xfce.org>
Date:   Sat Oct 17 13:15:23 2009 +0200

    Read mount options from a rc file (bug #2891).
    
    All the hardcoded mount options are now read from a rc file so
    they can be easily changed by the distro or user.
    
    Conflicts:
    
    	exo-mount/exo-mount-hal.c

 exo-mount/Makefile.am     |    4 +
 exo-mount/README          |    2 +
 exo-mount/exo-mount-hal.c |  137 ++++++++++++++++++++++++++++++---------------
 exo-mount/mount.rc        |   54 ++++++++++++++++++
 4 files changed, 151 insertions(+), 46 deletions(-)

diff --git a/exo-mount/Makefile.am b/exo-mount/Makefile.am
index 1851fd7..63fa279 100644
--- a/exo-mount/Makefile.am
+++ b/exo-mount/Makefile.am
@@ -10,6 +10,9 @@ INCLUDES = 								\
 	-DPATH_MOUNT=\"$(PATH_MOUNT)\"					\
 	-DPATH_UMOUNT=\"$(PATH_UMOUNT)\"
 
+defaultsdir = $(sysconfdir)/xdg/xfce4
+defaults_DATA = mount.rc
+
 bin_PROGRAMS =								\
 	exo-mount
 
@@ -52,6 +55,7 @@ install-data-local:
 	-( cd $(DESTDIR)$(bindir) ; ln -sf exo-mount exo-unmount )
 
 EXTRA_DIST =								\
+	$(defaults_DATA)					\
 	README
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/exo-mount/README b/exo-mount/README
index 30b0553..2fd9724 100644
--- a/exo-mount/README
+++ b/exo-mount/README
@@ -9,3 +9,5 @@ highly recommended. See the output of
 
 for available command line options.
 
+For the mount options used by HAL, see the mount.rc file installed by exo in the
+$prefix/etc/xdg/xfce4 directory.
diff --git a/exo-mount/exo-mount-hal.c b/exo-mount/exo-mount-hal.c
index 548bfb1..bbf9ca3 100644
--- a/exo-mount/exo-mount-hal.c
+++ b/exo-mount/exo-mount-hal.c
@@ -694,8 +694,14 @@ exo_mount_hal_device_mount (ExoMountHalDevice *device,
   gchar       *fstype;
   const gchar *fs;
   gchar       *s;
-  gint         m, n = 0;
+  guint        m, n;
   const gchar *charset;
+  XfceRc      *rc;
+  gchar       *key;
+  gchar       *option;
+  GSList      *lp, *fsoptions = NULL;
+  gsize        len;
+  const gchar *value;
 
   g_return_val_if_fail (device != NULL, FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -710,60 +716,98 @@ exo_mount_hal_device_mount (ExoMountHalDevice *device,
   else
     fs = device->fstype;
 
+  /* open the config file and look for the filesystem group */
+  rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "xfce4" G_DIR_SEPARATOR_S "mount.rc", FALSE);
+  if (G_LIKELY (rc != NULL))
+    {
+      if (xfce_rc_has_group (rc, fs))
+        {
+          /* set the filesystem group */
+          xfce_rc_set_group (rc, fs);
+        }
+      else
+        {
+          /* config is not usable */
+          xfce_rc_close (rc);
+          rc = NULL;
+        }
+    }
+
   /* check if we know any valid mount options */
   if (G_LIKELY (device->fsoptions != NULL))
     {
       /* process all valid mount options */
       for (m = 0; device->fsoptions[m] != NULL; ++m)
         {
-          /* this is currently mostly Linux specific noise */
-          if (strcmp (device->fsoptions[m], "uid=") == 0
-              && (strcmp (fs, "vfat") == 0
-               || strcmp (fs, "iso9660") == 0
-               || strcmp (fs, "udf") == 0
-               || strcmp (fs, "ntfs") == 0
-               || strcmp (fs, "ntfs-3g") == 0
-               || device->volume == NULL))
-            {
-              options[n++] = g_strdup_printf ("uid=%u", (guint) getuid ());
-            }
-          else if (strcmp (device->fsoptions[m], "shortname=") == 0
-                && strcmp (fs, "vfat") == 0)
-            {
-              options[n++] = g_strdup_printf ("shortname=winnt");
-            }
-          else if (strcmp (device->fsoptions[m], "sync") == 0
-                && device->volume == NULL)
+          option = NULL;
+
+          if (strcmp (device->fsoptions[m], "sync") == 0)
             {
               /* non-pollable drive... */
-              options[n++] = g_strdup ("sync");
-            }
-          else if (strcmp (device->fsoptions[m], "longnames") == 0
-                && strcmp (fs, "vfat") == 0)
-            {
-              /* however this one is FreeBSD specific */
-              options[n++] = g_strdup ("longnames");
+              option = g_strdup ("sync");
             }
-          else if (strcmp (device->fsoptions[m], "umask=") == 0
-                   && strcmp (fs, "ntfs-3g") == 0)
+          else if (rc != NULL)
             {
-              /* we need to pass umask=0077 to ntfs-g3 or else it gets 0777 perms */
-              options[n++] = g_strdup ("umask=0077");
-            }
-          else if (strcmp (device->fsoptions[m], "iocharset=") == 0)
-            {
-              /* get the charset from a variable set by the user or glib */
-              charset = g_getenv ("EXO_MOUNT_IOCHARSET");
-              if (G_LIKELY (charset == NULL))
-                if (g_get_charset (&charset))
-                  charset = "utf8";
-
-              if (G_LIKELY (charset != NULL && *charset != '\0'))
-                options[n++] = g_strdup_printf ("iocharset=%s", charset);
+              /* option with value or enabled/disabled */
+              if (g_str_has_suffix (device->fsoptions[m], "="))
+                {
+                  len = strlen (device->fsoptions[m]) - 1;
+                  key = g_strndup (device->fsoptions[m], len);
+                  value = xfce_rc_read_entry_untranslated (rc, key, NULL);
+
+                  if (value != NULL)
+                    {
+                      /* substitute the <auto> options */
+                      if (strcmp (value, "<auto>") == 0)
+                        {
+                          if (strcmp (key, "uid") == 0)
+                            {
+                              option = g_strdup_printf ("uid=%u", (guint) getuid ());
+                            }
+                          else if (strcmp (key, "gid") == 0)
+                            {
+                              option = g_strdup_printf ("gid=%u", (guint) getgid ());
+                            }
+                          else if (strcmp (key, "iocharset") == 0)
+                            {
+                              charset = g_getenv ("EXO_MOUNT_IOCHARSET");
+                              if (charset == NULL
+                                  && g_get_charset (&charset))
+                                charset = "utf8";
+                              option = g_strdup_printf ("iocharset=%s", charset);
+                            }
+                        }
+                      else
+                        {
+                          /* use the value from the rc file */
+                          option = g_strdup_printf ("%s=%s", key, value);
+                        }
+                    }
+
+                  g_free (key);
+                }
+              else if (xfce_rc_has_entry (rc, device->fsoptions[m]))
+                {
+                  if (xfce_rc_read_bool_entry (rc, device->fsoptions[m], FALSE))
+                    option = g_strdup (device->fsoptions[m]);
+                }
             }
+
+          /* add the option */
+          if (option != NULL)
+            fsoptions = g_slist_prepend (fsoptions, option);
         }
     }
 
+  if (rc != NULL)
+    xfce_rc_close (rc);
+
+  /* create the filesystem options (+2 for possible "ro" and null terminate) */
+  options = g_new0 (gchar *, g_slist_length (fsoptions) + 2);
+  for (n = 0, lp = fsoptions; lp != NULL; lp = lp->next, ++n)
+    options[n] = lp->data;
+  g_slist_free (fsoptions);
+
   /* try to determine a usable mount point */
   if (G_LIKELY (device->volume != NULL))
     {
@@ -777,9 +821,10 @@ exo_mount_hal_device_mount (ExoMountHalDevice *device,
     }
 
   /* make sure that the mount point is usable (i.e. does not contain G_DIR_SEPARATOR's) */
-  mount_point = (mount_point != NULL && *mount_point != '\0')
-              ? exo_str_replace (mount_point, G_DIR_SEPARATOR_S, "_") 
-              : g_strdup ("");
+  if (mount_point != NULL && *mount_point != '\0')
+    mount_point = exo_str_replace (mount_point, G_DIR_SEPARATOR_S, "_");
+  else
+    mount_point = g_strdup ("");
 
   /* let HAL guess the fstype, unless we have an alternative preferred fstype */
   if (G_UNLIKELY (device->altfstype != NULL))
@@ -913,7 +958,7 @@ oom:      g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, "%s", g_strerror
   if (dbus_error_is_set (&derror))
     {
       /* try to translate the error appropriately */
-      if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0) 
+      if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0)
         {
           /* TRANSLATORS: User tried to mount a volume, but is not privileged to do so. */
           g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("You are not privileged to mount the volume \"%s\""), device->name);
@@ -1093,7 +1138,7 @@ oom:  g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, "%s", g_strerror (EN
   if (G_UNLIKELY (dbus_error_is_set (&derror)))
     {
       /* try to translate the error appropriately */
-      if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0) 
+      if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0)
         {
           /* TRANSLATORS: User tried to unmount a volume, but is not privileged to do so. */
           g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("You are not privileged to unmount the volume \"%s\""), device->name);
diff --git a/exo-mount/mount.rc b/exo-mount/mount.rc
new file mode 100644
index 0000000..723b841
--- /dev/null
+++ b/exo-mount/mount.rc
@@ -0,0 +1,54 @@
+#
+# ABOUT
+# =====
+# This file contains the mount option configuration when exo-mount is used with the HAL
+# back end (which is highly recommended). If mounting using exo is somehow not working
+# for you, you can copy this file to your $XDG_CONFIG_HOME/xfce4 directory and modify it.
+#
+# The options for each filesystem are not used when they are not in the list of
+# valid mount options provided by HAL. You can find those values using lshal and
+# search for the volume.mount.valid_options property.
+#
+#
+# EXAMPLE
+# =======
+# For example your usb device contains the vfat file system and lshal shows the
+# following valid mount options for the device:
+#
+#   volume.mount.valid_options = {'ro', 'sync', 'dirsync', 'noatime', 'nodiratime',
+#                                 'noexec', 'quiet', 'remount', 'exec', 'uid=',
+#                                 'gid=', 'umask=', 'utf8'} (string list)
+#
+# All the values that end with a = character are options that contain a value,
+# the other options are booleans that can be enabled by for example putting
+# utf8=true in the group.
+#
+#
+# SUBSTITUTIONS
+# =============
+# Some options can be substituted by exo-mount when you set the value to <auto>:
+#   uid      : The real user ID
+#   gid      : The real group ID
+#   iocharset: To the EXO_MOUNT_IOCHARSET or LC_CTYPE environment variable.
+#
+
+[vfat]
+uid=<auto>
+shortname=winnt
+# FreeBSD specific option
+longnames=true
+
+[iso9660]
+uid=<auto>
+
+[udf]
+uid=<auto>
+iocharset=<auto>
+
+[ntfs]
+uid=<auto>
+
+[ntfs-3g]
+uid=<auto>
+# Make sure the device does not get 0777 permissions
+umask=0077



More information about the Xfce4-commits mailing list