static void dopoll(void) { int i; t_fdpoll *fp; fd_set readset, writeset, exceptset; FD_ZERO(&writeset); FD_ZERO(&readset); FD_ZERO(&exceptset); FD_SET(sockfd, &readset); if (protocol == SOCK_STREAM) { for (fp = fdpoll, i = nfdpoll; i--; fp++) FD_SET(fp->fdp_fd, &readset); } if (select(maxfd+1, &readset, &writeset, &exceptset, 0) < 0) { perror("select"); exit(1); } if (protocol == SOCK_STREAM) { for (i = 0; i < nfdpoll; i++) if (FD_ISSET(fdpoll[i].fdp_fd, &readset)) tcpread(&fdpoll[i]); if (FD_ISSET(sockfd, &readset)) doconnect(); } else { if (FD_ISSET(sockfd, &readset)) udpread(); } }
static void sunudpread(void *v) { int n, paraport, port; uchar *buf; Arg arg = *(Arg*)v; SunMsgUdp *msg; SunSrv *srv; Udphdr udp; uchar localip[IPaddrlen]; sendp(arg.csync, 0); srv = arg.srv; paraport = -1; /* 127.1 */ memmove(localip, v4prefix, IPaddrlen); localip[12] = 127; localip[15] = 1; buf = emalloc(UdpMaxRead); while((n = udpread(arg.fd, &udp, buf, UdpMaxRead)) > 0){ if(arg.srv->chatty) fprint(2, "udpread got %d (%d) from %I\n", n, Udphdrsize, udp.raddr); msg = emalloc(sizeof(SunMsgUdp)); msg->udp = udp; msg->msg.data = emalloc(n); msg->msg.count = n; memmove(msg->msg.data, buf, n); msg->msg.creply = arg.creply; msg->msg.srv = arg.srv; if(arg.srv->chatty) fprint(2, "message %p count %d\n", msg, msg->msg.count); if((srv->localonly || srv->localparanoia) && ipcmp(udp.raddr, localip) != 0){ fprint(2, "dropping message from %I: not local\n", udp.raddr); sunmsgreplyerror(&msg->msg, SunAuthTooWeak); continue; } if(srv->localparanoia){ port = nhgets(udp.rport); if(paraport == -1){ fprint(2, "paranoid mode: only %I/%d allowed\n", localip, port); paraport = port; }else if(paraport != port){ fprint(2, "dropping message from %I: not port %d\n", udp.raddr, port); sunmsgreplyerror(&msg->msg, SunAuthTooWeak); continue; } } if(srv->ipokay && !srv->ipokay(udp.raddr, nhgets(udp.rport))) msg->msg.rpc.status = SunProgUnavail; sendp(arg.srv->crequest, msg); } }