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