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

📄 icheck.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#char	*dargv[]{	"/dev/rrk2",	"/dev/rrp0",	0};#define	NINODE	16*16#define	NB	10#include "/usr/sys/ino.h"#include "/usr/sys/filsys.h"struct	inode	inode[NINODE];struct	filsys	sblock;int	sflg;int	fi;int	nifiles;int	nfile;int	nspcl;int	nlarg;int	nvlarg;int	nindir;int	nvindir;int	ndir;int	nused;int	nfree;int	ino;int	ndup;int	blist[10] { -1};int	nerror;int	bmap[4096];main(argc, argv)char **argv;{	register char **p;	register int n, *lp;	if (argc == 1) {		for (p = dargv; *p;)			check(*p++);		return(nerror);	}	while (--argc) {		argv++;		if (**argv=='-') switch ((*argv)[1]) {		case 's':			sflg++;			continue;		case 'b':			lp = blist;			while (lp < &blist[NB-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 *ip, i, j;	fi = open(file, sflg?2:0);	if (fi < 0) {		printf("cannot open %s\n", file);		nerror =| 04;		return;	}	printf("%s:\n", file);	nfile = 0;	nspcl = 0;	nlarg = 0;	nvlarg = 0;	nindir = 0;	nvindir = 0;	ndir = 0;	nused = 0;	nfree = 0;	ndup = 0;	for (ip = bmap; ip < &bmap[4096];)		*ip++ = 0;	sync();	bread(1, &sblock, 512);	nifiles = sblock.s_isize*16;	for(i=0; ino < nifiles; i =+ NINODE/16) {		bread(i+2, inode, sizeof inode);		for(j=0; j<NINODE && ino<nifiles; j++) {			ino++;			pass1(&inode[j]);		}	}	ino = 0;	sync();	bread(1, &sblock, 512);	if (sflg) {		makefree();		return;	}	while(i = alloc()) {		if (chk(i, "free"))			break;		nfree++;	}	if (ndup) {		printf("%l dups in free\n", ndup);		nerror =| 02;	}	j = 0;	for (ip = bmap; ip < &bmap[4096];) {		i = *ip++;		while (i) {			if (i<0)				j--;			i =<< 1;		}	}	j =+ sblock.s_fsize - sblock.s_isize - 2;	if (j)		printf("missing%5l\n", j);	printf("spcl  %6l\n", nspcl);	printf("files %6l\n", nfile);	printf("large %6l\n", nlarg);	if (nvlarg)		printf("huge  %6l\n", nvlarg);	printf("direc %6l\n", ndir);	printf("indir %6l\n", nindir);	if (nvindir)		printf("indir2%6l\n", nvindir);	printf("used  %6l\n", nused);	printf("free  %6l\n", nfree);	close(fi);}pass1(aip)struct inode *aip;{	int buf[256], vbuf[256];	register i, j, *ip;	ip = aip;	if ((ip->i_mode&IALLOC) == 0)		return;	if ((ip->i_mode&IFCHR&IFBLK) != 0) {		nspcl++;		return;	}	if ((ip->i_mode&IFMT) == IFDIR)		ndir++;	else		nfile++;	if ((ip->i_mode&ILARG) != 0) {		nlarg++;		for(i=0; i<7; i++)		if (ip->i_addr[i] != 0) {			nindir++;			if (chk(ip->i_addr[i], "indirect"))				continue;			bread(ip->i_addr[i], buf, 512);			for(j=0; j<256; j++)			if (buf[j] != 0)				chk(buf[j], "data (large)");		}		if (ip->i_addr[7]) {			nvlarg++;			if (chk(ip->i_addr[7], "indirect"))				return;			bread(ip->i_addr[7], buf, 512);			for(i=0; i<256; i++)			if (buf[i] != 0) {				nvindir++;				if (chk(buf[i], "2nd indirect"))					continue;				bread(buf[i], vbuf, 512);				for(j=0; j<256; j++)				if (vbuf[j])					chk(vbuf[j], "data (very large)");			}		}		return;	}	for(i=0; i<8; i++) {		if (ip->i_addr[i] != 0)			chk(ip->i_addr[i], "data (small)");	}}chk(ab, s)char *ab;{	register char *b;	register n, m;	b = ab;	if (ino)		nused++;	if (b<sblock.s_isize+2 || b>=sblock.s_fsize) {		printf("%l bad; inode=%l, class=%s\n", b, ino, s);		return(1);	}	m = 1 << (b&017);	n = (b>>4) & 07777;	if (bmap[n]&m) {		printf("%l dup; inode=%l, class=%s\n", b, ino, s);		ndup++;	}	bmap[n] =| m;	for (n=0; blist[n] != -1; n++)		if (b == blist[n])			printf("%l arg; inode=%l, class=%s\n", b, ino, s);	return(0);}alloc(){	register b, i;	int buf[256];	i = --sblock.s_nfree;	if (i<0 || i>=100) {		printf("bad freeblock\n");		return(0);	}	b = sblock.s_free[i];	if (b == 0)		return(0);	if (sblock.s_nfree <= 0) {		bread(b, buf, 512);		sblock.s_nfree = buf[0];		for(i=0; i<100; i++)			sblock.s_free[i] = buf[i+1];	}	return(b);}bread(bno, buf, cnt)int *buf;{	register *ip;	seek(fi, bno, 3);	if (read(fi, buf, cnt) != cnt) {		printf("read error %d\n", bno);		if (sflg) {			printf("No update\n");			sflg = 0;		}		for (ip = buf; ip < &buf[256];)			*ip++ = 0;	}}free(in){	register i;	int buf[256];	if (sblock.s_nfree >= 100) {		buf[0] = sblock.s_nfree;		for(i=0; i<100; i++)			buf[i+1] = sblock.s_free[i];		sblock.s_nfree = 0;		bwrite(in, buf);	}	sblock.s_free[sblock.s_nfree++] = in;}bwrite(bno, buf){	seek(fi, bno, 3);	if (write(fi, buf, 512) != 512)		printf("write error %d\n", bno);}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);}makefree(){	register i;	sblock.s_nfree = 0;	sblock.s_ninode = 0;	sblock.s_flock = 0;	sblock.s_ilock = 0;	sblock.s_fmod = 0;	free(0);	for(i=sblock.s_fsize-1; i>=sblock.s_isize+2; i--) {		if ((bmap[(i>>4)&07777] & (1<<(i&017)))==0)			free(i);	}	bwrite(1, &sblock);	close(fi);	sync();	return;}

⌨️ 快捷键说明

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