1*368c31abSDavid du Colombier #include <u.h>
2*368c31abSDavid du Colombier #include <libc.h>
3*368c31abSDavid du Colombier #include <venti.h>
4*368c31abSDavid du Colombier #include <thread.h>
56b6b9ac8SDavid du Colombier
66b6b9ac8SDavid du Colombier char *host;
76b6b9ac8SDavid du Colombier
86b6b9ac8SDavid du Colombier void
usage(void)96b6b9ac8SDavid du Colombier usage(void)
106b6b9ac8SDavid du Colombier {
116b6b9ac8SDavid du Colombier fprint(2, "usage: mkroot [-h host] name type score blocksize prev\n");
12*368c31abSDavid du Colombier threadexitsall("usage");
136b6b9ac8SDavid du Colombier }
146b6b9ac8SDavid du Colombier
15*368c31abSDavid du Colombier void
threadmain(int argc,char * argv[])16*368c31abSDavid du Colombier threadmain(int argc, char *argv[])
176b6b9ac8SDavid du Colombier {
186b6b9ac8SDavid du Colombier uchar score[VtScoreSize];
196b6b9ac8SDavid du Colombier uchar buf[VtRootSize];
20*368c31abSDavid du Colombier VtConn *z;
216b6b9ac8SDavid du Colombier VtRoot root;
226b6b9ac8SDavid du Colombier
236b6b9ac8SDavid du Colombier ARGBEGIN{
246b6b9ac8SDavid du Colombier case 'h':
256b6b9ac8SDavid du Colombier host = EARGF(usage());
266b6b9ac8SDavid du Colombier break;
276b6b9ac8SDavid du Colombier default:
286b6b9ac8SDavid du Colombier usage();
296b6b9ac8SDavid du Colombier break;
306b6b9ac8SDavid du Colombier }ARGEND
316b6b9ac8SDavid du Colombier
326b6b9ac8SDavid du Colombier if(argc != 5)
336b6b9ac8SDavid du Colombier usage();
346b6b9ac8SDavid du Colombier
35*368c31abSDavid du Colombier fmtinstall('V', vtscorefmt);
36*368c31abSDavid du Colombier fmtinstall('F', vtfcallfmt);
376b6b9ac8SDavid du Colombier
386b6b9ac8SDavid du Colombier strecpy(root.name, root.name+sizeof root.name, argv[0]);
396b6b9ac8SDavid du Colombier strecpy(root.type, root.type+sizeof root.type, argv[1]);
40*368c31abSDavid du Colombier if(vtparsescore(argv[2], nil, root.score) < 0)
41*368c31abSDavid du Colombier sysfatal("bad score '%s'", argv[2]);
42*368c31abSDavid du Colombier root.blocksize = atoi(argv[3]);
43*368c31abSDavid du Colombier if(vtparsescore(argv[4], nil, root.prev) < 0)
44*368c31abSDavid du Colombier sysfatal("bad score '%s'", argv[4]);
45*368c31abSDavid du Colombier vtrootpack(&root, buf);
466b6b9ac8SDavid du Colombier
47*368c31abSDavid du Colombier z = vtdial(host);
486b6b9ac8SDavid du Colombier if(z == nil)
49*368c31abSDavid du Colombier sysfatal("could not connect to server: %r");
506b6b9ac8SDavid du Colombier
51*368c31abSDavid du Colombier if(vtconnect(z) < 0)
52*368c31abSDavid du Colombier sysfatal("vtconnect: %r");
536b6b9ac8SDavid du Colombier
54*368c31abSDavid du Colombier if(vtwrite(z, score, VtRootType, buf, VtRootSize) < 0)
55*368c31abSDavid du Colombier sysfatal("vtwrite: %r");
56*368c31abSDavid du Colombier if(vtsync(z) < 0)
57*368c31abSDavid du Colombier sysfatal("vtsync: %r");
58*368c31abSDavid du Colombier vthangup(z);
596b6b9ac8SDavid du Colombier print("%V\n", score);
60*368c31abSDavid du Colombier threadexitsall(0);
616b6b9ac8SDavid du Colombier }
62