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 cbeb0b26 2006-04-01 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 be36ff68 2004-04-29 devnull int ref;
17 be36ff68 2004-04-29 devnull QLock lk;
18 056fe1ba 2003-11-23 devnull char dir[NETPATHLEN];
19 056fe1ba 2003-11-23 devnull VtSrv *srv;
20 056fe1ba 2003-11-23 devnull VtConn *c;
21 056fe1ba 2003-11-23 devnull };
22 056fe1ba 2003-11-23 devnull
23 056fe1ba 2003-11-23 devnull struct VtSrv
24 056fe1ba 2003-11-23 devnull {
25 056fe1ba 2003-11-23 devnull int afd;
26 056fe1ba 2003-11-23 devnull int dead;
27 056fe1ba 2003-11-23 devnull char adir[NETPATHLEN];
28 056fe1ba 2003-11-23 devnull Queue *q; /* Queue(VtReq*) */
29 056fe1ba 2003-11-23 devnull };
30 056fe1ba 2003-11-23 devnull
31 056fe1ba 2003-11-23 devnull static void listenproc(void*);
32 056fe1ba 2003-11-23 devnull static void connproc(void*);
33 056fe1ba 2003-11-23 devnull
34 18b18143 2005-02-13 devnull char *VtServerLog = "libventi/server";
35 18b18143 2005-02-13 devnull
36 be36ff68 2004-04-29 devnull static void
37 be36ff68 2004-04-29 devnull scincref(VtSconn *sc)
38 be36ff68 2004-04-29 devnull {
39 be36ff68 2004-04-29 devnull qlock(&sc->lk);
40 be36ff68 2004-04-29 devnull sc->ref++;
41 be36ff68 2004-04-29 devnull qunlock(&sc->lk);
42 be36ff68 2004-04-29 devnull }
43 be36ff68 2004-04-29 devnull
44 be36ff68 2004-04-29 devnull static void
45 be36ff68 2004-04-29 devnull scdecref(VtSconn *sc)
46 be36ff68 2004-04-29 devnull {
47 be36ff68 2004-04-29 devnull qlock(&sc->lk);
48 be36ff68 2004-04-29 devnull if(--sc->ref > 0){
49 be36ff68 2004-04-29 devnull qunlock(&sc->lk);
50 be36ff68 2004-04-29 devnull return;
51 be36ff68 2004-04-29 devnull }
52 be36ff68 2004-04-29 devnull if(sc->c)
53 be36ff68 2004-04-29 devnull vtfreeconn(sc->c);
54 be36ff68 2004-04-29 devnull vtfree(sc);
55 be36ff68 2004-04-29 devnull }
56 be36ff68 2004-04-29 devnull
57 056fe1ba 2003-11-23 devnull VtSrv*
58 056fe1ba 2003-11-23 devnull vtlisten(char *addr)
59 056fe1ba 2003-11-23 devnull {
60 056fe1ba 2003-11-23 devnull VtSrv *s;
61 056fe1ba 2003-11-23 devnull
62 056fe1ba 2003-11-23 devnull s = vtmallocz(sizeof(VtSrv));
63 056fe1ba 2003-11-23 devnull s->afd = announce(addr, s->adir);
64 056fe1ba 2003-11-23 devnull if(s->afd < 0){
65 056fe1ba 2003-11-23 devnull free(s);
66 056fe1ba 2003-11-23 devnull return nil;
67 056fe1ba 2003-11-23 devnull }
68 056fe1ba 2003-11-23 devnull s->q = _vtqalloc();
69 056fe1ba 2003-11-23 devnull proccreate(listenproc, s, STACK);
70 056fe1ba 2003-11-23 devnull return s;
71 056fe1ba 2003-11-23 devnull }
72 056fe1ba 2003-11-23 devnull
73 056fe1ba 2003-11-23 devnull static void
74 056fe1ba 2003-11-23 devnull listenproc(void *v)
75 056fe1ba 2003-11-23 devnull {
76 056fe1ba 2003-11-23 devnull int ctl;
77 056fe1ba 2003-11-23 devnull char dir[NETPATHLEN];
78 056fe1ba 2003-11-23 devnull VtSrv *srv;
79 056fe1ba 2003-11-23 devnull VtSconn *sc;
80 056fe1ba 2003-11-23 devnull
81 056fe1ba 2003-11-23 devnull srv = v;
82 056fe1ba 2003-11-23 devnull for(;;){
83 056fe1ba 2003-11-23 devnull ctl = listen(srv->adir, dir);
84 056fe1ba 2003-11-23 devnull if(ctl < 0){
85 056fe1ba 2003-11-23 devnull srv->dead = 1;
86 056fe1ba 2003-11-23 devnull break;
87 056fe1ba 2003-11-23 devnull }
88 056fe1ba 2003-11-23 devnull sc = vtmallocz(sizeof(VtSconn));
89 be36ff68 2004-04-29 devnull sc->ref = 1;
90 056fe1ba 2003-11-23 devnull sc->ctl = ctl;
91 056fe1ba 2003-11-23 devnull sc->srv = srv;
92 056fe1ba 2003-11-23 devnull strcpy(sc->dir, dir);
93 056fe1ba 2003-11-23 devnull proccreate(connproc, sc, STACK);
94 056fe1ba 2003-11-23 devnull }
95 056fe1ba 2003-11-23 devnull
96 cbeb0b26 2006-04-01 devnull /* hangup */
97 056fe1ba 2003-11-23 devnull }
98 056fe1ba 2003-11-23 devnull
99 056fe1ba 2003-11-23 devnull static void
100 056fe1ba 2003-11-23 devnull connproc(void *v)
101 056fe1ba 2003-11-23 devnull {
102 056fe1ba 2003-11-23 devnull VtSconn *sc;
103 056fe1ba 2003-11-23 devnull VtConn *c;
104 056fe1ba 2003-11-23 devnull Packet *p;
105 056fe1ba 2003-11-23 devnull VtReq *r;
106 056fe1ba 2003-11-23 devnull int fd;
107 a09e80f9 2004-05-23 devnull static int first=1;
108 056fe1ba 2003-11-23 devnull
109 8baa0cbd 2004-06-09 devnull if(first && chattyventi){
110 a09e80f9 2004-05-23 devnull first=0;
111 a09e80f9 2004-05-23 devnull fmtinstall('F', vtfcallfmt);
112 a09e80f9 2004-05-23 devnull }
113 056fe1ba 2003-11-23 devnull r = nil;
114 056fe1ba 2003-11-23 devnull sc = v;
115 be36ff68 2004-04-29 devnull sc->c = nil;
116 8baa0cbd 2004-06-09 devnull if(0) fprint(2, "new call %s on %d\n", sc->dir, sc->ctl);
117 056fe1ba 2003-11-23 devnull fd = accept(sc->ctl, sc->dir);
118 056fe1ba 2003-11-23 devnull close(sc->ctl);
119 056fe1ba 2003-11-23 devnull if(fd < 0){
120 056fe1ba 2003-11-23 devnull fprint(2, "accept %s: %r\n", sc->dir);
121 056fe1ba 2003-11-23 devnull goto out;
122 056fe1ba 2003-11-23 devnull }
123 056fe1ba 2003-11-23 devnull
124 056fe1ba 2003-11-23 devnull c = vtconn(fd, fd);
125 056fe1ba 2003-11-23 devnull sc->c = c;
126 056fe1ba 2003-11-23 devnull if(vtversion(c) < 0){
127 056fe1ba 2003-11-23 devnull fprint(2, "vtversion %s: %r\n", sc->dir);
128 056fe1ba 2003-11-23 devnull goto out;
129 056fe1ba 2003-11-23 devnull }
130 056fe1ba 2003-11-23 devnull if(vtsrvhello(c) < 0){
131 056fe1ba 2003-11-23 devnull fprint(2, "vtsrvhello %s: %r\n", sc->dir);
132 056fe1ba 2003-11-23 devnull goto out;
133 056fe1ba 2003-11-23 devnull }
134 056fe1ba 2003-11-23 devnull
135 8baa0cbd 2004-06-09 devnull if(0) fprint(2, "new proc %s\n", sc->dir);
136 056fe1ba 2003-11-23 devnull proccreate(vtsendproc, c, STACK);
137 056fe1ba 2003-11-23 devnull qlock(&c->lk);
138 056fe1ba 2003-11-23 devnull while(!c->writeq)
139 056fe1ba 2003-11-23 devnull rsleep(&c->rpcfork);
140 056fe1ba 2003-11-23 devnull qunlock(&c->lk);
141 056fe1ba 2003-11-23 devnull
142 056fe1ba 2003-11-23 devnull while((p = vtrecv(c)) != nil){
143 056fe1ba 2003-11-23 devnull r = vtmallocz(sizeof(VtReq));
144 056fe1ba 2003-11-23 devnull if(vtfcallunpack(&r->tx, p) < 0){
145 5ddc97fc 2005-02-14 devnull vtlog(VtServerLog, "<font size=-1>%T %s:</font> recv bad packet %p: %r<br>\n", c->addr, p);
146 056fe1ba 2003-11-23 devnull fprint(2, "bad packet on %s: %r\n", sc->dir);
147 18b18143 2005-02-13 devnull packetfree(p);
148 056fe1ba 2003-11-23 devnull continue;
149 056fe1ba 2003-11-23 devnull }
150 5ddc97fc 2005-02-14 devnull vtlog(VtServerLog, "<font size=-1>%T %s:</font> recv packet %p (%F)<br>\n", c->addr, p, &r->tx);
151 a09e80f9 2004-05-23 devnull if(chattyventi)
152 a09e80f9 2004-05-23 devnull fprint(2, "%s <- %F\n", argv0, &r->tx);
153 056fe1ba 2003-11-23 devnull packetfree(p);
154 7643b263 2005-07-13 devnull if(r->tx.msgtype == VtTgoodbye)
155 056fe1ba 2003-11-23 devnull break;
156 056fe1ba 2003-11-23 devnull r->rx.tag = r->tx.tag;
157 056fe1ba 2003-11-23 devnull r->sc = sc;
158 be36ff68 2004-04-29 devnull scincref(sc);
159 056fe1ba 2003-11-23 devnull if(_vtqsend(sc->srv->q, r) < 0){
160 be36ff68 2004-04-29 devnull scdecref(sc);
161 056fe1ba 2003-11-23 devnull fprint(2, "hungup queue\n");
162 056fe1ba 2003-11-23 devnull break;
163 056fe1ba 2003-11-23 devnull }
164 056fe1ba 2003-11-23 devnull r = nil;
165 056fe1ba 2003-11-23 devnull }
166 056fe1ba 2003-11-23 devnull
167 8baa0cbd 2004-06-09 devnull if(0) fprint(2, "eof on %s\n", sc->dir);
168 056fe1ba 2003-11-23 devnull
169 056fe1ba 2003-11-23 devnull out:
170 056fe1ba 2003-11-23 devnull if(r){
171 056fe1ba 2003-11-23 devnull vtfcallclear(&r->tx);
172 056fe1ba 2003-11-23 devnull vtfree(r);
173 056fe1ba 2003-11-23 devnull }
174 8baa0cbd 2004-06-09 devnull if(0) fprint(2, "freed %s\n", sc->dir);
175 be36ff68 2004-04-29 devnull scdecref(sc);
176 056fe1ba 2003-11-23 devnull return;
177 056fe1ba 2003-11-23 devnull }
178 056fe1ba 2003-11-23 devnull
179 056fe1ba 2003-11-23 devnull VtReq*
180 056fe1ba 2003-11-23 devnull vtgetreq(VtSrv *srv)
181 056fe1ba 2003-11-23 devnull {
182 18b18143 2005-02-13 devnull VtReq *r;
183 fa325e9b 2020-01-10 cross
184 18b18143 2005-02-13 devnull r = _vtqrecv(srv->q);
185 4ed8efea 2012-07-29 rsc if (r != nil)
186 4ed8efea 2012-07-29 rsc vtlog(VtServerLog, "<font size=-1>%T %s:</font> vtgetreq %F<br>\n", ((VtSconn*)r->sc)->c->addr, &r->tx);
187 18b18143 2005-02-13 devnull return r;
188 056fe1ba 2003-11-23 devnull }
189 056fe1ba 2003-11-23 devnull
190 056fe1ba 2003-11-23 devnull void
191 056fe1ba 2003-11-23 devnull vtrespond(VtReq *r)
192 056fe1ba 2003-11-23 devnull {
193 056fe1ba 2003-11-23 devnull Packet *p;
194 056fe1ba 2003-11-23 devnull VtSconn *sc;
195 056fe1ba 2003-11-23 devnull
196 056fe1ba 2003-11-23 devnull sc = r->sc;
197 056fe1ba 2003-11-23 devnull if(r->rx.tag != r->tx.tag)
198 056fe1ba 2003-11-23 devnull abort();
199 7643b263 2005-07-13 devnull if(r->rx.msgtype != r->tx.msgtype+1 && r->rx.msgtype != VtRerror)
200 056fe1ba 2003-11-23 devnull abort();
201 a09e80f9 2004-05-23 devnull if(chattyventi)
202 a09e80f9 2004-05-23 devnull fprint(2, "%s -> %F\n", argv0, &r->rx);
203 056fe1ba 2003-11-23 devnull if((p = vtfcallpack(&r->rx)) == nil){
204 5ddc97fc 2005-02-14 devnull vtlog(VtServerLog, "%s: vtfcallpack %F: %r<br>\n", sc->c->addr, &r->rx);
205 056fe1ba 2003-11-23 devnull fprint(2, "fcallpack on %s: %r\n", sc->dir);
206 056fe1ba 2003-11-23 devnull packetfree(p);
207 056fe1ba 2003-11-23 devnull vtfcallclear(&r->rx);
208 056fe1ba 2003-11-23 devnull return;
209 056fe1ba 2003-11-23 devnull }
210 5ddc97fc 2005-02-14 devnull vtlog(VtServerLog, "<font size=-1>%T %s:</font> send packet %p (%F)<br>\n", sc->c->addr, p, &r->rx);
211 2f4ba94e 2005-02-11 devnull if(vtsend(sc->c, p) < 0)
212 2f4ba94e 2005-02-11 devnull fprint(2, "vtsend %F: %r\n", &r->rx);
213 be36ff68 2004-04-29 devnull scdecref(sc);
214 056fe1ba 2003-11-23 devnull vtfcallclear(&r->tx);
215 056fe1ba 2003-11-23 devnull vtfcallclear(&r->rx);
216 056fe1ba 2003-11-23 devnull vtfree(r);
217 056fe1ba 2003-11-23 devnull }