Mercurial > hg > octave-kai > gnulib-hg
annotate lib/fsusage.c @ 1202:c9448dd2fd94
(get_fs_usage): Add parens.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 05 Jan 1998 17:38:38 +0000 |
parents | 5f2881266806 |
children | e7fef68c6d85 |
rev | line source |
---|---|
5 | 1 /* fsusage.c -- return space usage of mounted filesystems |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
2 Copyright (C) 1991, 1992, 1996, 1998 Free Software Foundation, Inc. |
5 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
650
b4ef1c1a0171
update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents:
618
diff
changeset
|
15 along with this program; if not, write to the Free Software Foundation, |
b4ef1c1a0171
update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents:
618
diff
changeset
|
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
5 | 17 |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
18 #if HAVE_CONFIG_H |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
19 # include <config.h> |
105 | 20 #endif |
21 | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
22 #if HAVE_INTTYPES_H |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
23 # include <inttypes.h> |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
24 #endif |
5 | 25 #include <sys/types.h> |
338 | 26 #include <sys/stat.h> |
5 | 27 #include "fsusage.h" |
28 | |
29 int statfs (); | |
30 | |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
31 #if HAVE_SYS_PARAM_H |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
32 # include <sys/param.h> |
76 | 33 #endif |
34 | |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
35 #if HAVE_SYS_MOUNT_H |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
36 # include <sys/mount.h> |
5 | 37 #endif |
38 | |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
39 #if HAVE_SYS_VFS_H |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
40 # include <sys/vfs.h> |
5 | 41 #endif |
42 | |
780 | 43 #if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */ |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
44 # include <sys/fs/s5param.h> |
669
20030d56c4ac
[HAVE_SYS_FS_S5PARAM_H]: Include sys/fs/s5param.h
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
45 #endif |
20030d56c4ac
[HAVE_SYS_FS_S5PARAM_H]: Include sys/fs/s5param.h
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
46 |
780 | 47 #if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY) |
48 # include <sys/filsys.h> /* SVR2 */ | |
323 | 49 #endif |
50 | |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
51 #if HAVE_FCNTL_H |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
52 # include <fcntl.h> |
5 | 53 #endif |
54 | |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
55 #if HAVE_SYS_STATFS_H |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
56 # include <sys/statfs.h> |
5 | 57 #endif |
58 | |
780 | 59 #if HAVE_DUSTAT_H /* AIX PS/2 */ |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
60 # include <sys/dustat.h> |
5 | 61 #endif |
62 | |
780 | 63 #if HAVE_SYS_STATVFS_H /* SVR4 */ |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
64 # include <sys/statvfs.h> |
5 | 65 int statvfs (); |
66 #endif | |
67 | |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
68 /* Many space usage primitives use all 1 bits to denote a value that is |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
69 not applicable or unknown. Propagate this information by returning |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
70 a uintmax_t value that is all 1 bits if the argument is all 1 bits, |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
71 even if the argument is unsigned and smaller than unitmax_t. */ |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
72 #define PROPAGATE_ALL_ONES(x) ((x) == -1 ? (uintmax_t) -1 : (uintmax_t) (x)) |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
73 |
385
f4cb6bbc01d4
(get_fs_usage, statfs): Use safe_read, and safe_stat rather than
Jim Meyering <jim@meyering.net>
parents:
339
diff
changeset
|
74 int safe_read (); |
f4cb6bbc01d4
(get_fs_usage, statfs): Use safe_read, and safe_stat rather than
Jim Meyering <jim@meyering.net>
parents:
339
diff
changeset
|
75 |
5 | 76 /* Fill in the fields of FSP with information about space usage for |
77 the filesystem on which PATH resides. | |
78 DISK is the device on which PATH is mounted, for space-getting | |
79 methods that need to know it. | |
793
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
80 Return 0 if successful, -1 if not. When returning -1, ensure that |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
81 ERRNO is either a system error value, or zero if DISK is NULL |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
82 on a system that requires a non-NULL value. */ |
5 | 83 int |
84 get_fs_usage (path, disk, fsp) | |
612
271429a79a04
(get_fs_usage): Declare parameter PATH to be const.
Jim Meyering <jim@meyering.net>
parents:
491
diff
changeset
|
85 const char *path; |
271429a79a04
(get_fs_usage): Declare parameter PATH to be const.
Jim Meyering <jim@meyering.net>
parents:
491
diff
changeset
|
86 const char *disk; |
5 | 87 struct fs_usage *fsp; |
88 { | |
780 | 89 #ifdef STAT_STATFS3_OSF1 |
90 | |
76 | 91 struct statfs fsd; |
92 | |
93 if (statfs (path, &fsd, sizeof (struct statfs)) != 0) | |
196 | 94 return -1; |
780 | 95 |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
96 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
97 |
120 | 98 #endif /* STAT_STATFS3_OSF1 */ |
76 | 99 |
780 | 100 #ifdef STAT_STATFS2_FS_DATA /* Ultrix */ |
101 | |
5 | 102 struct fs_data fsd; |
103 | |
104 if (statfs (path, &fsd) != 1) | |
105 return -1; | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
106 |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
107 fsp->fsu_blocksize = 1024; |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
108 fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.fd_req.btot); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
109 fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.fd_req.bfree); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
110 fsp->fsu_bavail = PROPAGATE_ALL_ONES (fsd.fd_req.bfreen); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
111 fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
112 fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree); |
5 | 113 |
780 | 114 #endif /* STAT_STATFS2_FS_DATA */ |
115 | |
116 #ifdef STAT_READ_FILSYS /* SVR2 */ | |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
117 # ifndef SUPERBOFF |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
118 # define SUPERBOFF (SUPERB * 512) |
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
119 # endif |
780 | 120 |
5 | 121 struct filsys fsd; |
122 int fd; | |
123 | |
793
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
124 if (! disk) |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
125 { |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
126 errno = 0; |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
127 return -1; |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
128 } |
d257c9ac0e72
(get_fs_usage): If DISK is 0 and we needed to use
Jim Meyering <jim@meyering.net>
parents:
780
diff
changeset
|
129 |
5 | 130 fd = open (disk, O_RDONLY); |
131 if (fd < 0) | |
132 return -1; | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
133 lseek (fd, (off_t) SUPERBOFF, 0); |
385
f4cb6bbc01d4
(get_fs_usage, statfs): Use safe_read, and safe_stat rather than
Jim Meyering <jim@meyering.net>
parents:
339
diff
changeset
|
134 if (safe_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd) |
5 | 135 { |
136 close (fd); | |
137 return -1; | |
138 } | |
139 close (fd); | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
140 |
1202
c9448dd2fd94
(get_fs_usage): Add parens.
Jim Meyering <jim@meyering.net>
parents:
1201
diff
changeset
|
141 fsp->fsu_blocksize = (fsd.s_type == Fs2b ? 1024 : 512); |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
142 fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.s_fsize); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
143 fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.s_tfree); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
144 fsp->fsu_bavail = PROPAGATE_ALL_ONES (fsd.s_tfree); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
145 fsp->fsu_files = (fsd.s_isize == -1 |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
146 ? (uintmax_t) -1 |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
147 : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1)); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
148 fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode); |
780 | 149 |
150 #endif /* STAT_READ_FILSYS */ | |
5 | 151 |
780 | 152 #ifdef STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */ |
153 | |
5 | 154 struct statfs fsd; |
155 | |
156 if (statfs (path, &fsd) < 0) | |
157 return -1; | |
488
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
158 |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
159 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize); |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
160 |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
161 # ifdef STATFS_TRUNCATES_BLOCK_COUNTS |
780 | 162 |
488
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
163 /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
164 struct statfs are truncated to 2GB. These conditions detect that |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
165 truncation, presumably without botching the 4.1.1 case, in which |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
166 the values are not truncated. The correct counts are stored in |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
167 undocumented spare fields. */ |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
168 if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0) |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
169 { |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
170 fsd.f_blocks = fsd.f_spare[0]; |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
171 fsd.f_bfree = fsd.f_spare[1]; |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
172 fsd.f_bavail = fsd.f_spare[2]; |
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
173 } |
774
2158edf8414e
cpp-indent + change some #ifdef to #if
Jim Meyering <jim@meyering.net>
parents:
670
diff
changeset
|
174 # endif /* STATFS_TRUNCATES_BLOCK_COUNTS */ |
488
3b80433a4e28
(get_fs_usage) [STATFS_TRUNCATES_BLOCK_COUNTS]: Copy untruncated block
Jim Meyering <jim@meyering.net>
parents:
439
diff
changeset
|
175 |
780 | 176 #endif /* STAT_STATFS2_BSIZE */ |
5 | 177 |
780 | 178 #ifdef STAT_STATFS2_FSIZE /* 4.4BSD */ |
179 | |
5 | 180 struct statfs fsd; |
181 | |
182 if (statfs (path, &fsd) < 0) | |
183 return -1; | |
780 | 184 |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
185 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
186 |
780 | 187 #endif /* STAT_STATFS2_FSIZE */ |
5 | 188 |
780 | 189 #ifdef STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */ |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
190 |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
191 # if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
192 # define f_bavail f_bfree |
780 | 193 # endif |
194 | |
5 | 195 struct statfs fsd; |
196 | |
197 if (statfs (path, &fsd, sizeof fsd, 0) < 0) | |
198 return -1; | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
199 |
5 | 200 /* Empirically, the block counts on most SVR3 and SVR3-derived |
201 systems seem to always be in terms of 512-byte blocks, | |
202 no matter what value f_bsize has. */ | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
203 # if _AIX || defined(_CRAY) |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
204 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize); |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
205 # else |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
206 fsp->fsu_blocksize = 512; |
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
207 # endif |
780 | 208 |
209 #endif /* STAT_STATFS4 */ | |
5 | 210 |
780 | 211 #ifdef STAT_STATVFS /* SVR4 */ |
212 | |
5 | 213 struct statvfs fsd; |
214 | |
215 if (statvfs (path, &fsd) < 0) | |
216 return -1; | |
1135
5306f6a320de
Do all calculations using uintmax_t.
Jim Meyering <jim@meyering.net>
parents:
793
diff
changeset
|
217 |
5 | 218 /* f_frsize isn't guaranteed to be supported. */ |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
219 fsp->fsu_blocksize = |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
220 PROPAGATE_ALL_ONES (fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize); |
780 | 221 |
222 #endif /* STAT_STATVFS */ | |
5 | 223 |
780 | 224 #if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ_FILSYS) |
225 /* !Ultrix && !SVR2 */ | |
226 | |
1201
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
227 fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
228 fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
229 fsp->fsu_bavail = PROPAGATE_ALL_ONES (fsd.f_bavail); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
230 fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files); |
5f2881266806
(PROPAGATE_ALL_ONES): New macro.
Jim Meyering <jim@meyering.net>
parents:
1135
diff
changeset
|
231 fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree); |
780 | 232 |
233 #endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */ | |
5 | 234 |
235 return 0; | |
236 } | |
237 | |
238 #if defined(_AIX) && defined(_I386) | |
239 /* AIX PS/2 does not supply statfs. */ | |
240 | |
241 int | |
242 statfs (path, fsb) | |
243 char *path; | |
244 struct statfs *fsb; | |
245 { | |
246 struct stat stats; | |
247 struct dustat fsd; | |
248 | |
426
defe7888e2f3
(statfs): Use stat, not safe_stat.
Jim Meyering <jim@meyering.net>
parents:
385
diff
changeset
|
249 if (stat (path, &stats)) |
5 | 250 return -1; |
251 if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd))) | |
252 return -1; | |
253 fsb->f_type = 0; | |
254 fsb->f_bsize = fsd.du_bsize; | |
255 fsb->f_blocks = fsd.du_fsize - fsd.du_isize; | |
256 fsb->f_bfree = fsd.du_tfree; | |
257 fsb->f_bavail = fsd.du_tfree; | |
258 fsb->f_files = (fsd.du_isize - 2) * fsd.du_inopb; | |
259 fsb->f_ffree = fsd.du_tinode; | |
260 fsb->f_fsid.val[0] = fsd.du_site; | |
261 fsb->f_fsid.val[1] = fsd.du_pckno; | |
262 return 0; | |
263 } | |
780 | 264 |
5 | 265 #endif /* _AIX && _I386 */ |