Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Jan 2016 07:21:37 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r293307 - stable/10/usr.bin/netstat
Message-ID:  <201601070721.u077LbEq090713@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Thu Jan  7 07:21:37 2016
New Revision: 293307
URL: https://svnweb.freebsd.org/changeset/base/293307

Log:
  MFC r287649:
  Use a common subroutine to fetch and zero protocol stats instead of
  duplicating roughly similar code for each protocol.

Modified:
  stable/10/usr.bin/netstat/flowtable.c
  stable/10/usr.bin/netstat/if.c
  stable/10/usr.bin/netstat/inet.c
  stable/10/usr.bin/netstat/inet6.c
  stable/10/usr.bin/netstat/main.c
  stable/10/usr.bin/netstat/mbuf.c
  stable/10/usr.bin/netstat/mroute.c
  stable/10/usr.bin/netstat/mroute6.c
  stable/10/usr.bin/netstat/netstat.h
  stable/10/usr.bin/netstat/sctp.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.bin/netstat/flowtable.c
==============================================================================
--- stable/10/usr.bin/netstat/flowtable.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/flowtable.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -28,12 +28,14 @@
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
+
 #include <sys/param.h>
-#include <sys/sysctl.h>
+
 #include <net/flowtable.h>
-#include <err.h>
+
 #include <stdint.h>
 #include <stdio.h>
+
 #include "netstat.h"
 
 /*
@@ -67,17 +69,18 @@ void
 flowtable_stats(void)
 {
 	struct flowtable_stat stat;
-	size_t len = sizeof(stat);
 
 	if (!live)
 		return;
 
-	if (sysctlbyname("net.flowtable.ip4.stat", &stat, &len, NULL, 0) == 0) {
+	if (fetch_stats("net.flowtable.ip4.stat", 0, &stat,
+	    sizeof(stat), NULL) == 0) {
 		printf("flowtable for IPv4:\n");
 		print_stats(&stat);
 	}
 
-	if (sysctlbyname("net.flowtable.ip6.stat", &stat, &len, NULL, 0) == 0) {
+	if (fetch_stats("net.flowtable.ip6.stat", 0, &stat,
+	    sizeof(stat), NULL) == 0) {
 		printf("flowtable for IPv6:\n");
 		print_stats(&stat);
 	}

Modified: stable/10/usr.bin/netstat/if.c
==============================================================================
--- stable/10/usr.bin/netstat/if.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/if.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
-#include <sys/sysctl.h>
 #include <sys/time.h>
 
 #define	_IFI_OQDROPS
@@ -117,20 +116,11 @@ pfsync_acts_stats(const char *fmt, uint6
 void
 pfsync_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct pfsyncstats pfsyncstat, zerostat;
-	size_t len = sizeof(struct pfsyncstats);
+	struct pfsyncstats pfsyncstat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.pfsync.stats", &pfsyncstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.pfsync.stats");
-			return;
-		}
-	} else
-		kread(off, &pfsyncstat, len);
+	if (fetch_stats("net.pfsync.stats", off, &pfsyncstat,
+	    sizeof(pfsyncstat), kread) != 0)
+		return;
 
 	printf("%s:\n", name);
 

Modified: stable/10/usr.bin/netstat/inet.c
==============================================================================
--- stable/10/usr.bin/netstat/inet.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/inet.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -593,8 +593,7 @@ protopr(u_long off, const char *name, in
 void
 tcp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct tcpstat tcpstat, zerostat;
-	size_t len = sizeof tcpstat;
+	struct tcpstat tcpstat;
 
 #ifdef INET6
 	if (tcp_done != 0)
@@ -603,16 +602,9 @@ tcp_stats(u_long off, const char *name, 
 		tcp_done = 1;
 #endif
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.tcp.stats", &tcpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			warn("sysctl: net.inet.tcp.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &tcpstat, len);
+	if (fetch_stats("net.inet.tcp.stats", off, &tcpstat,
+	    sizeof(tcpstat), kread_counters) != 0)
+		return;
 
 	printf ("%s:\n", name);
 
@@ -755,8 +747,7 @@ tcp_stats(u_long off, const char *name, 
 void
 udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct udpstat udpstat, zerostat;
-	size_t len = sizeof udpstat;
+	struct udpstat udpstat;
 	uint64_t delivered;
 
 #ifdef INET6
@@ -766,16 +757,9 @@ udp_stats(u_long off, const char *name, 
 		udp_done = 1;
 #endif
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.udp.stats", &udpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			warn("sysctl: net.inet.udp.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &udpstat, len);
+	if (fetch_stats("net.inet.udp.stats", off, &udpstat,
+	    sizeof(udpstat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 #define	p(f, m) if (udpstat.f || sflag <= 1) \
@@ -815,23 +799,11 @@ udp_stats(u_long off, const char *name, 
 void
 carp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct carpstats carpstat, zerostat;
-	size_t len = sizeof(struct carpstats);
+	struct carpstats carpstat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.carp.stats", &carpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet.carp.stats");
-			return;
-		}
-	} else {
-		if (off == 0)
-			return;
-		kread_counters(off, &carpstat, len);
-	}
+	if (fetch_stats("net.inet.carp.stats", off, &carpstat,
+	    sizeof(carpstat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -866,19 +838,11 @@ carp_stats(u_long off, const char *name,
 void
 ip_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct ipstat ipstat, zerostat;
-	size_t len = sizeof ipstat;
+	struct ipstat ipstat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.ip.stats", &ipstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			warn("sysctl: net.inet.ip.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &ipstat, len);
+	if (fetch_stats("net.inet.ip.stats", off, &ipstat,
+	    sizeof(ipstat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -930,19 +894,11 @@ ip_stats(u_long off, const char *name, i
 void
 arp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct arpstat arpstat, zerostat;
-	size_t len = sizeof(arpstat);
+	struct arpstat arpstat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.link.ether.arp.stats", &arpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			warn("sysctl: net.link.ether.arp.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &arpstat, len);
+	if (fetch_stats("net.link.ether.arp.stats", off, &arpstat,
+	    sizeof(arpstat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -1015,21 +971,13 @@ static	const char *icmpnames[ICMP_MAXTYP
 void
 icmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct icmpstat icmpstat, zerostat;
-	int i, first;
+	struct icmpstat icmpstat;
 	size_t len;
+	int i, first;
 
-	len = sizeof icmpstat;
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.icmp.stats", &icmpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			warn("sysctl: net.inet.icmp.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &icmpstat, len);
+	if (fetch_stats("net.inet.icmp.stats", off, &icmpstat,
+	    sizeof(icmpstat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -1138,43 +1086,11 @@ igmp_stats_live_old(const char *name)
 void
 igmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct igmpstat igmpstat, zerostat;
-	size_t len;
-
-#ifndef BURN_BRIDGES
-	if (live) {
-		/*
-		 * Detect if we are being run against a pre-IGMPv3 kernel.
-		 * We cannot do this for a core file as the legacy
-		 * struct igmpstat has no size field, nor does it
-		 * export it in any readily-available symbols.
-		 */
-		len = 0;
-		if (sysctlbyname("net.inet.igmp.stats", NULL, &len, NULL,
-		    0) < 0) {
-			warn("sysctl: net.inet.igmp.stats");
-			return;
-		}
-		if (len < sizeof(igmpstat)) {
-			igmp_stats_live_old(name);
-			return;
-		}
-	}
-#endif /* !BURN_BRIDGES */
+	struct igmpstat igmpstat;
 
