/* * tarcat - concatenate tar archives into a single tar archive */ #include #include #include #include "tar.h" enum { Stdin, Stdout, }; static int debug; /* don't copy zero blocks at end */ static void catenate(int in, char *inname) { vlong len; static Hblock hdr; Hblock *hp = &hdr; if (debug) fprint(2, "%s: reading %s\n", inname, argv0); while (getdir(hp, in, &len)) { writetar(Stdout, (char *)hp, Tblock); /* write dir block */ passtar(hp, in, Stdout, len); } } void main(int argc, char **argv) { int errflg = 0; ARGBEGIN { case 'd': ++debug; break; default: errflg++; break; } ARGEND if (errflg) { fprint(2, "usage: %s [-d] [file]...\n", argv0); exits("usage"); } if (argc <= 0) catenate(Stdin, "/fd/0"); else for (; argc-- > 0; argv++) { int in = open(argv[0], OREAD); if (in < 0) sysfatal("%s: %r", argv[0]); catenate(in, argv[0]); close(in); } closeout(Stdout, "/fd/1", 0); exits(0); }