|
|
1.1 root 1: /* tarread.c */
2: /* Copyright (c) 1985, by Carnegie-Mellon University */
3:
4: #include <stdio.h>
5: #include <v2tov3.h>
6: #include <sys\types.h>
7: #include <sys\stat.h>
8: #include "tar.h"
9:
10: char usage[] = "tarread: usage: tarread tx[vwz] tarfile\n";
11: union hblock hbuf;
12:
13: int verbose = 0;
14: int confirm = 0;
15: int binary = 0;
16: char cmd;
17:
18: main(argc, argv)
19: int argc;
20: char *argv[];
21: {
22: FILE *fp;
23: char *cp;
24:
25: if (argc != 3) {
26: fprintf(stderr, usage);
27: exit(1);
28: }
29:
30: for (cp = argv[1]; *cp; cp++)
31: switch (*cp) {
32: case 't':
33: case 'x':
34: cmd = *cp;
35: break;
36:
37: case 'v':
38: verbose++;
39: break;
40: case 'z':
41: binary++;
42: break;
43: case 'w':
44: confirm++;
45: break;
46: default:
47: fprintf(stderr, "tarread: unknown switch %c\n", *cp);
48: fprintf(stderr, usage);
49: exit(1);
50: }
51:
52: if ((fp = fopen(argv[2], "rb")) == NULL) {
53: fprintf(stderr, "tarrread: cannot open %s\n", argv[2]);
54: exit(1);
55: }
56:
57: for (;;) {
58: if (fread(&hbuf, sizeof(hbuf), 1, fp) != 1) {
59: perror("fread");
60: exit(1);
61: }
62: if (!proc_file(fp))
63: break;
64: }
65: }
66:
67:
68: int proc_file(fp)
69: FILE *fp;
70: {
71: char name[NAMSIZ];
72: unsigned short mode;
73: short uid, gid;
74: long size, mtime;
75: char c;
76: int confrmd;
77: long skip;
78:
79: if (hbuf.dbuf.name[0] == '\0')
80: return (NULL);
81:
82: strcpy(name, hbuf.dbuf.name);
83: if (sscanf(hbuf.dbuf.mode, "%o", &mode) != 1)
84: fprintf("Couldn't read mode\n");
85: if (sscanf(hbuf.dbuf.uid, "%o", &uid) != 1)
86: fprintf("Couldn't read uid\n");
87: if (sscanf(hbuf.dbuf.gid, "%o", &gid) != 1)
88: fprintf("Couldn't read gid\n");
89: if (sscanf(hbuf.dbuf.size, "%12lo %12lo", &size, &mtime) != 2)
90: fprintf("Couldn't read size or mtime\n");
91:
92: skip = (size + TBLOCK - 1) / TBLOCK * TBLOCK;
93:
94: switch (cmd) {
95: case 't':
96: if (verbose)
97: printf("%8o %d/%d\t %6ld %.24s %s\n", mode,
98: uid, gid, size, ctime(&mtime), name);
99: else
100: printf("%s\n", name);
101:
102: break;
103:
104: case 'x':
105: if (verbose)
106: printf("x %s: ", name);
107: confrmd = 1;
108:
109: if (confirm) {
110: confrmd = 0;
111: if ((c = getchar()) == 'y')
112: confrmd++;
113: while (c != '\n')
114: c = getchar();
115: if(!confrmd)
116: break;
117: }
118:
119: if(extract(name, size, mode, mtime, fp))
120: skip = 0;
121:
122: if (verbose)
123: printf("\n");
124: break;
125: }
126: if (fseek(fp, skip, 1)) {
127: perror("fseek");
128: exit(1);
129: }
130: return (1);
131: }
132:
133:
134: int extract(fname, size, mode, mtime, ifp)
135: char *fname;
136: long size;
137: unsigned short mode;
138: long mtime;
139: FILE *ifp;
140: {
141: FILE *ofp;
142: char fbuf[TBLOCK];
143: long copied, left;
144: char *s, *np, *strchr();
145: struct stat sbuf;
146:
147: for(np = fname; s = strchr(np, '/'); np = s+1) {
148: *s = '\0';
149: if(stat(fname, &sbuf)) {
150: if(mkdir(fname))
151: perror("mkdir");
152: } else if(!(sbuf.st_mode & S_IFDIR)) {
153: fprintf(stderr, "\n%s: Not a directory", fname);
154: *s = '/';
155: fprintf(stderr, "\ntar: %s - cannot create", fname);
156: return (0);
157: }
158: *s = '/';
159: }
160: if(!*np)
161: return (0);
162:
163: if (binary) {
164: if ((ofp = fopen(fname, "wb")) == NULL) {
165: perror("extract:");
166: return (0);
167: }
168: } else {
169: if ((ofp = fopen(fname, "w")) == NULL) {
170: perror("extract:");
171: return (0);
172: }
173: }
174:
175: for(copied = 0; copied < size; copied += TBLOCK) {
176: if(fread(fbuf, TBLOCK, 1, ifp) != 1) {
177: perror("fread");
178: exit(1);
179: }
180: left = size - copied;
181: if(fwrite(fbuf, (int)min(left, TBLOCK), 1, ofp) != 1) {
182: perror("fwrite");
183: exit(1);
184: }
185: }
186:
187: if(fclose(ofp)) {
188: perror("fclose");
189: exit(1);
190: }
191:
192: /*
193: * Now, set modification time.
194: */
195: {
196: #include <sys\utime.h>
197: struct utimbuf utim;
198:
199: utim.modtime = mtime;
200:
201: if (utime(fname, &utim) == -1) {
202: perror("utime");
203: exit(1);
204: }
205: }
206:
207: return (1);
208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.