Blame


1 551445b9 2004-04-21 devnull #include <u.h>
2 551445b9 2004-04-21 devnull #include <libc.h>
3 551445b9 2004-04-21 devnull #include <thread.h>
4 551445b9 2004-04-21 devnull #include <sunrpc.h>
5 551445b9 2004-04-21 devnull
6 551445b9 2004-04-21 devnull typedef struct Arg Arg;
7 551445b9 2004-04-21 devnull struct Arg
8 551445b9 2004-04-21 devnull {
9 551445b9 2004-04-21 devnull int fd;
10 551445b9 2004-04-21 devnull char adir[40];
11 551445b9 2004-04-21 devnull SunSrv *srv;
12 551445b9 2004-04-21 devnull };
13 551445b9 2004-04-21 devnull
14 551445b9 2004-04-21 devnull static void
15 551445b9 2004-04-21 devnull sunnetlisten(void *v)
16 551445b9 2004-04-21 devnull {
17 551445b9 2004-04-21 devnull int fd, lcfd;
18 551445b9 2004-04-21 devnull char ldir[40];
19 551445b9 2004-04-21 devnull Arg *a = v;
20 551445b9 2004-04-21 devnull
21 551445b9 2004-04-21 devnull for(;;){
22 551445b9 2004-04-21 devnull lcfd = listen(a->adir, ldir);
23 551445b9 2004-04-21 devnull if(lcfd < 0)
24 551445b9 2004-04-21 devnull break;
25 551445b9 2004-04-21 devnull fd = accept(lcfd, ldir);
26 551445b9 2004-04-21 devnull close(lcfd);
27 551445b9 2004-04-21 devnull if(fd < 0)
28 551445b9 2004-04-21 devnull continue;
29 551445b9 2004-04-21 devnull if(!sunsrvfd(a->srv, fd))
30 551445b9 2004-04-21 devnull close(fd);
31 551445b9 2004-04-21 devnull }
32 551445b9 2004-04-21 devnull free(a);
33 551445b9 2004-04-21 devnull close(a->fd);
34 551445b9 2004-04-21 devnull }
35 551445b9 2004-04-21 devnull
36 551445b9 2004-04-21 devnull int
37 551445b9 2004-04-21 devnull sunsrvnet(SunSrv *srv, char *addr)
38 551445b9 2004-04-21 devnull {
39 551445b9 2004-04-21 devnull Arg *a;
40 551445b9 2004-04-21 devnull
41 551445b9 2004-04-21 devnull a = emalloc(sizeof(Arg));
42 551445b9 2004-04-21 devnull if((a->fd = announce(addr, a->adir)) < 0)
43 551445b9 2004-04-21 devnull return -1;
44 551445b9 2004-04-21 devnull a->srv = srv;
45 551445b9 2004-04-21 devnull
46 551445b9 2004-04-21 devnull proccreate(sunnetlisten, a, SunStackSize);
47 551445b9 2004-04-21 devnull return 0;
48 551445b9 2004-04-21 devnull }
49 551445b9 2004-04-21 devnull
50 551445b9 2004-04-21 devnull int
51 551445b9 2004-04-21 devnull sunsrvannounce(SunSrv *srv, char *addr)
52 551445b9 2004-04-21 devnull {
53 551445b9 2004-04-21 devnull if(strstr(addr, "udp!"))
54 551445b9 2004-04-21 devnull return sunsrvudp(srv, addr);
55 551445b9 2004-04-21 devnull else
56 551445b9 2004-04-21 devnull return sunsrvnet(srv, addr);
57 551445b9 2004-04-21 devnull }