projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
.
[gnulib.git]
/
lib
/
fsusage.c
diff --git
a/lib/fsusage.c
b/lib/fsusage.c
index
b434913
..
f326c37
100644
(file)
--- a/
lib/fsusage.c
+++ b/
lib/fsusage.c
@@
-15,58
+15,70
@@
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <sys/types.h>
#include "fsusage.h"
#include <sys/types.h>
#include "fsusage.h"
+#include "safe-stat.h"
int statfs ();
int statfs ();
-#if
defined(STAT_STATFS2_BSIZE) && !defined(_IBMR2) /* 4.3BSD, SunOS 4, HP-UX, AIX PS/2. */
-#include <sys/
vfs
.h>
+#if
def HAVE_SYS_PARAM_H
+#include <sys/
param
.h>
#endif
#endif
-#ifdef
STAT_STATFS2_FSIZE /* 4.4BSD. */
+#ifdef
HAVE_SYS_MOUNT_H
#include <sys/mount.h>
#endif
#include <sys/mount.h>
#endif
-#ifdef STAT_STATFS2_FS_DATA /* Ultrix. */
-#include <sys/param.h>
-#include <sys/mount.h>
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
#endif
#endif
-#ifdef STAT_READ /* SVR2. */
-#include <sys/param.h>
-#include <sys/filsys.h>
+#ifdef HAVE_SYS_FILSYS_H
+#include <sys/filsys.h> /* SVR2. */
+#endif
+
+#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#include <fcntl.h>
#endif
-#if
defined(STAT_STATFS4) || (defined(_AIX) && defined(_IBMR2)) /* SVR3, Dynix, Irix, AIX RS6000. */
+#if
def HAVE_SYS_STATFS_H
#include <sys/statfs.h>
#endif
#include <sys/statfs.h>
#endif
-#if
defined(_AIX) && defined(_I386)
/* AIX PS/2. */
+#if
def HAVE_DUSTAT_H
/* AIX PS/2. */
#include <sys/stat.h>
#include <sys/dustat.h>
#endif
#include <sys/stat.h>
#include <sys/dustat.h>
#endif
-#ifdef
STAT_STATVFS
/* SVR4. */
+#ifdef
HAVE_SYS_STATVFS_H
/* SVR4. */
#include <sys/statvfs.h>
int statvfs ();
#endif
/* Return the number of TOSIZE-byte blocks used by
#include <sys/statvfs.h>
int statvfs ();
#endif
/* Return the number of TOSIZE-byte blocks used by
- BLOCKS FROMSIZE-byte blocks, rounding up. */
+ BLOCKS FROMSIZE-byte blocks, rounding away from zero.
+ TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
static long
adjust_blocks (blocks, fromsize, tosize)
long blocks;
int fromsize, tosize;
{
static long
adjust_blocks (blocks, fromsize, tosize)
long blocks;
int fromsize, tosize;
{
+ if (tosize <= 0)
+ 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. */
return blocks * (fromsize / tosize);
else /* E.g., from 256 to 512. */
if (fromsize == tosize) /* E.g., from 512 to 512. */
return blocks;
else if (fromsize > tosize) /* E.g., from 2048 to 512. */
return blocks * (fromsize / tosize);
else /* E.g., from 256 to 512. */
- return (blocks +
1
) / (tosize / fromsize);
+ return (blocks +
(blocks < 0 ? -1 : 1)
) / (tosize / fromsize);
}
/* Fill in the fields of FSP with information about space usage for
}
/* Fill in the fields of FSP with information about space usage for
@@
-80,20
+92,28
@@
get_fs_usage (path, disk, fsp)
char *path, *disk;
struct fs_usage *fsp;
{
char *path, *disk;
struct fs_usage *fsp;
{
+#if defined (STAT_STATFS3_OSF1)
+ struct statfs fsd;
+
+ if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
+ return -1;
+#define CONVERT_BLOCKS(b) adjust_blocks ((b), fsd.f_fsize, 512)
+#endif /* STAT_STATFS3_OSF1 */
+
#ifdef STAT_STATFS2_FS_DATA /* Ultrix. */
struct fs_data fsd;
if (statfs (path, &fsd) != 1)
return -1;
#ifdef STAT_STATFS2_FS_DATA /* Ultrix. */
struct fs_data fsd;
if (statfs (path, &fsd) != 1)
return -1;
-#define
convert_blocks
(b) adjust_blocks ((b), 1024, 512)
- fsp->fsu_blocks =
convert_blocks
(fsd.fd_req.btot);
- fsp->fsu_bfree =
convert_blocks
(fsd.fd_req.bfree);
- fsp->fsu_bavail =
convert_blocks
(fsd.fd_req.bfreen);
+#define
CONVERT_BLOCKS
(b) adjust_blocks ((b), 1024, 512)
+ fsp->fsu_blocks =
CONVERT_BLOCKS
(fsd.fd_req.btot);
+ fsp->fsu_bfree =
CONVERT_BLOCKS
(fsd.fd_req.bfree);
+ fsp->fsu_bavail =
CONVERT_BLOCKS
(fsd.fd_req.bfreen);
fsp->fsu_files = fsd.fd_req.gtot;
fsp->fsu_ffree = fsd.fd_req.gfree;
#endif
fsp->fsu_files = fsd.fd_req.gtot;
fsp->fsu_ffree = fsd.fd_req.gfree;
#endif
-#ifdef STAT_READ /* SVR2. */
+#ifdef STAT_READ
_FILSYS
/* SVR2. */
#ifndef SUPERBOFF
#define SUPERBOFF (SUPERB * 512)
#endif
#ifndef SUPERBOFF
#define SUPERBOFF (SUPERB * 512)
#endif
@@
-110,10
+130,10
@@
get_fs_usage (path, disk, fsp)
return -1;
}
close (fd);
return -1;
}
close (fd);
-#define
convert_blocks
(b) adjust_blocks ((b), (fsd.s_type == Fs2b ? 1024 : 512), 512)
- fsp->fsu_blocks =
convert_blocks
(fsd.s_fsize);
- fsp->fsu_bfree =
convert_blocks
(fsd.s_tfree);
- fsp->fsu_bavail =
convert_blocks
(fsd.s_tfree);
+#define
CONVERT_BLOCKS
(b) adjust_blocks ((b), (fsd.s_type == Fs2b ? 1024 : 512), 512)
+ fsp->fsu_blocks =
CONVERT_BLOCKS
(fsd.s_fsize);
+ fsp->fsu_bfree =
CONVERT_BLOCKS
(fsd.s_tfree);
+ fsp->fsu_bavail =
CONVERT_BLOCKS
(fsd.s_tfree);
fsp->fsu_files = (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1);
fsp->fsu_ffree = fsd.s_tinode;
#endif
fsp->fsu_files = (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1);
fsp->fsu_ffree = fsd.s_tinode;
#endif
@@
-123,7
+143,7
@@
get_fs_usage (path, disk, fsp)
if (statfs (path, &fsd) < 0)
return -1;
if (statfs (path, &fsd) < 0)
return -1;
-#define
convert_blocks
(b) adjust_blocks ((b), fsd.f_bsize, 512)
+#define
CONVERT_BLOCKS
(b) adjust_blocks ((b), fsd.f_bsize, 512)
#endif
#ifdef STAT_STATFS2_FSIZE /* 4.4BSD. */
#endif
#ifdef STAT_STATFS2_FSIZE /* 4.4BSD. */
@@
-131,7
+151,7
@@
get_fs_usage (path, disk, fsp)
if (statfs (path, &fsd) < 0)
return -1;
if (statfs (path, &fsd) < 0)
return -1;
-#define
convert_blocks
(b) adjust_blocks ((b), fsd.f_fsize, 512)
+#define
CONVERT_BLOCKS
(b) adjust_blocks ((b), fsd.f_fsize, 512)
#endif
#ifdef STAT_STATFS4 /* SVR3, Dynix, Irix. */
#endif
#ifdef STAT_STATFS4 /* SVR3, Dynix, Irix. */
@@
-142,11
+162,13
@@
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. */
/* 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. */
-#define
convert_blocks
(b) (b)
+#define
CONVERT_BLOCKS
(b) (b)
#ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx. */
#ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx. */
+#ifndef DOLPHIN /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
#define f_bavail f_bfree
#endif
#endif
#define f_bavail f_bfree
#endif
#endif
+#endif
#ifdef STAT_STATVFS /* SVR4. */
struct statvfs fsd;
#ifdef STAT_STATVFS /* SVR4. */
struct statvfs fsd;
@@
-154,14
+176,14
@@
get_fs_usage (path, disk, fsp)
if (statvfs (path, &fsd) < 0)
return -1;
/* f_frsize isn't guaranteed to be supported. */
if (statvfs (path, &fsd) < 0)
return -1;
/* f_frsize isn't guaranteed to be supported. */
-#define
convert_blocks
(b) \
+#define
CONVERT_BLOCKS
(b) \
adjust_blocks ((b), fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize, 512)
#endif
adjust_blocks ((b), fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize, 512)
#endif
-#if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ) /* !Ultrix && !SVR2. */
- fsp->fsu_blocks =
convert_blocks
(fsd.f_blocks);
- fsp->fsu_bfree =
convert_blocks
(fsd.f_bfree);
- fsp->fsu_bavail =
convert_blocks
(fsd.f_bavail);
+#if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ
_FILSYS
) /* !Ultrix && !SVR2. */
+ fsp->fsu_blocks =
CONVERT_BLOCKS
(fsd.f_blocks);
+ fsp->fsu_bfree =
CONVERT_BLOCKS
(fsd.f_bfree);
+ fsp->fsu_bavail =
CONVERT_BLOCKS
(fsd.f_bavail);
fsp->fsu_files = fsd.f_files;
fsp->fsu_ffree = fsd.f_ffree;
#endif
fsp->fsu_files = fsd.f_files;
fsp->fsu_ffree = fsd.f_ffree;
#endif
@@
-180,7
+202,7
@@
statfs (path, fsb)
struct stat stats;
struct dustat fsd;
struct stat stats;
struct dustat fsd;
- if (
stat
(path, &stats))
+ if (
SAFE_STAT
(path, &stats))
return -1;
if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
return -1;
return -1;
if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
return -1;