ifconfig: use IPv6 infrastructure
No binary (build failed)
—
(log yok)
| @@ -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); | |
| @@ -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) | |
| @@ -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 */ | |
| }; | |