v19i004: df2_r4 - R3/R4 son of df2, Part01/01
Warren Tucker
wht at n4hgf.Mt-Park.GA.US
Tue Apr 30 14:06:32 AEST 1991
Submitted-by: Warren Tucker <wht at n4hgf.Mt-Park.GA.US>
Posting-number: Volume 19, Issue 4
Archive-name: df2_r4/part01
DF2 has proven popular. Here is a child of it which supports
System V Release 3 or 4. I am also submitting a patch to the
first df2 from Chip Salzenburg for the original to do NFS
support.
My goal was to customize a df for my needs and to make the code
available for others to do likewise. Note my original had just
enough room for my longest mount directory :-). 80 characters is
not a lot of room for the wide range of stuff you want to print.
We all are likely to customize.
So, with this version and Chip's NFS patches to the original, we
have a better collection of code and fragments to each build our
idea of a "df -me" dream hack.
#!/bin/sh
# This is df2_r4, a shell archive (shar 3.46)
# made 04/29/1991 16:33 UTC by wht at n4hgf
# Source directory /u1/src/df2
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 3200 -rw-r--r-- README
# 1140 -rw-r--r-- Makefile
# 4421 -rw-r--r-- df2.c
#
# ============= README ==============
if test -f 'README' -a X"$1" != X"-c"; then
echo 'x - skipping README (File already exists)'
else
echo 'x - extracting README (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'README' &&
XThis is an updated version of df2, originally posted to comp.sources.misc as
X
X> Posting-number: Volume 18, Issue 81
X> Archive-name: df2/part01
X
XPaul Slootman has ported it to System 5 Release 4 (does he REALLY
Xhave all that disk ?? :->).
X
Xit is still easy to make, though the needed library and the compile
Xoptions have prompted a Makefile. Read and edit the Makefile as
Xnecessary and just make it.
X
XX-Organization: DataCount Register Informatici
X Postbus 888
X 7640 AW Wierden
X The Netherlands
X>Date: Thu, 25 Apr 91 15:43 MDT
X>From: emory!dri.nl!slootman (Paul Slootman)
X>To: wht at n4hgf.mt-park.ga.us
X>Subject: df2 ported to SysV.4
X
XHi,
X
XI snarfed your df2 from the net, and have ported it to System V.4
X(on an ICL DRS6000 Sparc). It needed a few adjustments to allow
Xfor the virtual filesystems, but seems to be running ok for now.
XI'm going to extend it to take into account that some filesystems
Xhave a requirement that some percentage of the disk MUST be free
X(i.e. a normal user may only use up to 90%; beyond that he gets a
X"filesystem full" error). This is something the standard df doesn't
Xhandle. (When it's 89% full, that's what it says. When it's 90%
Xfull, df states 100% full -- which can be confusing "Hey just a
Xmoment ago it said 89%!!!").
XThe percentage is rounded now. That's the usual way.
XA small cosmetic adjustment has also been made - the filesystem
Xnames are longer. Eg.:
X Size (kb) Inodes
XFilesystem |Direct.| Total Free Used Used| Total Free Used Used
X----------------+-------+----------------------------+-------------------------
X/dev/dsk/c0d0s7 |/ | 28623 10731 17892 63%| 10240 8968 1272 12%
X/proc |/proc | 0 0 0 0%| 1002 885 117 12%
X/dev/fd |/dev/fd| 0 0 0 0%| 50 0 50 100%
X/dev/dsk/c0d0s2 |/stand | 10240 3566 6674 65%| 200 112 88 44%
X/dev/dsk/c0d0s8 |/var | 24964 13621 11343 45%| 13376 12468 908 7%
X/dev/dsk/c0d0s9 |/dsk00 | 101102 20340 80762 80%| 10240 4470 5770 56%
X/dev/dsk/c0d0s10|/dsk01 | 33679 28435 5244 16%| 3456 2602 854 25%
X/dev/dsk/c0d0s11|/dsk02 | 84490 22899 61591 73%| 35840 28262 7578 21%
X/dev/dsk/c0d0s12|/dsk03 | 63297 26060 37237 59%| 27136 24587 2549 9%
X/dev/dsk/c0d0s14|/dsk04 | 73916 28332 45584 62%| 31232 28899 2333 7%
X/dev/dsk/c0d0s15|/dsk09 | 84490 14107 70383 83%| 35840 33104 2736 8%
X/dev/dsk/c0d0s16|/tmp | 28223 23147 5076 18%| 12288 12094 194 2%
X/dev/dsk/c1d0s0 |/usr | 108809 21860 86949 80%| 58048 49097 8951 15%
X/dev/dsk/c1d0s2 |/dsk10 | 52758 6804 45954 87%| 22528 19389 3139 14%
X/dev/dsk/c1d0s3 |/dsk11 | 169005 25563 143442 85%| 71168 60238 10930 15%
X/dev/dsk/c1d0s4 |/dsk12 | 84490 14421 70069 83%| 35840 32931 2909 8%
X/dev/dsk/c1d0s5 |/dsk19 | 182634 25472 157162 86%| 77312 70749 6563 8%
X----------------+-------+----------------------------+-------------------------
X |total |1130720 285358 845362 74%|445796 388855 56941 12%
X
SHAR_EOF
chmod 0644 README ||
echo 'restore of README failed'
Wc_c="`wc -c < 'README'`"
test 3200 -eq "$Wc_c" ||
echo 'README: original size 3200, current size' "$Wc_c"
fi
# ============= Makefile ==============
if test -f 'Makefile' -a X"$1" != X"-c"; then
echo 'x - skipping Makefile (File already exists)'
else
echo 'x - extracting Makefile (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
X#+------------------------------------------------------------
X# Makefile for df2
X# Set PROGRAM to the executable name
X#-------------------------------------------------------------
X#+:EDITS:
X#:04-26-1991-03:15-wht at n4hgf-since we have two versions and -lm, use a Makefile
X
X#--> comment if you have System 5 Release 3
X# uncomment if you have System 5 Release 4
X#SYSVR4 = -DSYSVR4
X
X#--> your compiler may vary
XCC = cc
X#CC = gcc -fwritable-strings -fpcc-struct-return
X
X#--> where do you want to install it?
XLBIN = /usr/local/bin
X
X# probably don't need to change below here
XCFLAGS = -O $(SYSVR4)
XLDFLAGS =
XLIBS = -lm
XSHELL = /bin/sh
XPROGRAM = df2
XINSTALLED = $(LBIN)/$(PROGRAM)
XSRC = $(PROGRAM).c
XOBJ = $(PROGRAM).o
X.SUFFIXES:
X.SUFFIXES: .c .o .h
X.c.o:; $(CC) -c $(CFLAGS) $*.c
X
X$(PROGRAM): $(OBJ)
X rm -rf $@
X $(CC) -o $@ $(LDFLAGS) $(OBJ) $(LIBS)
X
Xinstall: $(PROGRAM)
X rm -f $(INSTALLED) $(INSTALLED)~
X if [ -f $(INSTALLED) ]; then mv $(INSTALLED) $(INSTALLED)~; fi
X cp $(PROGRAM) $(INSTALLED)
X strip $(INSTALLED)
X [ -x /usr/bin/mcs ] && /usr/bin/mcs -d $(INSTALLED)
X chmod o+x $(INSTALLED)
X
Xlint:
X lint -u -x $(SRC) > $(PROGRAM).lint
SHAR_EOF
chmod 0644 Makefile ||
echo 'restore of Makefile failed'
Wc_c="`wc -c < 'Makefile'`"
test 1140 -eq "$Wc_c" ||
echo 'Makefile: original size 1140, current size' "$Wc_c"
fi
# ============= df2.c ==============
if test -f 'df2.c' -a X"$1" != X"-c"; then
echo 'x - skipping df2.c (File already exists)'
else
echo 'x - extracting df2.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'df2.c' &&
X/* CHK=0x90B3 */
Xchar *rev = "1.10";
X/*+-------------------------------------------------------------------------
X df2.c - another df-like utility
X wht at n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:04-26-1991-04:26-wht at n4hgf-merge R3 code with R4 */
X/*:04-25-1991-15:45-slootman at dri.nl-port to SysV.4 */
X/*:04-07-1991-02:58-wht at n4hgf-creation */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <math.h>
X#include <sys/errno.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#ifdef SYSVR4
X#include <sys/statvfs.h>
X#include <sys/mnttab.h>
X#define statfs statvfs
X#else
X#include <sys/statfs.h>
X#include <mnttab.h>
X#endif /* SYSVR4 */
X
Xextern int errno;
Xextern char *sys_errlist[];
X
Xchar *heading[] =
X{
X" Size (kb) Inodes ",
X#ifdef SYSVR4
X"Filesystem |Direct.| Total Free Used Used| Total Free Used Used",
X#else
X"Filesystem|Mount Dir | Total Free Used Used| Total Free Used Used",
X#endif /* SYSVR4 */
X(char *)0
X};
X
X#ifdef SYSVR4
Xchar *sep =
X"----------------+-------+----------------------------+-------------------------";
X#else
Xchar *sep =
X"----------+-------------+----------------------------+-------------------------";
X#endif /* SYSVR4 */
X
X/*+-------------------------------------------------------------------------
X main(argc,argv)
X--------------------------------------------------------------------------*/
X/*ARGSUSED*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
Xchar **cpptr = heading;
Xchar *etc_mnttab = "/etc/mnttab";
XFILE *fpmt;
Xstruct mnttab mnttab_buf;
Xstruct mnttab *mt = &mnttab_buf;
Xstruct statfs statf_buf;
Xstruct statfs *fs = &statf_buf;
X
Xlong kb_size;
Xlong kb_free;
Xlong kb_used;
Xint kb_used_pct;
Xlong kb_size_total = 0;
Xlong kb_free_total = 0;
Xlong kb_used_total = 0;
X
Xlong ino_size;
Xlong ino_free;
Xlong ino_used;
Xint ino_used_pct;
Xlong ino_size_total = 0;
Xlong ino_free_total = 0;
Xlong ino_used_total = 0;
X
X#ifdef SYSVR4
Xchar *fmt_line ="%-16.16s|%-7.7s|%7ld %7ld %7ld %3d%%|%6ld %6ld %6ld %3d%%\n";
X#else
Xchar *fmt_line ="%-10.10s|%-13.13s|%7ld %7ld %7ld %3d%%|%6ld %6ld %6ld %3d%%\n";
X#endif /* SYSVR4 */
X
X if(argc != 1)
X {
X (void)fprintf(stderr,"df2 %s: no arguments required or accepted\n",rev);
X exit(1);
X }
X
X if(!(fpmt = fopen(etc_mnttab,"r")))
X {
X perror(etc_mnttab);
X exit(1);
X }
X
X while(*cpptr)
X (void)printf("%s\n",*cpptr++);
X (void)printf("%s\n",sep);
X
X while (
X#ifdef SYSVR4
X !getmntent(fpmt,mt)
X#else
X fread((char *)mt,1,sizeof(*mt),fpmt) == sizeof(*mt)
X#endif /* SYSVR4 */
X )
X {
X if(
X#ifdef SYSVR4
X statvfs(mt->mnt_mountp,fs)
X#else
X statfs(mt->mt_filsys,fs,sizeof(*fs),0)
X#endif
X )
X {
X#ifdef SYSVR4
X (void)printf("%-16.16s statvfs: %s\n",
X mt->mnt_special,sys_errlist[errno]);
X#else
X (void)printf("%-10.10s statfs: %s\n",
X mt->mt_dev,sys_errlist[errno]);
X#endif /* SYSVR4 */
X continue;
X }
X
X#ifdef SYSVR4
X kb_size = fs->f_blocks * fs->f_frsize / 1024L;
X kb_free = fs->f_bfree * fs->f_frsize / 1024L;
X#else
X kb_size = fs->f_blocks / 2L;
X kb_free = fs->f_bfree / 2L;
X#endif /* SYSVR4 */
X kb_used = kb_size - kb_free;
X
X if(kb_size>0)
X {
X kb_used_pct = (int)floor(
X ((double)kb_used * 100) / (double)kb_size + 0.5);
X }
X else
X kb_used_pct = 0;
X
X ino_size = fs->f_files;
X ino_free = fs->f_ffree;
X ino_used = ino_size - ino_free;
X if(ino_size>0)
X {
X ino_used_pct = (int)floor(
X ((double)ino_used * 100) / (double)ino_size + 0.5);
X }
X else
X ino_used_pct=0;
X
X#ifdef SYSVR4
X (void)printf(fmt_line,
X mt->mnt_special,mt->mnt_mountp,
X kb_size,kb_free,kb_used,kb_used_pct,
X ino_size,ino_free,ino_used,ino_used_pct);
X#else
X (void)printf(fmt_line,
X mt->mt_dev,mt->mt_filsys,
X kb_size,kb_free,kb_used,kb_used_pct,
X ino_size,ino_free,ino_used,ino_used_pct);
X#endif /* SYSVR4 */
X
X kb_size_total += kb_size;
X kb_free_total += kb_free;
X kb_used_total += kb_used;
X
X ino_size_total += ino_size;
X ino_free_total += ino_free;
X ino_used_total += ino_used;
X }
X
X kb_used_pct = (int)(kb_used_total * 100 / kb_size_total);
X ino_used_pct = (int)(ino_used_total * 100L / (long)ino_size_total);
X
X (void)printf("%s\n",sep);
X (void)printf(fmt_line, "","total",
X kb_size_total,kb_free_total,kb_used_total,kb_used_pct,
X ino_size_total,ino_free_total,ino_used_total,ino_used_pct);
X
X exit(0);
X /*NOTREACHED*/
X} /* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of df2.c */
SHAR_EOF
chmod 0644 df2.c ||
echo 'restore of df2.c failed'
Wc_c="`wc -c < 'df2.c'`"
test 4421 -eq "$Wc_c" ||
echo 'df2.c: original size 4421, current size' "$Wc_c"
fi
exit 0
---------------------------------------------------------------------
Warren Tucker, TuckerWare emory!n4hgf!wht or wht at n4hgf.Mt-Park.GA.US
Ker-au'-lo-phon. An 8-foot partial flue-stop, having metal pipes
surmounted by adjustable rings, and with a hole bored near the top of
each pipe. Tone soft and "reedy".
exit 0 # Just in case...
--
Kent Landfield INTERNET: kent at sparky.IMD.Sterling.COM
Sterling Software, IMD UUCP: uunet!sparky!kent
Phone: (402) 291-8300 FAX: (402) 291-4362
Please send comp.sources.misc-related mail to kent at uunet.uu.net.
More information about the Comp.sources.misc
mailing list