diff options
-rw-r--r-- | include/libbb.h | 2 | ||||
-rw-r--r-- | networking/ifconfig.c | 53 | ||||
-rw-r--r-- | networking/traceroute.c | 2 |
3 files changed, 28 insertions, 29 deletions
diff --git a/include/libbb.h b/include/libbb.h index 742d04031..d22efe05b 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -344,7 +344,7 @@ char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa, socklen_t sale char* xmalloc_sockaddr2dotted(const struct sockaddr *sa, socklen_t salen); char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa, socklen_t salen); // "old" (ipv4 only) API -// users: traceroute.c hostname.c ifconfig.c ping.c +// users: traceroute.c hostname.c struct hostent *xgethostbyname(const char *name); diff --git a/networking/ifconfig.c b/networking/ifconfig.c index b36f86d6a..f4fc0a476 100644 --- a/networking/ifconfig.c +++ b/networking/ifconfig.c @@ -266,9 +266,6 @@ int ifconfig_main(int argc, char **argv) { struct ifreq ifr; struct sockaddr_in sai; -#if ENABLE_FEATURE_IPV6 - struct sockaddr_in6 sai6; -#endif #if ENABLE_FEATURE_IFCONFIG_HW struct sockaddr sa; #endif @@ -389,31 +386,33 @@ int ifconfig_main(int argc, char **argv) sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask); } #endif + else { + len_and_sockaddr *lsa = xhost2sockaddr(host, 0); #if ENABLE_FEATURE_IPV6 - else if (inet_pton(AF_INET6, host, &sai6.sin6_addr) > 0) { - int sockfd6; - struct in6_ifreq ifr6; - - memcpy((char *) &ifr6.ifr6_addr, - (char *) &sai6.sin6_addr, - sizeof(struct in6_addr)); - - /* Create a channel to the NET kernel. */ - sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0); - if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0) - bb_perror_msg_and_die("SIOGIFINDEX"); - ifr6.ifr6_ifindex = ifr.ifr_ifindex; - ifr6.ifr6_prefixlen = prefix_len; - if (ioctl(sockfd6, a1op->selector, &ifr6) < 0) - bb_perror_msg_and_die(a1op->name); - continue; - } -#endif - else if (inet_aton(host, &sai.sin_addr) == 0) { - /* It's not a dotted quad. */ - struct hostent *hp = xgethostbyname(host); - memcpy((char *) &sai.sin_addr, (char *) hp->h_addr_list[0], - sizeof(struct in_addr)); + if (lsa->sa.sa_family == AF_INET6) { + int sockfd6; + struct in6_ifreq ifr6; + + memcpy((char *) &ifr6.ifr6_addr, + (char *) &(lsa->sin6.sin6_addr), + sizeof(struct in6_addr)); + + /* Create a channel to the NET kernel. */ + sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0); + if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0) + bb_perror_msg_and_die("SIOGIFINDEX"); + ifr6.ifr6_ifindex = ifr.ifr_ifindex; + ifr6.ifr6_prefixlen = prefix_len; + if (ioctl(sockfd6, a1op->selector, &ifr6) < 0) + bb_perror_msg_and_die(a1op->name); + if (ENABLE_FEATURE_CLEAN_UP) + free(lsa); + continue; + } +#endif + sai.sin_addr = lsa->sin.sin_addr; + if (ENABLE_FEATURE_CLEAN_UP) + free(lsa); } #if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS if (mask & A_HOSTNAME) diff --git a/networking/traceroute.c b/networking/traceroute.c index 4ddde2fda..fd4c20e6d 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c @@ -247,7 +247,7 @@ struct ipovly { /* * UDP kernel structures and variables. */ -struct udpiphdr { +struct udpiphdr { struct ipovly ui_i; /* overlaid ip structure */ struct udphdr ui_u; /* udp header */ }; |