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