]> git.lizzy.rs Git - plan9front.git/blob - sys/src/lib9p/listen.c
pc: replace duplicated and broken mmu flush code in vunmap()
[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(nctl, ndir);
48                 if(data < 0){
49                         fprint(2, "%s: accept %s: %r\n", argv0, ndir);
50                         close(nctl);
51                         continue;
52                 }
53                 close(nctl);
54
55                 s = emalloc9p(sizeof *s);
56                 *s = *os;
57                 s->addr = getremotesys(ndir);
58                 s->infd = s->outfd = data;
59                 s->fpool = nil;
60                 s->rpool = nil;
61                 s->rbuf = nil;
62                 s->wbuf = nil;
63                 s->free = srvfree;
64                 _forker(srvproc, s, 0);
65         }
66         free(os->addr);
67         free(os);
68 }
69
70 static void
71 srvproc(void *v)
72 {
73         srv((Srv*)v);
74 }
75
76 static void
77 srvfree(Srv *s)
78 {
79         close(s->infd);
80         free(s->addr);
81         free(s);
82 }
83
84 static char*
85 getremotesys(char *ndir)
86 {
87         char buf[128], *serv, *sys;
88         int fd, n;
89
90         snprint(buf, sizeof buf, "%s/remote", ndir);
91         sys = nil;
92         fd = open(buf, OREAD);
93         if(fd >= 0){
94                 n = read(fd, buf, sizeof(buf)-1);
95                 if(n>0){
96                         buf[n-1] = 0;
97                         serv = strchr(buf, '!');
98                         if(serv)
99                                 *serv = 0;
100                         sys = estrdup9p(buf);
101                 }
102                 close(fd);
103         }
104         if(sys == nil)
105                 sys = estrdup9p("unknown");
106         return sys;
107 }