Rather than simply assuming that the kernel supports
PACKET_AUXDATA, check to see if it is defined before trying
to use it.

Signed-off-by: Dan Moulding <[email protected]>
---
 networking/udhcp/dhcpc.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 7dfc160..052ad86 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -845,10 +845,13 @@ static NOINLINE int udhcp_recv_raw_packet(struct 
dhcp_packet *dhcp_pkt, int fd)
        int bytes;
        struct ip_udp_dhcp_packet packet;
        uint16_t check;
-       unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))];
        struct iovec iov;
        struct msghdr msg;
+
+#ifdef PACKET_AUXDATA
+       unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))];
        struct cmsghdr *cmsg;
+#endif
 
        /* used to use just safe_read(fd, &packet, sizeof(packet))
         * but we need to check for TP_STATUS_CSUMNOTREADY :(
@@ -858,8 +861,12 @@ static NOINLINE int udhcp_recv_raw_packet(struct 
dhcp_packet *dhcp_pkt, int fd)
        memset(&msg, 0, sizeof(msg));
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
+
+#ifdef PACKET_AUXDATA
        msg.msg_control = cmsgbuf;
        msg.msg_controllen = sizeof(cmsgbuf);
+#endif
+
        for (;;) {
                bytes = recvmsg(fd, &msg, 0);
                if (bytes < 0) {
@@ -906,6 +913,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct 
dhcp_packet *dhcp_pkt, int fd)
                return -2;
        }
 
+#ifdef PACKET_AUXDATA
        for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
                if (cmsg->cmsg_level == SOL_PACKET
                 && cmsg->cmsg_type == PACKET_AUXDATA
@@ -919,6 +927,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct 
dhcp_packet *dhcp_pkt, int fd)
                                goto skip_udp_sum_check;
                }
        }
+#endif
 
        /* verify UDP checksum. IP header has to be modified for this */
        memset(&packet.ip, 0, offsetof(struct iphdr, protocol));
@@ -930,7 +939,10 @@ static NOINLINE int udhcp_recv_raw_packet(struct 
dhcp_packet *dhcp_pkt, int fd)
                log1("Packet with bad UDP checksum received, ignoring");
                return -2;
        }
+
+#ifdef PACKET_AUXDATA
  skip_udp_sum_check:
+#endif
 
        if (packet.data.cookie != htonl(DHCP_MAGIC)) {
                bb_info_msg("Packet with bad magic, ignoring");
@@ -1043,12 +1055,14 @@ static int udhcp_raw_socket(int ifindex)
        }
 #endif
 
+#ifdef PACKET_AUXDATA
        if (setsockopt(fd, SOL_PACKET, PACKET_AUXDATA,
                        &const_int_1, sizeof(int)) < 0
        ) {
                if (errno != ENOPROTOOPT)
                        log1("Can't set PACKET_AUXDATA on raw socket");
        }
+#endif
 
        log1("Created raw socket");
 
-- 
1.8.2.1

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to