- if(ret < sizeof(iphdr) + sizeof(req))
- continue;
- memcpy(&iphdr, buf, sizeof(iphdr));
- memcpy(&req, buf + sizeof(iphdr), sizeof(req));
- if(iphdr.protocol != IPPROTO_ICMP)
- continue;
- if(req.type != ICMP_NAMEREQ)
- continue;
- rep.type = ICMP_NAMEREP;
- rep.code = 0;
- rep.id = req.id;
- rep.seq = req.seq;
- rep.ttl = htonl(ttl);
- memcpy(buf, &rep, sizeof(rep));
- datalen = filldn(buf + sizeof(rep));
+ for(i = 0; i < n; i++) {
+ if((pfd[i].revents & POLLIN) == 0)
+ continue;
+ cs = pfd[i].fd;
+ namelen = sizeof(name);
+ memset(&name, 0, sizeof(name));
+ ret = recvfrom(cs, buf, sizeof(buf), 0, (struct sockaddr *)&name, &namelen);
+ if(ret < 0) {
+ syslog(LOG_WARNING, "error while receiving datagram: %m");
+ continue;
+ }
+
+ if(cs == s4) {
+ if(ret < sizeof(iphdr) + sizeof(req))
+ continue;
+ hdrlen = sizeof(iphdr);
+ memcpy(&iphdr, buf, sizeof(iphdr));
+ if(iphdr.protocol != IPPROTO_ICMP)
+ continue;
+ } else if(cs == s6) {
+ if(ret < sizeof(req))
+ continue;
+ ((struct sockaddr_in6 *)&name)->sin6_port = 0;
+ hdrlen = 0;
+ } else {
+ syslog(LOG_CRIT, "strangeness!");
+ abort();
+ }
+ memcpy(&req, buf + hdrlen, sizeof(req));
+ if(req.type != ICMP_NAMEREQ)
+ continue;
+ rep.type = ICMP_NAMEREP;
+ rep.code = 0;
+ rep.id = req.id;
+ rep.seq = req.seq;
+ rep.ttl = htonl(ttl);
+ memcpy(buf, &rep, sizeof(rep));
+ datalen = filldn(buf + sizeof(rep));