for (cmsg = CMSG_FIRSTHDR(&msg); cmsg && CMSG_OK(&msg, cmsg);
cmsg = CMSG_NXTHDR(&msg, cmsg)) {
- if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
- break;
- }
- if (!cmsg)
- return 0;
- err = CMSG_DATA(cmsg);
- offender = SO_EE_OFFENDER(err);
-
- if (offender->sa_family != AF_INET)
- return 1;
+ if (cmsg->cmsg_level != SOL_IP || cmsg->cmsg_type != IP_RECVERR) {
+ continue;
+ }
- memcpy(&addr, offender, sizeof(addr));
+ err = CMSG_DATA(cmsg);
+ offender = SO_EE_OFFENDER(err);
- rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
+ if (offender->sa_family != AF_INET) {
+ continue;
+ }
+
+ memcpy(&addr, offender, sizeof(addr));
+ rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
+ }
return 1;
}
int
rxi_HandleSocketError(int socket)
{
- int ret = 0;
struct msghdr msg;
struct cmsghdr *cmsg;
struct sock_extended_err *err;
code = recvmsg(socket, &msg, MSG_ERRQUEUE|MSG_DONTWAIT|MSG_TRUNC);
if (code < 0 || !(msg.msg_flags & MSG_ERRQUEUE))
- goto out;
+ return 0;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
- if ((char *)cmsg - controlmsgbuf > msg.msg_controllen - CMSG_SPACE(0) ||
- (char *)cmsg - controlmsgbuf > msg.msg_controllen - CMSG_SPACE(cmsg->cmsg_len) ||
- cmsg->cmsg_len == 0) {
- cmsg = 0;
- break;
+ if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR) {
+ err = (struct sock_extended_err *)CMSG_DATA(cmsg);
+ rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
}
- if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
- break;
}
- if (!cmsg)
- goto out;
- ret = 1;
- err = (struct sock_extended_err *) CMSG_DATA(cmsg);
- rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
-
-out:
- return ret;
+ return 1;
}
#endif