Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * tarcat - concatenate tar archives into a single tar archive
 */

#include <u.h>
#include <libc.h>
#include <ctype.h>
#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);
}