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

📄 dump.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* * incremental dump * dump fisbuodh filesystem * f take output tape from arglist * i from date in /etc/dtab * s specify tape size in feet (feet = blocks/9) * b specify tape size in blocks * u update /etc/dtab to current date * 0 dump from the epoch * d dump specified number of days * h dump specified number of hours * a on incremental dump, dump files even >= MAXSIZE */char	*dargv[]{	0,	"i",	"/dev/rp0",	0};#include "/usr/sys/ino.h"#include "/usr/sys/filsys.h"#define	MAXSIZE	1000struct filsys sblock;struct{	char	name[16];	int	date[2];} dtab[10];char	*dfile	"/etc/dtab";char	*ofile;int	*talist;int	fi;int	buf[256];int	dbuf[256];int	ibuf[256];int	vbuf[256];char	*date[2];char	*ddate[2];int	fo	-1;int	pher;int	dflg;int	iflg;int	cflg;int	aflg;char	*tsize	19000;char	*taddr;main(argc, argv)char **argv;{	char *key;	int s, i, nfil, nblk, f;	register *tap;	register struct inode *ip;	int ino;	ofile = "/dev/mt0";	time(date);	if(argc == 1) {		argv = dargv;		for(argc = 1; dargv[argc]; argc++);	}	argc--;	argv++;	key = *argv;	while(*key)	switch(*key++) {	default:		printf("bad character in key\n");		exit();	case 'a': /* dump all (even large) */		aflg++;		continue;	case '-':		continue;	case 'c': /* increment file name */		cflg++;		continue;	case 'f': /* file name from arg list */		argc--;		argv++;		ofile = *argv;		continue;	case 'i': /* date from date file */		iflg++;		continue;	case 's': /* tape size */		tsize = number(argv[1]) * 9;		argv++;		argc--;		continue;	case 'b': /* tape size */		tsize = number(argv[1]);		argv++;		argc--;		continue;	case 'u': /* rewrite date */		dflg++;		continue;	case '0': /* dump all */		ddate[0] = ddate[1] = 0;		continue;	case 'd': /* dump some number of days */		i = 21600;		goto sd;	case 'h': /* dump some number of hours */		i = 900;		goto sd;	sd:		ddate[0] = date[0];		ddate[1] = date[1];		s = number(argv[1])*4;		argv++;		argc--;		while(s) {			if(i > ddate[1])				ddate[0]--;			ddate[1] =- i;			s--;		}		continue;	}	if(argc <= 1) {		printf("no file system specified\n");		exit();	}	if(iflg) {		f = open(dfile, 0);		if(f >= 0) {			read(f, dtab, sizeof dtab);			close(f);			for(i=0; i<10; i++)				if(equal(dtab[i].name, argv[1])) {					ddate[0] = dtab[i].date[0];					ddate[1] = dtab[i].date[1];				}		}	}	printf("%s:\n", argv[1]);	fi = open(argv[1], 0);	if(fi < 0) {		printf("cannot open %s\n", argv[1]);		exit();	}	printf("incremental dump from\n");	pdate(ddate);	sync();	bread(1, &sblock);	talist = sbrk(size(0, sblock.s_isize*32)*512);	tap = talist;	if(tap == -1) {		printf("No memory\n");		exit();	}	nfil = 0;	nblk = size(0, sblock.s_isize*32);	ino = 0;	for(i=0; i<sblock.s_isize; i++) {		bread(i+2, buf);		for(ip = &buf[0]; ip < &buf[256]; ip++) {			ino++;			if(ip->i_mode == 0 || ip->i_nlink == 0) {				*tap++ = -1;				continue;			}			if(ip->i_mtime[0] < ddate[0])				goto no;			if(ip->i_mtime[0] == ddate[0] &&			   ip->i_mtime[1] <  ddate[1])				goto no;			s = size(ip->i_size0&0377, ip->i_size1) + 1;			if (s>MAXSIZE && aflg==0 && iflg!=0) {				printf("%l big; not dumped.\n", ino);				goto no;			}			nfil++;			nblk =+ s;			*tap++ = s;			continue;		no:			*tap++ = 0;		}	}	printf("%l files\n%l blocks\n", nfil, nblk);	i = ldiv(0, nblk, ldiv(0, tsize, 10));	printf("%l.%l tapes\n", i/10, i%10);	tap = buf;	clrbuf(tap);	*tap++ = sblock.s_isize;	*tap++ = sblock.s_fsize;	*tap++ = date[0];	*tap++ = date[1];	*tap++ = ddate[0];	*tap++ = ddate[1];	*tap++ = tsize;	swrite(buf);	i = size(0, sblock.s_isize*32);	tap = talist;	while(i--) {		bwrite(tap);		tap =+ 256;	}	tap = talist;	for(i=0; i<sblock.s_isize; i++) {		bread(i+2, buf);		for(ip = &buf[0]; ip < &buf[256]; ip++) {			if(*tap && *tap != -1)				dump(ip, *tap-1);			tap++;		}	}	printf("%l phase errors\n", pher);	if(!dflg)		exit();	for(i=0; i<10; i++)		dtab[i].name[0] = 0;	f = open(dfile, 2);	if(f < 0) {		f = creat(dfile, 0666);		if(f < 0) {			printf("cannot create %s\n", dfile);			exit();		}	} else		read(f, dtab, sizeof dtab);	for(i=0; i<10; i++)		if(dtab[i].name[0] == 0 || equal(dtab[i].name, argv[1]))			goto found;	printf("%s full\n", dfile);	exit();found:	for(s=0; s<15; s++) {		dtab[i].name[s] = argv[1][s];		if(argv[1][s] == 0)			break;	}	dtab[i].date[0] = date[0];	dtab[i].date[1] = date[1];	seek(f, 0, 0);	write(f, dtab, sizeof dtab);	printf("date updated\n");	pdate(date);}pdate(d)int *d;{	if(d[0] == 0 && d[1] == 0)		printf("the epoch\n"); else		printf(ctime(d));}dump(ip, sz)struct inode *ip;{	register *p, *q, *r;	p = dbuf;	q = ip;	clrbuf(p);	while(q < &ip->i_mtime[2])		*p++ = *q++;	swrite(dbuf);	if(ip->i_mode & (IFBLK&IFCHR)) {		if(sz != 0)			printf("special\n");		return;	}	for(p = &ip->i_addr[0]; p < &ip->i_addr[8]; p++)	if(*p) {		if(ip->i_mode&ILARG) {			bread(*p, ibuf);			for(q = &ibuf[0]; q < &ibuf[256]; q++)			if(*q) {				if(p == &ip->i_addr[7]) {					bread(*q, vbuf);					for(r = &vbuf[0]; r < &vbuf[256]; r++)					if(*r) {						if(--sz < 0)							goto pe;						bread(*r, dbuf);						bwrite(dbuf);					}					continue;				}				if(--sz < 0)					goto pe;				bread(*q, dbuf);				bwrite(dbuf);			}		} else {			if(--sz < 0)				goto pe;			bread(*p, dbuf);			bwrite(dbuf);		}	}	if(sz)		goto pe;	return;pe:	clrbuf(dbuf);	while(--sz >= 0)		bwrite(dbuf);	pher++;}bread(bno, b){	seek(fi, bno, 3);	if(read(fi, b, 512) != 512) {		printf("read error %l\n", bno);	}}clrbuf(b)int *b;{	register i, *p;	p = b;	i = 256;	while(i--)		*p++ = 0;}swrite(b)int *b;{	register i, s, *p;	i = 254;	s = taddr;	p = b;	while(i--)		s =+ *p++;	*p++ = taddr;	*p = 031415 - s;	bwrite(b);}bwrite(b){	if(taddr == 0) {		if(fo != -1) {			printf("change tapes\n");			close(fo);			rdline();		}		otape();	}wloop:	if(write(fo, b, 512) != 512) {		printf("write error\n");		rdline();		seek(fo, taddr, 3);		goto wloop;	}	taddr++;	if(taddr >= tsize)		taddr = 0;}rdline(){	int c;loop:	c = 0;	read(0, &c, 1);	if(c == 0)		exit();	if(c != '\n')		goto loop;}number(s)char *s;{	register n, c;	n = 0;	while(c = *s++) {		if(c<'0' || c>'9')			continue;		n = n*10+c-'0';	}	return(n);}size(s0, s1){	register s;	extern ldivr;	s = ldiv(s0&0377, s1, 512);	if(ldivr)		s++;	return(s);}otape(){	register char *p;	fo = creat(ofile, 0666);	if(fo < 0) {		printf("can not open %s\n", ofile);		exit();	}	if(!cflg)		return;	p = ofile;	while(*p++)		;	p[-2]++;}equal(a, b)char *a, *b;{	while(*a++ == *b)		if(*b++ == 0)			return(1);	return(0);}

⌨️ 快捷键说明

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