1 /*
2 * tarcat - concatenate tar archives into a single tar archive
3 */
4
5 #include <u.h>
6 #include <libc.h>
7 #include <ctype.h>
8 #include "tar.h"
9
10 enum {
11 Stdin,
12 Stdout,
13 };
14
15 static int debug;
16
17 /* don't copy zero blocks at end */
18 static void
catenate(int in,char * inname)19 catenate(int in, char *inname)
20 {
21 vlong len;
22 static Hblock hdr;
23 Hblock *hp = &hdr;
24
25 if (debug)
26 fprint(2, "%s: reading %s\n", inname, argv0);
27 while (getdir(hp, in, &len)) {
28 writetar(Stdout, (char *)hp, Tblock); /* write dir block */
29 passtar(hp, in, Stdout, len);
30 }
31 }
32
33 void
main(int argc,char ** argv)34 main(int argc, char **argv)
35 {
36 int errflg = 0;
37
38 ARGBEGIN {
39 case 'd':
40 ++debug;
41 break;
42 default:
43 errflg++;
44 break;
45 } ARGEND
46 if (errflg) {
47 fprint(2, "usage: %s [-d] [file]...\n", argv0);
48 exits("usage");
49 }
50
51 if (argc <= 0)
52 catenate(Stdin, "/fd/0");
53 else
54 for (; argc-- > 0; argv++) {
55 int in = open(argv[0], OREAD);
56
57 if (in < 0)
58 sysfatal("%s: %r", argv[0]);
59 catenate(in, argv[0]);
60 close(in);
61 }
62 closeout(Stdout, "/fd/1", 0);
63 exits(0);
64 }
65