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

📄 dcheck.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 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 + -