Address feedback from hrs@ re: r301059 (ifconfig subnet mask)
- Use NI_MAXHOST to size buffers for getnameinfo() - remove non-standard 'full' inet6 address printing - remove 'no scope' option - use strchr(3) to optimize replacing separator character in lladdrs Reviewed by: gnn, jhb Differential Revision: https://reviews.freebsd.org/D2856
This commit is contained in:
parent
e90f6cad4e
commit
8e48e06278
@ -54,7 +54,7 @@ static const char rcsid[] =
|
||||
|
||||
static struct in_aliasreq in_addreq;
|
||||
static struct ifreq in_ridreq;
|
||||
static char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
|
||||
static char addr_buf[NI_MAXHOST]; /*for getnameinfo()*/
|
||||
extern char *f_inet, *f_addr;
|
||||
|
||||
static void
|
||||
|
@ -65,13 +65,13 @@ static int ip6lifetime;
|
||||
static int prefix(void *, int);
|
||||
static char *sec2str(time_t);
|
||||
static int explicit_prefix = 0;
|
||||
extern char *f_inet6, *f_addr, *f_scope;
|
||||
extern char *f_inet6, *f_addr;
|
||||
|
||||
extern void setnd6flags(const char *, int, int, const struct afswtch *);
|
||||
extern void setnd6defif(const char *, int, int, const struct afswtch *);
|
||||
extern void nd6_status(int);
|
||||
|
||||
static char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
|
||||
static char addr_buf[NI_MAXHOST]; /*for getnameinfo()*/
|
||||
|
||||
static void
|
||||
setifprefixlen(const char *addr, int dummy __unused, int s,
|
||||
@ -173,10 +173,9 @@ in6_status(int s __unused, const struct ifaddrs *ifa)
|
||||
struct in6_ifreq ifr6;
|
||||
int s6;
|
||||
u_int32_t flags6;
|
||||
const u_int16_t *a;
|
||||
struct in6_addrlifetime lifetime;
|
||||
struct timespec now;
|
||||
int error, n_flags, i;
|
||||
int error, n_flags;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC_FAST, &now);
|
||||
|
||||
@ -208,30 +207,19 @@ in6_status(int s __unused, const struct ifaddrs *ifa)
|
||||
lifetime = ifr6.ifr_ifru.ifru_lifetime;
|
||||
close(s6);
|
||||
|
||||
if (f_addr != NULL && strcmp(f_addr, "full") == 0) {
|
||||
a = (const u_int16_t *)&sin->sin6_addr;
|
||||
printf("\tinet6 ");
|
||||
for (i = 0; i < 8; i++) {
|
||||
printf("%04hx", ntohs(*(a + i)));
|
||||
if (i < 7)
|
||||
printf(":");
|
||||
}
|
||||
} else {
|
||||
if (f_addr != NULL && strcmp(f_addr, "fqdn") == 0)
|
||||
n_flags = 0;
|
||||
else if (f_addr != NULL && strcmp(f_addr, "host") == 0)
|
||||
n_flags = NI_NOFQDN;
|
||||
else
|
||||
n_flags = NI_NUMERICHOST;
|
||||
error = getnameinfo((struct sockaddr *)sin, sin->sin6_len,
|
||||
addr_buf, sizeof(addr_buf), NULL, 0,
|
||||
n_flags);
|
||||
if (error != 0 ||
|
||||
(f_scope != NULL && strcmp(f_scope, "none") == 0))
|
||||
inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
|
||||
sizeof(addr_buf));
|
||||
printf("\tinet6 %s", addr_buf);
|
||||
}
|
||||
if (f_addr != NULL && strcmp(f_addr, "fqdn") == 0)
|
||||
n_flags = 0;
|
||||
else if (f_addr != NULL && strcmp(f_addr, "host") == 0)
|
||||
n_flags = NI_NOFQDN;
|
||||
else
|
||||
n_flags = NI_NUMERICHOST;
|
||||
error = getnameinfo((struct sockaddr *)sin, sin->sin6_len,
|
||||
addr_buf, sizeof(addr_buf), NULL, 0,
|
||||
n_flags);
|
||||
if (error != 0)
|
||||
inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
|
||||
sizeof(addr_buf));
|
||||
printf("\tinet6 %s", addr_buf);
|
||||
|
||||
if (ifa->ifa_flags & IFF_POINTOPOINT) {
|
||||
sin = (struct sockaddr_in6 *)ifa->ifa_dstaddr;
|
||||
@ -280,8 +268,7 @@ in6_status(int s __unused, const struct ifaddrs *ifa)
|
||||
if ((flags6 & IN6_IFF_PREFER_SOURCE) != 0)
|
||||
printf("prefer_source ");
|
||||
|
||||
if ((f_scope == NULL || strcmp(f_scope, "none") != 0) &&
|
||||
((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id)
|
||||
if (((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id)
|
||||
printf("scopeid 0x%x ",
|
||||
((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id);
|
||||
|
||||
|
@ -58,25 +58,22 @@ link_status(int s __unused, const struct ifaddrs *ifa)
|
||||
{
|
||||
/* XXX no const 'cuz LLADDR is defined wrong */
|
||||
struct sockaddr_dl *sdl = (struct sockaddr_dl *) ifa->ifa_addr;
|
||||
char *ether_format;
|
||||
int i;
|
||||
char *ether_format, *format_char;
|
||||
|
||||
if (sdl != NULL && sdl->sdl_alen > 0) {
|
||||
if ((sdl->sdl_type == IFT_ETHER ||
|
||||
sdl->sdl_type == IFT_L2VLAN ||
|
||||
sdl->sdl_type == IFT_BRIDGE) &&
|
||||
sdl->sdl_alen == ETHER_ADDR_LEN)
|
||||
sdl->sdl_alen == ETHER_ADDR_LEN) {
|
||||
ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl));
|
||||
if (f_ether != NULL && strcmp(f_ether, "dash") == 0) {
|
||||
ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl));
|
||||
for (i = 0; i < strlen(ether_format); i++) {
|
||||
if (ether_format[i] == ':')
|
||||
ether_format[i] = '-';
|
||||
}
|
||||
printf("\tether %s\n", ether_format);
|
||||
} else
|
||||
printf("\tether %s\n",
|
||||
ether_ntoa((struct ether_addr *)LLADDR(sdl)));
|
||||
else {
|
||||
for (format_char = strchr(ether_format, ':');
|
||||
format_char != NULL;
|
||||
format_char = strchr(ether_format, ':'))
|
||||
*format_char = '-';
|
||||
}
|
||||
printf("\tether %s\n", ether_format);
|
||||
} else {
|
||||
int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
|
||||
|
||||
printf("\tlladdr %s\n", link_ntoa(sdl) + n);
|
||||
|
@ -213,7 +213,7 @@ The
|
||||
and their associated
|
||||
.Sy format
|
||||
strings are:
|
||||
.Bl -tag -width scope
|
||||
.Bl -tag -width ether
|
||||
.It Sy addr
|
||||
Adjust the display of inet and inet6 addresses
|
||||
.Bl -tag -width default
|
||||
@ -223,9 +223,6 @@ Display inet and inet6 addresses in the default format,
|
||||
.It Sy fqdn
|
||||
Display inet and inet6 addresses as fully qualified domain names
|
||||
.Pq FQDN
|
||||
.It Sy full
|
||||
Display inet6 addresses without suppressing zeroes.
|
||||
Only applicable to inet6
|
||||
.It Sy host
|
||||
Display inet and inet6 addresses as unqualified hostnames
|
||||
.It Sy numeric
|
||||
@ -276,19 +273,6 @@ Display subnet prefix in integer format, for example:
|
||||
.br
|
||||
prefixlen 64
|
||||
.El
|
||||
.It Sy scope
|
||||
Controls the display of the interface scope as part of the address.
|
||||
Only applicable to inet6 addresses.
|
||||
.Bl -tag -width default
|
||||
.It Sy default
|
||||
The interface scope and scopeid are included in the address, for example:
|
||||
.br
|
||||
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
|
||||
.It Sy none
|
||||
The interface scope and scopeid are not displayed, for example:
|
||||
.br
|
||||
inet6 fe80::1 prefixlen 64
|
||||
.El
|
||||
.El
|
||||
.Pp
|
||||
The following parameters may be set with
|
||||
|
@ -99,7 +99,7 @@ int supmedia = 0;
|
||||
int printkeys = 0; /* Print keying material for interfaces. */
|
||||
|
||||
/* Formatter Strings */
|
||||
char *f_inet, *f_inet6, *f_ether, *f_addr, *f_scope;
|
||||
char *f_inet, *f_inet6, *f_ether, *f_addr;
|
||||
|
||||
static int ifconfig(int argc, char *const *argv, int iscreate,
|
||||
const struct afswtch *afp);
|
||||
@ -257,8 +257,6 @@ static void freeformat(void)
|
||||
free(f_ether);
|
||||
if (f_addr != NULL)
|
||||
free(f_addr);
|
||||
if (f_scope != NULL)
|
||||
free(f_scope);
|
||||
}
|
||||
|
||||
static void setformat(char *input)
|
||||
@ -286,8 +284,6 @@ static void setformat(char *input)
|
||||
f_inet = strdup(modifier);
|
||||
else if (strcmp(category, "inet6") == 0)
|
||||
f_inet6 = strdup(modifier);
|
||||
else if (strcmp(category, "scope") == 0)
|
||||
f_scope = strdup(modifier);
|
||||
}
|
||||
free(formatstr);
|
||||
}
|
||||
@ -372,7 +368,7 @@ main(int argc, char *argv[])
|
||||
size_t iflen;
|
||||
|
||||
all = downonly = uponly = namesonly = noload = verbose = 0;
|
||||
f_inet = f_inet6 = f_ether = f_addr = f_scope = NULL;
|
||||
f_inet = f_inet6 = f_ether = f_addr = NULL;
|
||||
|
||||
envformat = getenv("IFCONFIG_FORMAT");
|
||||
if (envformat != NULL)
|
||||
|
Loading…
x
Reference in New Issue
Block a user