(st_blocks): long -> off_t.

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.
This commit is contained in:
Jim Meyering 1997-11-30 10:24:20 +00:00
parent ce43e130bb
commit f633782aa1

View 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>
@ -30,12 +30,7 @@
# 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 */
@ -45,12 +40,12 @@
/* 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)
{