OSDN Git Service

statfs: towards _STATFS_F_FLAGS
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 17 Jan 2013 21:46:24 +0000 (22:46 +0100)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 17 Jan 2013 21:46:24 +0000 (22:46 +0100)
preparatory work.

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
libc/misc/statfs/internal_statvfs.c
libc/misc/statfs/statfs64.c

index 29890d4..7176739 100644 (file)
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+/* The kernel hints us if the f_flags is valid  */
+#define ST_VALID 0x0020
+
   /* Now fill in the fields we have information for.  */
   buf->f_bsize = fsbuf.f_bsize;
 #ifdef _STATFS_F_FRSIZE
@@ -31,7 +34,7 @@
   buf->f_ffree = fsbuf.f_ffree;
   if (sizeof (buf->f_fsid) == sizeof (fsbuf.f_fsid))
     buf->f_fsid = (fsbuf.f_fsid.__val[0]
-                  | ((unsigned long int) fsbuf.f_fsid.__val[1]
+                  | ((unsigned long long int) fsbuf.f_fsid.__val[1]
                      << (8 * (sizeof (buf->f_fsid)
                               - sizeof (fsbuf.f_fsid.__val[0])))));
   else
@@ -43,9 +46,6 @@
 #endif
   buf->f_namemax = fsbuf.f_namelen;
   memset (buf->__f_spare, '\0', sizeof(fsbuf.f_spare));
-
-  /* What remains to do is to fill the fields f_favail and f_flag.  */
-
   /* XXX I have no idea how to compute f_favail.  Any idea???  */
   buf->f_favail = buf->f_ffree;
 
      file.  The way we can test for matching filesystem is using the
      device number.  */
   buf->f_flag = 0;
-  if (STAT (&st) >= 0)
-    {
-      int save_errno = errno;
-      struct mntent mntbuf;
-      FILE *mtab;
-
-      mtab = setmntent ("/proc/mounts", "r");
-      if (mtab == NULL)
-       mtab = setmntent (_PATH_MOUNTED, "r");
+  if (STAT (&st) >= 0
+#ifdef _STATFS_F_FLAGS
+         && (fsbuf.f_flags & ST_VALID) == 0
+#endif
+        ) {
+         int save_errno = errno;
+         struct mntent mntbuf;
+         FILE *mtab;
 
-      if (mtab != NULL)
-       {
-         char tmpbuf[1024];
+         mtab = setmntent ("/proc/mounts", "r");
+         if (mtab == NULL)
+               mtab = setmntent (_PATH_MOUNTED, "r");
+         if (mtab != NULL) {
+               char tmpbuf[1024];
 
-         while (getmntent_r (mtab, &mntbuf, tmpbuf, sizeof (tmpbuf)))
-           {
-             struct stat fsst;
+               while (getmntent_r (mtab, &mntbuf, tmpbuf, sizeof (tmpbuf))) {
+                 struct stat fsst;
 
-             /* Find out about the device the current entry is for.  */
-             if (stat (mntbuf.mnt_dir, &fsst) >= 0
-                 && st.st_dev == fsst.st_dev)
-               {
-                 /* Bingo, we found the entry for the device FD is on.
-                    Now interpret the option string.  */
-                 char *cp = mntbuf.mnt_opts;
-                 char *opt;
+                 /* Find out about the device the current entry is for.  */
+                 if (stat (mntbuf.mnt_dir, &fsst) >= 0
+                         && st.st_dev == fsst.st_dev) {
+                         /* Bingo, we found the entry for the device FD is on.
+                                Now interpret the option string.  */
+                         char *cp = mntbuf.mnt_opts;
+                         char *opt;
 
-                 while ((opt = strsep (&cp, ",")) != NULL)
-                   if (strcmp (opt, "ro") == 0)
-                     buf->f_flag |= ST_RDONLY;
-                   else if (strcmp (opt, "nosuid") == 0)
-                     buf->f_flag |= ST_NOSUID;
+                         while ((opt = strsep (&cp, ",")) != NULL)
+                               if (strcmp (opt, "ro") == 0)
+                                 buf->f_flag |= ST_RDONLY;
+                               else if (strcmp (opt, "nosuid") == 0)
+                                 buf->f_flag |= ST_NOSUID;
 #ifdef __USE_GNU
-                   else if (strcmp (opt, "noexec") == 0)
-                     buf->f_flag |= ST_NOEXEC;
-                   else if (strcmp (opt, "nodev") == 0)
-                     buf->f_flag |= ST_NODEV;
-                   else if (strcmp (opt, "sync") == 0)
-                     buf->f_flag |= ST_SYNCHRONOUS;
-                   else if (strcmp (opt, "mand") == 0)
-                     buf->f_flag |= ST_MANDLOCK;
-                   else if (strcmp (opt, "noatime") == 0)
-                     buf->f_flag |= ST_NOATIME;
-                   else if (strcmp (opt, "nodiratime") == 0)
-                     buf->f_flag |= ST_NODIRATIME;
+                               else if (strcmp (opt, "noexec") == 0)
+                                 buf->f_flag |= ST_NOEXEC;
+                               else if (strcmp (opt, "nodev") == 0)
+                                 buf->f_flag |= ST_NODEV;
+                               else if (strcmp (opt, "sync") == 0)
+                                 buf->f_flag |= ST_SYNCHRONOUS;
+                               else if (strcmp (opt, "mand") == 0)
+                                 buf->f_flag |= ST_MANDLOCK;
+                               else if (strcmp (opt, "noatime") == 0)
+                                 buf->f_flag |= ST_NOATIME;
+                               else if (strcmp (opt, "nodiratime") == 0)
+                                 buf->f_flag |= ST_NODIRATIME;
+                               else if (strcmp (opt, "relatime") == 0)
+                                 buf->f_flag |= ST_RELATIME;
 #endif
-
-                 /* We can stop looking for more entries.  */
-                 break;
+                         /* We can stop looking for more entries.  */
+                         break;
+                 }
                }
-           }
-
-         /* Close the file.  */
-         endmntent (mtab);
-       }
-
-      __set_errno (save_errno);
-    }
+               /* Close the file.  */
+               endmntent (mtab);
+         }
+         __set_errno (save_errno);
+  }
+#ifdef _STATFS_F_FLAGS
+       else
+         buf->f_flag = fsbuf.f_flags ^ ST_VALID;
+#endif
index 9922797..ce8211b 100644 (file)
@@ -44,6 +44,9 @@ int statfs64 (const char *file, struct statfs64 *buf)
 #ifdef _STATFS_F_FRSIZE
     buf->f_frsize = buf32.f_frsize;
 #endif
+#ifdef _STATFS_F_FLAGS
+    buf->f_flags = buf32.f_flags;
+#endif
     memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare));
 
     return 0;