📄 dcheck.c
字号:
#char *dargv[]{ "/dev/rrk2", "/dev/rrp0", 0};#define NINODE 16*16#define NI 20#include "/usr/sys/ino.h"#include "/usr/sys/filsys.h"struct inode inode[NINODE];struct filsys sblock;int sflg;int headpr;int ilist[NI] { -1};int fi;char *ecount;char *lasts;int ino;int nerror;int nfiles;struct dir { int ino; char name[14];};main(argc, argv)char **argv;{ register char **p; register int n, *lp; ecount = sbrk(0); if (argc == 1) { for (p = dargv; *p;) check(*p++); return(nerror); } while (--argc) { argv++; if (**argv=='-') switch ((*argv)[1]) { case 's': sflg++; continue; case 'i': lp = ilist; while (lp < &ilist[NI-1] && (n = number(argv[1]))) { *lp++ = n; argv++; argc--; } *lp++ = -1; continue; default: printf("Bad flag\n"); } check(*argv); } return(nerror);}check(file)char *file;{ register i, j; fi = open(file, 0); if(fi < 0) { printf("cannot open %s\n", file); return; } headpr = 0; printf("%s:\n", file); sync(); bread(1, &sblock, 512); nfiles = sblock.s_isize*16; if (lasts < nfiles) { if ((sbrk(nfiles - lasts)) == -1) { printf("Not enough core\n"); exit(04); } lasts = nfiles; } for (i=0; i<nfiles; i++) ecount[i] = 0; for(i=0; ino<nfiles; i =+ NINODE/16) { bread(i+2, inode, sizeof inode); for(j=0; j<NINODE && ino<nfiles; j++) { ino++; pass1(&inode[j]); } } ino = 0; for (i=0; ino<nfiles; i =+ NINODE/16) { bread(i+2, inode, sizeof inode); for (j=0; j<NINODE && ino<nfiles; j++) { ino++; pass2(&inode[j]); } }}pass1(aip)struct inode *aip;{ register doff; register struct inode *ip; register struct dir *dp; int i; ip = aip; if((ip->i_mode&IALLOC) == 0) return; if((ip->i_mode&IFMT) != IFDIR) return; doff = 0; while (dp = dread(ip, doff)) { doff =+ 16; if (dp->ino==0) continue; for (i=0; ilist[i] != -1; i++) if (ilist[i]==dp->ino) printf("%5l arg; %l/%.14s\n", dp->ino, ino, dp->name); ecount[dp->ino]++; }}pass2(aip){ register struct inode *ip; register i; ip = aip; i = ino; if ((ip->i_mode&IALLOC)==0 && ecount[i]==0) return; if (ip->i_nlink==ecount[i] && ip->i_nlink!=0) return; if (headpr==0) { printf("entries link cnt\n"); headpr++; } printf("%l %d %d\n", ino, ecount[i]&0377, ip->i_nlink&0377);}dread(aip, aoff){ register b, off; register struct inode *ip; static ibuf[256]; static char buf[512]; off = aoff; ip = aip; if ((off&0777)==0) { if (off==0177000) { printf("Monstrous directory %l\n", ino); return(0); } if ((ip->i_mode&ILARG)==0) { if (off>=010000 || (b = ip->i_addr[off>>9])==0) return(0); bread(b, buf, 512); } else { if (off==0) { if (ip->i_addr[0]==0) return(0); bread(ip->i_addr[0], ibuf, 512); } if ((b = ibuf[(off>>9)&0177])==0) return(0); bread(b, buf, 512); } } return(&buf[off&0777]);}bread(bno, buf, cnt){ seek(fi, bno, 3); if(read(fi, buf, cnt) != cnt) { printf("read error %d\n", bno); exit(); }}bwrite(bno, buf){ seek(fi, bno, 3); if(write(fi, buf, 512) != 512) { printf("write error %d\n", bno); exit(); }}number(as)char *as;{ register n, c; register char *s; s = as; n = 0; while ((c = *s++) >= '0' && c <= '9') { n = n*10+c-'0'; } return(n);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -