⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncheck.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#char	*dargv[]{	"/dev/rrk2",	"/dev/rrp0",	0};#define NINODE	16*16#include "/usr/sys/ino.h"#include "/usr/sys/filsys.h"struct	filsys	sblock;struct	inode	inode[NINODE];int	sflg;int	aflg;#define	NI	20#define	NDIRS	787int	ilist[NI] { -1};int	fi;struct	htab {	int	hino;	int	hpino;	char	hname[14];} htab[NDIRS];int	nhent	10;int	(*pass[])()	{ pass1, pass2, pass3 };char	*lasts;int	ino;int	nerror;int	nffil;int	fout;int	nfiles;struct dir {	int	ino;	char	name[14];};main(argc, argv)char **argv;{	register char **p;	register int n, *lp;	nffil = dup(1);	if (argc == 1) {		for (p = dargv; *p;)			check(*p++);		return(nerror);	}	while (--argc) {		argv++;		if (**argv=='-') switch ((*argv)[1]) {		case 's':			sflg++;			continue;		case 'a':			aflg++;			continue;		case 'i':			lp = ilist;			while (lp < &ilist[NI-1] && (n = number(argv[1]))) {				*lp++ = n;				argv++;				argc--;			}			*lp++ = -1;			continue;		default:			printf2("Bad flag\n");		}		check(*argv);	}	return(nerror);}check(file)char *file;{	register i, j, pno;	fi = open(file, 0);	if (fi < 0) {		printf2("cannot open %s\n", file);		return;	}	printf2("%s:\n", file);	sync();	bread(1, &sblock, 512);	nfiles = sblock.s_isize*16;	for (i=0; i<NDIRS; i++)		htab[i].hino = 0;	fout = nffil;	flush();	for (pno=0; pno<3; pno++) {		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++;				(*pass[pno])(&inode[j]);			}		}	}	flush();	fout = 1;}pass1(ip){	if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)		return;	lookup(ino, 1);}pass2(ip)struct inode *ip;{	register doff;	register struct htab *hp;	register struct dir *dp;	int i;	if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)		return;	doff = 0;	while (dp = dread(ip, doff)) {		doff =+ 16;		if (dp->ino==0)			continue;		if ((hp = lookup(dp->ino, 0)) == 0)			continue;		if (dotname(dp))			continue;		hp->hpino = ino;		for (i=0; i<14; i++)			hp->hname[i] = dp->name[i];	}}pass3(ip)struct inode *ip;{	register doff;	register struct dir *dp;	register int *ilp;	if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)		return;	doff = 0;	while (dp = dread(ip, doff)) {		doff =+ 16;		if (dp->ino==0)			continue;		if (aflg==0 && dotname(dp))			continue;		for (ilp=ilist; *ilp >= 0; ilp++)			if (*ilp == dp->ino)				break;		if (ilp > ilist && *ilp!=dp->ino)			continue;		printf("%d	", dp->ino);		pname(ino, 0);		printf("/%.14s\n", dp->name);	}}dotname(adp){	register struct dir *dp;	dp = adp;	if (dp->name[0]=='.')		if (dp->name[1]==0 || dp->name[1]=='.' && dp->name[2]==0)			return(1);	return(0);}pname(i, lev){	register struct htab *hp;	if (i==1)		return;	if ((hp = lookup(i, 0)) == 0) {		printf("???");		return;	}	if (lev > 10) {		printf("...");		return;	}	pname(hp->hpino, ++lev);	printf("/%.14s", hp->hname);}lookup(i, ef){	register struct htab *hp;	for (hp = &htab[i%NDIRS]; hp->hino;) {		if (hp->hino==i)			return(hp);		if (++hp >= &htab[NDIRS])			hp = htab;	}	if (ef==0)		return(0);	if (++nhent >= NDIRS) {		printf2("Out of core-- increase NDIRS\n");		flush();		exit(1);	}	hp->hino = i;	return(hp);}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) {			printf2("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) {		printf2("read error %d\n", bno);		exit();	}}bwrite(bno, buf){	seek(fi, bno, 3);	if (write(fi, buf, 512) != 512) {		printf2("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);}printf2(s, a1, a2){	extern fout;	flush();	fout = 2;	printf(s, a1, a2);	fout = nffil;	flush();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -