summaryrefslogtreecommitdiff
path: root/lib/fsusage.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1995-10-01 18:23:29 +0000
committerJim Meyering <jim@meyering.net>1995-10-01 18:23:29 +0000
commit4de6eab547881a9e3c2931dfe282eb963ce4eb0c (patch)
treef055766322c6e1e4cd53b7c85e566e0a707175fa /lib/fsusage.c
parentcaa2df2274f224e0feaa8a8579ad48dcbd2e2606 (diff)
downloadcoreutils-4de6eab547881a9e3c2931dfe282eb963ce4eb0c.tar.xz
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
counts from f_spare array into proper members of struct statfs. From Eirik Fuller (eirik@netapp.com);
Diffstat (limited to 'lib/fsusage.c')
-rw-r--r--lib/fsusage.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/fsusage.c b/lib/fsusage.c
index 2c1c7f0e2..0296e7e0b 100644
--- a/lib/fsusage.c
+++ b/lib/fsusage.c
@@ -144,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