version 1.9, 2008/05/11 22:07:23 |
version 1.10, 2008/05/11 23:25:46 |
Line 59 __RCSID("$NetBSD$"); |
|
Line 59 __RCSID("$NetBSD$"); |
|
#include "af_inet.h" |
#include "af_inet.h" |
#include "af_inetany.h" |
#include "af_inetany.h" |
|
|
|
static void in_alias(const char *, prop_dictionary_t, prop_dictionary_t, |
|
struct in_aliasreq *); |
static void in_preference(const char *, const struct sockaddr *); |
static void in_preference(const char *, const struct sockaddr *); |
|
|
void |
void |
in_alias(const char *ifname, prop_dictionary_t env, prop_dictionary_t oenv, |
in_alias(const char *ifname, prop_dictionary_t env, prop_dictionary_t oenv, |
struct ifreq *creq) |
struct in_aliasreq *creq) |
{ |
{ |
struct sockaddr_in *sin; |
|
struct ifreq ifr; |
struct ifreq ifr; |
int alias, s; |
int alias, s; |
unsigned short flags; |
unsigned short flags; |
Line 85 in_alias(const char *ifname, prop_dictio |
|
Line 86 in_alias(const char *ifname, prop_dictio |
|
memset(&ifr, 0, sizeof(ifr)); |
memset(&ifr, 0, sizeof(ifr)); |
estrlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); |
estrlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); |
if (ioctl(s, SIOCGIFADDR, &ifr) == -1) { |
if (ioctl(s, SIOCGIFADDR, &ifr) == -1) { |
if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { |
if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) |
return; |
return; |
} else |
warn("SIOCGIFADDR"); |
warn("SIOCGIFADDR"); |
|
} |
} |
/* If creq and ifr are the same address, this is not an alias. */ |
/* If creq and ifr are the same address, this is not an alias. */ |
if (memcmp(&ifr.ifr_addr, &creq->ifr_addr, sizeof(creq->ifr_addr)) == 0) |
if (memcmp(&ifr.ifr_addr, &creq->ifra_addr, sizeof(ifr.ifr_addr)) == 0) |
alias = 0; |
alias = 0; |
memset(&in_addreq, 0, sizeof(in_addreq)); |
in_addreq = *creq; |
estrlcpy(in_addreq.ifra_name, ifname, sizeof(in_addreq.ifra_name)); |
|
memcpy(&in_addreq.ifra_addr, &creq->ifr_addr, |
|
sizeof(in_addreq.ifra_addr)); |
|
if (ioctl(s, SIOCGIFALIAS, &in_addreq) == -1) { |
if (ioctl(s, SIOCGIFALIAS, &in_addreq) == -1) { |
if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { |
if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { |
return; |
return; |
Line 104 in_alias(const char *ifname, prop_dictio |
|
Line 101 in_alias(const char *ifname, prop_dictio |
|
warn("SIOCGIFALIAS"); |
warn("SIOCGIFALIAS"); |
} |
} |
|
|
sin = &in_addreq.ifra_addr; |
printf("\tinet %s%s", alias ? "alias " : "", |
printf("\tinet %s%s", alias ? "alias " : "", inet_ntoa(sin->sin_addr)); |
inet_ntoa(in_addreq.ifra_addr.sin_addr)); |
|
|
if (getifflags(env, oenv, &flags) == -1) |
if (getifflags(env, oenv, &flags) == -1) |
err(EXIT_FAILURE, "%s: getifflags", __func__); |
err(EXIT_FAILURE, "%s: getifflags", __func__); |
|
|
if (flags & IFF_POINTOPOINT) { |
if (flags & IFF_POINTOPOINT) |
sin = &in_addreq.ifra_dstaddr; |
printf(" -> %s", inet_ntoa(in_addreq.ifra_dstaddr.sin_addr)); |
printf(" -> %s", inet_ntoa(sin->sin_addr)); |
|
} |
|
|
|
sin = &in_addreq.ifra_mask; |
printf(" netmask 0x%x", ntohl(in_addreq.ifra_mask.sin_addr.s_addr)); |
printf(" netmask 0x%x", ntohl(sin->sin_addr.s_addr)); |
|
|
|
if (flags & IFF_BROADCAST) { |
if (flags & IFF_BROADCAST) { |
sin = &in_addreq.ifra_broadaddr; |
printf(" broadcast %s", |
printf(" broadcast %s", inet_ntoa(sin->sin_addr)); |
inet_ntoa(in_addreq.ifra_broadaddr.sin_addr)); |
} |
} |
} |
} |
|
|
static uint16_t |
static int16_t |
in_get_preference(const char *ifname, const struct sockaddr *sa) |
in_get_preference(const char *ifname, const struct sockaddr *sa) |
{ |
{ |
struct if_addrprefreq ifap; |
struct if_addrprefreq ifap; |
Line 136 in_get_preference(const char *ifname, co |
|
Line 130 in_get_preference(const char *ifname, co |
|
err(EXIT_FAILURE, "socket"); |
err(EXIT_FAILURE, "socket"); |
} |
} |
memset(&ifap, 0, sizeof(ifap)); |
memset(&ifap, 0, sizeof(ifap)); |
strncpy(ifap.ifap_name, ifname, sizeof(ifap.ifap_name)); |
estrlcpy(ifap.ifap_name, ifname, sizeof(ifap.ifap_name)); |
memcpy(&ifap.ifap_addr, sa, MIN(sizeof(ifap.ifap_addr), sa->sa_len)); |
memcpy(&ifap.ifap_addr, sa, MIN(sizeof(ifap.ifap_addr), sa->sa_len)); |
if (ioctl(s, SIOCGIFADDRPREF, &ifap) == -1) { |
if (ioctl(s, SIOCGIFADDRPREF, &ifap) == -1) { |
if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) |
if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) |
Line 149 in_get_preference(const char *ifname, co |
|
Line 143 in_get_preference(const char *ifname, co |
|
static void |
static void |
in_preference(const char *ifname, const struct sockaddr *sa) |
in_preference(const char *ifname, const struct sockaddr *sa) |
{ |
{ |
uint16_t preference; |
int16_t preference; |
|
|
if (lflag) |
if (lflag) |
return; |
return; |
|
|
preference = in_get_preference(ifname, sa); |
preference = in_get_preference(ifname, sa); |
printf(" preference %" PRIu16, preference); |
printf(" preference %" PRId16, preference); |
} |
} |
|
|
void |
void |
in_status(prop_dictionary_t env, prop_dictionary_t oenv, bool force) |
in_status(prop_dictionary_t env, prop_dictionary_t oenv, bool force) |
{ |
{ |
struct ifaddrs *ifap, *ifa; |
struct ifaddrs *ifap, *ifa; |
struct ifreq ifr; |
struct in_aliasreq ifra; |
int printprefs = 0; |
int printprefs = 0; |
const char *ifname; |
const char *ifname; |
|
|
Line 171 in_status(prop_dictionary_t env, prop_di |
|
Line 165 in_status(prop_dictionary_t env, prop_di |
|
|
|
if (getifaddrs(&ifap) != 0) |
if (getifaddrs(&ifap) != 0) |
err(EXIT_FAILURE, "getifaddrs"); |
err(EXIT_FAILURE, "getifaddrs"); |
|
|
/* Print address preference numbers if any address has a non-zero |
/* Print address preference numbers if any address has a non-zero |
* preference assigned. |
* preference assigned. |
*/ |
*/ |
for (ifa = ifap; ifa; ifa = ifa->ifa_next) { |
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { |
if (strcmp(ifname, ifa->ifa_name) != 0) |
if (strcmp(ifname, ifa->ifa_name) != 0) |
continue; |
continue; |
if (ifa->ifa_addr->sa_family != AF_INET) |
if (ifa->ifa_addr->sa_family != AF_INET) |
Line 184 in_status(prop_dictionary_t env, prop_di |
|
Line 179 in_status(prop_dictionary_t env, prop_di |
|
break; |
break; |
} |
} |
} |
} |
for (ifa = ifap; ifa; ifa = ifa->ifa_next) { |
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { |
if (strcmp(ifname, ifa->ifa_name) != 0) |
if (strcmp(ifname, ifa->ifa_name) != 0) |
continue; |
continue; |
if (ifa->ifa_addr->sa_family != AF_INET) |
if (ifa->ifa_addr->sa_family != AF_INET) |
continue; |
continue; |
if (sizeof(ifr.ifr_addr) < ifa->ifa_addr->sa_len) |
if (sizeof(ifra.ifra_addr) < ifa->ifa_addr->sa_len) |
continue; |
continue; |
|
|
memset(&ifr, 0, sizeof(ifr)); |
memset(&ifra, 0, sizeof(ifra)); |
estrlcpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); |
estrlcpy(ifra.ifra_name, ifa->ifa_name, sizeof(ifra.ifra_name)); |
memcpy(&ifr.ifr_addr, ifa->ifa_addr, ifa->ifa_addr->sa_len); |
memcpy(&ifra.ifra_addr, ifa->ifa_addr, ifa->ifa_addr->sa_len); |
in_alias(ifa->ifa_name, env, oenv, &ifr); |
in_alias(ifa->ifa_name, env, oenv, &ifra); |
if (printprefs) |
if (printprefs) |
in_preference(ifa->ifa_name, ifa->ifa_addr); |
in_preference(ifa->ifa_name, ifa->ifa_addr); |
printf("\n"); |
printf("\n"); |
} |
} |
if (ifa != NULL) { |
|
for (ifa = ifap; ifa; ifa = ifa->ifa_next) { |
|
if (strcmp(ifname, ifa->ifa_name) != 0) |
|
continue; |
|
if (ifa->ifa_addr->sa_family != AF_INET) |
|
continue; |
|
} |
|
} |
|
freeifaddrs(ifap); |
freeifaddrs(ifap); |
} |
} |
|
|