|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/param.h>
3: #include <sys/filsys.h>
4: #include <sys/fblk.h>
5:
6: daddr_t blkno = 1;
7: char *dargv[] = {
8: 0,
9: "/dev/rp0a",
10: "/dev/rp2a",
11: "/dev/rp2h",
12: 0
13: };
14:
15:
16: struct filsys sblock;
17:
18: int fi;
19: daddr_t alloc();
20:
21: main(argc, argv)
22: char **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:
36: dfree(file)
37: char *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:
55: daddr_t
56: alloc()
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:
84: bread(bno, buf, cnt)
85: daddr_t bno;
86: char *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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.