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