Subversion Repositories planix.SVN

Rev

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

Rev Author Line No. Line
2 - 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
}