* Copyright (c) 1980, 1990, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
static char copyright
[] =
"@(#) Copyright (c) 1980, 1990, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)df.c 8.1 (Berkeley) %G%";
/* XXX assumes MOUNT_MAXTYPE < 32 */
#define MT_ALL (MT(MOUNT_MAXTYPE+1)-1)
#define MT_AMDNFS (1) /* XXX automounted NFS FSes return type 0 */
#define MT_LOCAL (MT(MOUNT_UFS)|MT(MOUNT_MFS)|MT(MOUNT_LFS))
#define MT_DEFAULT MT_ALL
"nfs", MT(MOUNT_NFS
)|MT_AMDNFS
,
"fdesc", MT(MOUNT_FDESC
),
"portal", MT(MOUNT_PORTAL
),
/* return fsid of underlying FS */
"kernfs", MT(MOUNT_KERNFS
),
"misc", MT(MOUNT_LOFS
)|MT(MOUNT_FDESC
)|MT(MOUNT_PORTAL
)|
MT(MOUNT_NULL
)|MT(MOUNT_UMAP
)|MT(MOUNT_KERNFS
),
long addtype
__P((long, char *));
long regetmntinfo
__P((struct statfs
**, long, long));
int bread
__P((off_t
, void *, int));
char *getmntpt
__P((char *));
void prtstat
__P((struct statfs
*, int));
void ufs_df
__P((char *, int));
struct statfs statfsbuf
, *mntbuf
;
int err
, ch
, i
, maxwidth
, width
;
while ((ch
= getopt(argc
, argv
, "int:")) != EOF
)
fsmask
= addtype(fsmask
, optarg
);
mntsize
= getmntinfo(&mntbuf
, MNT_NOWAIT
);
for (i
= 0; i
< mntsize
; i
++) {
width
= strlen(mntbuf
[i
].f_mntfromname
);
mntsize
= regetmntinfo(&mntbuf
, mntsize
, fsmask
);
for (i
= 0; i
< mntsize
; i
++) {
width
= strlen(mntbuf
[i
].f_mntfromname
);
for (i
= 0; i
< mntsize
; i
++)
prtstat(&mntbuf
[i
], maxwidth
);
if (stat(*argv
, &stbuf
) < 0) {
if ((mntpt
= getmntpt(*argv
)) == 0) {
} else if ((stbuf
.st_mode
& S_IFMT
) == S_IFCHR
) {
} else if ((stbuf
.st_mode
& S_IFMT
) == S_IFBLK
) {
if ((mntpt
= getmntpt(*argv
)) == 0) {
mntpt
= mktemp(strdup("/tmp/df.XXXXXX"));
if (mkdir(mntpt
, DEFFILEMODE
) != 0) {
if (mount(MOUNT_UFS
, mntpt
, MNT_RDONLY
,
} else if (statfs(mntpt
, &statfsbuf
)) {
statfsbuf
.f_mntonname
[0] = '\0';
prtstat(&statfsbuf
, maxwidth
);
* Statfs does not take a `wait' flag, so we cannot
if (statfs(mntpt
, &statfsbuf
) < 0) {
maxwidth
= strlen(statfsbuf
.f_mntfromname
) + 1;
prtstat(&statfsbuf
, maxwidth
);
mntsize
= getmntinfo(&mntbuf
, MNT_NOWAIT
);
for (i
= 0; i
< mntsize
; i
++) {
if (!strcmp(mntbuf
[i
].f_mntfromname
, name
))
return (mntbuf
[i
].f_mntonname
);
* If it is one of our known types, add it to the current mask
for (tp
= typetab
; tp
->str
; tp
++)
if (strcmp(str
, tp
->str
) == 0)
return (tp
->types
| (tflag
? omask
: MT_NONE
));
* See if it is the negation of one of the known values
if (strlen(str
) > 2 && str
[0] == 'n' && str
[1] == 'o')
for (tp
= typetab
; tp
->str
; tp
++)
if (strcmp(str
+2, tp
->str
) == 0)
return (~tp
->types
& (tflag
? omask
: MT_ALL
));
(void)fprintf(stderr
, "df: unknown type `%s'\n", str
);
* Make a pass over the filesystem info in ``mntbuf'' filtering out
* filesystem types not in ``fsmask'' and possibly re-stating to get
* current (not cached) info. Returns the new count of valid statfs bufs.
regetmntinfo(mntbufp
, mntsize
, fsmask
)
register struct statfs
*mntbuf
;
return (nflag
? mntsize
: getmntinfo(mntbufp
, MNT_WAIT
));
for (i
= 0; i
< mntsize
; i
++) {
if (fsmask
& MT(mntbuf
[i
].f_type
)) {
(void)statfs(mntbuf
[i
].f_mntonname
,&mntbuf
[j
]);
* Convert statfs returned filesystem size into BLOCKSIZE units.
* Attempts to avoid overflow for large filesystems.
#define fsbtoblk(num, fsbs, bs) \
(((fsbs) != 0 && (fsbs) < (bs)) ? \
(num) / ((bs) / (fsbs)) : (num) * ((fsbs) / (bs)))
* Print out status about a filesystem.
register struct statfs
*sfsp
;
static int headerlen
, timesthrough
;
long used
, availblks
, inodes
;
if (++timesthrough
== 1) {
header
= getbsize(&headerlen
, &blocksize
);
(void)printf("%-*.*s %s Used Avail Capacity",
maxwidth
, maxwidth
, "Filesystem", header
);
(void)printf(" iused ifree %%iused");
(void)printf(" Mounted on\n");
(void)printf("%-*.*s", maxwidth
, maxwidth
, sfsp
->f_mntfromname
);
used
= sfsp
->f_blocks
- sfsp
->f_bfree
;
availblks
= sfsp
->f_bavail
+ used
;
(void)printf(" %*ld %8ld %8ld", headerlen
,
fsbtoblk(sfsp
->f_blocks
, sfsp
->f_bsize
, blocksize
),
fsbtoblk(used
, sfsp
->f_bsize
, blocksize
),
fsbtoblk(sfsp
->f_bavail
, sfsp
->f_bsize
, blocksize
));
availblks
== 0 ? 100.0 : (double)used
/ (double)availblks
* 100.0);
used
= inodes
- sfsp
->f_ffree
;
(void)printf(" %7ld %7ld %5.0f%% ", used
, sfsp
->f_ffree
,
inodes
== 0 ? 100.0 : (double)used
/ (double)inodes
* 100.0);
(void)printf(" %s\n", sfsp
->f_mntonname
);
* This code constitutes the pre-system call Berkeley df code for extracting
* information from filesystem superblocks.
register struct statfs
*sfsp
;
if ((rfd
= open(file
, O_RDONLY
)) < 0) {
if (bread((off_t
)SBOFF
, &sblock
, SBSIZE
) == 0) {
sfsp
->f_type
= MOUNT_UFS
;
sfsp
->f_bsize
= sblock
.fs_fsize
;
sfsp
->f_iosize
= sblock
.fs_bsize
;
sfsp
->f_blocks
= sblock
.fs_dsize
;
sfsp
->f_bfree
= sblock
.fs_cstotal
.cs_nbfree
* sblock
.fs_frag
+
sblock
.fs_cstotal
.cs_nffree
;
sfsp
->f_bavail
= (sblock
.fs_dsize
* (100 - sblock
.fs_minfree
) / 100) -
(sblock
.fs_dsize
- sfsp
->f_bfree
);
sfsp
->f_files
= sblock
.fs_ncg
* sblock
.fs_ipg
;
sfsp
->f_ffree
= sblock
.fs_cstotal
.cs_nifree
;
if ((mntpt
= getmntpt(file
)) == 0)
memmove(&sfsp
->f_mntonname
[0], mntpt
, MNAMELEN
);
memmove(&sfsp
->f_mntfromname
[0], file
, MNAMELEN
);
(void)lseek(rfd
, off
, SEEK_SET
);
if ((nr
= read(rfd
, buf
, cnt
)) != cnt
) {
/* Probably a dismounted disk if errno == EIO. */
(void)fprintf(stderr
, "\ndf: %qd: %s\n",
off
, strerror(nr
> 0 ? EIO
: errno
));
(void)fprintf(stderr
, "usage: df [-in] [file | file_system ...]\n");