From dd169e84683aa7be3604d491f1c34ab657973365 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 20 Jan 2011 12:13:23 +0100 Subject: [PATCH] eliminate aliasing warnings in traceroute.c and udhcp/socket.c Signed-off-by: Denys Vlasenko --- networking/traceroute.c | 3 ++- networking/udhcp/socket.c | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/networking/traceroute.c b/networking/traceroute.c index c18fba8d0..82bb0118c 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c @@ -751,7 +751,8 @@ print(int read_len, const struct sockaddr *from, const struct sockaddr *to) } else #endif { - read_len -= ((struct ip*)recv_pkt)->ip_hl << 2; + struct ip *ip4packet = (struct ip*)recv_pkt; + read_len -= ip4packet->ip_hl << 2; } printf(" %d bytes to %s", read_len, ina); free(ina); diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c index 0ed7ad1c6..39f1cec54 100644 --- a/networking/udhcp/socket.c +++ b/networking/udhcp/socket.c @@ -36,42 +36,45 @@ int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) { + /* char buffer instead of bona-fide struct avoids aliasing warning */ + char ifr_buf[sizeof(struct ifreq)]; + struct ifreq *const ifr = (void *)ifr_buf; + int fd; - struct ifreq ifr; struct sockaddr_in *our_ip; - memset(&ifr, 0, sizeof(ifr)); + memset(ifr, 0, sizeof(*ifr)); fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); - ifr.ifr_addr.sa_family = AF_INET; - strncpy_IFNAMSIZ(ifr.ifr_name, interface); + ifr->ifr_addr.sa_family = AF_INET; + strncpy_IFNAMSIZ(ifr->ifr_name, interface); if (nip) { - if (ioctl_or_perror(fd, SIOCGIFADDR, &ifr, + if (ioctl_or_perror(fd, SIOCGIFADDR, ifr, "is interface %s up and configured?", interface) ) { close(fd); return -1; } - our_ip = (struct sockaddr_in *) &ifr.ifr_addr; + our_ip = (struct sockaddr_in *) &ifr->ifr_addr; *nip = our_ip->sin_addr.s_addr; log1("IP %s", inet_ntoa(our_ip->sin_addr)); } if (ifindex) { - if (ioctl_or_warn(fd, SIOCGIFINDEX, &ifr) != 0) { + if (ioctl_or_warn(fd, SIOCGIFINDEX, ifr) != 0) { close(fd); return -1; } - log1("Adapter index %d", ifr.ifr_ifindex); - *ifindex = ifr.ifr_ifindex; + log1("Adapter index %d", ifr->ifr_ifindex); + *ifindex = ifr->ifr_ifindex; } if (mac) { - if (ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr) != 0) { + if (ioctl_or_warn(fd, SIOCGIFHWADDR, ifr) != 0) { close(fd); return -1; } - memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); + memcpy(mac, ifr->ifr_hwaddr.sa_data, 6); log1("MAC %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); }