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 <ip.h>
4 551445b9 2004-04-21 devnull #include <thread.h>
5 551445b9 2004-04-21 devnull #include <sunrpc.h>
6 551445b9 2004-04-21 devnull
7 551445b9 2004-04-21 devnull typedef struct SunMsgUdp SunMsgUdp;
8 551445b9 2004-04-21 devnull struct SunMsgUdp
9 551445b9 2004-04-21 devnull {
10 551445b9 2004-04-21 devnull SunMsg msg;
11 551445b9 2004-04-21 devnull Udphdr udp;
12 551445b9 2004-04-21 devnull };
13 551445b9 2004-04-21 devnull
14 551445b9 2004-04-21 devnull typedef struct Arg Arg;
15 551445b9 2004-04-21 devnull struct Arg
16 551445b9 2004-04-21 devnull {
17 551445b9 2004-04-21 devnull SunSrv *srv;
18 551445b9 2004-04-21 devnull Channel *creply;
19 551445b9 2004-04-21 devnull Channel *csync;
20 551445b9 2004-04-21 devnull int fd;
21 551445b9 2004-04-21 devnull };
22 551445b9 2004-04-21 devnull
23 551445b9 2004-04-21 devnull enum
24 551445b9 2004-04-21 devnull {
25 551445b9 2004-04-21 devnull UdpMaxRead = 65536+Udphdrsize
26 551445b9 2004-04-21 devnull };
27 551445b9 2004-04-21 devnull static void
28 551445b9 2004-04-21 devnull sunudpread(void *v)
29 551445b9 2004-04-21 devnull {
30 551445b9 2004-04-21 devnull int n, paraport, port;
31 551445b9 2004-04-21 devnull uchar *buf;
32 551445b9 2004-04-21 devnull Arg arg = *(Arg*)v;
33 551445b9 2004-04-21 devnull SunMsgUdp *msg;
34 551445b9 2004-04-21 devnull SunSrv *srv;
35 551445b9 2004-04-21 devnull Udphdr udp;
36 551445b9 2004-04-21 devnull uchar localip[IPaddrlen];
37 551445b9 2004-04-21 devnull
38 551445b9 2004-04-21 devnull sendp(arg.csync, 0);
39 551445b9 2004-04-21 devnull srv = arg.srv;
40 551445b9 2004-04-21 devnull paraport = -1;
41 551445b9 2004-04-21 devnull
42 551445b9 2004-04-21 devnull /* 127.1 */
43 551445b9 2004-04-21 devnull memmove(localip, v4prefix, IPaddrlen);
44 551445b9 2004-04-21 devnull localip[12] = 127;
45 551445b9 2004-04-21 devnull localip[15] = 1;
46 551445b9 2004-04-21 devnull
47 551445b9 2004-04-21 devnull buf = emalloc(UdpMaxRead);
48 551445b9 2004-04-21 devnull while((n = udpread(arg.fd, &udp, buf, UdpMaxRead)) > 0){
49 551445b9 2004-04-21 devnull if(arg.srv->chatty)
50 551445b9 2004-04-21 devnull fprint(2, "udpread got %d (%d) from %I\n", n, Udphdrsize, udp.raddr);
51 4c06b8ee 2005-05-19 devnull msg = emalloc(sizeof(SunMsgUdp));
52 4c06b8ee 2005-05-19 devnull msg->udp = udp;
53 4c06b8ee 2005-05-19 devnull msg->msg.data = emalloc(n);
54 4c06b8ee 2005-05-19 devnull msg->msg.count = n;
55 4c06b8ee 2005-05-19 devnull memmove(msg->msg.data, buf, n);
56 4c06b8ee 2005-05-19 devnull msg->msg.creply = arg.creply;
57 4c06b8ee 2005-05-19 devnull msg->msg.srv = arg.srv;
58 4c06b8ee 2005-05-19 devnull if(arg.srv->chatty)
59 4c06b8ee 2005-05-19 devnull fprint(2, "message %p count %d\n", msg, msg->msg.count);
60 551445b9 2004-04-21 devnull if((srv->localonly || srv->localparanoia) && ipcmp(udp.raddr, localip) != 0){
61 551445b9 2004-04-21 devnull fprint(2, "dropping message from %I: not local\n", udp.raddr);
62 4c06b8ee 2005-05-19 devnull sunmsgreplyerror(&msg->msg, SunAuthTooWeak);
63 551445b9 2004-04-21 devnull continue;
64 551445b9 2004-04-21 devnull }
65 551445b9 2004-04-21 devnull if(srv->localparanoia){
66 551445b9 2004-04-21 devnull port = nhgets(udp.rport);
67 551445b9 2004-04-21 devnull if(paraport == -1){
68 551445b9 2004-04-21 devnull fprint(2, "paranoid mode: only %I/%d allowed\n", localip, port);
69 551445b9 2004-04-21 devnull paraport = port;
70 551445b9 2004-04-21 devnull }else if(paraport != port){
71 551445b9 2004-04-21 devnull fprint(2, "dropping message from %I: not port %d\n", udp.raddr, port);
72 4c06b8ee 2005-05-19 devnull sunmsgreplyerror(&msg->msg, SunAuthTooWeak);
73 551445b9 2004-04-21 devnull continue;
74 551445b9 2004-04-21 devnull }
75 551445b9 2004-04-21 devnull }
76 4c06b8ee 2005-05-19 devnull if(srv->ipokay && !srv->ipokay(udp.raddr, nhgets(udp.rport)))
77 4c06b8ee 2005-05-19 devnull msg->msg.rpc.status = SunProgUnavail;
78 551445b9 2004-04-21 devnull sendp(arg.srv->crequest, msg);
79 551445b9 2004-04-21 devnull }
80 551445b9 2004-04-21 devnull }
81 551445b9 2004-04-21 devnull
82 551445b9 2004-04-21 devnull static void
83 551445b9 2004-04-21 devnull sunudpwrite(void *v)
84 551445b9 2004-04-21 devnull {
85 551445b9 2004-04-21 devnull Arg arg = *(Arg*)v;
86 551445b9 2004-04-21 devnull SunMsgUdp *msg;
87 551445b9 2004-04-21 devnull
88 551445b9 2004-04-21 devnull sendp(arg.csync, 0);
89 551445b9 2004-04-21 devnull
90 551445b9 2004-04-21 devnull while((msg = recvp(arg.creply)) != nil){
91 551445b9 2004-04-21 devnull if(udpwrite(arg.fd, &msg->udp, msg->msg.data, msg->msg.count) != msg->msg.count)
92 551445b9 2004-04-21 devnull fprint(2, "udpwrite: %r\n");
93 5d3be932 2007-04-24 devnull sunmsgdrop(&msg->msg);
94 551445b9 2004-04-21 devnull }
95 551445b9 2004-04-21 devnull }
96 551445b9 2004-04-21 devnull
97 551445b9 2004-04-21 devnull int
98 551445b9 2004-04-21 devnull sunsrvudp(SunSrv *srv, char *address)
99 551445b9 2004-04-21 devnull {
100 551445b9 2004-04-21 devnull int fd;
101 551445b9 2004-04-21 devnull char adir[40];
102 551445b9 2004-04-21 devnull Arg *arg;
103 551445b9 2004-04-21 devnull
104 551445b9 2004-04-21 devnull fd = announce(address, adir);
105 551445b9 2004-04-21 devnull if(fd < 0)
106 551445b9 2004-04-21 devnull return -1;
107 551445b9 2004-04-21 devnull
108 551445b9 2004-04-21 devnull arg = emalloc(sizeof(Arg));
109 551445b9 2004-04-21 devnull arg->fd = fd;
110 551445b9 2004-04-21 devnull arg->srv = srv;
111 551445b9 2004-04-21 devnull arg->creply = chancreate(sizeof(SunMsg*), 10);
112 551445b9 2004-04-21 devnull arg->csync = chancreate(sizeof(void*), 10);
113 551445b9 2004-04-21 devnull
114 551445b9 2004-04-21 devnull proccreate(sunudpread, arg, SunStackSize);
115 551445b9 2004-04-21 devnull proccreate(sunudpwrite, arg, SunStackSize);
116 551445b9 2004-04-21 devnull recvp(arg->csync);
117 551445b9 2004-04-21 devnull recvp(arg->csync);
118 551445b9 2004-04-21 devnull chanfree(arg->csync);
119 551445b9 2004-04-21 devnull free(arg);
120 551445b9 2004-04-21 devnull
121 551445b9 2004-04-21 devnull return 0;
122 551445b9 2004-04-21 devnull }