Added block_size field. (Closes: #125049)

2003-12-27  Ole Laursen  <olau@hardworking.dk>

	* include/glibtop/fsusage.h: Added block_size field. (Closes: #125049)
This commit is contained in:
Ole Laursen
2004-03-09 23:28:48 +00:00
committed by Bastien Nocera
parent 4bd9752d52
commit 897db07104
8 changed files with 133 additions and 140 deletions

View File

@@ -1,3 +1,7 @@
2003-12-27 Ole Laursen <olau@hardworking.dk>
* include/glibtop/fsusage.h: Added block_size field. (Closes: #125049)
2004-03-05 Bastien Nocera <hadess@hadess.net> 2004-03-05 Bastien Nocera <hadess@hadess.net>
* include/glibtop/procmap.h: patch by Benoit Dejean <bnet@ifrance.com> * include/glibtop/procmap.h: patch by Benoit Dejean <bnet@ifrance.com>

View File

@@ -1,3 +1,7 @@
2003-12-27 Ole Laursen <olau@hardworking.dk>
* mountlist.c: Updated to display block size too.
2004-03-04 Bastien Nocera <hadess@hadess.net> 2004-03-04 Bastien Nocera <hadess@hadess.net>
* smp.c: use libgtop-i18n.h * smp.c: use libgtop-i18n.h

View File

@@ -88,18 +88,18 @@ main (int argc, char *argv [])
mount_entries [index].type, mount_entries [index].type,
mount_entries [index].devname); mount_entries [index].devname);
printf ("\n\n%-23s %9s %9s %9s %9s %9s\n\n", printf ("\n\n%-16s %9s %9s %9s %9s %9s %9s\n",
"", "Blocks", "Free", "Avail", "Files", "Free"); "Mount", "Blocks", "Free", "Avail", "Files", "Free", "BlockSz");
for (index = 0; index < mount_list.number; index++) { for (index = 0; index < mount_list.number; index++) {
glibtop_get_fsusage (&fsusage, glibtop_get_fsusage (&fsusage,
mount_entries [index].mountdir); mount_entries [index].mountdir);
printf ("Usage: %-16s %9Lu %9Lu %9Lu %9Lu %9Lu\n", printf ("%-16s %9Lu %9Lu %9Lu %9Lu %9Lu %9d\n",
mount_entries [index].mountdir, mount_entries [index].mountdir,
fsusage.blocks, fsusage.bfree, fsusage.blocks, fsusage.bfree,
fsusage.bavail, fsusage.files, fsusage.bavail, fsusage.files,
fsusage.ffree); fsusage.ffree, fsusage.block_size);
} }
g_free (mount_entries); g_free (mount_entries);

View File

@@ -1,7 +1,6 @@
/* $Id$ */ /* $Id$ */
/* Copyright (C) 1998-99 Martin Baulig /* Copyright (C) 1998-99 Martin Baulig
This file is part of LibGTop 1.0.
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
@@ -34,19 +33,22 @@ G_BEGIN_DECLS
#define GLIBTOP_FSUSAGE_BAVAIL 2 #define GLIBTOP_FSUSAGE_BAVAIL 2
#define GLIBTOP_FSUSAGE_FILES 3 #define GLIBTOP_FSUSAGE_FILES 3
#define GLIBTOP_FSUSAGE_FFREE 4 #define GLIBTOP_FSUSAGE_FFREE 4
#define GLIBTOP_FSUSAGE_BLOCK_SIZE 6
#define GLIBTOP_MAX_FSUSAGE 5 #define GLIBTOP_MAX_FSUSAGE 5
typedef struct _glibtop_fsusage glibtop_fsusage; typedef struct _glibtop_fsusage glibtop_fsusage;
struct _glibtop_fsusage struct _glibtop_fsusage
{ {
guint64 flags, guint64 flags,
blocks, /* Total blocks. */ blocks, /* Total number of blocks. */
bfree, /* Free blocks available to superuser. */ bfree, /* Free blocks available to superuser. */
bavail, /* Free blocks available to non-superuser. */ bavail, /* Free blocks available to non-superuser. */
files, /* Total file nodes. */ files, /* Total file nodes. */
ffree; /* Free file nodes. */ ffree; /* Free file nodes. */
int block_size; /* Size of a block in bytes. */
}; };
#define glibtop_get_fsusage(fsusage,disk) glibtop_get_fsusage_l(glibtop_global_server, fsusage, disk) #define glibtop_get_fsusage(fsusage,disk) glibtop_get_fsusage_l(glibtop_global_server, fsusage, disk)

View File

