bug-gnulib
[Top][All Lists]
Advanced

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

Re: Interix list of mounted file systems.


From: Jim Meyering
Subject: Re: Interix list of mounted file systems.
Date: Thu, 20 Jan 2011 09:53:56 +0100

Markus Duft wrote:
> On 10/21/2010 12:35 PM, Jim Meyering wrote:
>> Markus Duft wrote:
>>> On 10/21/2010 11:59 AM, James Youngman wrote:
>>>> On Thu, Oct 21, 2010 at 10:05 AM, Markus Duft <address@hidden> wrote:
>>>>> Hi!
>>>>>
>>>>> I just created the attached patch for findutils to build. Any chance to
>>>>> get this in your git repo? :) The code is as good as it can get with
>>>>> interix, i think - improvement suggestions welcome!
>>>>
>>>> To make things very clear here to gnulib folks, this is a patch
>>>> against gnulib at 1778ee9e7d0e150a37db66a0e51c1a56755aab4f (assuming
>>>> Markus worked from findutils 4.5.9) rather than against findutils
>>>> itself.
>>>
>>> yeah right, thanks for pointing that out. i did work from 4.5.9.
>>
>> Thank you for the contribution, Markus.
>>
>> I see that you have FSF copyright assignments on file
>> for other projects, but not yet for gnulib.
>> Can you start that process?
>> Once that's done, we can proceed.
>
> ping :)
>
> copyright assignment is in place, and i don't think the patch has much
> conflict potential, right?

There was no need to rebase.
However, there was no ChangeLog entry, and the style of your added
function did not match the existing code (we require a space before
most open parentheses, and declare pointers like char *p, not "char* p"),
so my pre-apply clean-up and review took more time than usual.

I wrote the ChangeLog entry and fixed the code formatting.
Oh, your patch added trailing blanks, too.  Removed.

On the semantics of the patch, I don't like using NAME_MAX,
  char node[9 + NAME_MAX];
(some systems don't define it at all)
but since this code is compiled only on Interix, I didn't bother
to change it.

This commit has your name of course, but I've changed enough
that I'll wait for an ACK before pushing.
Below I've included one more patch to clean up some more
code formatting nits in that same file.

>From a481c562988f66f1614206c2f82779aa7835afb8 Mon Sep 17 00:00:00 2001
From: Markus Duft <address@hidden>
Date: Thu, 20 Jan 2011 09:19:24 +0100
Subject: [PATCH 1/2] mountlist: add support for Interix

* lib/mountlist.c (read_file_system_list) [MOUNTED_INTERIX_STATVFS]:
Apply statvfs to all entries of /dev/fs.
* m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Check for statvfs,
and if found, AC_DEFINE MOUNTED_INTERIX_STATVFS.
---
 ChangeLog        |    8 ++++++++
 lib/mountlist.c  |   44 ++++++++++++++++++++++++++++++++++++++++++++
 m4/ls-mntd-fs.m4 |   17 +++++++++++++++++
 3 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 85e510e..22c944b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-01-14  Markus Duft <address@hidden>
+
+       mountlist: add support for Interix
+       * lib/mountlist.c (read_file_system_list) [MOUNTED_INTERIX_STATVFS]:
+       Apply statvfs to all entries of /dev/fs.
+       * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Check for statvfs,
+       and if found, AC_DEFINE MOUNTED_INTERIX_STATVFS.
+
 2011-01-14  Jim Meyering  <address@hidden>

        bootstrap: avoid failure when there is no .gitmodules file
diff --git a/lib/mountlist.c b/lib/mountlist.c
index afe813c..397de57 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -112,6 +112,11 @@
 # include <sys/vfs.h>
 #endif

+#ifdef MOUNTED_INTERIX_STATVFS  /* Interix. */
+# include <sys/statvfs.h>
+# include <dirent.h>
+#endif
+
 #ifdef DOLPHIN
 /* So special that it's not worth putting this in autoconf.  */
 # undef MOUNTED_FREAD_FSTYP
@@ -879,6 +884,45 @@ read_file_system_list (bool need_fs_type)
   }
 #endif /* MOUNTED_VMOUNT. */

+#ifdef MOUNTED_INTERIX_STATVFS
+  {
+    DIR *dirp = opendir ("/dev/fs");
+    char node[9 + NAME_MAX];
+
+    if (!dirp)
+      goto free_then_fail;
+
+    while (1)
+      {
+        struct statvfs dev;
+        struct dirent entry;
+        struct dirent *result;
+
+        if (readdir_r (dirp, &entry, &result) || result == NULL)
+          break;
+
+        strcpy (node, "/dev/fs/");
+        strcat (node, entry.d_name);
+
+        if (statvfs (node, &dev) == 0)
+          {
+            me = xmalloc (sizeof *me);
+            me->me_devname = xstrdup (dev.f_mntfromname);
+            me->me_mountdir = xstrdup (dev.f_mntonname);
+            me->me_type = xstrdup (dev.f_fstypename);
+            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);
+            me->me_dev = (dev_t) -1;        /* Magic; means not known yet. */
+
+            /* Add to the linked list. */
+            *mtail = me;
+            mtail = &me->me_next;
+          }
+      }
+  }
+#endif /* MOUNTED_INTERIX_STATVFS */
+
   *mtail = NULL;
   return mount_list;

