blob: a8b917e02360ebd27ffaf989e37394bf0355987e [file] [log] [blame]
#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);
}