mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
74 lines
1.1 KiB
C
74 lines
1.1 KiB
C
#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);
|
|
}
|