- len = read(u->fd, buffer, sizeof(buffer));
- if (len < 1) {
- if (errno != EAGAIN)
- fprintf(stderr, "read failed: %s\n", strerror(errno));
+ iov[0].iov_base = buffer;
+ iov[0].iov_len = sizeof(buffer);
+
+ memset(&msg, 0, sizeof(msg));
+ msg.msg_name = (struct sockaddr *) &from;
+ msg.msg_namelen = (iface->v6) ? (sizeof(struct sockaddr_in6)) : (sizeof(struct sockaddr_in));
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = &cmsg6;
+ msg.msg_controllen = sizeof(cmsg6);
+
+ len = recvmsg(u->fd, &msg, flags);
+ if (len < 0) {
+ fprintf(stderr, "%s:%s[%d]\n", __FILE__, __func__, __LINE__);