+ for(i = 0; i < n; i++) {
+ if((pfd[i].revents & POLLIN) == 0)
+ continue;
+ cs = pfd[i].fd;
+ memset(&name, 0, sizeof(name));
+
+ iov.iov_len = sizeof(buf);
+ iov.iov_base = buf;
+ mhdr.msg_name = &name;
+ mhdr.msg_namelen = sizeof(name);
+ mhdr.msg_iov = &iov;
+ mhdr.msg_iovlen = 1;
+ mhdr.msg_control = cmsgbuf;
+ mhdr.msg_controllen = sizeof(cmsgbuf);
+
+ ret = recvmsg(cs, &mhdr, 0);
+ 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;
+ mhdr.msg_control = NULL;
+ mhdr.msg_controllen = 0;
+ } else if(cs == s6) {
+ if(ret < sizeof(req))
+ continue;
+ ((struct sockaddr_in6 *)&name)->sin6_port = 0;
+ hdrlen = 0;
+ /* Just keep mhdr.msg_control. */
+ } 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));