BSD 3 development
[unix-history] / usr / src / cmd / df.c
CommitLineData
c908b4d4
BJ
1#include <stdio.h>
2#include <sys/param.h>
3#include <sys/filsys.h>
4#include <sys/fblk.h>
5
6daddr_t blkno = 1;
7char *dargv[] = {
8 0,
9 "/dev/rp0a",
10 "/dev/rp2a",
11 "/dev/rp2h",
12 0
13};
14
15
16struct filsys sblock;
17
18int fi;
19daddr_t alloc();
20
21main(argc, argv)
22char **argv;
23{
24 int i;
25
26 if(argc <= 1) {
27 for(argc = 1; dargv[argc]; argc++);
28 argv = dargv;
29 }
30
31 for(i=1; i<argc; i++) {
32 dfree(argv[i]);
33 }
34}
35
36dfree(file)
37char *file;
38{
39 daddr_t i;
40
41 fi = open(file, 0);
42 if(fi < 0) {
43 fprintf(stderr,"cannot open %s\n", file);
44 return;
45 }
46 sync();
47 bread(1L, (char *)&sblock, sizeof(sblock));
48 i = 0;
49 while(alloc())
50 i++;
51 printf("%s %D\n", file, i);
52 close(fi);
53}
54
55daddr_t
56alloc()
57{
58 int i;
59 daddr_t b;
60 struct fblk buf;
61
62 i = --sblock.s_nfree;
63 if(i<0 || i>=NICFREE) {
64 printf("bad free count, b=%D\n", blkno);
65 return(0);
66 }
67 b = sblock.s_free[i];
68 if(b == 0)
69 return(0);
70 if(b<sblock.s_isize || b>=sblock.s_fsize) {
71 printf("bad free block (%D)\n", b);
72 return(0);
73 }
74 if(sblock.s_nfree <= 0) {
75 bread(b, (char *)&buf, sizeof(buf));
76 blkno = b;
77 sblock.s_nfree = buf.df_nfree;
78 for(i=0; i<NICFREE; i++)
79 sblock.s_free[i] = buf.df_free[i];
80 }
81 return(b);
82}
83
84bread(bno, buf, cnt)
85daddr_t bno;
86char *buf;
87{
88 int n;
89 extern errno;
90
91 lseek(fi, bno<<BSHIFT, 0);
92 if((n=read(fi, buf, cnt)) != cnt) {
93 printf("read error %D\n", bno);
94 printf("count = %d; errno = %d\n", n, errno);
95 exit(0);
96 }
97}