aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/netstat
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2015-09-01 08:42:04 +0000
committerHiroki Sato <hrs@FreeBSD.org>2015-09-01 08:42:04 +0000
commit10d5269ff900c124da8257725dc4e57dd55b1931 (patch)
tree8a34498005c7be97042e01a5b31617e78b4b4d85 /usr.bin/netstat
parent7760154342d4361500e997477d3f0c683e084351 (diff)
downloadsrc-10d5269ff900c124da8257725dc4e57dd55b1931.tar.gz
src-10d5269ff900c124da8257725dc4e57dd55b1931.zip
- Add -W flag support for network column in intpr() (-i flag) and
routepr() (-r flag). It is too narrow to show an IPv6 prefix in most cases. - Accept "local" as a synonym of "unix" in protocol family name. - Show a prefix length in CIDR notation when name resolution failed in netname(). - Make routename() and netname() AF-independent and remove unnecessary typecasting from struct sockaddr. - Use getnameinfo(3) to format L2 addr in intpr(). - Fix a bug which showed "Address" when -A flag is specfied in pr_rthdr(). - Replace cryptic GETSA() macro with SA_SIZE(). - Fix declarations shadowing local variables with the same names. - Add more static, remove unused header files and variables. MFC after: 1 week
Notes
Notes: svn path=/head/; revision=287351
Diffstat (limited to 'usr.bin/netstat')
-rw-r--r--usr.bin/netstat/if.c129
-rw-r--r--usr.bin/netstat/inet.c1
-rw-r--r--usr.bin/netstat/inet6.c2
-rw-r--r--usr.bin/netstat/main.c7
-rw-r--r--usr.bin/netstat/mroute.c24
-rw-r--r--usr.bin/netstat/mroute6.c6
-rw-r--r--usr.bin/netstat/netstat.h13
-rw-r--r--usr.bin/netstat/route.c322
-rw-r--r--usr.bin/netstat/sctp.c6
9 files changed, 226 insertions, 284 deletions
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index 109ef2dabbe3..bc0b2af4a70d 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -75,11 +75,7 @@ __FBSDID("$FreeBSD$");
#include "netstat.h"
-static void sidewaysintpr(int);
-
-#ifdef INET6
-static char addr_buf[NI_MAXHOST]; /* for getnameinfo() */
-#endif
+static void sidewaysintpr(void);
#ifdef PF
static const char* pfsyncacts[] = {
@@ -280,13 +276,13 @@ next_ifma(struct ifmaddrs *ifma, const char *name, const sa_family_t family)
* Print a description of the network interfaces.
*/
void
-intpr(int interval, void (*pfunc)(char *), int af)
+intpr(void (*pfunc)(char *), int af)
{
struct ifaddrs *ifap, *ifa;
struct ifmaddrs *ifmap, *ifma;
if (interval)
- return sidewaysintpr(interval);
+ return sidewaysintpr();
if (getifaddrs(&ifap) != 0)
err(EX_OSERR, "getifaddrs");
@@ -366,63 +362,54 @@ intpr(int interval, void (*pfunc)(char *), int af)
xo_emit("{:address/%-15.15s} ", "none");
break;
case AF_INET:
- {
- struct sockaddr_in *sin, *mask;
-
- sin = (struct sockaddr_in *)ifa->ifa_addr;
- mask = (struct sockaddr_in *)ifa->ifa_netmask;
- xo_emit("{t:network/%-13.13s} ",
- netname(sin->sin_addr.s_addr,
- mask->sin_addr.s_addr));
- xo_emit("{t:address/%-17.17s} ",
- routename(sin->sin_addr.s_addr));
+ if (Wflag) {
+ xo_emit("{t:network/%-13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ } else {
+ xo_emit("{t:network/%-13.13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17.17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ }
network = true;
break;
- }
#ifdef INET6
case AF_INET6:
- {
- struct sockaddr_in6 *sin6, *mask;
-
- sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
- mask = (struct sockaddr_in6 *)ifa->ifa_netmask;
-
- xo_emit("{t:network/%-13.13s} ",
- netname6(sin6, &mask->sin6_addr));
- getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len,
- addr_buf, sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
- xo_emit("{t:address/%-17.17s} ", addr_buf);
+ if (Wflag) {
+ xo_emit("{t:network/%-13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ } else {
+ xo_emit("{t:network/%-13.13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17.17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ }
- network = 1;
+ network = true;
break;
- }
#endif /* INET6 */
case AF_LINK:
{
struct sockaddr_dl *sdl;
- char *cp, linknum[10];
- int len = 32;
- char buf[len];
- int n, z;
+ char linknum[10];
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
- cp = (char *)LLADDR(sdl);
- n = sdl->sdl_alen;
sprintf(linknum, "<Link#%d>", sdl->sdl_index);
xo_emit("{t:network/%-13.13s} ", linknum);
- buf[0] = '\0';
- z = 0;
- while ((--n >= 0) && (z < len)) {
- snprintf(buf + z, len - z, "%02x%c",
- *cp++ & 0xff, n > 0 ? ':' : ' ');
- z += 3;
- }
- if (z > 0)
- xo_emit("{:address/%*s}", 32 - z, buf);
- else
+ if (sdl->sdl_nlen == 0 &&
+ sdl->sdl_alen == 0 &&
+ sdl->sdl_slen == 0)
xo_emit("{P: }");
- link = 1;
+ else
+ xo_emit("{:address/%*s}",
+ 32 - 3 * sdl->sdl_alen,
+ routename(ifa->ifa_addr, 1));
+ link = true;
break;
}
}
@@ -465,44 +452,30 @@ intpr(int interval, void (*pfunc)(char *), int af)
xo_open_instance("multicast-address");
switch (ifma->ifma_addr->sa_family) {
- case AF_INET:
- {
- struct sockaddr_in *sin;
-
- sin = (struct sockaddr_in *)ifma->ifma_addr;
- fmt = routename(sin->sin_addr.s_addr);
- break;
- }
-#ifdef INET6
- case AF_INET6:
-
- /* in6_fillscopeid(&msa.in6); */
- getnameinfo(ifma->ifma_addr,
- ifma->ifma_addr->sa_len, addr_buf,
- sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
- xo_emit("{P:/%*s }{t:address/%-19.19s}",
- Wflag ? 27 : 25, "", addr_buf);
- break;
-#endif /* INET6 */
case AF_LINK:
{
struct sockaddr_dl *sdl;
sdl = (struct sockaddr_dl *)ifma->ifma_addr;
- switch (sdl->sdl_type) {
- case IFT_ETHER:
- case IFT_FDDI:
- fmt = ether_ntoa(
- (struct ether_addr *)LLADDR(sdl));
+ if (sdl->sdl_type != IFT_ETHER &&
+ sdl->sdl_type != IFT_FDDI)
break;
- }
- break;
}
+ /* FALLTHROUGH */
+ case AF_INET:
+#ifdef INET6
+ case AF_INET6:
+#endif /* INET6 */
+ fmt = routename(ifma->ifma_addr, numeric_addr);
+ break;
}
-
if (fmt) {
- xo_emit("{P:/%*s }{t:address/%-17.17s/}",
- Wflag ? 27 : 25, "", fmt);
+ if (Wflag)
+ xo_emit("{P:/%27s }"
+ "{t:address/%-17s/}", "", fmt);
+ else
+ xo_emit("{P:/%25s }"
+ "{t:address/%-17.17s/}", "", fmt);
if (ifma->ifma_addr->sa_family == AF_LINK) {
xo_emit(" {:received-packets/%8lu}",
IFA_STAT(imcasts));
@@ -596,7 +569,7 @@ catchalarm(int signo __unused)
* First line printed at top of screen is always cumulative.
*/
static void
-sidewaysintpr(int interval)
+sidewaysintpr(void)
{
struct iftot ift[2], *new, *old;
struct itimerval interval_it;
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c
index c966bf44f2be..4c3675a78c23 100644
--- a/usr.bin/netstat/inet.c
+++ b/usr.bin/netstat/inet.c
@@ -66,7 +66,6 @@ __FBSDID("$FreeBSD$");
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h>
-#include <netinet/tcp_debug.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
diff --git a/usr.bin/netstat/inet6.c b/usr.bin/netstat/inet6.c
index 3535f4533ae5..6cdc46b50968 100644
--- a/usr.bin/netstat/inet6.c
+++ b/usr.bin/netstat/inet6.c
@@ -71,8 +71,6 @@ __FBSDID("$FreeBSD$");
#include <libxo/xo.h>
#include "netstat.h"
-struct socket sockb;
-
char *inet6name(struct in6_addr *);
static char ntop_buf[INET6_ADDRSTRLEN];
diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c
index 65bcbf67b824..d9e175dfffc3 100644
--- a/usr.bin/netstat/main.c
+++ b/usr.bin/netstat/main.c
@@ -374,7 +374,8 @@ main(int argc, char *argv[])
else if (strcmp(optarg, "pfkey") == 0)
af = PF_KEY;
#endif
- else if (strcmp(optarg, "unix") == 0)
+ else if (strcmp(optarg, "unix") == 0 ||
+ strcmp(optarg, "local") == 0)
af = AF_UNIX;
#ifdef NETGRAPH
else if (strcmp(optarg, "ng") == 0
@@ -547,7 +548,7 @@ main(int argc, char *argv[])
#endif
if (iflag && !sflag) {
xo_open_container("statistics");
- intpr(interval, NULL, af);
+ intpr(NULL, af);
xo_close_container("statistics");
xo_finish();
exit(0);
@@ -645,7 +646,7 @@ printproto(struct protox *tp, const char *name, bool *first)
if (sflag) {
if (iflag) {
if (tp->pr_istats)
- intpr(interval, tp->pr_istats, af);
+ intpr(tp->pr_istats, af);
else if (pflag)
xo_message("%s: no per-interface stats routine",
tp->pr_name);
diff --git a/usr.bin/netstat/mroute.c b/usr.bin/netstat/mroute.c
index 37c8868049be..9f789e1c7a32 100644
--- a/usr.bin/netstat/mroute.c
+++ b/usr.bin/netstat/mroute.c
@@ -70,6 +70,7 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <string.h>
#include <libxo/xo.h>
#include "netstat.h"
@@ -178,12 +179,17 @@ print_bw_meter(struct bw_meter *bw_meter, int *banner_printed)
static void
print_mfc(struct mfc *m, int maxvif, int *banner_printed)
{
+ struct sockaddr_in sin;
+ struct sockaddr *sa = (struct sockaddr *)&sin;
struct bw_meter bw_meter, *bwm;
int bw_banner_printed;
int error;
vifi_t vifi;
bw_banner_printed = 0;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
if (! *banner_printed) {
xo_open_list("multicast-forwarding-entry");
@@ -193,9 +199,11 @@ print_mfc(struct mfc *m, int maxvif, int *banner_printed)
*banner_printed = 1;
}
- xo_emit(" {:origin-address/%-15.15s}", routename(m->mfc_origin.s_addr));
+ memcpy(&sin.sin_addr, &m->mfc_origin, sizeof(sin.sin_addr));
+ xo_emit(" {:origin-address/%-15.15s}", routename(sa, numeric_addr));
+ memcpy(&sin.sin_addr, &m->mfc_mcastgrp, sizeof(sin.sin_addr));
xo_emit(" {:group-address/%-15.15s}",
- routename(m->mfc_mcastgrp.s_addr));
+ routename(sa, numeric_addr));
xo_emit(" {:sent-packets/%9lu}", m->mfc_pkt_cnt);
xo_emit(" {:parent/%3d} ", m->mfc_parent);
xo_open_list("vif-ttl");
@@ -230,6 +238,8 @@ print_mfc(struct mfc *m, int maxvif, int *banner_printed)
void
mroutepr()
{
+ struct sockaddr_in sin;
+ struct sockaddr *sa = (struct sockaddr *)&sin;
struct vif viftable[MAXVIFS];
struct vif *v;
struct mfc *m;
@@ -242,6 +252,10 @@ mroutepr()
saved_numeric_addr = numeric_addr;
numeric_addr = 1;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
+
/*
* TODO:
* The VIF table will move to hanging off the struct if_info for
@@ -294,12 +308,14 @@ mroutepr()
}
xo_open_instance("vif");
+ memcpy(&sin.sin_addr, &v->v_lcl_addr, sizeof(sin.sin_addr));
xo_emit(" {:vif/%2u} {:threshold/%6u} {:route/%-15.15s}",
/* opposite math of add_vif() */
vifi, v->v_threshold,
- routename(v->v_lcl_addr.s_addr));
+ routename(sa, numeric_addr));
+ memcpy(&sin.sin_addr, &v->v_rmt_addr, sizeof(sin.sin_addr));
xo_emit(" {:source/%-15.15s}", (v->v_flags & VIFF_TUNNEL) ?
- routename(v->v_rmt_addr.s_addr) : "");
+ routename(sa, numeric_addr) : "");
xo_emit(" {:received-packets/%9lu} {:sent-packets/%9lu}\n",
v->v_pkt_in, v->v_pkt_out);
diff --git a/usr.bin/netstat/mroute6.c b/usr.bin/netstat/mroute6.c
index d9c127a4282f..668add4a33fc 100644
--- a/usr.bin/netstat/mroute6.c
+++ b/usr.bin/netstat/mroute6.c
@@ -186,9 +186,11 @@ mroute6pr()
xo_open_instance("multicast-forwarding-cache");
xo_emit(" {:origin/%-*.*s}", WID_ORG, WID_ORG,
- routename6(&mfc.mf6c_origin));
+ routename(sin6tosa(&mfc.mf6c_origin),
+ numeric_addr));
xo_emit(" {:group/%-*.*s}", WID_GRP, WID_GRP,
- routename6(&mfc.mf6c_mcastgrp));
+ routename(sin6tosa(&mfc.mf6c_mcastgrp),
+ numeric_addr));
xo_emit(" {:total-packets/%9ju}",
(uintmax_t)mfc.mf6c_pkt_cnt);
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
index 29e4d0fae8d6..8357cc5158bb 100644
--- a/usr.bin/netstat/netstat.h
+++ b/usr.bin/netstat/netstat.h
@@ -32,6 +32,10 @@
#include <sys/cdefs.h>
+#define satosin(sa) ((struct sockaddr_in *)(sa))
+#define satosin6(sa) ((struct sockaddr_in6 *)(sa))
+#define sin6tosa(sin6) ((struct sockaddr *)(sin6))
+
extern int Aflag; /* show addresses of protocol control block */
extern int aflag; /* show all sockets (including servers) */
extern int bflag; /* show i/f total bytes in/out */
@@ -106,8 +110,6 @@ void mrt6_stats(void);
struct sockaddr_in6;
struct in6_addr;
void in6_fillscopeid(struct sockaddr_in6 *);
-char *routename6(struct sockaddr_in6 *);
-const char *netname6(struct sockaddr_in6 *, struct in6_addr *);
void inet6print(const char *, struct in6_addr *, int, const char *, int);
#endif /*INET6*/
@@ -122,15 +124,14 @@ void netisr_stats(void *);
void hostpr(u_long, u_long);
void impstats(u_long, u_long);
-void intpr(int, void (*)(char *), int);
+void intpr(void (*)(char *), int);
-void pr_rthdr(int);
void pr_family(int);
void rt_stats(void);
void flowtable_stats(void);
-char *routename(in_addr_t);
-char *netname(in_addr_t, in_addr_t);
+char *routename(struct sockaddr *, int);
+const char *netname(struct sockaddr *, struct sockaddr *);
char *ns_print(struct sockaddr *);
void routepr(int, int);
diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c
index ab5a3ed1d7d9..b271133ddb7c 100644
--- a/usr.bin/netstat/route.c
+++ b/usr.bin/netstat/route.c
@@ -71,7 +71,7 @@ __FBSDID("$FreeBSD$");
/*
* Definitions for showing gateway flags.
*/
-struct bits {
+static struct bits {
u_long b_mask;
char b_val;
const char *b_name;
@@ -107,19 +107,15 @@ static struct nlist rl[] = {
{ .n_name = NULL },
};
-typedef union {
- long dummy; /* Helps align structure. */
- struct sockaddr u_sa;
- u_short u_data[128];
-} sa_u;
-
struct ifmap_entry {
char ifname[IFNAMSIZ];
};
static struct ifmap_entry *ifmap;
static int ifmap_size;
-struct timespec uptime;
+static struct timespec uptime;
+static const char *netname4(in_addr_t, in_addr_t);
+static const char *netname6(struct sockaddr_in6 *, struct sockaddr_in6 *);
static void p_rtable_sysctl(int, int);
static void p_rtentry_sysctl(const char *name, struct rt_msghdr *);
static void p_sockaddr(const char *name, struct sockaddr *, struct sockaddr *,
@@ -130,6 +126,7 @@ static void p_flags(int, const char *);
static const char *fmt_flags(int f);
static void domask(char *, in_addr_t, u_long);
+
/*
* Print routing tables.
*/
@@ -228,12 +225,10 @@ static int wid_expire;
/*
* Print header for routing table columns.
*/
-void
-pr_rthdr(int af1)
+static void
+pr_rthdr(int af1 __unused)
{
- if (Aflag)
- xo_emit("{T:/%-8.8s} ","Address");
if (Wflag) {
xo_emit("{T:/%-*.*s} {T:/%-*.*s} {T:/%-*.*s} {T:/%*.*s} "
"{T:/%*.*s} {T:/%*.*s} {T:/%*s}\n",
@@ -365,30 +360,22 @@ p_rtable_sysctl(int fibnum, int af)
static void
p_rtentry_sysctl(const char *name, struct rt_msghdr *rtm)
{
- struct sockaddr *sa = (struct sockaddr *)(rtm + 1);
+ struct sockaddr *sa, *addr[RTAX_MAX];
char buffer[128];
char prettyname[128];
- sa_u addr, mask, gw;
- unsigned int l;
+ int i;
xo_open_instance(name);
+ sa = (struct sockaddr *)(rtm + 1);
+ for (i = 0; i < RTAX_MAX; i++) {
+ if (rtm->rtm_addrs & (1 << i))
+ addr[i] = sa;
+ sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
+ }
-#define GETSA(_s, _f) { \
- bzero(&(_s), sizeof(_s)); \
- if (rtm->rtm_addrs & _f) { \
- l = roundup(sa->sa_len, sizeof(long)); \
- memcpy(&(_s), sa, (l > sizeof(_s)) ? sizeof(_s) : l); \
- sa = (struct sockaddr *)((char *)sa + l); \
- } \
-}
-
- GETSA(addr, RTA_DST);
- GETSA(gw, RTA_GATEWAY);
- GETSA(mask, RTA_NETMASK);
-
- p_sockaddr("destination", &addr.u_sa, &mask.u_sa, rtm->rtm_flags,
- wid_dst);
- p_sockaddr("gateway", &gw.u_sa, NULL, RTF_HOST, wid_gw);
+ p_sockaddr("destination", addr[RTAX_DST], addr[RTAX_NETMASK],
+ rtm->rtm_flags, wid_dst);
+ p_sockaddr("gateway", addr[RTAX_GATEWAY], NULL, RTF_HOST, wid_gw);
snprintf(buffer, sizeof(buffer), "{[:-%d}{:flags/%%s}{]:} ",
wid_flags);
p_flags(rtm->rtm_flags, buffer);
@@ -435,7 +422,7 @@ p_sockaddr(const char *name, struct sockaddr *sa, struct sockaddr *mask,
snprintf(buf, sizeof(buf), "{:%s/%%s} ", name);
xo_emit(buf, cp);
} else {
- if (numeric_addr) {
+ if (Wflag != 0 || numeric_addr) {
snprintf(buf, sizeof(buf), "{[:%d}{:%s/%%s}{]:} ",
-width, name);
xo_emit(buf, cp);
@@ -450,107 +437,67 @@ p_sockaddr(const char *name, struct sockaddr *sa, struct sockaddr *mask,
static const char *
fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
{
- static char workbuf[128];
+ static char buf[128];
const char *cp;
if (sa == NULL)
return ("null");
switch(sa->sa_family) {
- case AF_INET:
- {
- struct sockaddr_in *sockin = (struct sockaddr_in *)sa;
-
- if ((sockin->sin_addr.s_addr == INADDR_ANY) &&
- mask &&
- ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr)
- ==0L)
- cp = "default" ;
- else if (flags & RTF_HOST)
- cp = routename(sockin->sin_addr.s_addr);
- else if (mask)
- cp = netname(sockin->sin_addr.s_addr,
- ((struct sockaddr_in *)mask)->sin_addr.s_addr);
- else
- cp = netname(sockin->sin_addr.s_addr, INADDR_ANY);
- break;
- }
-
#ifdef INET6
case AF_INET6:
- {
- struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
-
/*
* The sa6->sin6_scope_id must be filled here because
* this sockaddr is extracted from kmem(4) directly
* and has KAME-specific embedded scope id in
* sa6->sin6_addr.s6_addr[2].
*/
- in6_fillscopeid(sa6);
-
+ in6_fillscopeid(satosin6(sa));
+ /* FALLTHROUGH */
+#endif /*INET6*/
+ case AF_INET:
if (flags & RTF_HOST)
- cp = routename6(sa6);
+ cp = routename(sa, numeric_addr);
else if (mask)
- cp = netname6(sa6,
- &((struct sockaddr_in6 *)mask)->sin6_addr);
- else {
- cp = netname6(sa6, NULL);
- }
+ cp = netname(sa, mask);
+ else
+ cp = netname(sa, NULL);
break;
- }
-#endif /*INET6*/
-
case AF_NETGRAPH:
{
- strlcpy(workbuf, ((struct sockaddr_ng *)sa)->sg_data,
- sizeof(workbuf));
- cp = workbuf;
+ strlcpy(buf, ((struct sockaddr_ng *)sa)->sg_data,
+ sizeof(buf));
+ cp = buf;
break;
}
-
case AF_LINK:
{
+#if 0
struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
- if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 &&
- sdl->sdl_slen == 0) {
- (void) sprintf(workbuf, "link#%d", sdl->sdl_index);
- cp = workbuf;
- } else
- switch (sdl->sdl_type) {
-
- case IFT_ETHER:
- case IFT_L2VLAN:
- case IFT_BRIDGE:
- if (sdl->sdl_alen == ETHER_ADDR_LEN) {
- cp = ether_ntoa((struct ether_addr *)
- (sdl->sdl_data + sdl->sdl_nlen));
- break;
- }
- /* FALLTHROUGH */
- default:
- cp = link_ntoa(sdl);
- break;
- }
+ /* Interface route. */
+ if (sdl->sdl_nlen)
+ cp = sdl->sdl_data;
+ else
+#endif
+ cp = routename(sa, 1);
break;
}
-
default:
{
u_char *s = (u_char *)sa->sa_data, *slim;
char *cq, *cqlim;
- cq = workbuf;
+ cq = buf;
slim = sa->sa_len + (u_char *) sa;
- cqlim = cq + sizeof(workbuf) - 6;
+ cqlim = cq + sizeof(buf) - 6;
cq += sprintf(cq, "(%d)", sa->sa_family);
while (s < slim && cq < cqlim) {
cq += sprintf(cq, " %02x", *s++);
if (s < slim)
cq += sprintf(cq, "%02x", *s++);
}
- cp = workbuf;
+ cp = buf;
}
}
@@ -586,28 +533,35 @@ fmt_flags(int f)
}
char *
-routename(in_addr_t in)
+routename(struct sockaddr *sa, int flags)
{
- char *cp;
- static char line[MAXHOSTNAMELEN];
- struct hostent *hp;
-
- cp = 0;
- if (!numeric_addr) {
- hp = gethostbyaddr(&in, sizeof (struct in_addr), AF_INET);
- if (hp) {
- cp = hp->h_name;
- trimdomain(cp, strlen(cp));
+ static char line[NI_MAXHOST];
+ int error, f;
+
+ f = (flags) ? NI_NUMERICHOST : 0;
+ error = getnameinfo(sa, sa->sa_len, line, sizeof(line),
+ NULL, 0, f);
+ if (error) {
+ const void *src;
+ switch (sa->sa_family) {
+#ifdef INET
+ case AF_INET:
+ src = &satosin(sa)->sin_addr;
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ src = &satosin6(sa)->sin6_addr;
+ break;
+#endif /* INET6 */
+ default:
+ return(line);
}
+ inet_ntop(sa->sa_family, src, line, sizeof(line) - 1);
+ return (line);
}
- if (cp) {
- strlcpy(line, cp, sizeof(line));
- } else {
-#define C(x) ((x) & 0xff)
- in = ntohl(in);
- sprintf(line, "%u.%u.%u.%u",
- C(in >> 24), C(in >> 16), C(in >> 8), C(in));
- }
+ trimdomain(line, strlen(line));
+
return (line);
}
@@ -622,7 +576,7 @@ domask(char *dst, in_addr_t addr __unused, u_long mask)
{
int b, i;
- if (mask == 0 || (!numeric_addr && NSHIFT(mask) != 0)) {
+ if (mask == 0) {
*dst = '\0';
return;
}
@@ -648,14 +602,41 @@ domask(char *dst, in_addr_t addr __unused, u_long mask)
/*
* Return the name of the network whose address is given.
*/
-char *
-netname(in_addr_t in, in_addr_t mask)
+const char *
+netname(struct sockaddr *sa, struct sockaddr *mask)
+{
+ switch (sa->sa_family) {
+ case AF_INET:
+ if (mask != NULL)
+ return (netname4(satosin(sa)->sin_addr.s_addr,
+ satosin(mask)->sin_addr.s_addr));
+ else
+ return (netname4(satosin(sa)->sin_addr.s_addr,
+ INADDR_ANY));
+ break;
+#ifdef INET6
+ case AF_INET6:
+ return (netname6(satosin6(sa), satosin6(mask)));
+#endif /* INET6 */
+ default:
+ return (NULL);
+ }
+}
+
+static const char *
+netname4(in_addr_t in, in_addr_t mask)
{
char *cp = 0;
- static char line[MAXHOSTNAMELEN];
+ static char line[MAXHOSTNAMELEN + sizeof("/xx")];
+ char nline[INET_ADDRSTRLEN];
struct netent *np = 0;
in_addr_t i;
+ if (in == INADDR_ANY && mask == 0) {
+ strlcpy(line, "default", sizeof(line));
+ return (line);
+ }
+
/* It is ok to supply host address. */
in &= mask;
@@ -667,12 +648,15 @@ netname(in_addr_t in, in_addr_t mask)
trimdomain(cp, strlen(cp));
}
}
+ inet_ntop(AF_INET, &in, nline, sizeof(line));
if (cp != NULL) {
+ if (strcpy(cp, nline) != 0)
+ return (line);
strlcpy(line, cp, sizeof(line));
- } else {
- inet_ntop(AF_INET, &in, line, sizeof(line) - 1);
- }
+ } else
+ strlcpy(line, nline, sizeof(line));
domask(line + strlen(line), i, ntohl(mask));
+
return (line);
}
@@ -698,47 +682,35 @@ in6_fillscopeid(struct sockaddr_in6 *sa6)
#endif
}
-const char *
-netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
+/* Mask to length table. To check an invalid value, (length + 1) is used. */
+static int masktolen[256] = {
+ [0xff] = 8 + 1,
+ [0xfe] = 7 + 1,
+ [0xfc] = 6 + 1,
+ [0xf8] = 5 + 1,
+ [0xf0] = 4 + 1,
+ [0xe0] = 3 + 1,
+ [0xc0] = 2 + 1,
+ [0x80] = 1 + 1,
+ [0x00] = 0 + 1,
+};
+
+static const char *
+netname6(struct sockaddr_in6 *sa6, struct sockaddr_in6 *mask)
{
- static char line[MAXHOSTNAMELEN];
- u_char *p = (u_char *)mask;
- u_char *lim;
- int masklen, illegal = 0, flag = 0;
+ static char line[NI_MAXHOST + sizeof("/xxx") - 1];
+ char nline[NI_MAXHOST];
+ u_char *p, *lim;
+ int masklen, illegal = 0;
if (mask) {
+ p = (u_char *)&mask->sin6_addr;
for (masklen = 0, lim = p + 16; p < lim; p++) {
- switch (*p) {
- case 0xff:
- masklen += 8;
- break;
- case 0xfe:
- masklen += 7;
- break;
- case 0xfc:
- masklen += 6;
- break;
- case 0xf8:
- masklen += 5;
- break;
- case 0xf0:
- masklen += 4;
- break;
- case 0xe0:
- masklen += 3;
- break;
- case 0xc0:
- masklen += 2;
- break;
- case 0x80:
- masklen += 1;
- break;
- case 0x00:
- break;
- default:
- illegal ++;
- break;
- }
+ if (masktolen[*p] > 0)
+ /* -1 is required. */
+ masklen += masktolen[*p] - 1;
+ else
+ illegal++;
}
if (illegal)
xo_error("illegal prefixlen\n");
@@ -749,37 +721,17 @@ netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
if (masklen == 0 && IN6_IS_ADDR_UNSPECIFIED(&sa6->sin6_addr))
return("default");
+ getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, nline, sizeof(nline),
+ NULL, 0, NI_NUMERICHOST);
if (numeric_addr)
- flag |= NI_NUMERICHOST;
- getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, line, sizeof(line),
- NULL, 0, flag);
-
- if (numeric_addr)
+ strlcpy(line, nline, sizeof(line));
+ else
+ getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, line,
+ sizeof(line), NULL, 0, 0);
+ if (numeric_addr || strcmp(line, nline) == 0)
sprintf(&line[strlen(line)], "/%d", masklen);
- return line;
-}
-
-char *
-routename6(struct sockaddr_in6 *sa6)
-{
- static char line[MAXHOSTNAMELEN];
- int flag = 0;
- /* use local variable for safety */
- struct sockaddr_in6 sa6_local;
-
- sa6_local.sin6_family = AF_INET6;
- sa6_local.sin6_len = sizeof(sa6_local);
- sa6_local.sin6_addr = sa6->sin6_addr;
- sa6_local.sin6_scope_id = sa6->sin6_scope_id;
-
- if (numeric_addr)
- flag |= NI_NUMERICHOST;
-
- getnameinfo((struct sockaddr *)&sa6_local, sa6_local.sin6_len,
- line, sizeof(line), NULL, 0, flag);
-
- return line;
+ return (line);
}
#endif /*INET6*/
diff --git a/usr.bin/netstat/sctp.c b/usr.bin/netstat/sctp.c
index e7419df815ec..f721a966c77d 100644
--- a/usr.bin/netstat/sctp.c
+++ b/usr.bin/netstat/sctp.c
@@ -79,7 +79,7 @@ static void sctp_statesprint(uint32_t state);
#define NETSTAT_SCTP_STATES_SHUTDOWN_ACK_SENT 0x8
#define NETSTAT_SCTP_STATES_SHUTDOWN_PENDING 0x9
-const char *sctpstates[] = {
+static const char *sctpstates[] = {
"CLOSED",
"BOUND",
"LISTEN",
@@ -92,13 +92,13 @@ const char *sctpstates[] = {
"SHUTDOWN_PENDING"
};
-LIST_HEAD(xladdr_list, xladdr_entry) xladdr_head;
+static LIST_HEAD(xladdr_list, xladdr_entry) xladdr_head;
struct xladdr_entry {
struct xsctp_laddr *xladdr;
LIST_ENTRY(xladdr_entry) xladdr_entries;
};
-LIST_HEAD(xraddr_list, xraddr_entry) xraddr_head;
+static LIST_HEAD(xraddr_list, xraddr_entry) xraddr_head;
struct xraddr_entry {
struct xsctp_raddr *xraddr;
LIST_ENTRY(xraddr_entry) xraddr_entries;