aboutsummaryrefslogtreecommitdiff
path: root/networking/ifconfig.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-02-04 02:40:27 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-02-04 02:40:27 +0000
commit10944524238532ad35aaefec89cf7cc950745d6b (patch)
tree4a9479ef583cf8223796a994df98b5c3d9b70861 /networking/ifconfig.c
parent5870ad9672ac09e366f1bfd4086e98cd019ed8f2 (diff)
downloadbusybox-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.c53
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)