@@ -1,3 +1,12 @@
2003-12-27 Ole Laursen <olau@hardworking.dk>
* README.fsusage: Added a few words about the code from GNU
Coreutils.
* fsusage.c, fsusage.h: Resynced from GNU Coreutils 5.0.
* fsusage-frontend.c: Moved the frontend from fsusage.c to here.
2003-10-21 Bastien Nocera <hadess@hadess.net> 2003-10-21 Bastien Nocera <hadess@hadess.net>
* Makefile.am: * Makefile.am:

View File

@@ -14,7 +14,8 @@ CFLAGS = @CFLAGS@ $(inodedb_DEFS)
noinst_LTLIBRARIES = libgtop_common-2.0.la libgtop_suid_common-2.0.la noinst_LTLIBRARIES = libgtop_common-2.0.la libgtop_suid_common-2.0.la
libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \ libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \
fsusage.c fsusage.h mountlist.c mountlist.h \ fsusage.c fsusage.h fsusage-frontend.c \
mountlist.c mountlist.h \
$(inodedb_SRCLIST) $(inodedb_SRCLIST)
libgtop_common_2_0_la_LDFLAGS = $(LT_VERSION_INFO) libgtop_common_2_0_la_LDFLAGS = $(LT_VERSION_INFO)

View File

