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 int verbose;
14*368c31abSDavid du Colombier
15*368c31abSDavid du Colombier enum
16*368c31abSDavid du Colombier {
17*368c31abSDavid du Colombier STACK = 8192
18*368c31abSDavid du Colombier };
19*368c31abSDavid du Colombier
20*368c31abSDavid du Colombier void
usage(void)21*368c31abSDavid du Colombier usage(void)
22*368c31abSDavid du Colombier {
23*368c31abSDavid du Colombier fprint(2, "usage: venti/devnull [-v] [-a address]\n");
24*368c31abSDavid du Colombier threadexitsall("usage");
25*368c31abSDavid du Colombier }
26*368c31abSDavid du Colombier
27*368c31abSDavid du Colombier void
threadmain(int argc,char ** argv)28*368c31abSDavid du Colombier threadmain(int argc, char **argv)
29*368c31abSDavid du Colombier {
30*368c31abSDavid du Colombier VtReq *r;
31*368c31abSDavid du Colombier VtSrv *srv;
32*368c31abSDavid du Colombier char *address;
33*368c31abSDavid du Colombier
34*368c31abSDavid du Colombier fmtinstall('V', vtscorefmt);
35*368c31abSDavid du Colombier fmtinstall('F', vtfcallfmt);
36*368c31abSDavid du Colombier
37*368c31abSDavid du Colombier address = "tcp!*!venti";
38*368c31abSDavid du Colombier
39*368c31abSDavid du Colombier ARGBEGIN{
40*368c31abSDavid du Colombier case 'v':
41*368c31abSDavid du Colombier verbose++;
42*368c31abSDavid du Colombier break;
43*368c31abSDavid du Colombier case 'a':
44*368c31abSDavid du Colombier address = EARGF(usage());
45*368c31abSDavid du Colombier break;
46*368c31abSDavid du Colombier default:
47*368c31abSDavid du Colombier usage();
48*368c31abSDavid du Colombier }ARGEND
49*368c31abSDavid du Colombier
50*368c31abSDavid du Colombier srv = vtlisten(address);
51*368c31abSDavid du Colombier if(srv == nil)
52*368c31abSDavid du Colombier sysfatal("vtlisten %s: %r", address);
53*368c31abSDavid du Colombier
54*368c31abSDavid du Colombier while((r = vtgetreq(srv)) != nil){
55*368c31abSDavid du Colombier r->rx.msgtype = r->tx.msgtype+1;
56*368c31abSDavid du Colombier if(verbose)
57*368c31abSDavid du Colombier fprint(2, "<- %F\n", &r->tx);
58*368c31abSDavid du Colombier switch(r->tx.msgtype){
59*368c31abSDavid du Colombier case VtTping:
60*368c31abSDavid du Colombier break;
61*368c31abSDavid du Colombier case VtTgoodbye:
62*368c31abSDavid du Colombier break;
63*368c31abSDavid du Colombier case VtTread:
64*368c31abSDavid du Colombier r->rx.error = vtstrdup("no such block");
65*368c31abSDavid du Colombier r->rx.msgtype = VtRerror;
66*368c31abSDavid du Colombier break;
67*368c31abSDavid du Colombier case VtTwrite:
68*368c31abSDavid du Colombier packetsha1(r->tx.data, r->rx.score);
69*368c31abSDavid du Colombier break;
70*368c31abSDavid du Colombier case VtTsync:
71*368c31abSDavid du Colombier break;
72*368c31abSDavid du Colombier }
73*368c31abSDavid du Colombier if(verbose)
74*368c31abSDavid du Colombier fprint(2, "-> %F\n", &r->rx);
75*368c31abSDavid du Colombier vtrespond(r);
76*368c31abSDavid du Colombier }
77*368c31abSDavid du Colombier threadexitsall(nil);
78*368c31abSDavid du Colombier }
79*368c31abSDavid du Colombier
80