| #include <u.h> |
| #include <libc.h> |
| #include <ip.h> |
| #include <thread.h> |
| #include <sunrpc.h> |
| |
| typedef struct Arg Arg; |
| struct Arg |
| { |
| int fd; |
| char adir[40]; |
| SunSrv *srv; |
| }; |
| |
| static void |
| sunnetlisten(void *v) |
| { |
| int fd, lcfd; |
| char ldir[40]; |
| uchar ip[IPaddrlen]; |
| int port; |
| Arg *a = v; |
| NetConnInfo *nci; |
| |
| for(;;){ |
| lcfd = listen(a->adir, ldir); |
| if(lcfd < 0) |
| break; |
| fd = accept(lcfd, ldir); |
| close(lcfd); |
| if(fd < 0) |
| continue; |
| if(a->srv->ipokay){ |
| if((nci = getnetconninfo(nil, fd)) == nil){ |
| close(fd); |
| continue; |
| } |
| port = atoi(nci->rserv); |
| parseip(ip, nci->raddr); |
| freenetconninfo(nci); |
| if(!a->srv->ipokay(ip, port)){ |
| close(fd); |
| continue; |
| } |
| } |
| if(!sunsrvfd(a->srv, fd)) |
| close(fd); |
| } |
| free(a); |
| close(a->fd); |
| } |
| |
| int |
| sunsrvnet(SunSrv *srv, char *addr) |
| { |
| Arg *a; |
| |
| a = emalloc(sizeof(Arg)); |
| if((a->fd = announce(addr, a->adir)) < 0) |
| return -1; |
| a->srv = srv; |
| |
| proccreate(sunnetlisten, a, SunStackSize); |
| return 0; |
| } |
| |
| int |
| sunsrvannounce(SunSrv *srv, char *addr) |
| { |
| if(strstr(addr, "udp!")) |
| return sunsrvudp(srv, addr); |
| else |
| return sunsrvnet(srv, addr); |
| } |