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 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 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