]> git.lizzy.rs Git - plan9front.git/blob - sys/src/lib9p/listen.c
pc/pc64: reset DR7 in mmurelease
[plan9front.git] / sys / src / lib9p / listen.c
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <fcall.h>
5 #include <thread.h>
6 #include <9p.h>
7
8 static void listenproc(void*);
9 static void srvproc(void*);
10 static void srvfree(Srv *);
11 static char *getremotesys(char*);
12
13 void
14 _listensrv(Srv *os, char *addr)
15 {
16         Srv *s;
17
18         if(_forker == nil)
19                 sysfatal("no forker");
20         s = emalloc9p(sizeof *s);
21         *s = *os;
22         s->addr = estrdup9p(addr);
23         _forker(listenproc, s, 0);
24 }
25
26 static void
27 listenproc(void *v)
28 {
29         char ndir[NETPATHLEN], dir[NETPATHLEN];
30         int ctl, data, nctl;
31         Srv *os, *s;
32         
33         os = v;
34         ctl = announce(os->addr, dir);
35         if(ctl < 0){
36                 fprint(2, "%s: announce %s: %r", argv0, os->addr);
37                 return;
38         }
39
40         for(;;){
41                 nctl = listen(dir, ndir);
42                 if(nctl < 0){
43                         fprint(2, "%s: listen %s: %r", argv0, os->addr);
44                         break;
45                 }
46                 
47                 data = accept(ctl, ndir);
48                 if(data < 0){
49                         fprint(2, "%s: accept %s: %r\n", argv0, ndir);
50                         continue;
51                 }
52
53                 s = emalloc9p(sizeof *s);
54                 *s = *os;
55                 s->addr = getremotesys(ndir);
56                 s->infd = s->outfd = data;
57                 s->fpool = nil;
58                 s->rpool = nil;
59                 s->rbuf = nil;
60                 s->wbuf = nil;
61                 s->free = srvfree;
62                 _forker(srvproc, s, 0);
63         }
64         free(os->addr);
65         free(os);
66 }
67
68 static void
69 srvproc(void *v)
70 {
71         srv((Srv*)v);
72 }
73
74 static void
75 srvfree(Srv *s)
76 {
77         close(s->infd);
78         free(s->addr);
79         free(s);
80 }
81
82 static char*
83 getremotesys(char *ndir)
84 {
85         char buf[128], *serv, *sys;
86         int fd, n;
87
88         snprint(buf, sizeof buf, "%s/remote", ndir);
89         sys = nil;
90         fd = open(buf, OREAD);
91         if(fd >= 0){
92                 n = read(fd, buf, sizeof(buf)-1);
93                 if(n>0){
94                         buf[n-1] = 0;
95                         serv = strchr(buf, '!');
96                         if(serv)
97                                 *serv = 0;
98                         sys = estrdup9p(buf);
99                 }
100                 close(fd);
101         }
102         if(sys == nil)
103                 sys = estrdup9p("unknown");
104         return sys;
105 }