xref: /plan9/sys/src/cmd/venti/mkroot.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
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