bug-gnulib
[Top][All Lists]
Advanced

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

mountlist changes imported from coreutils


From: Paul Eggert
Subject: mountlist changes imported from coreutils
Date: Mon, 09 Jan 2006 15:31:12 -0800
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

I installed this:

2006-01-09  Paul Eggert  <address@hidden>

        Sync from coreutils.

        * lib/mountlist.c (ME_DUMMY): "none" and "proc" file systems are dummies
        too.  Problem with "none" reported by Bob Proulx.  Problem with
        "proc" reported by n0dalus.

        * lib/mountlist.c: Include <limits.h>.
        (dev_from_mount_options)
        [defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2]:
        New function.  It no longer assumes "dev=" has the System V meaning
        on Linux (since it doesn't).  It also parses "dev=" more carefully.
        (read_file_system_list)
        [defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2]: Use it.
        MOUNTED_GETMNTENT2 is new here; the code didn't used to look for
        dev= in that case.

Index: lib/mountlist.c
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/mountlist.c,v
retrieving revision 1.53
diff -p -u -r1.53 mountlist.c
--- lib/mountlist.c     23 Sep 2005 04:15:13 -0000      1.53
+++ lib/mountlist.c     9 Jan 2006 23:02:07 -0000
@@ -23,6 +23,7 @@
 
 #include "mountlist.h"
 
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -143,6 +144,8 @@ char *strstr ();
 #ifndef ME_DUMMY
 # define ME_DUMMY(Fs_name, Fs_type)            \
     (strcmp (Fs_type, "autofs") == 0           \
+     || strcmp (Fs_type, "none") == 0          \
+     || strcmp (Fs_type, "proc") == 0          \
      || strcmp (Fs_type, "subfs") == 0         \
      /* for Irix 6.5 */                                \
      || strcmp (Fs_type, "ignore") == 0)
@@ -283,6 +286,44 @@ fstype_to_string (int t)
 }
 #endif /* MOUNTED_VMOUNT */
 
+
+#if defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2
+
+/* Return the device number from MOUNT_OPTIONS, if possible.
+   Otherwise return (dev_t) -1.  */
+
+static dev_t
+dev_from_mount_options (char const *mount_options)
+{
+  /* GNU/Linux allows file system implementations to define their own
+     meaning for "dev=" mount options, so don't trust the meaning
+     here.  */
+# ifndef __linux__
+
+  static char const dev_pattern[] = ",dev=";
+  char const *devopt = strstr (mount_options, dev_pattern);
+
+  if (devopt)
+    {
+      char const *optval = devopt + sizeof dev_pattern - 1;
+      char *optvalend;
+      unsigned long int dev;
+      errno = 0;
+      dev = strtoul (optval, &optvalend, 16);
+      if (optval != optvalend
+         && (*optvalend == '\0' || *optvalend == ',')
+         && ! (dev == ULONG_MAX && errno == ERANGE)
+         && dev == (dev_t) dev)
+       return dev;
+    }
+
+# endif
+
+  return -1;
+}
+
+#endif
+
 /* Return a list of the currently mounted file systems, or NULL on error.
    Add each entry to the tail of the list so that they stay in order.
    If NEED_FS_TYPE is true, ensure that the file system type fields in
@@ -325,12 +366,11 @@ read_file_system_list (bool need_fs_type
   }
 #endif
 
-#ifdef MOUNTED_GETMNTENT1      /* 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
+#ifdef MOUNTED_GETMNTENT1 /* GNU/Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
   {
     struct mntent *mnt;
     char *table = MOUNTED;
     FILE *fp;
-    char *devopt;
 
     fp = setmntent (table, "r");
     if (fp == NULL)
@@ -345,11 +385,7 @@ read_file_system_list (bool need_fs_type
        me->me_type_malloced = 1;
        me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
        me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
-       devopt = strstr (mnt->mnt_opts, "dev=");
-       if (devopt)
-         me->me_dev = strtoul (devopt + 4, NULL, 16);
-       else
-         me->me_dev = (dev_t) -1;      /* Magic; means not known yet. */
+       me->me_dev = dev_from_mount_options (mnt->mnt_opts);
 
        /* Add to the linked list. */
        *mtail = me;
@@ -623,7 +659,7 @@ read_file_system_list (bool need_fs_type
   }
 #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP.  */
 
-#ifdef MOUNTED_GETMNTTBL       /* DolphinOS goes it's own way */
+#ifdef MOUNTED_GETMNTTBL       /* DolphinOS goes its own way.  */
   {
     struct mntent **mnttbl = getmnttbl (), **ent;
     for (ent=mnttbl;*ent;ent++)
@@ -697,7 +733,7 @@ read_file_system_list (bool need_fs_type
            me->me_type_malloced = 1;
            me->me_dummy = MNT_IGNORE (&mnt) != 0;
            me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
-           me->me_dev = (dev_t) -1;    /* Magic; means not known yet. */
+           me->me_dev = dev_from_mount_options (mnt.mnt_mntopts);
 
            /* Add to the linked list. */
            *mtail = me;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]