Blame


1 056fe1ba 2003-11-23 devnull #include <u.h>
2 056fe1ba 2003-11-23 devnull #include <libc.h>
3 056fe1ba 2003-11-23 devnull #include <venti.h>
4 056fe1ba 2003-11-23 devnull #include <thread.h>
5 056fe1ba 2003-11-23 devnull #include "queue.h"
6 056fe1ba 2003-11-23 devnull
7 056fe1ba 2003-11-23 devnull enum
8 056fe1ba 2003-11-23 devnull {
9 056fe1ba 2003-11-23 devnull STACK = 8192,
10 056fe1ba 2003-11-23 devnull };
11 056fe1ba 2003-11-23 devnull
12 056fe1ba 2003-11-23 devnull typedef struct VtSconn VtSconn;
13 056fe1ba 2003-11-23 devnull struct VtSconn
14 056fe1ba 2003-11-23 devnull {
15 056fe1ba 2003-11-23 devnull int ctl;
16 056fe1ba 2003-11-23 devnull char dir[NETPATHLEN];
17 056fe1ba 2003-11-23 devnull VtSrv *srv;
18 056fe1ba 2003-11-23 devnull VtConn *c;
19 056fe1ba 2003-11-23 devnull };
20 056fe1ba 2003-11-23 devnull
21 056fe1ba 2003-11-23 devnull struct VtSrv
22 056fe1ba 2003-11-23 devnull {
23 056fe1ba 2003-11-23 devnull int afd;
24 056fe1ba 2003-11-23 devnull int dead;
25 056fe1ba 2003-11-23 devnull char adir[NETPATHLEN];
26 056fe1ba 2003-11-23 devnull Queue *q; /* Queue(VtReq*) */
27 056fe1ba 2003-11-23 devnull };
28 056fe1ba 2003-11-23 devnull
29 056fe1ba 2003-11-23 devnull static void listenproc(void*);
30 056fe1ba 2003-11-23 devnull static void connproc(void*);
31 056fe1ba 2003-11-23 devnull
32 056fe1ba 2003-11-23 devnull VtSrv*
33 056fe1ba 2003-11-23 devnull vtlisten(char *addr)
34 056fe1ba 2003-11-23 devnull {
35 056fe1ba 2003-11-23 devnull VtSrv *s;
36 056fe1ba 2003-11-23 devnull
37 056fe1ba 2003-11-23 devnull s = vtmallocz(sizeof(VtSrv));
38 056fe1ba 2003-11-23 devnull s->afd = announce(addr, s->adir);
39 056fe1ba 2003-11-23 devnull if(s->afd < 0){
40 056fe1ba 2003-11-23 devnull free(s);
41 056fe1ba 2003-11-23 devnull return nil;
42 056fe1ba 2003-11-23 devnull }
43 056fe1ba 2003-11-23 devnull s->q = _vtqalloc();
44 056fe1ba 2003-11-23 devnull proccreate(listenproc, s, STACK);
45 056fe1ba 2003-11-23 devnull return s;
46 056fe1ba 2003-11-23 devnull }
47 056fe1ba 2003-11-23 devnull
48 056fe1ba 2003-11-23 devnull static void
49 056fe1ba 2003-11-23 devnull listenproc(void *v)
50 056fe1ba 2003-11-23 devnull {
51 056fe1ba 2003-11-23 devnull int ctl;
52 056fe1ba 2003-11-23 devnull char dir[NETPATHLEN];
53 056fe1ba 2003-11-23 devnull VtSrv *srv;
54 056fe1ba 2003-11-23 devnull VtSconn *sc;
55 056fe1ba 2003-11-23 devnull
56 056fe1ba 2003-11-23 devnull srv = v;
57 056fe1ba 2003-11-23 devnull for(;;){
58 2277c5d7 2004-03-21 devnull fprint(2, "listen for venti\n");
59 056fe1ba 2003-11-23 devnull ctl = listen(srv->adir, dir);
60 056fe1ba 2003-11-23 devnull if(ctl < 0){
61 056fe1ba 2003-11-23 devnull srv->dead = 1;
62 056fe1ba 2003-11-23 devnull break;
63 056fe1ba 2003-11-23 devnull }
64 2277c5d7 2004-03-21 devnull fprint(2, "got one\n");
65 056fe1ba 2003-11-23 devnull sc = vtmallocz(sizeof(VtSconn));
66 056fe1ba 2003-11-23 devnull sc->ctl = ctl;
67 056fe1ba 2003-11-23 devnull sc->srv = srv;
68 056fe1ba 2003-11-23 devnull strcpy(sc->dir, dir);
69 056fe1ba 2003-11-23 devnull proccreate(connproc, sc, STACK);
70 056fe1ba 2003-11-23 devnull }
71 056fe1ba 2003-11-23 devnull
72 056fe1ba 2003-11-23 devnull // hangup
73 056fe1ba 2003-11-23 devnull }
74 056fe1ba 2003-11-23 devnull
75 056fe1ba 2003-11-23 devnull static void
76 056fe1ba 2003-11-23 devnull connproc(void *v)
77 056fe1ba 2003-11-23 devnull {
78 056fe1ba 2003-11-23 devnull VtSconn *sc;
79 056fe1ba 2003-11-23 devnull VtConn *c;
80 056fe1ba 2003-11-23 devnull Packet *p;
81 056fe1ba 2003-11-23 devnull VtReq *r;
82 056fe1ba 2003-11-23 devnull int fd;
83 056fe1ba 2003-11-23 devnull
84 056fe1ba 2003-11-23 devnull r = nil;
85 056fe1ba 2003-11-23 devnull c = nil;
86 056fe1ba 2003-11-23 devnull sc = v;
87 056fe1ba 2003-11-23 devnull fprint(2, "new call %s on %d\n", sc->dir, sc->ctl);
88 056fe1ba 2003-11-23 devnull fd = accept(sc->ctl, sc->dir);
89 056fe1ba 2003-11-23 devnull close(sc->ctl);
90 056fe1ba 2003-11-23 devnull if(fd < 0){
91 056fe1ba 2003-11-23 devnull fprint(2, "accept %s: %r\n", sc->dir);
92 056fe1ba 2003-11-23 devnull goto out;
93 056fe1ba 2003-11-23 devnull }
94 056fe1ba 2003-11-23 devnull
95 056fe1ba 2003-11-23 devnull c = vtconn(fd, fd);
96 056fe1ba 2003-11-23 devnull sc->c = c;
97 056fe1ba 2003-11-23 devnull if(vtversion(c) < 0){
98 056fe1ba 2003-11-23 devnull fprint(2, "vtversion %s: %r\n", sc->dir);
99 056fe1ba 2003-11-23 devnull goto out;
100 056fe1ba 2003-11-23 devnull }
101 056fe1ba 2003-11-23 devnull if(vtsrvhello(c) < 0){
102 056fe1ba 2003-11-23 devnull fprint(2, "vtsrvhello %s: %r\n", sc->dir);
103 056fe1ba 2003-11-23 devnull goto out;
104 056fe1ba 2003-11-23 devnull }
105 056fe1ba 2003-11-23 devnull
106 056fe1ba 2003-11-23 devnull fprint(2, "new proc %s\n", sc->dir);
107 056fe1ba 2003-11-23 devnull proccreate(vtsendproc, c, STACK);
108 056fe1ba 2003-11-23 devnull qlock(&c->lk);
109 056fe1ba 2003-11-23 devnull while(!c->writeq)
110 056fe1ba 2003-11-23 devnull rsleep(&c->rpcfork);
111 056fe1ba 2003-11-23 devnull qunlock(&c->lk);
112 056fe1ba 2003-11-23 devnull
113 056fe1ba 2003-11-23 devnull while((p = vtrecv(c)) != nil){
114 056fe1ba 2003-11-23 devnull r = vtmallocz(sizeof(VtReq));
115 056fe1ba 2003-11-23 devnull if(vtfcallunpack(&r->tx, p) < 0){
116 056fe1ba 2003-11-23 devnull packetfree(p);
117 056fe1ba 2003-11-23 devnull fprint(2, "bad packet on %s: %r\n", sc->dir);
118 056fe1ba 2003-11-23 devnull continue;
119 056fe1ba 2003-11-23 devnull }
120 056fe1ba 2003-11-23 devnull packetfree(p);
121 056fe1ba 2003-11-23 devnull if(r->tx.type == VtTgoodbye)
122 056fe1ba 2003-11-23 devnull break;
123 056fe1ba 2003-11-23 devnull r->rx.tag = r->tx.tag;
124 056fe1ba 2003-11-23 devnull r->sc = sc;
125 056fe1ba 2003-11-23 devnull if(_vtqsend(sc->srv->q, r) < 0){
126 056fe1ba 2003-11-23 devnull fprint(2, "hungup queue\n");
127 056fe1ba 2003-11-23 devnull break;
128 056fe1ba 2003-11-23 devnull }
129 056fe1ba 2003-11-23 devnull r = nil;
130 056fe1ba 2003-11-23 devnull }
131 056fe1ba 2003-11-23 devnull
132 056fe1ba 2003-11-23 devnull fprint(2, "eof on %s\n", sc->dir);
133 056fe1ba 2003-11-23 devnull
134 056fe1ba 2003-11-23 devnull out:
135 056fe1ba 2003-11-23 devnull if(r){
136 056fe1ba 2003-11-23 devnull vtfcallclear(&r->tx);
137 056fe1ba 2003-11-23 devnull vtfree(r);
138 056fe1ba 2003-11-23 devnull }
139 056fe1ba 2003-11-23 devnull if(c)
140 056fe1ba 2003-11-23 devnull vtfreeconn(c);
141 056fe1ba 2003-11-23 devnull fprint(2, "freed %s\n", sc->dir);
142 056fe1ba 2003-11-23 devnull vtfree(sc);
143 056fe1ba 2003-11-23 devnull return;
144 056fe1ba 2003-11-23 devnull }
145 056fe1ba 2003-11-23 devnull
146 056fe1ba 2003-11-23 devnull VtReq*
147 056fe1ba 2003-11-23 devnull vtgetreq(VtSrv *srv)
148 056fe1ba 2003-11-23 devnull {
149 056fe1ba 2003-11-23 devnull return _vtqrecv(srv->q);
150 056fe1ba 2003-11-23 devnull }
151 056fe1ba 2003-11-23 devnull
152 056fe1ba 2003-11-23 devnull void
153 056fe1ba 2003-11-23 devnull vtrespond(VtReq *r)
154 056fe1ba 2003-11-23 devnull {
155 056fe1ba 2003-11-23 devnull Packet *p;
156 056fe1ba 2003-11-23 devnull VtSconn *sc;
157 056fe1ba 2003-11-23 devnull
158 056fe1ba 2003-11-23 devnull sc = r->sc;
159 056fe1ba 2003-11-23 devnull if(r->rx.tag != r->tx.tag)
160 056fe1ba 2003-11-23 devnull abort();
161 056fe1ba 2003-11-23 devnull if(r->rx.type != r->tx.type+1 && r->rx.type != VtRerror)
162 056fe1ba 2003-11-23 devnull abort();
163 056fe1ba 2003-11-23 devnull if((p = vtfcallpack(&r->rx)) == nil){
164 056fe1ba 2003-11-23 devnull fprint(2, "fcallpack on %s: %r\n", sc->dir);
165 056fe1ba 2003-11-23 devnull packetfree(p);
166 056fe1ba 2003-11-23 devnull vtfcallclear(&r->rx);
167 056fe1ba 2003-11-23 devnull return;
168 056fe1ba 2003-11-23 devnull }
169 056fe1ba 2003-11-23 devnull vtsend(sc->c, p);
170 056fe1ba 2003-11-23 devnull vtfcallclear(&r->tx);
171 056fe1ba 2003-11-23 devnull vtfcallclear(&r->rx);
172 056fe1ba 2003-11-23 devnull vtfree(r);
173 056fe1ba 2003-11-23 devnull }
174 056fe1ba 2003-11-23 devnull