Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Oct 2014 20:39:16 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r369861 - in head/sysutils/xosview: . files
Message-ID:  <201410022039.s92KdGRZ091928@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius (src committer)
Date: Thu Oct  2 20:39:15 2014
New Revision: 369861
URL: https://svnweb.freebsd.org/changeset/ports/369861
QAT: https://qat.redports.org/buildarchive/r369861/

Log:
  - Get interface stats via getifaddrs(3) instead of kvm(3).
  - Get vmstat via sysctl(3) instead of kvm(3).
  
  Approved by:	bapt (blanket)

Added:
  head/sysutils/xosview/files/
  head/sysutils/xosview/files/patch-bsd-kernel.cc   (contents, props changed)
Modified:
  head/sysutils/xosview/Makefile

Modified: head/sysutils/xosview/Makefile
==============================================================================
--- head/sysutils/xosview/Makefile	Thu Oct  2 20:07:11 2014	(r369860)
+++ head/sysutils/xosview/Makefile	Thu Oct  2 20:39:15 2014	(r369861)
@@ -3,7 +3,7 @@
 
 PORTNAME=	xosview
 PORTVERSION=	1.16
-PORTREVISION=	0
+PORTREVISION=	1
 CATEGORIES=	sysutils
 MASTER_SITES=	http://www.pogo.org.uk/~mark/xosview/releases/
 

