V7/usr/src/cmd/df.c
#include <stdio.h>
#include <sys/param.h>
#include <sys/filsys.h>
#include <sys/fblk.h>
daddr_t blkno = 1;
char *dargv[] = {
0,
"/dev/rp0",
"/dev/rp3",
0
};
struct filsys sblock;
int fi;
daddr_t alloc();
main(argc, argv)
char **argv;
{
int i;
if(argc <= 1) {
for(argc = 1; dargv[argc]; argc++);
argv = dargv;
}
for(i=1; i<argc; i++) {
dfree(argv[i]);
}
}
dfree(file)
char *file;
{
daddr_t i;
fi = open(file, 0);
if(fi < 0) {
fprintf(stderr,"cannot open %s\n", file);
return;
}
sync();
bread(1L, (char *)&sblock, sizeof(sblock));
i = 0;
while(alloc())
i++;
printf("%s %D\n", file, i);
close(fi);
}
daddr_t
alloc()
{
int i;
daddr_t b;
struct fblk buf;
i = --sblock.s_nfree;
if(i<0 || i>=NICFREE) {
printf("bad free count, b=%D\n", blkno);
return(0);
}
b = sblock.s_free[i];
if(b == 0)
return(0);
if(b<sblock.s_isize || b>=sblock.s_fsize) {
printf("bad free block (%D)\n", b);
return(0);
}
if(sblock.s_nfree <= 0) {
bread(b, (char *)&buf, sizeof(buf));
blkno = b;
sblock.s_nfree = buf.df_nfree;
for(i=0; i<NICFREE; i++)
sblock.s_free[i] = buf.df_free[i];
}
return(b);
}
bread(bno, buf, cnt)
daddr_t bno;
char *buf;
{
int n;
extern errno;
lseek(fi, bno<<BSHIFT, 0);
if((n=read(fi, buf, cnt)) != cnt) {
printf("read error %D\n", bno);
printf("count = %d; errno = %d\n", n, errno);
exit(0);
}
}