diff options
author | Denis Vlasenko | 2007-02-04 02:40:27 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-02-04 02:40:27 +0000 |
commit | 10944524238532ad35aaefec89cf7cc950745d6b (patch) | |
tree | 4a9479ef583cf8223796a994df98b5c3d9b70861 /networking/ifconfig.c | |
parent | 5870ad9672ac09e366f1bfd4086e98cd019ed8f2 (diff) | |
download | busybox-10944524238532ad35aaefec89cf7cc950745d6b.zip busybox-10944524238532ad35aaefec89cf7cc950745d6b.tar.gz |
ifconfig: use IPv6 infrastructure
Diffstat (limited to 'networking/ifconfig.c')
-rw-r--r-- | networking/ifconfig.c | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/networking/ifconfig.c b/networking/ifconfig.c index b36f86d..f4fc0a4 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) |