xref: /plan9/sys/lib/dist/cmd/touchfs.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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