3 #include <fcall.h> /* 9p2000 */
7 Nqueue = 100, /* reply queue size per connection (tunable) */
8 Nchans = 30, /* maximum number of connections */
11 typedef struct Srv Srv;
25 chanhangup(Chan *chan, char *msg)
33 if(chan == cons.chan || srv == nil || srv->chan != chan)
36 fprint(2, "hangup %s: %s\n", chan->whochan, msg);
37 if(fd2path(srv->fd, buf, sizeof(buf)) == 0){
38 if(p = strrchr(buf, '/')){
39 strecpy(p, buf+sizeof(buf), "/ctl");
40 if((cfd = open(buf, OWRITE)) >= 0){
41 write(cfd, "hangup", 6);
61 fprint(2, "%s closed\n", chan->whochan);
63 srv->chan = freechans.hd;
78 mb = fs_recv(chan->reply, 0);
82 if(!(mb->flags & FREE))
87 while(write(srv->fd, mb->data, mb->count) != mb->count){
88 rerrstr(buf, sizeof(buf));
89 if(strstr(buf, "interrupt"))
91 chanhangup(chan, buf);
113 if((mb = mballoc(IOHDRSZ+MAXDAT, chan, Mbeth1)) == nil)
114 panic("srvi: mballoc failed");
120 while((n = read(srv->fd, p, e - p)) > 0){
122 while((p - b) >= BIT32SZ){
124 if((m < BIT32SZ) || (m > mb->count)){
125 strcpy(err, "bad length in 9P2000 message header");
128 if((n = (p - b) - m) < 0){
133 if((ms = mballoc(m, chan, Mbeth1)) == nil)
134 panic("srvi: mballoc failed");
135 memmove(ms->data, b, m);
138 if((mb = mballoc(mb->count, chan, Mbeth1)) == nil)
139 panic("srvi: mballoc failed");
143 memmove(mb->data, b + m, n);
148 fs_send(chan->send, ms);
154 errstr(err, sizeof(err));
157 chanhangup(chan, err);
164 srvchan(int fd, char *name)
177 freechans.hd = srv->chan;
180 chan->protocol = nil;
183 snprint(chan->whochan, sizeof(chan->whochan), "%s", name);
190 if(chan->reply == nil){
191 chan->reply = newqueue(Nqueue, "srvoq");
192 newproc(srvo, chan, "srvo");
195 if(chan->send == nil)
197 snprint(buf, sizeof(buf), "srvi %s", name);
198 newproc(srvi, chan, buf);
210 if(freechans.hd != nil)
212 for(i=0; i<Nchans; i++){
213 chan = fs_chaninit(1, sizeof(Srv));
216 srv->chan = freechans.hd;