7 typedef struct SunMsgUdp SunMsgUdp;
14 typedef struct Arg Arg;
25 UdpMaxRead = 65536+Udphdrsize
30 int n, paraport, port;
36 uchar localip[IPaddrlen];
43 memmove(localip, v4prefix, IPaddrlen);
47 buf = emalloc(UdpMaxRead);
48 while((n = udpread(arg.fd, &udp, buf, UdpMaxRead)) > 0){
50 fprint(2, "udpread got %d (%d) from %I\n", n, Udphdrsize, udp.raddr);
51 msg = emalloc(sizeof(SunMsgUdp));
53 msg->msg.data = emalloc(n);
55 memmove(msg->msg.data, buf, n);
56 msg->msg.creply = arg.creply;
57 msg->msg.srv = arg.srv;
59 fprint(2, "message %p count %d\n", msg, msg->msg.count);
60 if((srv->localonly || srv->localparanoia) && ipcmp(udp.raddr, localip) != 0){
61 fprint(2, "dropping message from %I: not local\n", udp.raddr);
62 sunmsgreplyerror(&msg->msg, SunAuthTooWeak);
65 if(srv->localparanoia){
66 port = nhgets(udp.rport);
68 fprint(2, "paranoid mode: only %I/%d allowed\n", localip, port);
70 }else if(paraport != port){
71 fprint(2, "dropping message from %I: not port %d\n", udp.raddr, port);
72 sunmsgreplyerror(&msg->msg, SunAuthTooWeak);
76 if(srv->ipokay && !srv->ipokay(udp.raddr, nhgets(udp.rport)))
77 msg->msg.rpc.status = SunProgUnavail;
78 sendp(arg.srv->crequest, msg);
91 buf = emalloc(UdpMaxRead);
92 while((msg = recvp(arg.creply)) != nil){
93 if(udpwrite(arg.fd, &msg->udp, msg->msg.data, msg->msg.count) != msg->msg.count)
94 fprint(2, "udpwrite: %r\n");
95 sunmsgdrop(&msg->msg);
100 sunsrvudp(SunSrv *srv, char *address)
106 fd = announce(address, adir);
110 arg = emalloc(sizeof(Arg));
113 arg->creply = chancreate(sizeof(SunMsg*), 10);
114 arg->csync = chancreate(sizeof(void*), 10);
116 proccreate(sunudpread, arg, SunStackSize);
117 proccreate(sunudpwrite, arg, SunStackSize);
120 chanfree(arg->csync);