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