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

📄 restor.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* * restore from incremental dumps */char	*dargv[]{	0,	"t",	0};char	*ifile;char	*ofile;#include "/usr/sys/ino.h"#include "/usr/sys/filsys.h"struct	filsys	sblock;int	isize;int	*talist;int	fi;int	buf[256];int	dbuf[256];int	cbuf[256];char	*date[2];char	*ddate[2];int	fo;int	pher;char	*tsize	15000;int	iflg;int	wflg;int	cflg;char	file[10];int	ilist[100];main(argc, argv)char **argv;{	char *key;	register *tap, *p;	register struct inode *ip;	int i, com, sz, *q, l;	ifile = "/dev/mt0";	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 't':	case 'r':	case 'x':		com = key[-1];		continue;	case 'i':		iflg++;		continue;	case '-':		continue;	case 'c':		cflg++;		continue;	case 'f':		argv++;		argc--;		ifile = *argv;		continue;	case 'w':		wflg++;		continue;	}	otape();	sread(buf, 0);	tap = buf;	isize = *tap++;	*tap++;		/* fsize */	date[0] = *tap++;	date[1] = *tap++;	ddate[0] = *tap++;	ddate[1] = *tap++;	tsize = *tap++;	i = size(0, isize*32);	talist = sbrk(i*512);	tap = talist;	while(i--) {		tread(tap, 0);		tap =+ 256;	}	switch(com) {case 't':	l = 0;	com = 0;	pdate(ddate);	pdate(date);	tap = talist;	for(i=0; i<isize*16; i++) {		sz = *tap++;		if(sz == 0 || sz == -1) {			if(com == 0)				continue;			if(i == com) {				printf("%l", i);				l =+ 5;			} else {				printf("%l-%l", com, i);				l =+ 10;			}			if(l > 60) {				printf("\n");				l = 0;			} else				printf(",");			com = 0;		} else		if(com == 0)			com = i+1;	}	if(com)		printf("%l-\n", com);	printf("\n");	exit();case 'r':	if(argc <= 1) {		printf("no filesystem name\n");		exit();	}	ofile = argv[1];	fo = open(ofile, 2);	if(fo < 0) {		printf("can not open %s\n", ofile);		exit();	}	printf("last chance before scribbling on %s\n", ofile);	getchar();	dread(1, &sblock);	tap = talist;	for(i=0; i<sblock.s_isize; i++) {		if(i >= isize)			break;		dread(i+2, buf);		for(ip = &buf[0]; ip < &buf[256]; ip++) {			sz = *tap++;			if(sz == 0)				continue;			dealoc(ip);			if(sz == -1) {				for(p = ip; p < &ip->i_mtime[2]; )					*p++ = 0;				continue;			}			sread(dbuf, 0);			q = dbuf;			for(p = ip; p < &ip->i_mtime[2]; )				*p++ = *q++;			restor(ip, sz-1);		}		dwrite(i+2, buf);	}	dwrite(1, &sblock);	com = 0;	for(; i < isize; i++)		for(l = 0; l < 16; l++) {			sz = *tap++;			if(sz != 0 && sz != -1)				com++;		}	if(com)		printf("%l files not restored - small ilist\n", com);	exit();case 'x':	i = 0;	tap = ilist;	while(argc > 1) {		i++;		sz = number(argv[1]);		argv++;		argc--;		if(sz <= 0 || sz >=isize*16) {			printf("%l not in range\n", sz);			continue;		}		if(talist[sz-1] == 0) {			printf("%l not dumped\n", sz);			continue;		}		if(talist[sz-1] == -1) {			printf("%l does not exist\n", sz);			continue;		}		*tap++ = sz;	}	if(i != 0 && ilist[0] == 0)		exit();	tap = talist;	for(i=1; i<=isize*16; i++) {		if(ilist[0] != 0) {			for(sz=0; ilist[sz]; sz++)				if(ilist[sz] == i)					goto yes;			sz = *tap++;		no:			if(sz == -1)				sz = 0;			while(sz--)				tread(dbuf, 1);			continue;		}	yes:		sz = *tap++;		if(sz == 0 || sz == -1)			continue;		fo = dwait(i);		if(fo < 0)			goto no;		sz--;		sread(buf, 0);		ip = buf;		while(sz--) {			tread(dbuf, 0);			com = 512;			if(ip->i_size0 == 0 && ip->i_size1 < 512)				com = ip->i_size1;			write(fo, dbuf, com);			if(com > ip->i_size1)				ip->i_size0--;			ip->i_size1 =- com;		}		close(fo);		chmod(file, ip->i_mode);		chown(file, ip->i_uid);	}	exit();	}}dealoc(p)struct inode *p;{	register struct inode *ip;	register i, j;	int k;	int xbuf[256], ybuf[256];	ip = p;	if(ip->i_mode & (IFCHR&IFBLK))		return;	for(i=7; i>=0; i--)	if(ip->i_addr[i]) {		if(ip->i_mode&ILARG) {			dread(ip->i_addr[i], xbuf);			for(j=255; j>=0; j--)			if(xbuf[j]) {				if(i == 7) {					dread(xbuf[j], ybuf);					for(k=255; k>=0; k--)					if(ybuf[k])						free(ybuf[k]);				}				free(xbuf[j]);			}		}		free(ip->i_addr[i]);	}}restor(p, sz)struct inode *p;{	register struct inode *ip;	register i, j;	int xbuf[256];	ip = p;	if(ip->i_mode & (IFCHR&IFBLK))		return;	for(i=0; i<8; i++)		ip->i_addr[i] = 0;	if(sz <= 8) {		for(i=0; i<sz; i++)			ip->i_addr[i] = rcop();		ip->i_mode =& ~ILARG;		return;	}	for(i=0; i<256; i++)		xbuf[i] = 0;	for(j=0; sz >= 256; j++) {		if(j <= 7)			ip->i_addr[j] = alloc();		if(j >= 7)			xbuf[j-7] = alloc();		for(i=0; i<256; i++)			dbuf[i] = rcop();		if(j < 7)			dwrite(ip->i_addr[j], dbuf); else			dwrite(xbuf[j-7], dbuf);		sz =- 256;	}	if(sz) {		if(j <= 7)			ip->i_addr[j] = alloc();		if(j >= 7)			xbuf[j-7] = alloc();		for(i=0; i<sz; i++)			dbuf[i] = rcop();		for(; i<256; i++)			dbuf[i] = 0;		if(j < 7)			dwrite(ip->i_addr[j], dbuf); else			dwrite(xbuf[j-7], dbuf);	}	if(j >= 7)		dwrite(ip->i_addr[7], xbuf);	ip->i_mode =| ILARG;}rcop(){	register b;	b = alloc();	tread(cbuf, 0);	dwrite(b, cbuf);	return(b);}pdate(d)int *d;{	if(d[0] == 0 && d[1] == 0)		printf("the epoch\n"); else		printf(ctime(d));}dread(bno, b){	seek(fo, bno, 3);	if(read(fo, b, 512) != 512) {		printf("disk read error %l\n", bno);		exit();	}}dwrite(bno, b){	seek(fo, bno, 3);	if(write(fo, b, 512) != 512) {		printf("disk write error %l\n", bno);		exit();	}}sread(b, flag)int *b;{	register i, s, *p;	tread(b, flag);	if(flag)		return;	i = 256;	s = 0;	p = b;	while(i--)		s =+ *p++;	if(s != 031415) {		printf("checksum error\n");		if(!iflg)			exit();	}}tread(b, flag)int *b;{	register c;	static char *pta, *ata, ctflg;	if(pta++ >= tsize) {		pta = 1;		ata = 0;		close(fi);		otape();		ctflg++;	}	if(flag)		return;	if(ctflg) {		printf("change tapes\n");		if(ctflg > 1)			printf("skip %d tapes\n", ctflg-1);		while((c = getchar()) != '\n')			if(c == 0)				exit();		ctflg = 0;	}	ata++;	if(iflg)	for(; pta != ata; ata++)		read(fi, b, 512);	if(pta != ata) {		seek(fi, pta-ata, 4);		ata = pta;	}	if(read(fi, b, 512) != 512) {		printf("tape read error %l\n", ata-1);		if(!iflg)			exit();		for(c=0; c<256; c++)			b[c] = 0;	}}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;	fi = open(ifile, 0);	if(fi < 0) {		printf("can not open %s\n", ifile);		exit();	}	if(!cflg)		return;	p = ifile;	while(*p++)		;	p[-2]++;}dwait(ino){	register i;	dconv(ino, file);loop:	if(wflg) {		printf("%s ", file);		i = getchar();		if(i == 'x')			exit();		if(i == '\n')			return(-1);		if(i != 'y')			goto flush;		i = getchar();		if(i != '\n') {		flush:			while((i=getchar()) != '\n')				if(i == '\0')					exit();			goto loop;		}	}	i = creat(file, 0666);	return(i);}dconv(n, p)char *p;{	register i;	if(i = ldiv(0, n, 10))		p = dconv(i, p);	*p++ = lrem(0, n, 10) + '0';	*p = '\0';	return(p);}alloc(){	register b, i;	i = --sblock.s_nfree;	if(i<0 || i>=100) {		printf("bad freeblock\n");		exit();	}	b = sblock.s_free[i];	if(b == 0) {		printf("out of freelist\n");		exit();	}	if(sblock.s_nfree <= 0) {		dread(b, cbuf);		sblock.s_nfree = cbuf[0];		for(i=0; i<100; i++)			sblock.s_free[i] = cbuf[i+1];	}	return(b);}free(in){	register i;	if(sblock.s_nfree >= 100) {		cbuf[0] = sblock.s_nfree;		for(i=0; i<100; i++)			cbuf[i+1] = sblock.s_free[i];		sblock.s_nfree = 0;		dwrite(in, cbuf);	}	sblock.s_free[sblock.s_nfree++] = in;}

⌨️ 快捷键说明

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