@@ -1,5 +1,6 @@
/* fsusage.c -- return space usage of mounted filesystems /* fsusage.c -- return space usage of mounted filesystems
Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc. Copyright (C) 1991, 1992, 1996, 1998, 1999, 2002, 2003 Free Software
Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -19,11 +20,27 @@
# include <config.h> # include <config.h>
#endif #endif
#if HAVE_INTTYPES_H
# include <inttypes.h>
#else
# if HAVE_STDINT_H
# include <stdint.h>
# endif
#endif
#ifndef UINTMAX_MAX
# define UINTMAX_MAX ((uintmax_t) -1)
#endif
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "fsusage.h" #include "fsusage.h"
int statfs (); #if HAVE_LIMITS_H
# include <limits.h>
#endif
#ifndef CHAR_BIT
# define CHAR_BIT 8
#endif
#if HAVE_SYS_PARAM_H #if HAVE_SYS_PARAM_H
# include <sys/param.h> # include <sys/param.h>
@@ -41,7 +58,7 @@ int statfs ();
# include <sys/fs/s5param.h> # include <sys/fs/s5param.h>
#endif #endif
#if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY) #if defined HAVE_SYS_FILSYS_H && !defined _CRAY
# include <sys/filsys.h> /* SVR2 */ # include <sys/filsys.h> /* SVR2 */
#endif #endif
@@ -62,36 +79,31 @@ int statfs ();
int statvfs (); int statvfs ();
#endif #endif
#include <glibtop.h> #include "full-read.h"
#include <glibtop/error.h>
#include <glibtop/fsusage.h>
static int /* Many space usage primitives use all 1 bits to denote a value that is
get_fs_usage (const char *path, const char *disk, struct fs_usage *fsp); not applicable or unknown. Propagate this information by returning
a uintmax_t value that is all 1 bits if X is all 1 bits, even if X
is unsigned and narrower than uintmax_t. */
#define PROPAGATE_ALL_ONES(x) \
((sizeof (x) < sizeof (uintmax_t) \
&& (~ (x) == (sizeof (x) < sizeof (int) \
? - (1 << (sizeof (x) * CHAR_BIT)) \
: 0))) \
? UINTMAX_MAX : (x))
int safe_read (); /* Extract the top bit of X as an uintmax_t value. */
#define EXTRACT_TOP_BIT(x) ((x) \
& ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1)))
/* Return the number of TOSIZE-byte blocks used by /* If a value is negative, many space usage primitives store it into an
BLOCKS FROMSIZE-byte blocks, rounding away from zero. integer variable by assignment, even if the variable's type is unsigned.
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */ So, if a space usage variable X's top bit is set, convert X to the
uintmax_t value V such that (- (uintmax_t) V) is the negative of
static guint64 the original value. If X's top bit is clear, just yield X.
adjust_blocks (blocks, fromsize, tosize) Use PROPAGATE_TOP_BIT if the original value might be negative;
guint64 blocks; otherwise, use PROPAGATE_ALL_ONES. */
int fromsize, tosize; #define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))
{
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 * (guint64)(fromsize / tosize);
else /* e.g., from 256 to 512 */
return (blocks + (blocks < 0 ? -1 : 1)) / (guint64)(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
the filesystem on which PATH resides. the filesystem on which PATH resides.
@@ -100,79 +112,46 @@ adjust_blocks (blocks, fromsize, tosize)
Return 0 if successful, -1 if not. When returning -1, ensure that Return 0 if successful, -1 if not. When returning -1, ensure that
ERRNO is either a system error value, or zero if DISK is NULL ERRNO is either a system error value, or zero if DISK is NULL
on a system that requires a non-NULL value. */ on a system that requires a non-NULL value. */
static int int
get_fs_usage (path, disk, fsp) glibtop_private_get_fs_usage (const char *path, const char *disk, struct fs_usage *fsp)
const char *path;
const char *disk;
struct fs_usage *fsp;
{ {
#ifdef STAT_STATFS3_OSF1 #ifdef STAT_STATFS3_OSF1
# define CONVERT_BLOCKS(B) adjust_blocks ((guint64)(B), fsd.f_fsize, 512)
struct statfs fsd; struct statfs fsd;
if (statfs (path, &fsd, sizeof (struct statfs)) != 0) if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
return -1; return -1;
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
#endif /* STAT_STATFS3_OSF1 */ #endif /* STAT_STATFS3_OSF1 */
#ifdef STAT_STATFS2_FS_DATA /* Ultrix */ #ifdef STAT_STATFS2_FS_DATA /* Ultrix */
# define CONVERT_BLOCKS(B) adjust_blocks ((guint64)(B), 1024, 512)
struct fs_data fsd; struct fs_data fsd;
if (statfs (path, &fsd) != 1) if (statfs (path, &fsd) != 1)
return -1; return -1;
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.fd_req.btot);
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.fd_req.bfree); fsp->fsu_blocksize = 1024;
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.fd_req.bfreen); fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.fd_req.btot);
fsp->fsu_files = fsd.fd_req.gtot; fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.fd_req.bfree);
fsp->fsu_ffree = fsd.fd_req.gfree; fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.fd_req.bfreen);
fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.fd_req.bfreen) != 0;
fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot);
fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree);
#endif /* STAT_STATFS2_FS_DATA */ #endif /* STAT_STATFS2_FS_DATA */
#ifdef STAT_READ_FILSYS /* SVR2 */
# ifndef SUPERBOFF
# define SUPERBOFF (SUPERB * 512)
# endif
# define CONVERT_BLOCKS(B) \
adjust_blocks ((guint64)(B), (fsd.s_type == Fs2b ? 1024 : 512), 512)
struct filsys fsd;
int fd;
if (! disk)
{
errno = 0;
return -1;
}
fd = open (disk, O_RDONLY);
if (fd < 0)
return -1;
lseek (fd, (long) SUPERBOFF, 0);
if (safe_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd)
{
close (fd);
return -1;
}
close (fd);
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 /* STAT_READ_FILSYS */
#ifdef STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */ #ifdef STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */
# define CONVERT_BLOCKS(B) adjust_blocks ((guint64)(B), fsd.f_bsize, 512)
struct statfs fsd; struct statfs fsd;
if (statfs (path, &fsd) < 0) if (statfs (path, &fsd) < 0)
return -1; return -1;
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
# ifdef STATFS_TRUNCATES_BLOCK_COUNTS # ifdef STATFS_TRUNCATES_BLOCK_COUNTS
/* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
@@ -180,7 +159,7 @@ get_fs_usage (path, disk, fsp)
truncation, presumably without botching the 4.1.1 case, in which truncation, presumably without botching the 4.1.1 case, in which
the values are not truncated. The correct counts are stored in the values are not truncated. The correct counts are stored in
undocumented spare fields. */ undocumented spare fields. */
if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0) if (fsd.f_blocks == 0x7fffffff / fsd.f_bsize && fsd.f_spare[0] > 0)
{ {
fsd.f_blocks = fsd.f_spare[0]; fsd.f_blocks = fsd.f_spare[0];
fsd.f_bfree = fsd.f_spare[1]; fsd.f_bfree = fsd.f_spare[1];
@@ -191,73 +170,72 @@ get_fs_usage (path, disk, fsp)
#endif /* STAT_STATFS2_BSIZE */ #endif /* STAT_STATFS2_BSIZE */
#ifdef STAT_STATFS2_FSIZE /* 4.4BSD */ #ifdef STAT_STATFS2_FSIZE /* 4.4BSD */
# define CONVERT_BLOCKS(B) adjust_blocks ((guint64)(B), fsd.f_fsize, 512)
struct statfs fsd; struct statfs fsd;
if (statfs (path, &fsd) < 0) if (statfs (path, &fsd) < 0)
return -1; return -1;
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
#endif /* STAT_STATFS2_FSIZE */ #endif /* STAT_STATFS2_FSIZE */
#ifdef STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */ #ifdef STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */
# if _AIX || defined(_CRAY)
# define CONVERT_BLOCKS(B) adjust_blocks ((guint64)(B), fsd.f_bsize, 512) # if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN
# ifdef _CRAY
# define f_bavail f_bfree # define f_bavail f_bfree
# endif
# else
# define CONVERT_BLOCKS(B) (B)
# ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx */
# ifndef DOLPHIN /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
# define f_bavail f_bfree
# endif
# endif
# endif # endif
struct statfs fsd; struct statfs fsd;
if (statfs (path, &fsd, sizeof fsd, 0) < 0) if (statfs (path, &fsd, sizeof fsd, 0) < 0)
return -1; return -1;
/* Empirically, the block counts on most SVR3 and SVR3-derived /* Empirically, the block counts on most SVR3 and SVR3-derived
systems seem to always be in terms of 512-byte blocks, systems seem to always be in terms of 512-byte blocks,
no matter what value f_bsize has. */ no matter what value f_bsize has. */
# if _AIX || defined _CRAY
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
# else
fsp->fsu_blocksize = 512;
# endif
#endif /* STAT_STATFS4 */ #endif /* STAT_STATFS4 */
#ifdef STAT_STATVFS /* SVR4 */ #ifdef STAT_STATVFS /* SVR4 */
# define CONVERT_BLOCKS(B) \
adjust_blocks ((guint64)(B), fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize, 512)
struct statvfs fsd; struct statvfs fsd;
if (statvfs (path, &fsd) < 0) if (statvfs (path, &fsd) < 0)
return -1; return -1;
/* f_frsize isn't guaranteed to be supported. */ /* f_frsize isn't guaranteed to be supported. */
fsp->fsu_blocksize = (fsd.f_frsize
? PROPAGATE_ALL_ONES (fsd.f_frsize)
: PROPAGATE_ALL_ONES (fsd.f_bsize));
#endif /* STAT_STATVFS */ #endif /* STAT_STATVFS */
#if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ_FILSYS) #if !defined STAT_STATFS2_FS_DATA && !defined STAT_READ_FILSYS
/* !Ultrix && !SVR2 */ /* !Ultrix && !SVR2 */
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks); fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks);
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree); fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree);
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail); fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.f_bavail);
fsp->fsu_files = fsd.f_files; fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.f_bavail) != 0;
fsp->fsu_ffree = fsd.f_ffree; fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files);
fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree);
#endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */ #endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */
return 0; return 0;
} }
#if defined(_AIX) && defined(_I386) #if defined _AIX && defined _I386
/* AIX PS/2 does not supply statfs. */ /* AIX PS/2 does not supply statfs. */
int static int
statfs (path, fsb) statfs (char *path, struct statfs *fsb)
char *path;
struct statfs *fsb;
{ {
struct stat stats; struct stat stats;
struct dustat fsd; struct dustat fsd;
@@ -279,24 +257,3 @@ statfs (path, fsb)
} }
#endif /* _AIX && _I386 */ #endif /* _AIX && _I386 */
void
glibtop_get_fsusage_s (glibtop *server, glibtop_fsusage *buf,
const char *disk)
{
struct fs_usage fsp;
glibtop_init_r (&server, 0, 0);
memset (buf, 0, sizeof (glibtop_fsusage));
memset (&fsp, 0, sizeof (struct fs_usage));
if (get_fs_usage (disk, disk, &fsp))
return;
buf->blocks = fsp.fsu_blocks;
buf->bfree = fsp.fsu_bfree;
buf->bavail = fsp.fsu_bavail;
buf->files = fsp.fsu_files;
buf->ffree = fsp.fsu_ffree;
}

