📄 tar.c
字号:
} 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 + -