xref: /plan9/sys/src/libsunrpc/net.c (revision fb7f0c934c48abaed6040d054ef636408c3c522d)
134e04225SDavid du Colombier #include <u.h>
234e04225SDavid du Colombier #include <libc.h>
334e04225SDavid du Colombier #include <thread.h>
434e04225SDavid du Colombier #include <sunrpc.h>
534e04225SDavid du Colombier 
634e04225SDavid du Colombier typedef struct Arg Arg;
734e04225SDavid du Colombier struct Arg
834e04225SDavid du Colombier {
934e04225SDavid du Colombier 	int fd;
1034e04225SDavid du Colombier 	char adir[40];
1134e04225SDavid du Colombier 	SunSrv *srv;
1234e04225SDavid du Colombier };
1334e04225SDavid du Colombier 
1434e04225SDavid du Colombier static void
sunNetListen(void * v)1534e04225SDavid du Colombier sunNetListen(void *v)
1634e04225SDavid du Colombier {
1734e04225SDavid du Colombier 	int fd, lcfd;
1834e04225SDavid du Colombier 	char ldir[40];
1934e04225SDavid du Colombier 	Arg *a = v;
2034e04225SDavid du Colombier 
2134e04225SDavid du Colombier 	for(;;){
2234e04225SDavid du Colombier 		lcfd = listen(a->adir, ldir);
2334e04225SDavid du Colombier 		if(lcfd < 0)
2434e04225SDavid du Colombier 			break;
2534e04225SDavid du Colombier 		fd = accept(lcfd, ldir);
2634e04225SDavid du Colombier 		close(lcfd);
2734e04225SDavid du Colombier 		if(fd < 0)
2834e04225SDavid du Colombier 			continue;
2934e04225SDavid du Colombier 		if(!sunSrvFd(a->srv, fd))
3034e04225SDavid du Colombier 			close(fd);
3134e04225SDavid du Colombier 	}
3234e04225SDavid du Colombier 	free(a);
3334e04225SDavid du Colombier 	close(a->fd);
3434e04225SDavid du Colombier }
3534e04225SDavid du Colombier 
3634e04225SDavid du Colombier int
sunSrvNet(SunSrv * srv,char * addr)3734e04225SDavid du Colombier sunSrvNet(SunSrv *srv, char *addr)
3834e04225SDavid du Colombier {
3934e04225SDavid du Colombier 	Arg *a;
4034e04225SDavid du Colombier 
4134e04225SDavid du Colombier 	a = emalloc(sizeof(Arg));
4234e04225SDavid du Colombier 	if((a->fd = announce(addr, a->adir)) < 0)
43*fb7f0c93SDavid du Colombier 		return -1;
4434e04225SDavid du Colombier 	a->srv = srv;
4534e04225SDavid du Colombier 
4634e04225SDavid du Colombier 	proccreate(sunNetListen, a, SunStackSize);
47*fb7f0c93SDavid du Colombier 	return 0;
4834e04225SDavid du Colombier }
4934e04225SDavid du Colombier 
5034e04225SDavid du Colombier int
sunSrvAnnounce(SunSrv * srv,char * addr)5134e04225SDavid du Colombier sunSrvAnnounce(SunSrv *srv, char *addr)
5234e04225SDavid du Colombier {
5334e04225SDavid du Colombier 	if(strstr(addr, "udp!"))
5434e04225SDavid du Colombier 		return sunSrvUdp(srv, addr);
5534e04225SDavid du Colombier 	else
5634e04225SDavid du Colombier 		return sunSrvNet(srv, addr);
5734e04225SDavid du Colombier }
58