From owner-svn-src-all@FreeBSD.ORG Sat Feb 21 23:47:22 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 1F7BC355; Sat, 21 Feb 2015 23:47:22 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0862C9C3; Sat, 21 Feb 2015 23:47:22 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t1LNlMTM049465; Sat, 21 Feb 2015 23:47:22 GMT (envelope-from marcel@FreeBSD.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t1LNlK5o049455; Sat, 21 Feb 2015 23:47:20 GMT (envelope-from marcel@FreeBSD.org) Message-Id: <201502212347.t1LNlK5o049455@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: marcel set sender to marcel@FreeBSD.org using -f From: Marcel Moolenaar Date: Sat, 21 Feb 2015 23:47:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r279122 - head/usr.bin/netstat X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Feb 2015 23:47:22 -0000 Author: marcel Date: Sat Feb 21 23:47:20 2015 New Revision: 279122 URL: https://svnweb.freebsd.org/changeset/base/279122 Log: Convert netstat to use libxo. Obtained from: Phil Shafer Ported to -current by: alfred@ (mostly), Kim Shrier Formatting: marcel@ Sponsored by: Juniper Networks, Inc. Modified: head/usr.bin/netstat/Makefile head/usr.bin/netstat/bpf.c head/usr.bin/netstat/flowtable.c head/usr.bin/netstat/if.c head/usr.bin/netstat/inet.c head/usr.bin/netstat/inet6.c head/usr.bin/netstat/ipsec.c head/usr.bin/netstat/main.c head/usr.bin/netstat/mbuf.c head/usr.bin/netstat/mroute.c head/usr.bin/netstat/mroute6.c head/usr.bin/netstat/netgraph.c head/usr.bin/netstat/netisr.c head/usr.bin/netstat/netstat.h head/usr.bin/netstat/pfkey.c head/usr.bin/netstat/route.c head/usr.bin/netstat/sctp.c head/usr.bin/netstat/unix.c Modified: head/usr.bin/netstat/Makefile ============================================================================== --- head/usr.bin/netstat/Makefile Sat Feb 21 23:39:43 2015 (r279121) +++ head/usr.bin/netstat/Makefile Sat Feb 21 23:47:20 2015 (r279122) @@ -41,4 +41,6 @@ LIBADD+= netgraph CFLAGS+=-DNETGRAPH .endif +LIBADD+= xo + .include Modified: head/usr.bin/netstat/bpf.c ============================================================================== --- head/usr.bin/netstat/bpf.c Sat Feb 21 23:39:43 2015 (r279121) +++ head/usr.bin/netstat/bpf.c Sat Feb 21 23:47:20 2015 (r279122) @@ -46,8 +46,10 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include +#include #include "netstat.h" @@ -67,7 +69,7 @@ bpf_pidname(pid_t pid) size = sizeof(newkp); error = sysctl(mib, 4, &newkp, &size, NULL, 0); if (error < 0) { - warn("kern.proc.pid failed"); + xo_warn("kern.proc.pid failed"); return (strdup("??????")); } return (strdup(newkp.ki_comm)); @@ -86,6 +88,21 @@ bpf_flags(struct xbpf_d *bd, char *flagb *flagbuf++ = bd->bd_async ? 'a' : '-'; *flagbuf++ = bd->bd_locked ? 'l' : '-'; *flagbuf++ = '\0'; + + if (bd->bd_promisc) + xo_emit("{e:promiscuous/}"); + if (bd->bd_immediate) + xo_emit("{e:immediate/}"); + if (bd->bd_hdrcmplt) + xo_emit("{e:header-complete/}"); + xo_emit("{e:direction}", (bd->bd_direction == BPF_D_IN) ? "input" : + (bd->bd_direction == BPF_D_OUT) ? "output" : "bidirectional"); + if (bd->bd_feedback) + xo_emit("{e:feedback/}"); + if (bd->bd_async) + xo_emit("{e:async/}"); + if (bd->bd_locked) + xo_emit("{e:locked/}"); } void @@ -99,44 +116,55 @@ bpf_stats(char *ifname) bzero(&zerostat, sizeof(zerostat)); if (sysctlbyname("net.bpf.stats", NULL, NULL, &zerostat, sizeof(zerostat)) < 0) - warn("failed to zero bpf counters"); + xo_warn("failed to zero bpf counters"); return; } if (sysctlbyname("net.bpf.stats", NULL, &size, NULL, 0) < 0) { - warn("net.bpf.stats"); + xo_warn("net.bpf.stats"); return; } if (size == 0) return; bd = malloc(size); if (bd == NULL) { - warn("malloc failed"); + xo_warn("malloc failed"); return; } if (sysctlbyname("net.bpf.stats", bd, &size, NULL, 0) < 0) { - warn("net.bpf.stats"); + xo_warn("net.bpf.stats"); free(bd); return; } - (void) printf("%5s %6s %7s %9s %9s %9s %5s %5s %s\n", - "Pid", "Netif", "Flags", "Recv", "Drop", "Match", "Sblen", - "Hblen", "Command"); + xo_emit("{T:/%5s} {T:/%6s} {T:/%7s} {T:/%9s} {T:/%9s} {T:/%9s} " + "{T:/%5s} {T:/%5s} {T:/%s}\n", + "Pid", "Netif", "Flags", "Recv", "Drop", "Match", + "Sblen", "Hblen", "Command"); + xo_open_container("bpf-statistics"); + xo_open_list("bpf-entry"); for (d = &bd[0]; d < &bd[size / sizeof(*d)]; d++) { if (d->bd_structsize != sizeof(*d)) { - warnx("bpf_stats_extended: version mismatch"); + xo_warnx("bpf_stats_extended: version mismatch"); return; } if (ifname && strcmp(ifname, d->bd_ifname) != 0) continue; - bpf_flags(d, flagbuf); + xo_open_instance("bpf-entry"); pname = bpf_pidname(d->bd_pid); - (void) printf("%5d %6s %7s %9ju %9ju %9ju %5d %5d %s\n", - d->bd_pid, d->bd_ifname, flagbuf, - d->bd_rcount, d->bd_dcount, d->bd_fcount, - d->bd_slen, d->bd_hlen, pname); + xo_emit("{k:pid/%5d} {k:interface-name/%6s} ", + d->bd_pid, d->bd_ifname); + bpf_flags(d, flagbuf); + xo_emit("{d:flags/%7s} {:received-packets/%9ju} " + "{:dropped-packets/%9ju} {:filter-packets/%9ju} " + "{:store-buffer-length/%5d} {:hold-buffer-length/%5d} " + "{:process/%s}\n", + flagbuf, (uintmax_t)d->bd_rcount, (uintmax_t)d->bd_dcount, + (uintmax_t)d->bd_fcount, d->bd_slen, d->bd_hlen, pname); free(pname); + xo_close_instance("bpf-entry"); } + xo_close_list("bpf-entry"); + xo_close_container("bpf-statistics"); free(bd); } Modified: head/usr.bin/netstat/flowtable.c ============================================================================== --- head/usr.bin/netstat/flowtable.c Sat Feb 21 23:39:43 2015 (r279121) +++ head/usr.bin/netstat/flowtable.c Sat Feb 21 23:47:20 2015 (r279122) @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "netstat.h" /* Modified: head/usr.bin/netstat/if.c ============================================================================== --- head/usr.bin/netstat/if.c Sat Feb 21 23:39:43 2015 (r279121) +++ head/usr.bin/netstat/if.c Sat Feb 21 23:47:20 2015 (r279122) @@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "netstat.h" @@ -98,14 +99,38 @@ static const char* pfsyncacts[] = { /* PFSYNC_ACT_EOF */ "end of frame mark", }; +static const char* pfsyncacts_name[] = { + /* PFSYNC_ACT_CLR */ "clear-all-request", + /* PFSYNC_ACT_INS */ "state-insert", + /* PFSYNC_ACT_INS_ACK */ "state-inserted-ack", + /* PFSYNC_ACT_UPD */ "state-update", + /* PFSYNC_ACT_UPD_C */ "compressed-state-update", + /* PFSYNC_ACT_UPD_REQ */ "uncompressed-state-request", + /* PFSYNC_ACT_DEL */ "state-delete", + /* PFSYNC_ACT_DEL_C */ "compressed-state-delete", + /* PFSYNC_ACT_INS_F */ "fragment-insert", + /* PFSYNC_ACT_DEL_F */ "fragment-delete", + /* PFSYNC_ACT_BUS */ "bulk-update-mark", + /* PFSYNC_ACT_TDB */ "TDB-replay-counter-update", + /* PFSYNC_ACT_EOF */ "end-of-frame-mark", +}; + static void -pfsync_acts_stats(const char *fmt, uint64_t *a) +pfsync_acts_stats(const char *list, const char *desc, uint64_t *a) { int i; - for (i = 0; i < PFSYNC_ACT_MAX; i++, a++) - if (*a || sflag <= 1) - printf(fmt, *a, pfsyncacts[i], plural(*a)); + xo_open_list(list); + for (i = 0; i < PFSYNC_ACT_MAX; i++, a++) { + if (*a || sflag <= 1) { + xo_open_instance(list); + xo_emit("\t\t{e:name}{:count/%ju} {N:/%s%s %s}\n", + pfsyncacts_name[i], (uintmax_t)(*a), + pfsyncacts[i], plural(*a), desc); + xo_close_instance(list); + } + } + xo_close_list(list); } /* @@ -129,32 +154,50 @@ pfsync_stats(u_long off, const char *nam } else kread(off, &pfsyncstat, len); - printf("%s:\n", name); + xo_emit("{T:/%s}:\n", name); + xo_open_container(name); #define p(f, m) if (pfsyncstat.f || sflag <= 1) \ - printf(m, (uintmax_t)pfsyncstat.f, plural(pfsyncstat.f)) + xo_emit(m, (uintmax_t)pfsyncstat.f, plural(pfsyncstat.f)) - p(pfsyncs_ipackets, "\t%ju packet%s received (IPv4)\n"); - p(pfsyncs_ipackets6, "\t%ju packet%s received (IPv6)\n"); - pfsync_acts_stats("\t %ju %s%s received\n", + p(pfsyncs_ipackets, "\t{:received-inet-packets/%ju} " + "{N:/packet%s received (IPv4)}\n"); + p(pfsyncs_ipackets6, "\t{:received-inet6-packets/%ju} " + "{N:/packet%s received (IPv6)}\n"); + pfsync_acts_stats("input-histogram", "received", &pfsyncstat.pfsyncs_iacts[0]); - p(pfsyncs_badif, "\t\t%ju packet%s discarded for bad interface\n"); - p(pfsyncs_badttl, "\t\t%ju packet%s discarded for bad ttl\n"); - p(pfsyncs_hdrops, "\t\t%ju packet%s shorter than header\n"); - p(pfsyncs_badver, "\t\t%ju packet%s discarded for bad version\n"); - p(pfsyncs_badauth, "\t\t%ju packet%s discarded for bad HMAC\n"); - p(pfsyncs_badact,"\t\t%ju packet%s discarded for bad action\n"); - p(pfsyncs_badlen, "\t\t%ju packet%s discarded for short packet\n"); - p(pfsyncs_badval, "\t\t%ju state%s discarded for bad values\n"); - p(pfsyncs_stale, "\t\t%ju stale state%s\n"); - p(pfsyncs_badstate, "\t\t%ju failed state lookup/insert%s\n"); - p(pfsyncs_opackets, "\t%ju packet%s sent (IPv4)\n"); - p(pfsyncs_opackets6, "\t%ju packet%s sent (IPv6)\n"); - pfsync_acts_stats("\t %ju %s%s sent\n", + p(pfsyncs_badif, "\t\t/{:dropped-bad-interface/%ju} " + "{N:/packet%s discarded for bad interface}\n"); + p(pfsyncs_badttl, "\t\t{:dropped-bad-ttl/%ju} " + "{N:/packet%s discarded for bad ttl}\n"); + p(pfsyncs_hdrops, "\t\t{:dropped-short-header/%ju} " + "{N:/packet%s shorter than header}\n"); + p(pfsyncs_badver, "\t\t{:dropped-bad-version/%ju} " + "{N:/packet%s discarded for bad version}\n"); + p(pfsyncs_badauth, "\t\t{:dropped-bad-auth/%ju} " + "{N:/packet%s discarded for bad HMAC}\n"); + p(pfsyncs_badact,"\t\t{:dropped-bad-action/%ju} " + "{N:/packet%s discarded for bad action}\n"); + p(pfsyncs_badlen, "\t\t{:dropped-short/%ju} " + "{N:/packet%s discarded for short packet}\n"); + p(pfsyncs_badval, "\t\t{:dropped-bad-values/%ju} " + "{N:/state%s discarded for bad values}\n"); + p(pfsyncs_stale, "\t\t{:dropped-stale-state/%ju} " + "{N:/stale state%s}\n"); + p(pfsyncs_badstate, "\t\t{:dropped-failed-lookup/%ju} " + "{N:/failed state lookup\\/insert%s}\n"); + p(pfsyncs_opackets, "\t{:sent-inet-packets/%ju} " + "{N:/packet%s sent (IPv4})\n"); + p(pfsyncs_opackets6, "\t{:send-inet6-packets/%ju} " + "{N:/packet%s sent (IPv6})\n"); + pfsync_acts_stats("output-histogram", "sent", &pfsyncstat.pfsyncs_oacts[0]); - p(pfsyncs_onomem, "\t\t%ju failure%s due to mbuf memory error\n"); - p(pfsyncs_oerrors, "\t\t%ju send error%s\n"); + p(pfsyncs_onomem, "\t\t{:discarded-no-memory/%ju} " + "{N:/failure%s due to mbuf memory error}\n"); + p(pfsyncs_oerrors, "\t\t{:send-errors/%ju} " + "{N:/send error%s}\n"); #undef p + xo_close_container(name); } #endif /* PF */ @@ -162,10 +205,11 @@ pfsync_stats(u_long off, const char *nam * Display a formatted value, or a '-' in the same space. */ static void -show_stat(const char *fmt, int width, u_long value, short showvalue) +show_stat(const char *fmt, int width, const char *name, + u_long value, short showvalue) { const char *lsep, *rsep; - char newfmt[32]; + char newfmt[64]; lsep = ""; if (strncmp(fmt, "LS", 2) == 0) { @@ -179,23 +223,42 @@ show_stat(const char *fmt, int width, u_ } if (showvalue == 0) { /* Print just dash. */ - sprintf(newfmt, "%s%%%ds%s", lsep, width, rsep); - printf(newfmt, "-"); + xo_emit("{P:/%s}{D:/%*s}{P:/%s}", lsep, width, "-", rsep); return; } + /* + * XXX: workaround {P:} modifier can't be empty and doesn't seem to + * take args... so we need to conditionally include it in the format. + */ +#define maybe_pad(pad) do { \ + if (strlen(pad)) { \ + snprintf(newfmt, sizeof(newfmt), "{P:%s}", pad); \ + xo_emit(newfmt); \ + } \ +} while (0) + if (hflag) { char buf[5]; /* Format in human readable form. */ humanize_number(buf, sizeof(buf), (int64_t)value, "", HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL); - sprintf(newfmt, "%s%%%ds%s", lsep, width, rsep); - printf(newfmt, buf); + snprintf(newfmt, sizeof(newfmt), "%s%%%ds%s", + lsep, width, rsep); + xo_emit(newfmt, buf); + xo_attr("value", "%lu", value); + maybe_pad(lsep); + snprintf(newfmt, sizeof(newfmt), "{:%s/%%%ds}", name, width); + xo_emit(newfmt, buf); + maybe_pad(rsep); } else { /* Construct the format string. */ - sprintf(newfmt, "%s%%%d%s%s", lsep, width, fmt, rsep); - printf(newfmt, value); + maybe_pad(lsep); + snprintf(newfmt, sizeof(newfmt), "{:%s/%%%d%s}", + name, width, fmt); + xo_emit(newfmt, value); + maybe_pad(rsep); } } @@ -235,34 +298,37 @@ intpr(int interval, void (*pfunc)(char * if (aflag && getifmaddrs(&ifmap) != 0) err(EX_OSERR, "getifmaddrs"); + xo_open_list("interface"); if (!pfunc) { if (Wflag) - printf("%-7.7s", "Name"); + xo_emit("{T:/%-7.7s}", "Name"); else - printf("%-5.5s", "Name"); - printf(" %5.5s %-13.13s %-17.17s %8.8s %5.5s %5.5s", + xo_emit("{T:/%-5.5s}", "Name"); + xo_emit(" {T:/%5.5s} {T:/%-13.13s} {T:/%-17.17s} {T:/%8.8s} " + "{T:/%5.5s} {T:/%5.5s}", "Mtu", "Network", "Address", "Ipkts", "Ierrs", "Idrop"); if (bflag) - printf(" %10.10s","Ibytes"); - printf(" %8.8s %5.5s", "Opkts", "Oerrs"); + xo_emit(" {T:/%10.10s}","Ibytes"); + xo_emit(" {T:/%8.8s} {T:/%5.5s}", "Opkts", "Oerrs"); if (bflag) - printf(" %10.10s","Obytes"); - printf(" %5s", "Coll"); + xo_emit(" {T:/%10.10s}","Obytes"); + xo_emit(" {T:/%5s}", "Coll"); if (dflag) - printf(" %s", "Drop"); - putchar('\n'); + xo_emit(" {T:/%s}", "Drop"); + xo_emit("\n"); } for (ifa = ifap; ifa; ifa = ifa->ifa_next) { bool network = false, link = false; + char *name; if (interface != NULL && strcmp(ifa->ifa_name, interface) != 0) continue; + name = ifa->ifa_name; + if (pfunc) { - char *name; - name = ifa->ifa_name; (*pfunc)(name); /* @@ -278,19 +344,21 @@ intpr(int interval, void (*pfunc)(char * if (af != AF_UNSPEC && ifa->ifa_addr->sa_family != af) continue; + xo_open_instance("interface"); + if (Wflag) - printf("%-7.7s", ifa->ifa_name); + xo_emit("{tk:name/%-7.7s}", name); else - printf("%-5.5s", ifa->ifa_name); + xo_emit("{tk:name/%-5.5s}", name); #define IFA_MTU(ifa) (((struct if_data *)(ifa)->ifa_data)->ifi_mtu) - show_stat("lu", 6, IFA_MTU(ifa), IFA_MTU(ifa)); + show_stat("lu", 6, "mtu", IFA_MTU(ifa), IFA_MTU(ifa)); #undef IFA_MTU switch (ifa->ifa_addr->sa_family) { case AF_UNSPEC: - printf("%-13.13s ", "none"); - printf("%-15.15s ", "none"); + xo_emit("{:network/%-13.13s} ", "none"); + xo_emit("{:address/%-15.15s} ", "none"); break; case AF_INET: { @@ -298,9 +366,10 @@ intpr(int interval, void (*pfunc)(char * sin = (struct sockaddr_in *)ifa->ifa_addr; mask = (struct sockaddr_in *)ifa->ifa_netmask; - printf("%-13.13s ", netname(sin->sin_addr.s_addr, + xo_emit("{t:network/%-13.13s} ", + netname(sin->sin_addr.s_addr, mask->sin_addr.s_addr)); - printf("%-17.17s ", + xo_emit("{t:address/%-17.17s} ", routename(sin->sin_addr.s_addr)); network = true; @@ -314,67 +383,82 @@ intpr(int interval, void (*pfunc)(char * sin6 = (struct sockaddr_in6 *)ifa->ifa_addr; mask = (struct sockaddr_in6 *)ifa->ifa_netmask; - printf("%-13.13s ", netname6(sin6, &mask->sin6_addr)); + 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); - printf("%-17.17s ", addr_buf); + xo_emit("{t:address/%-17.17s} ", addr_buf); network = 1; break; - } + } #endif /* INET6 */ case AF_LINK: { struct sockaddr_dl *sdl; char *cp, linknum[10]; - int n, m; + int len = 32; + char buf[len]; + int n, z; sdl = (struct sockaddr_dl *)ifa->ifa_addr; cp = (char *)LLADDR(sdl); n = sdl->sdl_alen; sprintf(linknum, "", sdl->sdl_index); - m = printf("%-13.13s ", linknum); - - while ((--n >= 0) && (m < 30)) - m += printf("%02x%c", *cp++ & 0xff, - n > 0 ? ':' : ' '); - m = 32 - m; - while (m-- > 0) - putchar(' '); - + 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 + xo_emit("{P: }"); link = 1; break; } } #define IFA_STAT(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s) - show_stat("lu", 8, IFA_STAT(ipackets), link|network); - show_stat("lu", 5, IFA_STAT(ierrors), link); - show_stat("lu", 5, IFA_STAT(iqdrops), link); + show_stat("lu", 8, "received-packets", IFA_STAT(ipackets), + link|network); + show_stat("lu", 5, "received-errors", IFA_STAT(ierrors), link); + show_stat("lu", 5, "dropped-packet", IFA_STAT(iqdrops), link); if (bflag) - show_stat("lu", 10, IFA_STAT(ibytes), link|network); - show_stat("lu", 8, IFA_STAT(opackets), link|network); - show_stat("lu", 5, IFA_STAT(oerrors), link); + show_stat("lu", 10, "received-bytes", IFA_STAT(ibytes), + link|network); + show_stat("lu", 8, "sent-packets", IFA_STAT(opackets), + link|network); + show_stat("lu", 5, "send-errors", IFA_STAT(oerrors), link); if (bflag) - show_stat("lu", 10, IFA_STAT(obytes), link|network); - show_stat("NRSlu", 5, IFA_STAT(collisions), link); + show_stat("lu", 10, "sent-bytes", IFA_STAT(obytes), + link|network); + show_stat("NRSlu", 5, "collisions", IFA_STAT(collisions), link); if (dflag) - show_stat("LSlu", 5, IFA_STAT(oqdrops), link); - putchar('\n'); + show_stat("LSlu", 5, "dropped-packets", + IFA_STAT(oqdrops), link); + xo_emit("\n"); - if (!aflag) + if (!aflag) { + xo_close_instance("interface"); continue; + } /* * Print family's multicast addresses. */ + xo_open_list("multicast-address"); for (ifma = next_ifma(ifmap, ifa->ifa_name, - ifa->ifa_addr->sa_family); - ifma != NULL; - ifma = next_ifma(ifma, ifa->ifa_name, - ifa->ifa_addr->sa_family)) { + ifa->ifa_addr->sa_family); + ifma != NULL; + ifma = next_ifma(ifma, ifa->ifa_name, + ifa->ifa_addr->sa_family)) { const char *fmt = NULL; + xo_open_instance("multicast-address"); switch (ifma->ifma_addr->sa_family) { case AF_INET: { @@ -391,7 +475,7 @@ intpr(int interval, void (*pfunc)(char * getnameinfo(ifma->ifma_addr, ifma->ifma_addr->sa_len, addr_buf, sizeof(addr_buf), 0, 0, NI_NUMERICHOST); - printf("%*s %s\n", + xo_emit("{P:/%*s }{t:address/%-19.19s}", Wflag ? 27 : 25, "", addr_buf); break; #endif /* INET6 */ @@ -412,21 +496,24 @@ intpr(int interval, void (*pfunc)(char * } if (fmt) { - printf("%*s %-17.17s", + xo_emit("{P:/%*s }{t:address/%-17.17s/}", Wflag ? 27 : 25, "", fmt); if (ifma->ifma_addr->sa_family == AF_LINK) { - printf(" %8ju", - (uintmax_t )IFA_STAT(imcasts)); - printf("%*s", bflag ? 17 : 6, ""); - printf(" %8ju", - (uintmax_t )IFA_STAT(omcasts)); - } - putchar('\n'); + xo_emit(" {:received-packets/%8lu}", + IFA_STAT(imcasts)); + xo_emit("{P:/%*s}", bflag? 17 : 6, ""); + xo_emit(" {:sent-packets/%8lu}", + IFA_STAT(omcasts)); + } + xo_emit("\n"); } - + xo_close_instance("multicast-address"); ifma = ifma->ifma_next; } + xo_close_list("multicast-address"); + xo_close_instance("interface"); } + xo_close_list("interface"); freeifaddrs(ifap); if (aflag) @@ -455,7 +542,7 @@ fill_iftot(struct iftot *st) bool found = false; if (getifaddrs(&ifap) != 0) - err(EX_OSERR, "getifaddrs"); + xo_err(EX_OSERR, "getifaddrs"); bzero(st, sizeof(*st)); @@ -481,7 +568,7 @@ fill_iftot(struct iftot *st) } if (interface && found == false) - err(EX_DATAERR, "interface %s not found", interface); + xo_err(EX_DATAERR, "interface %s not found", interface); freeifaddrs(ifap); } @@ -520,23 +607,26 @@ sidewaysintpr(int interval) interval_it.it_interval.tv_usec = 0; interval_it.it_value = interval_it.it_interval; setitimer(ITIMER_REAL, &interval_it, NULL); + xo_open_list("interface-statistics"); banner: - printf("%17s %14s %16s", "input", + xo_emit("{T:/%17s} {T:/%14s} {T:/%16s}\n", "input", interface != NULL ? interface : "(Total)", "output"); - putchar('\n'); - printf("%10s %5s %5s %10s %10s %5s %10s %5s", + xo_emit("{T:/%10s} {T:/%5s} {T:/%5s} {T:/%10s} {T:/%10s} {T:/%5s} " + "{T:/%10s} {T:/%5s}", "packets", "errs", "idrops", "bytes", "packets", "errs", "bytes", "colls"); if (dflag) - printf(" %5.5s", "drops"); - putchar('\n'); - fflush(stdout); + xo_emit(" {T:/%5.5s}", "drops"); + xo_emit("\n"); + xo_flush(); line = 0; loop: - if ((noutputs != 0) && (--noutputs == 0)) - exit(0); + if ((noutputs != 0) && (--noutputs == 0)) { + xo_close_list("interface-statistics"); + return; + } oldmask = sigblock(sigmask(SIGALRM)); while (!signalled) sigpause(0); @@ -546,18 +636,29 @@ loop: fill_iftot(new); - show_stat("lu", 10, new->ift_ip - old->ift_ip, 1); - show_stat("lu", 5, new->ift_ie - old->ift_ie, 1); - show_stat("lu", 5, new->ift_id - old->ift_id, 1); - show_stat("lu", 10, new->ift_ib - old->ift_ib, 1); - show_stat("lu", 10, new->ift_op - old->ift_op, 1); - show_stat("lu", 5, new->ift_oe - old->ift_oe, 1); - show_stat("lu", 10, new->ift_ob - old->ift_ob, 1); - show_stat("NRSlu", 5, new->ift_co - old->ift_co, 1); + xo_open_instance("stats"); + show_stat("lu", 10, "received-packets", + new->ift_ip - old->ift_ip, 1); + show_stat("lu", 5, "received-errors", + new->ift_ie - old->ift_ie, 1); + show_stat("lu", 5, "dropped-packets", + new->ift_id - old->ift_id, 1); + show_stat("lu", 10, "received-bytes", + new->ift_ib - old->ift_ib, 1); + show_stat("lu", 10, "sent-packets", + new->ift_op - old->ift_op, 1); + show_stat("lu", 5, "send-errors", + new->ift_oe - old->ift_oe, 1); + show_stat("lu", 10, "sent-bytes", + new->ift_ob - old->ift_ob, 1); + show_stat("NRSlu", 5, "collisions", + new->ift_co - old->ift_co, 1); if (dflag) - show_stat("LSlu", 5, new->ift_od - old->ift_od, 1); - putchar('\n'); - fflush(stdout); + show_stat("LSlu", 5, "dropped-packets", + new->ift_od - old->ift_od, 1); + xo_close_instance("stats"); + xo_emit("\n"); + xo_flush(); if (new == &ift[0]) { new = &ift[1]; Modified: head/usr.bin/netstat/inet.c ============================================================================== --- head/usr.bin/netstat/inet.c Sat Feb 21 23:39:43 2015 (r279121) +++ head/usr.bin/netstat/inet.c Sat Feb 21 23:47:20 2015 (r279122) @@ -78,12 +78,14 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include +#include #include "netstat.h" char *inetname(struct in_addr *); -void inetprint(struct in_addr *, int, const char *, int); +void inetprint(const char *, struct in_addr *, int, const char *, int); #ifdef INET6 static int udp_done, tcp_done, sdp_done; #endif /* INET6 */ @@ -114,15 +116,15 @@ pcblist_sysctl(int proto, const char *na len = 0; if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) { if (errno != ENOENT) - warn("sysctl: %s", mibvar); + xo_warn("sysctl: %s", mibvar); return (0); } if ((buf = malloc(len)) == 0) { - warnx("malloc %lu bytes", (u_long)len); + xo_warnx("malloc %lu bytes", (u_long)len); return (0); } if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) { - warn("sysctl: %s", mibvar); + xo_warn("sysctl: %s", mibvar); free(buf); return (0); } @@ -205,14 +207,14 @@ pcblist_kvm(u_long off, char **bufp, int (pcbinfo.ipi_count + pcbinfo.ipi_count / 8) * sizeof(struct xinpcb); if ((buf = malloc(len)) == 0) { - warnx("malloc %lu bytes", (u_long)len); + xo_warnx("malloc %lu bytes", (u_long)len); return (0); } p = buf; #define COPYOUT(obj, size) do { \ if (len < (size)) { \ - warnx("buffer size exceeded"); \ + xo_warnx("buffer size exceeded"); \ goto fail; \ } \ bcopy((obj), p, (size)); \ @@ -349,8 +351,8 @@ protopr(u_long off, const char *name, in oxig = xig = (struct xinpgen *)buf; for (xig = (struct xinpgen *)((char *)xig + xig->xig_len); - xig->xig_len > sizeof(struct xinpgen); - xig = (struct xinpgen *)((char *)xig + xig->xig_len)) { + xig->xig_len > sizeof(struct xinpgen); + xig = (struct xinpgen *)((char *)xig + xig->xig_len)) { if (istcp) { timer = &((struct xtcpcb *)xig)->xt_timer; tp = &((struct xtcpcb *)xig)->xt_tp; @@ -403,186 +405,218 @@ protopr(u_long off, const char *name, in if (first) { if (!Lflag) { - printf("Active Internet connections"); + xo_emit("Active Internet connections"); if (aflag) - printf(" (including servers)"); + xo_emit(" (including servers)"); } else - printf( + xo_emit( "Current listen queue sizes (qlen/incqlen/maxqlen)"); - putchar('\n'); + xo_emit("\n"); if (Aflag) - printf("%-*s ", 2 * (int)sizeof(void *), "Tcpcb"); + xo_emit("{T:/%-*s} ", 2 * (int)sizeof(void *), + "Tcpcb"); if (Lflag) - printf((Aflag && !Wflag) ? - "%-5.5s %-14.14s %-18.18s" : - "%-5.5s %-14.14s %-22.22s", + xo_emit((Aflag && !Wflag) ? + "{T:/%-5.5s} {T:/%-14.14s} {T:/%-18.18s}" : + "{T:/%-5.5s} {T:/%-14.14s} {T:/%-22.22s}", "Proto", "Listen", "Local Address"); else if (Tflag) - printf((Aflag && !Wflag) ? - "%-5.5s %-6.6s %-6.6s %-6.6s %-18.18s %s" : - "%-5.5s %-6.6s %-6.6s %-6.6s %-22.22s %s", + xo_emit((Aflag && !Wflag) ? + "{T:/%-5.5s} {T:/%-6.6s} {T:/%-6.6s} {T:/%-6.6s} {T:/%-18.18s} {T:/%s}" : + "{T:/%-5.5s} {T:/%-6.6s} {T:/%-6.6s} {T:/%-6.6s} {T:/%-22.22s} {T:/%s}", "Proto", "Rexmit", "OOORcv", "0-win", "Local Address", "Foreign Address"); else { - printf((Aflag && !Wflag) ? - "%-5.5s %-6.6s %-6.6s %-18.18s %-18.18s" : - "%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s", - "Proto", "Recv-Q", "Send-Q", - "Local Address", "Foreign Address"); + xo_emit((Aflag && !Wflag) ? + "{T:/%-5.5s} {T:/%-6.6s} {T:/%-6.6s} {T:/%-18.18s} {T:/%-18.18s}" : + "{T:/%-5.5s} {T:/%-6.6s} {T:/%-6.6s} {T:/%-22.22s} {T:/%-22.22s}", + "Proto", "Recv-Q", "Send-Q", + "Local Address", "Foreign Address"); if (!xflag && !Rflag) - printf(" (state)"); + xo_emit(" (state)"); } if (xflag) { - printf(" %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s", - "R-MBUF", "S-MBUF", "R-CLUS", - "S-CLUS", "R-HIWA", "S-HIWA", - "R-LOWA", "S-LOWA", "R-BCNT", - "S-BCNT", "R-BMAX", "S-BMAX"); - printf(" %7.7s %7.7s %7.7s %7.7s %7.7s %7.7s", - "rexmt", "persist", "keep", - "2msl", "delack", "rcvtime"); + xo_emit(" {T:/%-6.6s} {T:/%-6.6s} {T:/%-6.6s} " + "{T:/%-6.6s} {T:/%-6.6s} {T:/%-6.6s} " + "{T:/%-6.6s} {T:/%-6.6s} {T:/%-6.6s} " + "{T:/%-6.6s} {T:/%-6.6s} {T:/%-6.6s}", + "R-MBUF", "S-MBUF", "R-CLUS", "S-CLUS", + "R-HIWA", "S-HIWA", "R-LOWA", "S-LOWA", + "R-BCNT", "S-BCNT", "R-BMAX", "S-BMAX"); + xo_emit(" {T:/%7.7s} {T:/%7.7s} {T:/%7.7s} " + "{T:/%7.7s} {T:/%7.7s} {T:/%7.7s}", + "rexmt", "persist", "keep", "2msl", + "delack", "rcvtime"); } else if (Rflag) { - printf (" %8.8s %5.5s", + xo_emit(" {T:/%8.8s} {T:/%5.5s}", "flowid", "ftype"); } - putchar('\n'); + xo_emit("\n"); first = 0; } if (Lflag && so->so_qlimit == 0) continue; + xo_open_instance("socket"); if (Aflag) { if (istcp) - printf("%*lx ", 2 * (int)sizeof(void *), (u_long)inp->inp_ppcb); + xo_emit("{q:address/%*lx} ", + 2 * (int)sizeof(void *), + (u_long)inp->inp_ppcb); else - printf("%*lx ", 2 * (int)sizeof(void *), (u_long)so->so_pcb); + xo_emit("{q:adddress/%*lx} ", + 2 * (int)sizeof(void *), + (u_long)so->so_pcb); } #ifdef INET6 if ((inp->inp_vflag & INP_IPV6) != 0) vchar = ((inp->inp_vflag & INP_IPV4) != 0) ? - "46" : "6 "; + "46" : "6"; else #endif vchar = ((inp->inp_vflag & INP_IPV4) != 0) ? - "4 " : " "; + "4" : ""; if (istcp && (tp->t_flags & TF_TOE) != 0) - printf("%-3.3s%-2.2s ", "toe", vchar); + xo_emit("{:protocol/%-3.3s%-2.2s/%s%s} ", "toe", vchar); else - printf("%-3.3s%-2.2s ", name, vchar); + xo_emit("{:protocol/%-3.3s%-2.2s/%s%s} ", name, vchar); if (Lflag) { char buf1[15]; snprintf(buf1, 15, "%d/%d/%d", so->so_qlen, so->so_incqlen, so->so_qlimit); - printf("%-14.14s ", buf1); + xo_emit("{:listen-queue-sizes/%-14.14s} ", buf1); } else if (Tflag) { if (istcp) - printf("%6u %6u %6u ", tp->t_sndrexmitpack, - tp->t_rcvoopack, tp->t_sndzerowin); + xo_emit("{:sent-retransmit-packets/%6u} " + "{:received-out-of-order-packets/%6u} " + "{:sent-zero-window/%6u} ", + tp->t_sndrexmitpack, tp->t_rcvoopack, + tp->t_sndzerowin); } else { - printf("%6u %6u ", + xo_emit("{:receive-bytes-waiting/%6u} " + "{:send-bytes-waiting/%6u} ", so->so_rcv.sb_cc, so->so_snd.sb_cc); } if (numeric_port) { if (inp->inp_vflag & INP_IPV4) { - inetprint(&inp->inp_laddr, (int)inp->inp_lport, - name, 1); + inetprint("local", &inp->inp_laddr, + (int)inp->inp_lport, name, 1); if (!Lflag) - inetprint(&inp->inp_faddr, + inetprint("remote", &inp->inp_faddr, (int)inp->inp_fport, name, 1); } #ifdef INET6 else if (inp->inp_vflag & INP_IPV6) { - inet6print(&inp->in6p_laddr, + inet6print("local", &inp->in6p_laddr, (int)inp->inp_lport, name, 1); if (!Lflag) - inet6print(&inp->in6p_faddr, + inet6print("remote", &inp->in6p_faddr, (int)inp->inp_fport, name, 1); } /* else nothing printed now */ #endif /* INET6 */ } else if (inp->inp_flags & INP_ANONPORT) { if (inp->inp_vflag & INP_IPV4) { - inetprint(&inp->inp_laddr, (int)inp->inp_lport, - name, 1); + inetprint("local", &inp->inp_laddr, + (int)inp->inp_lport, name, 1); if (!Lflag) - inetprint(&inp->inp_faddr, + inetprint("remote", &inp->inp_faddr, (int)inp->inp_fport, name, 0); } #ifdef INET6 else if (inp->inp_vflag & INP_IPV6) { - inet6print(&inp->in6p_laddr, + inet6print("local", &inp->in6p_laddr, (int)inp->inp_lport, name, 1); if (!Lflag) - inet6print(&inp->in6p_faddr, + inet6print("remote", &inp->in6p_faddr, (int)inp->inp_fport, name, 0); } /* else nothing printed now */ #endif /* INET6 */ } else { if (inp->inp_vflag & INP_IPV4) { - inetprint(&inp->inp_laddr, (int)inp->inp_lport, - name, 0); + inetprint("local", &inp->inp_laddr, + (int)inp->inp_lport, name, 0); if (!Lflag) - inetprint(&inp->inp_faddr, + inetprint("remote", &inp->inp_faddr, (int)inp->inp_fport, name, inp->inp_lport != inp->inp_fport); } #ifdef INET6 else if (inp->inp_vflag & INP_IPV6) { - inet6print(&inp->in6p_laddr, + inet6print("local", &inp->in6p_laddr, (int)inp->inp_lport, name, 0); if (!Lflag) - inet6print(&inp->in6p_faddr, + inet6print("remote", &inp->in6p_faddr, (int)inp->inp_fport, name, inp->inp_lport != inp->inp_fport); } /* else nothing printed now */ #endif /* INET6 */ } if (xflag) { - printf("%6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u", - so->so_rcv.sb_mcnt, so->so_snd.sb_mcnt, - so->so_rcv.sb_ccnt, so->so_snd.sb_ccnt, - so->so_rcv.sb_hiwat, so->so_snd.sb_hiwat, - so->so_rcv.sb_lowat, so->so_snd.sb_lowat, - so->so_rcv.sb_mbcnt, so->so_snd.sb_mbcnt, - so->so_rcv.sb_mbmax, so->so_snd.sb_mbmax); + xo_emit("{:receive-mbufs/%6u} {:send-mbufs/%6u} " + "{:receive-clusters/%6u} {:send-clusters/%6u} " + "{:receive-high-water/%6u} {:send-high-water/%6u} " + "{:receive-low-water/%6u} {:send-low-water/%6u} " + "{:receive-mbuf-bytes/%6u} {:send-mbuf-bytes/%6u} " + "{:receive-mbuf-bytes-max/%6u} " + "{:send-mbuf-bytes-max/%6u}", + so->so_rcv.sb_mcnt, so->so_snd.sb_mcnt, + so->so_rcv.sb_ccnt, so->so_snd.sb_ccnt, + so->so_rcv.sb_hiwat, so->so_snd.sb_hiwat, + so->so_rcv.sb_lowat, so->so_snd.sb_lowat, + so->so_rcv.sb_mbcnt, so->so_snd.sb_mbcnt, + so->so_rcv.sb_mbmax, so->so_snd.sb_mbmax); if (timer != NULL) - printf(" %4d.%02d %4d.%02d %4d.%02d %4d.%02d %4d.%02d %4d.%02d", - timer->tt_rexmt / 1000, (timer->tt_rexmt % 1000) / 10, - timer->tt_persist / 1000, (timer->tt_persist % 1000) / 10, - timer->tt_keep / 1000, (timer->tt_keep % 1000) / 10, - timer->tt_2msl / 1000, (timer->tt_2msl % 1000) / 10, - timer->tt_delack / 1000, (timer->tt_delack % 1000) / 10, - timer->t_rcvtime / 1000, (timer->t_rcvtime % 1000) / 10); + xo_emit(" {:retransmit-timer/%4d.%02d} " + "{:persist-timer/%4d.%02d} " + "{:keepalive-timer/%4d.%02d} " + "{:msl2-timer/%4d.%02d} " + "{:delay-ack-timer/%4d.%02d} " + "{:inactivity-timer/%4d.%02d}", + timer->tt_rexmt / 1000, + (timer->tt_rexmt % 1000) / 10, + timer->tt_persist / 1000, + (timer->tt_persist % 1000) / 10, + timer->tt_keep / 1000, + (timer->tt_keep % 1000) / 10, + timer->tt_2msl / 1000, + (timer->tt_2msl % 1000) / 10, + timer->tt_delack / 1000, + (timer->tt_delack % 1000) / 10, + timer->t_rcvtime / 1000, + (timer->t_rcvtime % 1000) / 10); } if (istcp && !Lflag && !xflag && !Tflag && !Rflag) { if (tp->t_state < 0 || tp->t_state >= TCP_NSTATES) - printf("%d", tp->t_state); + xo_emit("{:tcp-state/%d}", tp->t_state); else { - printf("%s", tcpstates[tp->t_state]); + xo_emit("{:tcp-state/%s}", + tcpstates[tp->t_state]); #if defined(TF_NEEDSYN) && defined(TF_NEEDFIN) /* Show T/TCP `hidden state' */ if (tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN)) - putchar('*'); + xo_emit("{:need-syn-or-fin/*}"); #endif /* defined(TF_NEEDSYN) && defined(TF_NEEDFIN) */ } } if (Rflag) { - printf(" %08x %5d", + /* XXX: is this right Alfred */ + xo_emit(" {:flow-id/%08x} {:flow-type/%5d}", inp->inp_flowid, inp->inp_flowtype); } - putchar('\n'); + xo_emit("\n"); + xo_close_instance("socket"); } if (xig != oxig && xig->xig_gen != oxig->xig_gen) { if (oxig->xig_count > xig->xig_count) { *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***