diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-04 02:40:27 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-04 02:40:27 +0000 |
commit | 10944524238532ad35aaefec89cf7cc950745d6b (patch) | |
tree | 4a9479ef583cf8223796a994df98b5c3d9b70861 /networking/ifconfig.c | |
parent | 5870ad9672ac09e366f1bfd4086e98cd019ed8f2 (diff) | |
download | busybox-w32-10944524238532ad35aaefec89cf7cc950745d6b.tar.gz busybox-w32-10944524238532ad35aaefec89cf7cc950745d6b.tar.bz2 busybox-w32-10944524238532ad35aaefec89cf7cc950745d6b.zip |
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 b36f86d6a..f4fc0a476 100644 --- a/networking/ifconfig.c +++ b/networking/ifconfig.c | |||
@@ -266,9 +266,6 @@ int ifconfig_main(int argc, char **argv) | |||
266 | { | 266 | { |
267 | struct ifreq ifr; | 267 | struct ifreq ifr; |
268 | struct sockaddr_in sai; | 268 | struct sockaddr_in sai; |
269 | #if ENABLE_FEATURE_IPV6 | ||
270 | struct sockaddr_in6 sai6; | ||
271 | #endif | ||
272 | #if ENABLE_FEATURE_IFCONFIG_HW | 269 | #if ENABLE_FEATURE_IFCONFIG_HW |
273 | struct sockaddr sa; | 270 | struct sockaddr sa; |
274 | #endif | 271 | #endif |
@@ -389,31 +386,33 @@ int ifconfig_main(int argc, char **argv) | |||
389 | sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask); | 386 | sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask); |
390 | } | 387 | } |
391 | #endif | 388 | #endif |
389 | else { | ||
390 | len_and_sockaddr *lsa = xhost2sockaddr(host, 0); | ||
392 | #if ENABLE_FEATURE_IPV6 | 391 | #if ENABLE_FEATURE_IPV6 |
393 | else if (inet_pton(AF_INET6, host, &sai6.sin6_addr) > 0) { | 392 | if (lsa->sa.sa_family == AF_INET6) { |
394 | int sockfd6; | 393 | int sockfd6; |
395 | struct in6_ifreq ifr6; | 394 | struct in6_ifreq ifr6; |
396 | 395 | ||
397 | memcpy((char *) &ifr6.ifr6_addr, | 396 | memcpy((char *) &ifr6.ifr6_addr, |
398 | (char *) &sai6.sin6_addr, | 397 | (char *) &(lsa->sin6.sin6_addr), |
399 | sizeof(struct in6_addr)); | 398 | sizeof(struct in6_addr)); |
400 | 399 | ||
401 | /* Create a channel to the NET kernel. */ | 400 | /* Create a channel to the NET kernel. */ |
402 | sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0); | 401 | sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0); |
403 | if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0) | 402 | if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0) |
404 | bb_perror_msg_and_die("SIOGIFINDEX"); | 403 | bb_perror_msg_and_die("SIOGIFINDEX"); |
405 | ifr6.ifr6_ifindex = ifr.ifr_ifindex; | 404 | ifr6.ifr6_ifindex = ifr.ifr_ifindex; |
406 | ifr6.ifr6_prefixlen = prefix_len; | 405 | ifr6.ifr6_prefixlen = prefix_len; |
407 | if (ioctl(sockfd6, a1op->selector, &ifr6) < 0) | 406 | if (ioctl(sockfd6, a1op->selector, &ifr6) < 0) |
408 | bb_perror_msg_and_die(a1op->name); | 407 | bb_perror_msg_and_die(a1op->name); |
409 | continue; | 408 | if (ENABLE_FEATURE_CLEAN_UP) |
410 | } | 409 | free(lsa); |
411 | #endif | 410 | continue; |
412 | else if (inet_aton(host, &sai.sin_addr) == 0) { | 411 | } |
413 | /* It's not a dotted quad. */ | 412 | #endif |
414 | struct hostent *hp = xgethostbyname(host); | 413 | sai.sin_addr = lsa->sin.sin_addr; |
415 | memcpy((char *) &sai.sin_addr, (char *) hp->h_addr_list[0], | 414 | if (ENABLE_FEATURE_CLEAN_UP) |
416 | sizeof(struct in_addr)); | 415 | free(lsa); |
417 | } | 416 | } |
418 | #if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS | 417 | #if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS |
419 | if (mask & A_HOSTNAME) | 418 | if (mask & A_HOSTNAME) |