-	len = sizeof(igmpstat);
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.igmp.stats", &igmpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			warn("sysctl: net.inet.igmp.stats");
-			return;
-		}
-	} else {
-		len = sizeof(igmpstat);
-		kread(off, &igmpstat, len);
-	}
+	if (fetch_stats("net.inet.igmp.stats", 0, &igmpstat,
+	    sizeof(igmpstat), kread) != 0)
+		return;
 
 	if (igmpstat.igps_version != IGPS_VERSION_3) {
 		warnx("%s: version mismatch (%d != %d)", __func__,
@@ -1221,23 +1137,11 @@ void
 pim_stats(u_long off __unused, const char *name, int af1 __unused,
     int proto __unused)
 {
-	struct pimstat pimstat, zerostat;
-	size_t len = sizeof pimstat;
+	struct pimstat pimstat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.pim.stats", &pimstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet.pim.stats");
-			return;
-		}
-	} else {
-		if (off == 0)
-			return;
-		kread_counters(off, &pimstat, len);
-	}
+	if (fetch_stats("net.inet.pim.stats", off, &pimstat,
+	    sizeof(pimstat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 

Modified: stable/10/usr.bin/netstat/inet6.c
==============================================================================
--- stable/10/usr.bin/netstat/inet6.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/inet6.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/ioctl.h>
 #include <sys/mbuf.h>
 #include <sys/protosw.h>
-#include <sys/sysctl.h>
 
 #include <net/route.h>
 #include <net/if.h>
@@ -360,23 +359,12 @@ static const char *srcrule_str[] = {
 void
 ip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct ip6stat ip6stat, zerostat;
+	struct ip6stat ip6stat;
 	int first, i;
-	size_t len;
 
-	len = sizeof ip6stat;
-	if (live) {
-		memset(&ip6stat, 0, len);
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet6.ip6.stats", &ip6stat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet6.ip6.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &ip6stat, len);
+	if (fetch_stats("net.inet6.ip6.stats", off, &ip6stat,
+	    sizeof(ip6stat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -842,23 +830,12 @@ static	const char *icmp6names[] = {
 void
 icmp6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct icmp6stat icmp6stat, zerostat;
+	struct icmp6stat icmp6stat;
 	int i, first;
-	size_t len;
 
-	len = sizeof icmp6stat;
-	if (live) {
-		memset(&icmp6stat, 0, len);
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet6.icmp6.stats", &icmp6stat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet6.icmp6.stats");
-			return;
-		}
-	} else
-		kread_counters(off, &icmp6stat, len);
+	if (fetch_stats("net.inet6.icmp6.stats", off, &icmp6stat,
+	    sizeof(icmp6stat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -999,23 +976,11 @@ icmp6_ifstats(char *ifname)
 void
 pim6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct pim6stat pim6stat, zerostat;
-	size_t len = sizeof pim6stat;
+	struct pim6stat pim6stat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet6.pim.stats", &pim6stat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet6.pim.stats");
-			return;
-		}
-	} else {
-		if (off == 0)
-			return;
-		kread(off, &pim6stat, len);
-	}
+	if (fetch_stats("net.inet6.pim.stats", off, &pim6stat,
+	    sizeof(pim6stat), kread) != 0)
+		return;
 
 	printf("%s:\n", name);
 
@@ -1037,22 +1002,12 @@ pim6_stats(u_long off, const char *name,
 void
 rip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct rip6stat rip6stat, zerostat;
+	struct rip6stat rip6stat;
 	u_quad_t delivered;
-	size_t len;
 
-	len = sizeof(rip6stat);
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet6.ip6.rip6stats", &rip6stat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet6.ip6.rip6stats");
-			return;
-		}
-	} else
-		kread_counters(off, &rip6stat, len);
+	if (fetch_stats("net.inet6.ip6.rip6stats", off, &rip6stat,
+	    sizeof(rip6stat), kread_counters) != 0)
+		return;
 
 	printf("%s:\n", name);
 

Modified: stable/10/usr.bin/netstat/main.c
==============================================================================
--- stable/10/usr.bin/netstat/main.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/main.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
+#include <sys/sysctl.h>
 
 #include <netinet/in.h>
 
@@ -643,6 +644,29 @@ main(int argc, char *argv[])
 	exit(0);
 }
 
+int
+fetch_stats(const char *sysctlname, u_long off, void *stats, size_t len,
+    int (*kreadfn)(u_long, void *, size_t))
+{
+	int error;
+
+	if (live) {
+		memset(stats, 0, len);
+		if (zflag)
+			error = sysctlbyname(sysctlname, NULL, NULL, stats,
+			    len);
+		else
+			error = sysctlbyname(sysctlname, stats, &len, NULL, 0);
+		if (error == -1 && errno != ENOENT)
+			warn("sysctl %s", sysctlname);
+	} else {
+		if (off == 0)
+			return (1);
+		error = kreadfn(off, stats, len);
+	}
+	return (error);
+}
+
 /*
  * Print out protocol statistics or control blocks (per sflag).
  * If the interface was not specifically requested, and the symbol

Modified: stable/10/usr.bin/netstat/mbuf.c
==============================================================================
--- stable/10/usr.bin/netstat/mbuf.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/mbuf.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -294,25 +294,20 @@ mbpr(void *kvmd, u_long mbaddr)
 	    "(%juk/9k/16k)\n", jumbop_failures, jumbo9_failures,
 	    jumbo16_failures, jumbop_size / 1024);
 
-	if (live) {
-		mlen = sizeof(nsfbufs);
-		if (!sysctlbyname("kern.ipc.nsfbufs", &nsfbufs, &mlen, NULL,
-		    0) &&
-		    !sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused,
-		    &mlen, NULL, 0) &&
-		    !sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak,
-		    &mlen, NULL, 0))
-			printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
-			    nsfbufsused, nsfbufspeak, nsfbufs);
-		mlen = sizeof(sfstat);
-		if (sysctlbyname("kern.ipc.sfstat", &sfstat, &mlen, NULL, 0)) {
-			warn("kern.ipc.sfstat");
-			goto out;
-		}
-	} else {
-		if (kread_counters(mbaddr, (char *)&sfstat, sizeof sfstat) != 0)
-			goto out;
-	}
+	mlen = sizeof(nsfbufs);
+	if (live &&
+	    sysctlbyname("kern.ipc.nsfbufs", &nsfbufs, &mlen, NULL, 0) == 0 &&
+	    sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused, &mlen,
+	    NULL, 0) == 0 &&
+	    sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak, &mlen,
+	    NULL, 0) == 0)
+		printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
+		    nsfbufsused, nsfbufspeak, nsfbufs);
+
+	if (fetch_stats("kern.ipc.sfstat", mbaddr, &sfstat, sizeof(sfstat),
+	    kread_counters) != 0)
+		goto out;
+
 	printf("%ju requests for sfbufs denied\n",
 	    (uintmax_t)sfstat.sf_allocfail);
 	printf("%ju requests for sfbufs delayed\n",

Modified: stable/10/usr.bin/netstat/mroute.c
==============================================================================
--- stable/10/usr.bin/netstat/mroute.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/mroute.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -370,7 +370,6 @@ mrt_stats()
 {
 	struct mrtstat mrtstat;
 	u_long mstaddr;
-	size_t len = sizeof(mrtstat);
 
 	kresolve_list(mrl);
 	mstaddr = mrl[N_MRTSTAT].n_value;
@@ -380,14 +379,9 @@ mrt_stats()
 		return;
 	}
 
-	if (live) {
-		if (sysctlbyname("net.inet.ip.mrtstat", &mrtstat, &len, NULL,
-		    0) < 0) {
-			warn("sysctl: net.inet.ip.mrtstat failed.");
-			return;
-		}
-	} else
-		kread_counters(mstaddr, &mrtstat, len);
+	if (fetch_stats("net.inet.ip.mrtstat", mstaddr, &mrtstat,
+	    sizeof(mrtstat), kread_counters) != 0)
+		return;
 
 	printf("IPv4 multicast forwarding:\n");
 

Modified: stable/10/usr.bin/netstat/mroute6.c
==============================================================================
--- stable/10/usr.bin/netstat/mroute6.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/mroute6.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -246,7 +246,6 @@ mrt6_stats()
 {
 	struct mrt6stat mrtstat;
 	u_long mstaddr;
-	size_t len = sizeof mrtstat;
 
 	kresolve_list(mrl);
 	mstaddr = mrl[N_MRT6STAT].n_value;
@@ -255,15 +254,9 @@ mrt6_stats()
 		fprintf(stderr, "No IPv6 MROUTING kernel support.\n");
 		return;
 	}
-
-	if (live) {
-		if (sysctlbyname("net.inet6.ip6.mrt6stat", &mrtstat, &len,
-		    NULL, 0) < 0) {
-			warn("sysctl: net.inet6.ip6.mrt6stat");
-			return;
-		}
-	} else
-		kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
+	if (fetch_stats("net.inet6.ip6.mrt6stat", 0, &mrtstat,
+	    sizeof(mrtstat), kread_counters) != 0)
+		return;
 
 	printf("IPv6 multicast forwarding:\n");
 

Modified: stable/10/usr.bin/netstat/netstat.h
==============================================================================
--- stable/10/usr.bin/netstat/netstat.h	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/netstat.h	Thu Jan  7 07:21:37 2016	(r293307)
@@ -60,6 +60,8 @@ extern int	unit;	/* unit number for abov
 extern int	live;	/* true if we are examining a live system */
 
 struct nlist;
+int	fetch_stats(const char *sysctlname, u_long addr, void *stats,
+	    size_t len, int (*kreadfn)(u_long, void *, size_t));
 int	kread(u_long addr, void *buf, size_t size);
 uint64_t kread_counter(u_long addr);
 int	kread_counters(u_long addr, void *buf, size_t size);

Modified: stable/10/usr.bin/netstat/sctp.c
==============================================================================
--- stable/10/usr.bin/netstat/sctp.c	Thu Jan  7 05:47:34 2016	(r293306)
+++ stable/10/usr.bin/netstat/sctp.c	Thu Jan  7 07:21:37 2016	(r293307)
@@ -607,20 +607,11 @@ sctp_statesprint(uint32_t state)
 void
 sctp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
 {
-	struct sctpstat sctpstat, zerostat;
-	size_t len = sizeof(sctpstat);
+	struct sctpstat sctpstat;
 
-	if (live) {
-		if (zflag)
-			memset(&zerostat, 0, len);
-		if (sysctlbyname("net.inet.sctp.stats", &sctpstat, &len,
-		    zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
-			if (errno != ENOENT)
-				warn("sysctl: net.inet.sctp.stats");
-			return;
-		}
-	} else
-		kread(off, &sctpstat, len);
+	if (fetch_stats("net.inet.sctp.stats", off, &sctpstat,
+	    sizeof(sctpstat), kread) != 0)
+		return;
 
 	printf ("%s:\n", name);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201601070721.u077LbEq090713>