xref: /plan9-contrib/sys/src/cmd/tarsplit/tarcat.c (revision 4d2c0504d2bd576e9eb786d7a9d27f921b5ebd5e)
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