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