merge with 3.8.4g
[gnulib.git] / lib / fsusage.c
index 8cc0c6d..96860eb 100644 (file)
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
+#ifdef HAVE_CONFIG_H
+#if defined (CONFIG_BROKETS)
+/* We use <config.h> instead of "config.h" so that a compilation
+   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
+   (which it would do because it found this file in $srcdir).  */
+#include <config.h>
+#else
+#include "config.h"
+#endif
+#endif
+
 #include <sys/types.h>
 #include "fsusage.h"
 
 int statfs ();
 
+#if defined (STAT_STATFS3_OSF1)        /* DEC Alpha running OSF/1 */
+#  include <sys/mount.h>
+#endif
+
 #if defined(STAT_STATFS2_BSIZE) && !defined(_IBMR2) /* 4.3BSD, SunOS 4, HP-UX, AIX PS/2.  */
 #include <sys/vfs.h>
 #endif
@@ -54,16 +69,20 @@ int statvfs ();
 #endif
 
 /* Return the number of TOSIZE-byte blocks used by
-   BLOCKS FROMSIZE-byte blocks, rounding up.  */
+   BLOCKS FROMSIZE-byte blocks, rounding away from zero.  */
 
-#define adjust_blocks(blocks, fromsize, tosize)                \
-  (((fromsize) == (tosize))                            \
-   ? (blocks)  /* E.g., from 512 to 512.  */           \
-   : (((fromsize) > (tosize))                          \
-      /* E.g., from 2048 to 512.  */                   \
-      ? (blocks) * ((fromsize) / (tosize))             \
-      /* E.g., from 256 to 512.  */                    \
-      : ((blocks) + 1) / ((tosize) / (fromsize))))
+static long
+adjust_blocks (blocks, fromsize, tosize)
+     long blocks;
+     int fromsize, tosize;
+{
+  if (fromsize == tosize)      /* E.g., from 512 to 512.  */
+    return blocks;
+  else if (fromsize > tosize)  /* E.g., from 2048 to 512.  */
+    return blocks * (fromsize / tosize);
+  else                         /* E.g., from 256 to 512.  */
+    return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
+}
 
 /* Fill in the fields of FSP with information about space usage for
    the filesystem on which PATH resides.
@@ -76,6 +95,14 @@ get_fs_usage (path, disk, fsp)
      char *path, *disk;
      struct fs_usage *fsp;
 {
+#if defined (STAT_STATFS3_OSF1)
+  struct statfs fsd;
+
+  if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
+    return (-1);
+#define convert_blocks(b) adjust_blocks ((b),fsd.f_fsize, 512)
+#endif /* STAT_STATFS3_OSF1 */
+
 #ifdef STAT_STATFS2_FS_DATA    /* Ultrix.  */
   struct fs_data fsd;
 
@@ -140,9 +167,11 @@ get_fs_usage (path, disk, fsp)
      no matter what value f_bsize has.  */
 #define convert_blocks(b) (b)
 #ifndef _SEQUENT_              /* _SEQUENT_ is DYNIX/ptx.  */
+#ifndef DOLPHIN                        /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
 #define f_bavail f_bfree
 #endif
 #endif
+#endif
 
 #ifdef STAT_STATVFS            /* SVR4.  */
   struct statvfs fsd;