3 #include <fcall.h> /* 9p2000 */
8 Nqueue = 200, /* queue size (tunable) */
9 Nsrvo = 8, /* number of write workers */
12 typedef struct Srv Srv;
30 chanhangup(Chan *chan, char *msg, int dolock)
38 if(chan->type != Devsrv)
41 if(srv == nil || srv->chan != chan)
56 print("%s closed\n", srv->name);
58 chanhangup(srv->chan, "", 0);
59 memset(srv->buf, 0, sizeof(srv->buf));
62 srv->chan = freechans.hd;
75 mb = fs_recv(srvoq, 0);
79 if(!(mb->flags & FREE))
83 srv = (Srv*)mb->param;
84 while((srv->fd >= 0) && (write(srv->fd, mb->data, mb->count) != mb->count)){
85 rerrstr(buf, sizeof(buf));
86 if(strstr(buf, "interrupt"))
90 print("srvo %s: %s\n", srv->name, buf);
91 chanhangup(srv->chan, buf, 0);
108 if((mb = mballoc(IOHDRSZ+Maxfdata, srv->chan, Mbeth1)) == nil)
109 panic("srvi %s: mballoc failed", srv->name);
115 while((srv->fd >= 0) && ((n = read(srv->fd, p, e - p)) >= 0)){
117 while((p - b) >= BIT32SZ){
119 if((m < BIT32SZ) || (m > mb->count)){
120 werrstr("bad length in 9P2000 message header");
123 if((n = (p - b) - m) < 0){
128 if((ms = mballoc(m, srv->chan, Mbeth1)) == nil)
129 panic("srvi %s: mballoc failed", srv->name);
130 memmove(ms->data, b, m);
133 if((mb = mballoc(mb->count, srv->chan, Mbeth1)) == nil)
134 panic("srvi %s: mballoc failed", srv->name);
138 memmove(mb->data, b + m, n);
143 ms->param = (uint)srv;
150 rerrstr(buf, sizeof(buf));
151 if(strstr(buf, "interrupt"))
155 print("srvi %s: %s\n", srv->name, buf);
156 chanhangup(srv->chan, buf, 0);
163 srvchan(int fd, char *name)
169 if(chan = freechans.hd){
171 freechans.hd = srv->chan;
175 chan = fs_chaninit(Devsrv, 1, sizeof(*srv));
179 if(chan->send == nil)
181 chan->protocol = nil;
188 snprint(srv->buf, sizeof(srv->buf), "srvi %s", name);
189 srv->name = strchr(srv->buf, ' ')+1;
190 newproc(srvi, srv, srv->buf);
203 srvoq = newqueue(Nqueue, "srvoq");
204 for(i=0; i<Nsrvo; i++)
205 newproc(srvo, nil, "srvo");