From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/lib9p/listen.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100755 sys/src/lib9p/listen.c (limited to 'sys/src/lib9p/listen.c') diff --git a/sys/src/lib9p/listen.c b/sys/src/lib9p/listen.c new file mode 100755 index 000000000..547988472 --- /dev/null +++ b/sys/src/lib9p/listen.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include +#include <9p.h> + +static void listenproc(void*); +static void srvproc(void*); +static char *getremotesys(char*); + +void +_listensrv(Srv *os, char *addr) +{ + Srv *s; + + if(_forker == nil) + sysfatal("no forker"); + s = emalloc9p(sizeof *s); + *s = *os; + s->addr = estrdup9p(addr); + _forker(listenproc, s, 0); +} + +static void +listenproc(void *v) +{ + char ndir[NETPATHLEN], dir[NETPATHLEN]; + int ctl, data, nctl; + Srv *os, *s; + + os = v; + ctl = announce(os->addr, dir); + if(ctl < 0){ + fprint(2, "%s: announce %s: %r", argv0, os->addr); + return; + } + + for(;;){ + nctl = listen(dir, ndir); + if(nctl < 0){ + fprint(2, "%s: listen %s: %r", argv0, os->addr); + break; + } + + data = accept(ctl, ndir); + if(data < 0){ + fprint(2, "%s: accept %s: %r\n", argv0, ndir); + continue; + } + + s = emalloc9p(sizeof *s); + *s = *os; + s->addr = getremotesys(ndir); + s->infd = s->outfd = data; + s->fpool = nil; + s->rpool = nil; + s->rbuf = nil; + s->wbuf = nil; + _forker(srvproc, s, 0); + } + free(os->addr); + free(os); +} + +static void +srvproc(void *v) +{ + int data; + Srv *s; + + s = v; + data = s->infd; + srv(s); + close(data); + free(s->addr); + free(s); +} + +static char* +getremotesys(char *ndir) +{ + char buf[128], *serv, *sys; + int fd, n; + + snprint(buf, sizeof buf, "%s/remote", ndir); + sys = nil; + fd = open(buf, OREAD); + if(fd >= 0){ + n = read(fd, buf, sizeof(buf)-1); + if(n>0){ + buf[n-1] = 0; + serv = strchr(buf, '!'); + if(serv) + *serv = 0; + sys = estrdup9p(buf); + } + close(fd); + } + if(sys == nil) + sys = estrdup9p("unknown"); + return sys; +} -- cgit v1.2.3