ifconfig: use IPv6 infrastructure

This commit is contained in:
Denis Vlasenko 2007-02-04 02:40:27 +00:00
parent 5870ad9672
commit 1094452423
3 changed files with 25 additions and 26 deletions

View File

@ -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(const struct sockaddr *sa, socklen_t salen);
char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa, socklen_t salen); char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa, socklen_t salen);
// "old" (ipv4 only) API // "old" (ipv4 only) API
// users: traceroute.c hostname.c ifconfig.c ping.c // users: traceroute.c hostname.c
struct hostent *xgethostbyname(const char *name); struct hostent *xgethostbyname(const char *name);

View File

@ -266,9 +266,6 @@ int ifconfig_main(int argc, char **argv)
{ {
struct ifreq ifr; struct ifreq ifr;
struct sockaddr_in sai; struct sockaddr_in sai;
#if ENABLE_FEATURE_IPV6
struct sockaddr_in6 sai6;
#endif
#if ENABLE_FEATURE_IFCONFIG_HW #if ENABLE_FEATURE_IFCONFIG_HW
struct sockaddr sa; struct sockaddr sa;
#endif #endif
@ -389,31 +386,33 @@ int ifconfig_main(int argc, char **argv)
sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask); sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask);
} }
#endif #endif
else {
len_and_sockaddr *lsa = xhost2sockaddr(host, 0);
#if ENABLE_FEATURE_IPV6 #if ENABLE_FEATURE_IPV6
else if (inet_pton(AF_INET6, host, &sai6.sin6_addr) > 0) { if (lsa->sa.sa_family == AF_INET6) {
int sockfd6; int sockfd6;
struct in6_ifreq ifr6; struct in6_ifreq ifr6;
memcpy((char *) &ifr6.ifr6_addr, memcpy((char *) &ifr6.ifr6_addr,
(char *) &sai6.sin6_addr, (char *) &(lsa->sin6.sin6_addr),
sizeof(struct in6_addr)); sizeof(struct in6_addr));
/* Create a channel to the NET kernel. */ /* Create a channel to the NET kernel. */
sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0); sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0);
if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0) if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0)
bb_perror_msg_and_die("SIOGIFINDEX"); bb_perror_msg_and_die("SIOGIFINDEX");
ifr6.ifr6_ifindex = ifr.ifr_ifindex; ifr6.ifr6_ifindex = ifr.ifr_ifindex;
ifr6.ifr6_prefixlen = prefix_len; ifr6.ifr6_prefixlen = prefix_len;
if (ioctl(sockfd6, a1op->selector, &ifr6) < 0) if (ioctl(sockfd6, a1op->selector, &ifr6) < 0)
bb_perror_msg_and_die(a1op->name); bb_perror_msg_and_die(a1op->name);
continue; if (ENABLE_FEATURE_CLEAN_UP)
} free(lsa);
continue;
}
#endif #endif
else if (inet_aton(host, &sai.sin_addr) == 0) { sai.sin_addr = lsa->sin.sin_addr;
/* It's not a dotted quad. */ if (ENABLE_FEATURE_CLEAN_UP)
struct hostent *hp = xgethostbyname(host); free(lsa);
memcpy((char *) &sai.sin_addr, (char *) hp->h_addr_list[0],
sizeof(struct in_addr));
} }
#if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS #if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS
if (mask & A_HOSTNAME) if (mask & A_HOSTNAME)

View File

@ -247,7 +247,7 @@ struct ipovly {
/* /*
* UDP kernel structures and variables. * UDP kernel structures and variables.
*/ */
struct udpiphdr { struct udpiphdr {
struct ipovly ui_i; /* overlaid ip structure */ struct ipovly ui_i; /* overlaid ip structure */
struct udphdr ui_u; /* udp header */ struct udphdr ui_u; /* udp header */
}; };