diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/libsunrpc/net.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libsunrpc/net.c')
-rwxr-xr-x | sys/src/libsunrpc/net.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/sys/src/libsunrpc/net.c b/sys/src/libsunrpc/net.c new file mode 100755 index 000000000..3060e2125 --- /dev/null +++ b/sys/src/libsunrpc/net.c @@ -0,0 +1,57 @@ +#include <u.h> +#include <libc.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]; + Arg *a = v; + + for(;;){ + lcfd = listen(a->adir, ldir); + if(lcfd < 0) + break; + fd = accept(lcfd, ldir); + close(lcfd); + if(fd < 0) + 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); +} |