]> git.lizzy.rs Git - plan9front.git/blob - sys/lib/dist/cmd/touchfs.c
perms
[plan9front.git] / sys / lib / dist / cmd / touchfs.c
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 }