xref: /plan9/sys/src/cmd/venti/ro.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
1*368c31abSDavid du Colombier /* Copyright (c) 2004 Russ Cox */
2*368c31abSDavid du Colombier #include <u.h>
3*368c31abSDavid du Colombier #include <libc.h>
4*368c31abSDavid du Colombier #include <venti.h>
5*368c31abSDavid du Colombier #include <thread.h>
6*368c31abSDavid du Colombier #include <libsec.h>
7*368c31abSDavid du Colombier 
8*368c31abSDavid du Colombier #ifndef _UNISTD_H_
9*368c31abSDavid du Colombier #pragma varargck type "F" VtFcall*
10*368c31abSDavid du Colombier #pragma varargck type "T" void
11*368c31abSDavid du Colombier #endif
12*368c31abSDavid du Colombier 
13*368c31abSDavid du Colombier VtConn *z;
14*368c31abSDavid du Colombier int verbose;
15*368c31abSDavid du Colombier 
16*368c31abSDavid du Colombier enum
17*368c31abSDavid du Colombier {
18*368c31abSDavid du Colombier 	STACK = 8192
19*368c31abSDavid du Colombier };
20*368c31abSDavid du Colombier 
21*368c31abSDavid du Colombier void
usage(void)22*368c31abSDavid du Colombier usage(void)
23*368c31abSDavid du Colombier {
24*368c31abSDavid du Colombier 	fprint(2, "usage: venti/ro [-v] [-a address] [-h address]\n");
25*368c31abSDavid du Colombier 	threadexitsall("usage");
26*368c31abSDavid du Colombier }
27*368c31abSDavid du Colombier 
28*368c31abSDavid du Colombier void
readthread(void * v)29*368c31abSDavid du Colombier readthread(void *v)
30*368c31abSDavid du Colombier {
31*368c31abSDavid du Colombier 	char err[ERRMAX];
32*368c31abSDavid du Colombier 	VtReq *r;
33*368c31abSDavid du Colombier 	uchar *buf;
34*368c31abSDavid du Colombier 	int n;
35*368c31abSDavid du Colombier 
36*368c31abSDavid du Colombier 	r = v;
37*368c31abSDavid du Colombier 	buf = vtmalloc(r->tx.count);
38*368c31abSDavid du Colombier 	if((n=vtread(z, r->tx.score, r->tx.blocktype, buf, r->tx.count)) < 0){
39*368c31abSDavid du Colombier 		r->rx.msgtype = VtRerror;
40*368c31abSDavid du Colombier 		rerrstr(err, sizeof err);
41*368c31abSDavid du Colombier 		r->rx.error = vtstrdup(err);
42*368c31abSDavid du Colombier 		free(buf);
43*368c31abSDavid du Colombier 	}else{
44*368c31abSDavid du Colombier 		r->rx.data = packetforeign(buf, n, free, buf);
45*368c31abSDavid du Colombier 	}
46*368c31abSDavid du Colombier 	if(verbose)
47*368c31abSDavid du Colombier 		fprint(2, "-> %F\n", &r->rx);
48*368c31abSDavid du Colombier 	vtrespond(r);
49*368c31abSDavid du Colombier }
50*368c31abSDavid du Colombier 
51*368c31abSDavid du Colombier void
threadmain(int argc,char ** argv)52*368c31abSDavid du Colombier threadmain(int argc, char **argv)
53*368c31abSDavid du Colombier {
54*368c31abSDavid du Colombier 	VtReq *r;
55*368c31abSDavid du Colombier 	VtSrv *srv;
56*368c31abSDavid du Colombier 	char *address, *ventiaddress;
57*368c31abSDavid du Colombier 
58*368c31abSDavid du Colombier 	fmtinstall('F', vtfcallfmt);
59*368c31abSDavid du Colombier 	fmtinstall('V', vtscorefmt);
60*368c31abSDavid du Colombier 
61*368c31abSDavid du Colombier 	address = "tcp!*!venti";
62*368c31abSDavid du Colombier 	ventiaddress = nil;
63*368c31abSDavid du Colombier 
64*368c31abSDavid du Colombier 	ARGBEGIN{
65*368c31abSDavid du Colombier 	case 'v':
66*368c31abSDavid du Colombier 		verbose++;
67*368c31abSDavid du Colombier 		break;
68*368c31abSDavid du Colombier 	case 'a':
69*368c31abSDavid du Colombier 		address = EARGF(usage());
70*368c31abSDavid du Colombier 		break;
71*368c31abSDavid du Colombier 	case 'h':
72*368c31abSDavid du Colombier 		ventiaddress = EARGF(usage());
73*368c31abSDavid du Colombier 		break;
74*368c31abSDavid du Colombier 	default:
75*368c31abSDavid du Colombier 		usage();
76*368c31abSDavid du Colombier 	}ARGEND
77*368c31abSDavid du Colombier 
78*368c31abSDavid du Colombier 	if((z = vtdial(ventiaddress)) == nil)
79*368c31abSDavid du Colombier 		sysfatal("vtdial %s: %r", ventiaddress);
80*368c31abSDavid du Colombier 	if(vtconnect(z) < 0)
81*368c31abSDavid du Colombier 		sysfatal("vtconnect: %r");
82*368c31abSDavid du Colombier 
83*368c31abSDavid du Colombier 	srv = vtlisten(address);
84*368c31abSDavid du Colombier 	if(srv == nil)
85*368c31abSDavid du Colombier 		sysfatal("vtlisten %s: %r", address);
86*368c31abSDavid du Colombier 
87*368c31abSDavid du Colombier 	while((r = vtgetreq(srv)) != nil){
88*368c31abSDavid du Colombier 		r->rx.msgtype = r->tx.msgtype+1;
89*368c31abSDavid du Colombier 		if(verbose)
90*368c31abSDavid du Colombier 			fprint(2, "<- %F\n", &r->tx);
91*368c31abSDavid du Colombier 		switch(r->tx.msgtype){
92*368c31abSDavid du Colombier 		case VtTping:
93*368c31abSDavid du Colombier 			break;
94*368c31abSDavid du Colombier 		case VtTgoodbye:
95*368c31abSDavid du Colombier 			break;
96*368c31abSDavid du Colombier 		case VtTread:
97*368c31abSDavid du Colombier 			threadcreate(readthread, r, 16384);
98*368c31abSDavid du Colombier 			continue;
99*368c31abSDavid du Colombier 		case VtTwrite:
100*368c31abSDavid du Colombier 			r->rx.error = vtstrdup("read-only server");
101*368c31abSDavid du Colombier 			r->rx.msgtype = VtRerror;
102*368c31abSDavid du Colombier 			break;
103*368c31abSDavid du Colombier 		case VtTsync:
104*368c31abSDavid du Colombier 			break;
105*368c31abSDavid du Colombier 		}
106*368c31abSDavid du Colombier 		if(verbose)
107*368c31abSDavid du Colombier 			fprint(2, "-> %F\n", &r->rx);
108*368c31abSDavid du Colombier 		vtrespond(r);
109*368c31abSDavid du Colombier 	}
110*368c31abSDavid du Colombier 	threadexitsall(nil);
111*368c31abSDavid du Colombier }
112*368c31abSDavid du Colombier 
113