(st_blocks): long -> off_t.
authorJim Meyering <jim@meyering.net>
Sun, 30 Nov 1997 10:24:20 +0000 (10:24 +0000)
committerJim Meyering <jim@meyering.net>
Sun, 30 Nov 1997 10:24:20 +0000 (10:24 +0000)
Avoid arithmetic overflow when size is near max.
Depend on _POSIX_SOURCE and BSIZE, not _POSIX_VERSION, for
compatibility with system.h.
(BSIZE): Remove definition, since if BSIZE is not defined
we're never invoked.

lib/fileblocks.c

index 7f696ab..6a421cf 100644 (file)
@@ -21,7 +21,7 @@
 # include <config.h>
 #endif
 
-#if !defined (HAVE_ST_BLOCKS) && !defined(_POSIX_VERSION)
+#if !HAVE_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE
 # include <sys/types.h>
 # include <sys/param.h>
 
 # endif
 
 # ifndef NINDIR
-/* Some SysV's, like Irix, seem to lack these.  Hope they're correct. */
-/* Size of a indirect block, in bytes. */
-#  ifndef BSIZE
-#   define BSIZE 1024
-#  endif
-
+/* Some SysV's, like Irix, seem to lack this.  Hope it's correct. */
 /* Number of inode pointers per indirect block. */
 #  define NINDIR (BSIZE/sizeof(daddr_t))
 # endif /* !NINDIR */
 
 /* Return the number of 512-byte blocks in a file of SIZE bytes. */
 
-long
+off_t
 st_blocks (size)
-     long size;
+     off_t size;
 {
-  long datablks = (size + 512 - 1) / 512;
-  long indrblks = 0;
+  off_t datablks = size / 512 + (size % 512 != 0);
+  off_t indrblks = 0;
 
   if (datablks > NDIR)
     {