[glib] Avoid failing arguments to statfs() test on systems which use statvfs.



commit 7f289c924bdc78bff9b5a96cf9e7c0ed943d64c6
Author: Patrick Welche <prlw1 quantz inf phy cam ac uk>
Date:   Mon Jul 18 17:58:01 2011 +0100

    Avoid failing arguments to statfs() test on systems which use statvfs.
    
    - move choice of statfs vs statvfs from gio/glocalfile.c to configure.ac
    - if statvfs is the choice, then don't check number of arguments to statfs()
    - use choice in gio/gunixmounts.c as well
    
    https://bugzilla.gnome.org/show_bug.cgi?id=617949

 configure.ac      |   30 +++++++++++++++++++++++++++++-
 gio/glocalfile.c  |   22 ----------------------
 gio/gunixmounts.c |   32 +++++++++++++++++++++++++++++---
 3 files changed, 58 insertions(+), 26 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 2ee3b79..7c25399 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1000,11 +1000,39 @@ AC_MSG_RESULT(unsigned $glib_size_type)
 
 # Check for some functions
 AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk memmem)
-AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link statvfs statfs utimes getgrgid getpwuid)
+AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid)
 AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getmntinfo)
 # Check for high-resolution sleep functions
 AC_CHECK_FUNCS(splice)
 
+# To avoid finding a compatibility unusable statfs, which typically
+# successfully compiles, but warns to use the newer statvfs interface:
+AS_IF([test $ac_cv_header_sys_statvfs_h = yes], [AC_CHECK_FUNCS([statvfs])])
+AS_IF([test $ac_cv_header_sys_statfs_h  = yes], [AC_CHECK_FUNCS([statfs])])
+
+AC_MSG_CHECKING([whether to use statfs or statvfs])
+# Some systems have both statfs and statvfs, pick the most "native" for these
+AS_IF([test x$ac_cv_func_statfs = xyes && test x$ac_cv_func_statvfs = yes],
+   [
+   # on solaris and irix, statfs doesn't even have the f_bavail field
+   AS_IF([test $ac_cv_member_struct_statfs_f_bavail = yes],
+      [ac_cv_func_statfs=no],
+   # else, at least on linux, statfs is the actual syscall
+      [ac_cv_func_statvfs=no])
+   ])
+
+AS_IF([test x$ac_cv_func_statfs = xyes],
+      [
+         AC_DEFINE([USE_STATFS], [1], [Define to use statfs()])
+         AC_MSG_RESULT([statfs])
+      ],
+      [test x$ac_cv_func_statvfs = xyes],
+      [
+         AC_DEFINE([USE_STATVFS], [1], [Define to use statvfs()])
+         AC_MSG_RESULT([statvfs])
+      ],
+      [  AC_MSG_RESULT([neither])])
+
 AC_CHECK_HEADERS(crt_externs.h)
 AC_CHECK_FUNCS(_NSGetEnviron)
 
diff --git a/gio/glocalfile.c b/gio/glocalfile.c
index 84ba0e2..b246af3 100644
--- a/gio/glocalfile.c
+++ b/gio/glocalfile.c
@@ -50,28 +50,6 @@
 #define O_BINARY 0
 #endif
 
-#if defined(HAVE_STATFS) && defined(HAVE_STATVFS)
-/* Some systems have both statfs and statvfs, pick the
-   most "native" for these */
-# if !defined(HAVE_STRUCT_STATFS_F_BAVAIL)
-   /* on solaris and irix, statfs doesn't even have the
-      f_bavail field */
-#  define USE_STATVFS
-# else
-  /* at least on linux, statfs is the actual syscall */
-#  define USE_STATFS
-# endif
-
-#elif defined(HAVE_STATFS)
-
-# define USE_STATFS
-
-#elif defined(HAVE_STATVFS)
-
-# define USE_STATVFS
-
-#endif
-
 #include "gfileattribute.h"
 #include "glocalfile.h"
 #include "glocalfileinfo.h"
diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c
index 08eb2a0..acbffb4 100644
--- a/gio/gunixmounts.c
+++ b/gio/gunixmounts.c
@@ -38,9 +38,6 @@
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
-#if HAVE_SYS_STATVFS_H
-#include <sys/statvfs.h>
-#endif
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/time.h>
@@ -50,6 +47,25 @@
 #include <gstdio.h>
 #include <dirent.h>
 
+#if HAVE_SYS_STATFS_H
+#include <sys/statfs.h>
+#endif
+#if HAVE_SYS_STATVFS_H
+#include <sys/statvfs.h>
+#endif
+#if HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#elif HAVE_SYS_MOUNT_H
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#include <sys/mount.h>
+#endif
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
 #include "gunixmounts.h"
 #include "gfile.h"
 #include "gfilemonitor.h"
@@ -570,7 +586,13 @@ get_mtab_monitor_file (void)
 static GList *
 _g_get_unix_mounts (void)
 {
+#if defined(USE_STATFS)
   struct statfs *mntent = NULL;
+#elif defined(USE_STATVFS)
+  struct statvfs *mntent = NULL;
+#else
+  #error statfs juggling failed
+#endif
   int num_mounts, i;
   GUnixMountEntry *mount_entry;
   GList *return_list;
@@ -588,7 +610,11 @@ _g_get_unix_mounts (void)
       mount_entry->mount_path = g_strdup (mntent[i].f_mntonname);
       mount_entry->device_path = g_strdup (mntent[i].f_mntfromname);
       mount_entry->filesystem_type = g_strdup (mntent[i].f_fstypename);
+#if defined(USE_STATFS)
       if (mntent[i].f_flags & MNT_RDONLY)
+#elif defined(USE_STATVFS)
+      if (mntent[i].f_flag & MNT_RDONLY)
+#endif
 	mount_entry->is_read_only = TRUE;
 
       mount_entry->is_system_internal =



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