ifconfig: use IPv6 infrastructure
This commit is contained in:
parent
5870ad9672
commit
1094452423
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user