Added: head/sysutils/xosview/files/patch-bsd-kernel.cc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/xosview/files/patch-bsd-kernel.cc	Thu Oct  2 20:39:15 2014	(r369861)
@@ -0,0 +1,222 @@
+--- bsd/kernel.cc.orig	2013-08-23 13:40:35.000000000 +0400
++++ bsd/kernel.cc	2014-10-03 00:35:05.000000000 +0400
+@@ -28,6 +28,7 @@
+ #include <string.h>
+ #include <err.h>
+ #include <errno.h>
++#include <ifaddrs.h>
+ #include <sysexits.h>
+ #include <sys/types.h>
+ #include <sys/queue.h>
+@@ -43,7 +44,6 @@
+ #if defined(XOSVIEW_FREEBSD) || defined(XOSVIEW_DFBSD)
+ static const char ACPIDEV[] = "/dev/acpi";
+ static const char APMDEV[] = "/dev/apm";
+-#include <net/if_var.h>
+ #include <sys/ioctl.h>
+ #include <dev/acpica/acpiio.h>
+ #include <machine/apm_bios.h>
+@@ -115,56 +115,41 @@
+ // this later on.  This keeps the indices within the nlist constant.
+ #define DUMMY_SYM "dummy_sym"
+ 
+-#if defined(XOSVIEW_FREEBSD)
+-{ "_cnt" },
+-#define VMMETER_SYM_INDEX    0
+-#else
+-{ DUMMY_SYM },
+-#define DUMMY_0
+-#endif
+-#if !defined(XOSVIEW_OPENBSD)
+-{ "_ifnet" },
+-#define IFNET_SYM_INDEX      1
+-#else
+-{ DUMMY_SYM },
+-#define DUMMY_1
+-#endif
+-
+ #if defined(XOSVIEW_OPENBSD)
+ { "_disklist" },
+-#define DISKLIST_SYM_INDEX   2
++#define DISKLIST_SYM_INDEX   0
+ #else
+ { DUMMY_SYM },
+-#define DUMMY_2
++#define DUMMY_0
+ #endif
+ #if defined(XOSVIEW_NETBSD)
+ { "_allevents" },
+-#define ALLEVENTS_SYM_INDEX  3
++#define ALLEVENTS_SYM_INDEX  1
+ { "_bufmem" },
+-#define BUFMEM_SYM_INDEX     4
++#define BUFMEM_SYM_INDEX     2
+ #else
+ { DUMMY_SYM },
+-#define DUMMY_3
++#define DUMMY_1
+ { DUMMY_SYM },
+-#define DUMMY_4
++#define DUMMY_2
+ #endif
+ #if defined(XOSVIEW_FREEBSD)
+ { "_intrnames" },
+-#define INTRNAMES_SYM_INDEX  5
++#define INTRNAMES_SYM_INDEX  3
+ # if __FreeBSD_version >= 900040
+ { "_sintrnames" },
+ # else
+ { "_eintrnames" },
+ # endif
+-#define EINTRNAMES_SYM_INDEX 6
++#define EINTRNAMES_SYM_INDEX 4
+ { "_intrcnt" },
+-#define INTRCNT_SYM_INDEX    7
++#define INTRCNT_SYM_INDEX    5
+ # if __FreeBSD_version >= 900040
+ { "_sintrcnt" },
+ # else
+ { "_eintrcnt" },
+ # endif
+-#define EINTRCNT_SYM_INDEX   8
++#define EINTRCNT_SYM_INDEX   6
+ #endif
+ { NULL }
+ };
+@@ -337,7 +322,21 @@
+ #else  /* HAVE_UVM */
+ 	struct vmmeter vm;
+ #if defined(XOSVIEW_FREEBSD)
+-	safe_kvm_read_symbol(VMMETER_SYM_INDEX, &vm, sizeof(vm));
++	size_t size = sizeof(unsigned int);
++
++#define	GET_VM_STATS(name) \
++	sysctlbyname("vm.stats.vm." #name, &vm.name, &size, NULL, 0)
++	GET_VM_STATS(v_active_count);
++	GET_VM_STATS(v_inactive_count);
++	GET_VM_STATS(v_wire_count);
++	GET_VM_STATS(v_cache_count);
++	GET_VM_STATS(v_free_count);
++	GET_VM_STATS(v_page_size);
++	GET_VM_STATS(v_vnodepgsin);
++	GET_VM_STATS(v_vnodepgsout);
++	GET_VM_STATS(v_swappgsin);
++	GET_VM_STATS(v_swappgsout);
++#undef GET_VM_STATS
+ #else  /* XOSVIEW_DFBSD */
+ 	struct vmstats vms;
+ 	size_t size = sizeof(vms);
+@@ -421,99 +420,37 @@
+ int
+ BSDNetInit() {
+ 	OpenKDIfNeeded();
+-#if defined(XOSVIEW_NETBSD)
+-	return ValidSymbol(IFNET_SYM_INDEX);
+-#else
+ 	return 1;
+-#endif
+ }
+ 
+ void
+ BSDGetNetInOut(unsigned long long *inbytes, unsigned long long *outbytes, const char *netIface, bool ignored) {
+-	char ifname[IFNAMSIZ];
++	struct ifaddrs *ifap, *ifa;
+ 	*inbytes = 0;
+ 	*outbytes = 0;
+-#if defined(XOSVIEW_OPENBSD)
+-	size_t size;
+-	char *buf, *next;
+-	struct if_msghdr *ifm;
+-	struct if_data ifd;
+-	struct sockaddr_dl *sdl;
+-
+-	if ( sysctl(mib_ifl, 6, NULL, &size, NULL, 0) < 0 )
+-		err(EX_OSERR, "BSDGetNetInOut(): sysctl 1 failed");
+-	if ( (buf = (char *)malloc(size)) == NULL)
+-		err(EX_OSERR, "BSDGetNetInOut(): malloc failed");
+-	if ( sysctl(mib_ifl, 6, buf, &size, NULL, 0) < 0 )
+-		err(EX_OSERR, "BSDGetNetInOut(): sysctl 2 failed");
+ 
+-	for (next = buf; next < buf + size; next += ifm->ifm_msglen) {
+-		bool skipif = false;
+-		ifm = (struct if_msghdr *)next;
+-		if (ifm->ifm_type != RTM_IFINFO || ifm->ifm_addrs & RTAX_IFP == 0)
+-			continue;
+-		ifd = ifm->ifm_data;
+-		sdl = (struct sockaddr_dl *)(ifm + 1);
+-		if (sdl->sdl_family != AF_LINK)
+-			continue;
+-		if ( strncmp(netIface, "False", 5) != 0 ) {
+-			memcpy(ifname, sdl->sdl_data, (sdl->sdl_nlen >= IFNAMSIZ ? IFNAMSIZ - 1 : sdl->sdl_nlen));
+-			if ( (!ignored && strncmp(sdl->sdl_data, netIface, sdl->sdl_nlen) != 0) ||
+-				 ( ignored && strncmp(sdl->sdl_data, netIface, sdl->sdl_nlen) == 0) )
+-				skipif = true;
+-		}
+-		if (!skipif) {
+-			*inbytes += ifd.ifi_ibytes;
+-			*outbytes += ifd.ifi_obytes;
+-		}
+-	}
+-	free(buf);
+-#else  /* XOSVIEW_OPENBSD */
+-	struct ifnet *ifnetp;
+-	struct ifnet ifnet;
+-#if defined (XOSVIEW_NETBSD)
+-	struct ifnet_head ifnethd;
+-#else
+-	struct ifnethead ifnethd;
+-#endif
+-	safe_kvm_read(nlst[IFNET_SYM_INDEX].n_value, &ifnethd, sizeof(ifnethd));
+-	ifnetp = TAILQ_FIRST(&ifnethd);
++	if (getifaddrs(&ifap) != 0)
++		return;
+ 
+-	while (ifnetp) {
++	for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ 		bool skipif = false;
+-		//  Now, dereference the pointer to get the ifnet struct.
+-		safe_kvm_read((u_long)ifnetp, &ifnet, sizeof(ifnet));
+-		strlcpy(ifname, ifnet.if_xname, sizeof(ifname));
+-#if defined(XOSVIEW_NETBSD)
+-		ifnetp = TAILQ_NEXT(&ifnet, if_list);
+-#else
+-		ifnetp = TAILQ_NEXT(&ifnet, if_link);
+-#endif
+-		if (!(ifnet.if_flags & IFF_UP))
++
++		if (ifa->ifa_addr->sa_family != AF_LINK)
+ 			continue;
++
+ 		if ( strncmp(netIface, "False", 5) != 0 ) {
+-			if ( (!ignored && strncmp(ifname, netIface, 256) != 0) ||
+-			     ( ignored && strncmp(ifname, netIface, 256) == 0) )
++			if ( (!ignored && strncmp(ifa->ifa_name, netIface, 256) != 0) ||
++			     ( ignored && strncmp(ifa->ifa_name, netIface, 256) == 0) )
+ 				skipif = true;
+ 		}
++#define	IFA_STAT(s)	(((struct if_data *)ifa->ifa_data)->ifi_ ## s)
+ 		if (!skipif) {
+-#if defined(XOSVIEW_DFBSD) && __DragonFly_version > 300304
+-			struct ifdata_pcpu *ifdatap = ifnet.if_data_pcpu;
+-			struct ifdata_pcpu ifdata;
+-			int ncpus = BSDCountCpus();
+-			for (int cpu = 0; cpu < ncpus; cpu++) {
+-				safe_kvm_read((u_long)ifdatap + cpu * sizeof(ifdata),
+-				              &ifdata, sizeof(ifdata));
+-				*inbytes  += ifdata.ifd_ibytes;
+-				*outbytes += ifdata.ifd_obytes;
+-			}
+-#else
+-			*inbytes  += ifnet.if_ibytes;
+-			*outbytes += ifnet.if_obytes;
+-#endif
++			*inbytes  += IFA_STAT(ibytes);
++			*outbytes += IFA_STAT(obytes);
+ 		}
++#undef IFA_STAT
+ 	}
+-#endif  /* XOSVIEW_OPENBSD */
++	freeifaddrs(ifap);
+ }
+ 
+ 



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