|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <string.h> ! 3: #include <time.h> ! 4: #include <libv.h> ! 5: #include "tar.h" ! 6: #include "misc.h" ! 7: ! 8: int tflag; ! 9: ! 10: int nerr; ! 11: struct sub *pathsublist; ! 12: ! 13: int ! 14: filter(FILE *ifp, FILE *ofp) ! 15: { ! 16: struct tarbuf buf; ! 17: struct tarhdr hdr; ! 18: char *ptr; ! 19: int blocks; ! 20: static char z[2 * TSIZE]; ! 21: ! 22: if (fread(&buf, sizeof buf, 1, ifp) != 1) { ! 23: ++nerr; ! 24: fprintf(stderr, "tarf: premature eof on input\n"); ! 25: return 0; ! 26: } ! 27: if (memcmp(&buf, z, TSIZE) == 0) { ! 28: if (!tflag && fwrite(z, 1, sizeof z, ofp) != sizeof z) { ! 29: ++nerr; ! 30: fprintf(stderr, "tarf: error writing eof header\n"); ! 31: } ! 32: return 0; ! 33: } ! 34: if (thdrget(&hdr, &buf) != 0) { ! 35: ++nerr; ! 36: fprintf(stderr, "tarf: bad input header\n"); ! 37: return 0; ! 38: } ! 39: if (!sub(&pathsublist, 1, hdr.name, TNAMEMAX)) { ! 40: ++nerr; ! 41: fprintf(stderr, "tarf: can't expand '%s'\n", hdr.name); ! 42: return 0; ! 43: } ! 44: if (hdr.typeflag == LNKTYPE || hdr.typeflag == SYMTYPE) ! 45: sub(&pathsublist, 1, hdr.linkname, TLINKMAX); ! 46: blocks = (hdr.size + TSIZE - 1) / TSIZE; ! 47: if (tflag) { ! 48: fprintf(ofp, "%s\n", hdr.name); ! 49: if (hdr.typeflag == REGTYPE) ! 50: discard(ifp, blocks * TSIZE); ! 51: } else { ! 52: if (thdrput(&buf, &hdr) != 0) { ! 53: ++nerr; ! 54: fprintf(stderr, "tarf: error building output header\n"); ! 55: return 0; ! 56: } ! 57: if (fwrite(&buf, sizeof buf, 1, ofp) != 1) { ! 58: ++nerr; ! 59: fprintf(stderr, "tarf: error writing output header\n"); ! 60: return 0; ! 61: } ! 62: if (hdr.typeflag == REGTYPE) ! 63: if (fpcopy(ofp, ifp, blocks * TSIZE) != blocks * TSIZE) { ! 64: ++nerr; ! 65: fprintf(stderr, "tarf: error copying data\n"); ! 66: return 0; ! 67: } ! 68: } ! 69: return 1; ! 70: } ! 71: ! 72: void ! 73: usage(void) ! 74: { ! 75: fprintf(stderr, "usage: tarf [-t] [-Dold=new ...]\n"); ! 76: exit(1); ! 77: } ! 78: ! 79: int ! 80: main(int argc, char *argv[]) ! 81: { ! 82: int c; ! 83: char *nstr; ! 84: ! 85: prog = argv[0]; ! 86: while ((c = getopt(argc, argv, "tD:")) != EOF) ! 87: switch (c) { ! 88: case 't': ! 89: ++tflag; ! 90: break; ! 91: case 'D': ! 92: nstr = strchr(optarg, '='); ! 93: if (nstr) { ! 94: *nstr = '\0'; ! 95: addsub(&pathsublist, optarg, nstr + 1); ! 96: } else ! 97: usage(); ! 98: break; ! 99: default: ! 100: usage(); ! 101: break; ! 102: } ! 103: if (argc > 1 && optind != argc) ! 104: usage(); ! 105: while (filter(stdin, stdout)) ! 106: ; ! 107: if (ferror(stdin) || !feof(stdin)) ! 108: return 1; ! 109: return nerr ? 1 : 0; ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.