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

📄 tar.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 2 页
字号:
		}		checkdir(dblock.dbuf.name);		if (dblock.dbuf.linkflag == '1') {			unlink(dblock.dbuf.name);			if (link(dblock.dbuf.linkname, dblock.dbuf.name) < 0) {				fprintf(stderr, "%s: cannot link\n", dblock.dbuf.name);				continue;			}			if (vflag)				fprintf(stderr, "%s linked to %s\n", dblock.dbuf.name, dblock.dbuf.linkname);			continue;		}		if ((ofile = creat(dblock.dbuf.name, stbuf.st_mode & 07777)) < 0) {			fprintf(stderr, "tar: %s - cannot create\n", dblock.dbuf.name);			passtape();			continue;		}		chown(dblock.dbuf.name, stbuf.st_uid, stbuf.st_gid);		blocks = ((bytes = stbuf.st_size) + TBLOCK-1)/TBLOCK;		if (vflag)			fprintf(stderr, "x %s, %ld bytes, %ld tape blocks\n", dblock.dbuf.name, bytes, blocks);		while (blocks-- > 0) {			readtape(buf);			if (bytes > TBLOCK) {				if (write(ofile, buf, TBLOCK) < 0) {					fprintf(stderr, "tar: %s: HELP - extract write error\n", dblock.dbuf.name);					done(2);				}			} else				if (write(ofile, buf, (int) bytes) < 0) {					fprintf(stderr, "tar: %s: HELP - extract write error\n", dblock.dbuf.name);					done(2);				}			bytes -= TBLOCK;		}		close(ofile);		if (mflag == 0) {			time_t timep[2];			timep[0] = time(NULL);			timep[1] = stbuf.st_mtime;			utime(dblock.dbuf.name, timep);		}	}}dotable(){	for (;;) {		getdir();		if (endtape())			break;		if (vflag)			longt(&stbuf);		printf("%s", dblock.dbuf.name);		if (dblock.dbuf.linkflag == '1')			printf(" linked to %s", dblock.dbuf.linkname);		printf("\n");		passtape();	}}putempty(){	char buf[TBLOCK];	char *cp;	for (cp = buf; cp < &buf[TBLOCK]; )		*cp++ = '\0';	writetape(buf);}longt(st)register struct stat *st;{	register char *cp;	char *ctime();	pmode(st);	printf("%3d/%1d", st->st_uid, st->st_gid);	printf("%7D", st->st_size);	cp = ctime(&st->st_mtime);	printf(" %-12.12s %-4.4s ", cp+4, cp+20);}#define	SUID	04000#define	SGID	02000#define	ROWN	0400#define	WOWN	0200#define	XOWN	0100#define	RGRP	040#define	WGRP	020#define	XGRP	010#define	ROTH	04#define	WOTH	02#define	XOTH	01#define	STXT	01000int	m1[] = { 1, ROWN, 'r', '-' };int	m2[] = { 1, WOWN, 'w', '-' };int	m3[] = { 2, SUID, 's', XOWN, 'x', '-' };int	m4[] = { 1, RGRP, 'r', '-' };int	m5[] = { 1, WGRP, 'w', '-' };int	m6[] = { 2, SGID, 's', XGRP, 'x', '-' };int	m7[] = { 1, ROTH, 'r', '-' };int	m8[] = { 1, WOTH, 'w', '-' };int	m9[] = { 2, STXT, 't', XOTH, 'x', '-' };int	*m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9};pmode(st)register struct stat *st;{	register int **mp;	for (mp = &m[0]; mp < &m[9];)		select(*mp++, st);}select(pairp, st)int *pairp;struct stat *st;{	register int n, *ap;	ap = pairp;	n = *ap++;	while (--n>=0 && (st->st_mode&*ap++)==0)		ap++;	printf("%c", *ap);}checkdir(name)register char *name;{	register char *cp;	int i;	for (cp = name; *cp; cp++) {		if (*cp == '/') {			*cp = '\0';			if (access(name, 01) < 0) {				if (fork() == 0) {					execl("/bin/mkdir", "mkdir", name, 0);					execl("/usr/bin/mkdir", "mkdir", name, 0);					fprintf(stderr, "tar: cannot find mkdir!\n");					done(0);				}				while (wait(&i) >= 0);				chown(name, stbuf.st_uid, stbuf.st_gid);			}			*cp = '/';		}	}}onintr(){	signal(SIGINT, SIG_IGN);	term++;}onquit(){	signal(SIGQUIT, SIG_IGN);	term++;}onhup(){	signal(SIGHUP, SIG_IGN);	term++;}onterm(){	signal(SIGTERM, SIG_IGN);	term++;}tomodes(sp)register struct stat *sp;{	register char *cp;	for (cp = dblock.dummy; cp < &dblock.dummy[TBLOCK]; cp++)		*cp = '\0';	sprintf(dblock.dbuf.mode, "%6o ", sp->st_mode & 07777);	sprintf(dblock.dbuf.uid, "%6o ", sp->st_uid);	sprintf(dblock.dbuf.gid, "%6o ", sp->st_gid);	sprintf(dblock.dbuf.size, "%11lo ", sp->st_size);	sprintf(dblock.dbuf.mtime, "%11lo ", sp->st_mtime);}checksum(){	register i;	register char *cp;	for (cp = dblock.dbuf.chksum; cp < &dblock.dbuf.chksum[sizeof(dblock.dbuf.chksum)]; cp++)		*cp = ' ';	i = 0;	for (cp = dblock.dummy; cp < &dblock.dummy[TBLOCK]; cp++)		i += *cp;	return(i);}checkw(c, name)char *name;{	if (wflag) {		printf("%c ", c);		if (vflag)			longt(&stbuf);		printf("%s: ", name);		if (response() == 'y'){			return(1);		}		return(0);	}	return(1);}response(){	char c;	c = getchar();	if (c != '\n')		while (getchar() != '\n');	else c = 'n';	return(c);}checkupdate(arg)char	*arg;{	char name[100];	long	mtime;	daddr_t seekp;	daddr_t	lookup();	rewind(tfile);	for (;;) {		if ((seekp = lookup(arg)) < 0)			return(1);		fseek(tfile, seekp, 0);		fscanf(tfile, "%s %lo", name, &mtime);		if (stbuf.st_mtime > mtime)			return(1);		else			return(0);	}}done(n){	unlink(tname);	exit(n);}prefix(s1, s2)register char *s1, *s2;{	while (*s1)		if (*s1++ != *s2++)			return(0);	if (*s2)		return(*s2 == '/');	return(1);}getwdir(s)char *s;{	int i;	int	pipdes[2];	pipe(pipdes);	if ((i = fork()) == 0) {		close(1);		dup(pipdes[1]);		execl("/bin/pwd", "pwd", 0);		execl("/usr/bin/pwd", "pwd", 0);		fprintf(stderr, "pwd failed!\n");		printf("/\n");		exit(1);	}	while (wait((int *)NULL) != -1)			;	read(pipdes[0], s, 50);	while(*s != '\n')		s++;	*s = '\0';	close(pipdes[0]);	close(pipdes[1]);}#define	N	200int	njab;daddr_tlookup(s)char *s;{	register i;	daddr_t a;	for(i=0; s[i]; i++)		if(s[i] == ' ')			break;	a = bsrch(s, i, low, high);	return(a);}daddr_tbsrch(s, n, l, h)daddr_t l, h;char *s;{	register i, j;	char b[N];	daddr_t m, m1;	njab = 0;loop:	if(l >= h)		return(-1L);	m = l + (h-l)/2 - N/2;	if(m < l)		m = l;	fseek(tfile, m, 0);	fread(b, 1, N, tfile);	njab++;	for(i=0; i<N; i++) {		if(b[i] == '\n')			break;		m++;	}	if(m >= h)		return(-1L);	m1 = m;	j = i;	for(i++; i<N; i++) {		m1++;		if(b[i] == '\n')			break;	}	i = cmp(b+j, s, n);	if(i < 0) {		h = m;		goto loop;	}	if(i > 0) {		l = m1;		goto loop;	}	return(m);}cmp(b, s, n)char *b, *s;{	register i;	if(b[0] != '\n')		exit(2);	for(i=0; i<n; i++) {		if(b[i+1] > s[i])			return(-1);		if(b[i+1] < s[i])			return(1);	}	return(b[i+1] == ' '? 0 : -1);}readtape(buffer)char *buffer;{	int i, j;	if (recno >= nblock || first == 0) {		if (first == 0 && nblock == 0)			j = NBLOCK;		else			j = nblock;		if ((i = read(mt, tbuf, TBLOCK*j)) < 0) {			fprintf(stderr, "Tar: tape read error\n");			done(3);		}		if (first == 0) {			if ((i % TBLOCK) != 0) {				fprintf(stderr, "Tar: tape blocksize error\n");				done(3);			}			i /= TBLOCK;			if (rflag && i != 1) {				fprintf(stderr, "Tar: Cannot update blocked tapes (yet)\n");				done(4);			}			if (i != nblock && i != 1) {				fprintf(stderr, "Tar: blocksize = %d\n", i);				nblock = i;			}		}		recno = 0;	}	first = 1;	copy(buffer, &tbuf[recno++]);	return(TBLOCK);}writetape(buffer)char *buffer;{	first = 1;	if (nblock == 0)		nblock = 1;	if (recno >= nblock) {		if (write(mt, tbuf, TBLOCK*nblock) < 0) {			fprintf(stderr, "Tar: tape write error\n");			done(2);		}		recno = 0;	}	copy(&tbuf[recno++], buffer);	if (recno >= nblock) {		if (write(mt, tbuf, TBLOCK*nblock) < 0) {			fprintf(stderr, "Tar: tape write error\n");			done(2);		}		recno = 0;	}	return(TBLOCK);}backtape(){	lseek(mt, (long) -TBLOCK, 1);	if (recno >= nblock) {		recno = nblock - 1;		if (read(mt, tbuf, TBLOCK*nblock) < 0) {			fprintf(stderr, "Tar: tape read error after seek\n");			done(4);		}		lseek(mt, (long) -TBLOCK, 1);	}}flushtape(){	write(mt, tbuf, TBLOCK*nblock);}copy(to, from)register char *to, *from;{	register i;	i = TBLOCK;	do {		*to++ = *from++;	} while (--i);}

⌨️ 快捷键说明

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