#include #include #include #include #include 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); }