Blame


1 551445b9 2004-04-21 devnull #include <u.h>
2 551445b9 2004-04-21 devnull #include <libc.h>
3 4c06b8ee 2005-05-19 devnull #include <ip.h>
4 551445b9 2004-04-21 devnull #include <thread.h>
5 551445b9 2004-04-21 devnull #include <sunrpc.h>
6 551445b9 2004-04-21 devnull
7 551445b9 2004-04-21 devnull typedef struct Arg Arg;
8 551445b9 2004-04-21 devnull struct Arg
9 551445b9 2004-04-21 devnull {
10 551445b9 2004-04-21 devnull int fd;
11 551445b9 2004-04-21 devnull char adir[40];
12 551445b9 2004-04-21 devnull SunSrv *srv;
13 551445b9 2004-04-21 devnull };
14 551445b9 2004-04-21 devnull
15 551445b9 2004-04-21 devnull static void
16 551445b9 2004-04-21 devnull sunnetlisten(void *v)
17 551445b9 2004-04-21 devnull {
18 551445b9 2004-04-21 devnull int fd, lcfd;
19 551445b9 2004-04-21 devnull char ldir[40];
20 4c06b8ee 2005-05-19 devnull uchar ip[IPaddrlen];
21 4c06b8ee 2005-05-19 devnull int port;
22 551445b9 2004-04-21 devnull Arg *a = v;
23 4c06b8ee 2005-05-19 devnull NetConnInfo *nci;
24 551445b9 2004-04-21 devnull
25 551445b9 2004-04-21 devnull for(;;){
26 551445b9 2004-04-21 devnull lcfd = listen(a->adir, ldir);
27 551445b9 2004-04-21 devnull if(lcfd < 0)
28 551445b9 2004-04-21 devnull break;
29 551445b9 2004-04-21 devnull fd = accept(lcfd, ldir);
30 551445b9 2004-04-21 devnull close(lcfd);
31 551445b9 2004-04-21 devnull if(fd < 0)
32 551445b9 2004-04-21 devnull continue;
33 4c06b8ee 2005-05-19 devnull if(a->srv->ipokay){
34 4c06b8ee 2005-05-19 devnull if((nci = getnetconninfo(nil, fd)) == nil){
35 4c06b8ee 2005-05-19 devnull close(fd);
36 4c06b8ee 2005-05-19 devnull continue;
37 4c06b8ee 2005-05-19 devnull }
38 4c06b8ee 2005-05-19 devnull port = atoi(nci->rserv);
39 4c06b8ee 2005-05-19 devnull parseip(ip, nci->raddr);
40 4c06b8ee 2005-05-19 devnull freenetconninfo(nci);
41 4c06b8ee 2005-05-19 devnull if(!a->srv->ipokay(ip, port)){
42 4c06b8ee 2005-05-19 devnull close(fd);
43 4c06b8ee 2005-05-19 devnull continue;
44 4c06b8ee 2005-05-19 devnull }
45 4c06b8ee 2005-05-19 devnull }
46 551445b9 2004-04-21 devnull if(!sunsrvfd(a->srv, fd))
47 551445b9 2004-04-21 devnull close(fd);
48 551445b9 2004-04-21 devnull }
49 551445b9 2004-04-21 devnull free(a);
50 551445b9 2004-04-21 devnull close(a->fd);
51 551445b9 2004-04-21 devnull }
52 551445b9 2004-04-21 devnull
53 551445b9 2004-04-21 devnull int
54 551445b9 2004-04-21 devnull sunsrvnet(SunSrv *srv, char *addr)
55 551445b9 2004-04-21 devnull {
56 551445b9 2004-04-21 devnull Arg *a;
57 551445b9 2004-04-21 devnull
58 551445b9 2004-04-21 devnull a = emalloc(sizeof(Arg));
59 551445b9 2004-04-21 devnull if((a->fd = announce(addr, a->adir)) < 0)
60 551445b9 2004-04-21 devnull return -1;
61 551445b9 2004-04-21 devnull a->srv = srv;
62 551445b9 2004-04-21 devnull
63 551445b9 2004-04-21 devnull proccreate(sunnetlisten, a, SunStackSize);
64 551445b9 2004-04-21 devnull return 0;
65 551445b9 2004-04-21 devnull }
66 551445b9 2004-04-21 devnull
67 551445b9 2004-04-21 devnull int
68 551445b9 2004-04-21 devnull sunsrvannounce(SunSrv *srv, char *addr)
69 551445b9 2004-04-21 devnull {
70 551445b9 2004-04-21 devnull if(strstr(addr, "udp!"))
71 551445b9 2004-04-21 devnull return sunsrvudp(srv, addr);
72 551445b9 2004-04-21 devnull else
73 551445b9 2004-04-21 devnull return sunsrvnet(srv, addr);
74 551445b9 2004-04-21 devnull }