Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <bio.h>
4
 
5
void
6
Bpass(Biobuf *bin, Biobuf *bout, int n)
7
{
8
	char buf[8192];
9
	int m;
10
 
11
	while(n > 0) {
12
		m = sizeof buf;
13
		if(m > n)
14
			m = n;
15
		m = Bread(bin, buf, m);
16
		if(m <= 0) {
17
			fprint(2, "corrupt archive\n");
18
			exits("notdone");
19
		}
20
		Bwrite(bout, buf, m);
21
		n -= m;
22
	}
23
	assert(n == 0);
24
}
25
 
26
void
27
main(int argc, char **argv)
28
{
29
	char *p, *f[10];
30
	Biobuf bin, bout;
31
	int nf;
32
	ulong d, size;
33
 
34
	if(argc != 2) {
35
		fprint(2, "usage: cat mkfs-archive | touchfs date (in seconds)\n");
36
		exits("usage");
37
	}
38
 
39
	d = strtoul(argv[1], 0, 0);
40
 
41
	quotefmtinstall();
42
	Binit(&bin, 0, OREAD);
43
	Binit(&bout, 1, OWRITE);
44
 
45
	while(p = Brdline(&bin, '\n')) {
46
		p[Blinelen(&bin)-1] = '\0';
47
		if(strcmp(p, "end of archive") == 0) {
48
			Bprint(&bout, "end of archive\n");
49
			exits(0);
50
		}
51
 
52
		nf = tokenize(p, f, nelem(f));
53
		if(nf != 6) {
54
			fprint(2, "corrupt archive\n");
55
			exits("notdone");
56
		}
57
 
58
		Bprint(&bout, "%q %q %q %q %lud %q\n",
59
			f[0], f[1], f[2], f[3], d, f[5]);
60
 
61
		size = strtoul(f[5], 0, 0);
62
		Bpass(&bin, &bout, size);
63
	}
64
	fprint(2, "premature end of archive\n");
65
	exits("notdone");
66
}