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