diff options
author | Shawn Routhier <sar@isc.org> | 2012-02-10 00:07:06 +0000 |
---|---|---|
committer | Shawn Routhier <sar@isc.org> | 2012-02-10 00:07:06 +0000 |
commit | 865afd5e447e23e9af0b888c92a9e9ce6b38e7a8 (patch) | |
tree | c5ec191507c4a672da765cbf74f4b7af161c3a53 | |
parent | 87132514a04da01b8849444272373fb0d60211e1 (diff) | |
download | isc-dhcp-865afd5e447e23e9af0b888c92a9e9ce6b38e7a8.tar.gz |
Tidy up the receive calls and eliminate the need for found_pkt
[ISC-Bugs #25066]
-rw-r--r-- | RELNOTES | 3 | ||||
-rw-r--r-- | common/socket.c | 51 |
2 files changed, 27 insertions, 27 deletions
@@ -81,6 +81,9 @@ work on other platforms. Please report any problems and suggested fixes to from the DNS client code. [ISC-Bugs 26287]. +- Tidy up the receive calls and eliminate the need for found_pkt + [ISC-Bugs #25066] + Changes since 4.2.2 - Fix the code that checks for an existing DDNS transaction to cancel diff --git a/common/socket.c b/common/socket.c index a48404b0..fa771281 100644 --- a/common/socket.c +++ b/common/socket.c @@ -765,7 +765,7 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) struct sockaddr_in *from; struct hardware *hfrom; { -#if !defined(USE_V4_PKTINFO) +#if !(defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)) SOCKLEN_T flen = sizeof *from; #endif int result; @@ -788,7 +788,6 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) struct cmsghdr *cmsg; struct in_pktinfo *pktinfo; unsigned int ifindex; - int found_pktinfo; /* * If necessary allocate space for the control message header. @@ -831,7 +830,7 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) * We set up some space for a "control message". We have * previously asked the kernel to give us packet * information (when we initialized the interface), so we - * should get the destination address from that. + * should get the interface index from that. */ m.msg_control = control_buf; m.msg_controllen = control_buf_len; @@ -842,12 +841,8 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) /* * If we did read successfully, then we need to loop * through the control messages we received and - * find the one with our destination address. - * - * We also keep a flag to see if we found it. If we - * didn't, then we consider this to be an error. + * find the one with our inteface index. */ - found_pktinfo = 0; cmsg = CMSG_FIRSTHDR(&m); while (cmsg != NULL) { if ((cmsg->cmsg_level == IPPROTO_IP) && @@ -861,18 +856,21 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) * the discover code. */ memcpy(hfrom->hbuf, &ifindex, sizeof(ifindex)); - found_pktinfo = 1; + return (result); } cmsg = CMSG_NXTHDR(&m, cmsg); } - if (!found_pktinfo) { - result = -1; - errno = EIO; - } + + /* + * We didn't find the necessary control message + * flag it as an error + */ + result = -1; + errno = EIO; } #else - result = recvfrom (interface -> rfdesc, (char *)buf, len, 0, - (struct sockaddr *)from, &flen); + result = recvfrom(interface -> rfdesc, (char *)buf, len, 0, + (struct sockaddr *)from, &flen); #endif /* IP_PKTINFO ... */ #ifdef IGNORE_HOSTUNREACH } while (result < 0 && @@ -880,7 +878,7 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) errno == ECONNREFUSED) && retry++ < 10); #endif - return result; + return (result); } #endif /* USE_SOCKET_RECEIVE */ @@ -897,7 +895,6 @@ receive_packet6(struct interface_info *interface, int result; struct cmsghdr *cmsg; struct in6_pktinfo *pktinfo; - int found_pktinfo; /* * If necessary allocate space for the control message header. @@ -952,11 +949,7 @@ receive_packet6(struct interface_info *interface, * If we did read successfully, then we need to loop * through the control messages we received and * find the one with our destination address. - * - * We also keep a flag to see if we found it. If we - * didn't, then we consider this to be an error. */ - found_pktinfo = 0; cmsg = CMSG_FIRSTHDR(&m); while (cmsg != NULL) { if ((cmsg->cmsg_level == IPPROTO_IPV6) && @@ -964,17 +957,21 @@ receive_packet6(struct interface_info *interface, pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); *to_addr = pktinfo->ipi6_addr; *if_idx = pktinfo->ipi6_ifindex; - found_pktinfo = 1; + + return (result); } cmsg = CMSG_NXTHDR(&m, cmsg); } - if (!found_pktinfo) { - result = -1; - errno = EIO; - } + + /* + * We didn't find the necessary control message + * flag is as an error + */ + result = -1; + errno = EIO; } - return result; + return (result); } #endif /* DHCPv6 */ |