X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffsusage.c;h=660e33c120418a1ce339138982766aad36057285;hb=e131b14fc24aa47678980b700a4284c4c138ffbf;hp=82bdd19702d083307fcaa12fbda1908b5acbcd52;hpb=63f4e38fff9d2458d63ead4a769cfd3dd3e99490;p=gnulib.git diff --git a/lib/fsusage.c b/lib/fsusage.c index 82bdd1970..660e33c12 100644 --- a/lib/fsusage.c +++ b/lib/fsusage.c @@ -22,7 +22,6 @@ #include #include #include "fsusage.h" -#include "safe-stat.h" int statfs (); @@ -74,7 +73,7 @@ adjust_blocks (blocks, fromsize, tosize) abort (); if (fromsize <= 0) return -1; - + if (fromsize == tosize) /* E.g., from 512 to 512. */ return blocks; else if (fromsize > tosize) /* E.g., from 2048 to 512. */ @@ -145,6 +144,21 @@ get_fs_usage (path, disk, fsp) if (statfs (path, &fsd) < 0) return -1; + +#ifdef STATFS_TRUNCATES_BLOCK_COUNTS + /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the + struct statfs are truncated to 2GB. These conditions detect that + truncation, presumably without botching the 4.1.1 case, in which + the values are not truncated. The correct counts are stored in + undocumented spare fields. */ + if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0) + { + fsd.f_blocks = fsd.f_spare[0]; + fsd.f_bfree = fsd.f_spare[1]; + fsd.f_bavail = fsd.f_spare[2]; + } +#endif /* STATFS_TRUNCATES_BLOCK_COUNTS */ + #define CONVERT_BLOCKS(b) adjust_blocks ((b), fsd.f_bsize, 512) #endif