diff --git a/m4/ls-mntd-fs.m4 b/m4/ls-mntd-fs.m4
index 0500699..72beaed 100644
--- a/m4/ls-mntd-fs.m4
+++ b/m4/ls-mntd-fs.m4
@@ -326,6 +326,23 @@ if test -z "$ac_list_mounted_fs"; then
 fi

 if test -z "$ac_list_mounted_fs"; then
+  # Interix / BSD alike statvfs
+  # the code is really interix specific, so make sure, we're on it.
+  case "$host" in
+  *-interix*)
+    AC_CHECK_FUNCS([statvfs])
+    if test $ac_cv_func_statvfs = yes; then
+      ac_list_mounted_fs=found
+      AC_DEFINE([MOUNTED_INTERIX_STATVFS], [1],
+                [Define if we are on interix, and ought to use statvfs plus
+                 some special knowledge on where mounted filesystems can be
+                 found. (Interix)])
+    fi
+    ;;
+  esac
+fi
+
+if test -z "$ac_list_mounted_fs"; then
   AC_MSG_ERROR([could not determine how to read list of mounted file systems])
   # FIXME -- no need to abort building the whole package
   # Can't build mountlist.c or anything that needs its functions
--
1.7.3.5


>From 984767e93b5de369d53d6ba55bab2794727a2bab Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Thu, 20 Jan 2011 09:35:37 +0100
Subject: [PATCH 2/2] mountlist: clean up code formatting

* lib/mountlist.c (read_file_system_list): Split a long line,
correct bracing style, use NULL in place of "(struct statfs *)0",
don't parenthesize return value, add spaces around "=" and after
";-in-for-stmt".
---
 ChangeLog       |    8 ++++++++
 lib/mountlist.c |   42 ++++++++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 22c944b..6c0f4b2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-01-20  Jim Meyering  <address@hidden>
+
+       mountlist: clean up code formatting
+       * lib/mountlist.c (read_file_system_list): Split a long line,
+       correct bracing style, use NULL in place of "(struct statfs *)0",
+       don't parenthesize return value, add spaces around "=" and after
+       ";-in-for-stmt".
+
 2011-01-14  Markus Duft <address@hidden>

        mountlist: add support for Interix
diff --git a/lib/mountlist.c b/lib/mountlist.c
index 397de57..23437bc 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -384,19 +384,20 @@ read_file_system_list (bool need_fs_type)

     if (listmntent (&mntlist, KMTAB, NULL, NULL) < 0)
       return NULL;
-    for (p = mntlist; p; p = p->next) {
-      mnt = p->ment;
-      me = xmalloc (sizeof *me);
-      me->me_devname = xstrdup (mnt->mnt_fsname);
-      me->me_mountdir = xstrdup (mnt->mnt_dir);
-      me->me_type = xstrdup (mnt->mnt_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);
-      me->me_dev = -1;
-      *mtail = me;
-      mtail = &me->me_next;
-    }
+    for (p = mntlist; p; p = p->next)
+      {
+        mnt = p->ment;
+        me = xmalloc (sizeof *me);
+        me->me_devname = xstrdup (mnt->mnt_fsname);
+        me->me_mountdir = xstrdup (mnt->mnt_dir);
+        me->me_type = xstrdup (mnt->mnt_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);
+        me->me_dev = -1;
+        *mtail = me;
+        mtail = &me->me_next;
+      }
     freemntlist (mntlist);
   }
 #endif
@@ -594,7 +595,8 @@ read_file_system_list (bool need_fs_type)
               break;

           me = xmalloc (sizeof *me);
-          me->me_devname = xstrdup (fi.device_name[0] != '\0' ? fi.device_name 
: fi.fsh_name);
+          me->me_devname = xstrdup (fi.device_name[0] != '\0'
+                                    ? fi.device_name : fi.fsh_name);
           me->me_mountdir = xstrdup (re != NULL ? re->name : fi.fsh_name);
           me->me_type = xstrdup (fi.fsh_name);
           me->me_type_malloced = 1;
@@ -624,9 +626,9 @@ read_file_system_list (bool need_fs_type)
     size_t bufsize;
     struct statfs *stats;

-    numsys = getfsstat ((struct statfs *)0, 0L, MNT_NOWAIT);
+    numsys = getfsstat (NULL, 0L, MNT_NOWAIT);
     if (numsys < 0)
-      return (NULL);
+      return NULL;
     if (SIZE_MAX / sizeof *stats <= numsys)
       xalloc_die ();

@@ -637,7 +639,7 @@ read_file_system_list (bool need_fs_type)
     if (numsys < 0)
       {
         free (stats);
-        return (NULL);
+        return NULL;
       }

     for (counter = 0; counter < numsys; counter++)
@@ -723,11 +725,11 @@ read_file_system_list (bool need_fs_type)
 #ifdef MOUNTED_GETMNTTBL        /* DolphinOS goes its own way.  */
   {
     struct mntent **mnttbl = getmnttbl (), **ent;
-    for (ent=mnttbl;*ent;ent++)
+    for (ent = mnttbl; *ent; ent++)
       {
         me = xmalloc (sizeof *me);
-        me->me_devname = xstrdup ( (*ent)->mt_resource);
-        me->me_mountdir = xstrdup ( (*ent)->mt_directory);
+        me->me_devname = xstrdup ((*ent)->mt_resource);
+        me->me_mountdir = xstrdup ((*ent)->mt_directory);
         me->me_type = xstrdup ((*ent)->mt_fstype);
         me->me_type_malloced = 1;
         me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
--
1.7.3.5



reply via email to

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