X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffsusage.c;h=c669c5e3690d591ba8ac694896db283111e66e49;hb=7b7f6d343eb133e6fb670a982ef4b6b3e13256cb;hp=1784d4a2a4f36310a8783253378c2c1308d5af1e;hpb=849c4387e6e64090599a8980bb76558d242f6c9c;p=gnulib.git diff --git a/lib/fsusage.c b/lib/fsusage.c index 1784d4a2a..c669c5e36 100644 --- a/lib/fsusage.c +++ b/lib/fsusage.c @@ -12,8 +12,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include @@ -22,7 +22,6 @@ #include #include #include "fsusage.h" -#include "safe-stat.h" int statfs (); @@ -38,7 +37,11 @@ int statfs (); #include #endif -#ifdef HAVE_SYS_FILSYS_H +#ifdef HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */ +#include +#endif + +#if defined(HAVE_SYS_FILSYS_H) && !defined(_CRAY) #include /* SVR2. */ #endif @@ -74,7 +77,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. */ @@ -91,7 +94,8 @@ adjust_blocks (blocks, fromsize, tosize) int get_fs_usage (path, disk, fsp) - char *path, *disk; + const char *path; + const char *disk; struct fs_usage *fsp; { #if defined (STAT_STATFS3_OSF1) @@ -145,6 +149,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 @@ -164,8 +183,11 @@ get_fs_usage (path, disk, fsp) /* Empirically, the block counts on most SVR3 and SVR3-derived systems seem to always be in terms of 512-byte blocks, no matter what value f_bsize has. */ -# if _AIX +# if _AIX || defined(_CRAY) # define CONVERT_BLOCKS(b) adjust_blocks ((b), fsd.f_bsize, 512) +# ifdef _CRAY +# define f_bavail f_bfree +# endif # else # define CONVERT_BLOCKS(b) (b) # ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx. */ @@ -208,7 +230,7 @@ statfs (path, fsb) struct stat stats; struct dustat fsd; - if (safe_stat (path, &stats)) + if (stat (path, &stats)) return -1; if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd))) return -1;