summaryrefslogtreecommitdiff
path: root/networking/ifconfig.c
diff options
context:
space:
mode:
authorDenis Vlasenko2007-02-04 02:40:27 +0000
committerDenis Vlasenko2007-02-04 02:40:27 +0000
commit10944524238532ad35aaefec89cf7cc950745d6b (patch)
tree4a9479ef583cf8223796a994df98b5c3d9b70861 /networking/ifconfig.c
parent5870ad9672ac09e366f1bfd4086e98cd019ed8f2 (diff)
downloadbusybox-10944524238532ad35aaefec89cf7cc950745d6b.zip
busybox-10944524238532ad35aaefec89cf7cc950745d6b.tar.gz
ifconfig: use IPv6 infrastructure
Diffstat (limited to 'networking/ifconfig.c')
-rw-r--r--networking/ifconfig.c53
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)