View File

@@ -1,5 +1,5 @@
/* fsusage.h -- declarations for filesystem space usage info /* fsusage.h -- declarations for filesystem space usage info
Copyright (C) 1991, 1992 Free Software Foundation, Inc. Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -15,15 +15,31 @@
along with this program; if not, write to the Free Software Foundation, along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <glib.h>
/* Space usage statistics for a filesystem. Blocks are 512-byte. */ /* Space usage statistics for a filesystem. Blocks are 512-byte. */
#if !defined FSUSAGE_H_
# define FSUSAGE_H_
struct fs_usage struct fs_usage
{ {
guint64 fsu_blocks; /* Total blocks. */ int fsu_blocksize; /* Size of a block. */
guint64 fsu_bfree; /* Free blocks available to superuser. */ uintmax_t fsu_blocks; /* Total blocks. */
guint64 fsu_bavail; /* Free blocks available to non-superuser. */ uintmax_t fsu_bfree; /* Free blocks available to superuser. */
guint64 fsu_files; /* Total file nodes. */ uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */
guint64 fsu_ffree; /* Free file nodes. */ int fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */
uintmax_t fsu_files; /* Total file nodes. */
uintmax_t fsu_ffree; /* Free file nodes. */
}; };
# ifndef PARAMS
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
# define PARAMS(Args) Args
# else
# define PARAMS(Args) ()
# endif
# endif
int glibtop_private_get_fs_usage PARAMS ((const char *path, const char *disk,
struct fs_usage *fsp));
#endif