Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Sep 2010 10:27:58 -0700
From:      User Sterling Camden <sterling@camdensoftware.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/150575: Patch pcpustat to version 1.3
Message-ID:  <20100914201926.2B3F5106566C@hub.freebsd.org>
Resent-Message-ID: <201009142020.o8EKK6mc021476@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         150575
>Category:       ports
>Synopsis:       Patch pcpustat to version 1.3
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Tue Sep 14 20:20:05 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     User Sterling Camden
>Release:        FreeBSD 8.1-STABLE amd64
>Organization:
Camden Software Consulting
>Environment:
System: FreeBSD libertas.local.camdensoftware.com 8.1-STABLE FreeBSD 8.1-STABLE #57: Mon Sep 13 11:51:25 PDT 2010 sterling@libertas.local.camdensoftware.com:/usr/obj/usr/src/sys/LIBERTAS amd64


>Description:
	Fixes another bug in determining the correct buffer size for sysctl.  Doing it the right way this time (for sure).
>How-To-Repeat:
	On some systems, pcpustat fails with:

	pcpustat: sysctl(kern.cp_times...) expected 1280, got 160

	Before outputting any data.  This is due to incorrectly sizing the buffer for obtaining the sysctl value kern.cp_times.
>Fix:

	The sysctlbyname(3) function provides a uniform way to obtain the proper size, so I have implemented that instead of
	trying to divine the correct size based on the number of CPUs.

	The tarball at http://chipstips.com/download/pcpustat-1.3.tar.bz2 has already been updated.

	patches follow:

--- /usr/ports/sysutils/pcpustat/work/pcpustat-1.1/pcpustat.c	2010-07-28 08:47:43.000000000 -0700
+++ pcpustat.c	2010-09-02 13:40:42.000000000 -0700
@@ -8,7 +8,11 @@
 #include <sys/resource.h>
 #include <sys/sysctl.h>
 
-static const char* what_string="@(#)pcpustat 1.1";
+#ifndef CPUSTATES
+#define CPUSTATES	5	/* OSX doesn't define this */
+#endif
+
+static const char* what_string="@(#)pcpustat 1.3";
 
 /* Bit flags for what stats to include: */
 
@@ -23,6 +27,7 @@
 /* Copied from /usr/src/usr.bin/top/machine.c */
 #define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
 static void getsysctl(const char *name, void *ptr, size_t len);
+static size_t getsysctllen(const char *name);
 
 struct opthelp {
     char *argname;
@@ -31,7 +36,7 @@
 
 int main(int ac, char **av)
 {
-    int c, option_index, stats=0, count=-1, wait=0, cpu, maxcpu, ncpu, quiet=0, not=0;
+    int c, option_index, stats=0, count=-1, wait=0, cpu, ncpu, quiet=0, not=0;
     size_t state_size;
     long cpus=0;
     long *cpu_prev, *cpu_curr;
@@ -194,8 +199,7 @@
 	printf("\n");
     }
 
-    GETSYSCTL("kern.smp.maxcpus", maxcpu);
-    state_size = CPUSTATES * maxcpu * sizeof(long);
+    state_size = getsysctllen("kern.cp_times");
     cpu_prev = malloc(state_size);
     cpu_curr = malloc(state_size);
     getsysctl("kern.cp_times", cpu_prev, state_size);
@@ -253,9 +257,16 @@
 		    sys_errlist[errno]);
 		exit(23);
 	}
-	if (nlen != len) {
-		fprintf(stderr, "pcpustat: sysctl(%s...) expected %lu, got %lu\n",
-		    name, (unsigned long)len, (unsigned long)nlen);
+}
+
+static size_t
+getsysctllen(const char *name)
+{
+	size_t len = 0;
+	if (sysctlbyname(name, NULL, &len, NULL, 0) == -1) {
+		fprintf(stderr, "pcpustat: sysctl(%s...) failed: %s\n", name,
+		    sys_errlist[errno]);
 		exit(23);
 	}
+	return len;
 }

--- /usr/ports/sysutils/pcpustat/Makefile	2010-09-14 10:13:36.000000000 -0700
+++ port/Makefile.new	2010-09-14 10:12:45.000000000 -0700
@@ -6,7 +6,7 @@
 #
 
 PORTNAME=	pcpustat
-PORTVERSION=	1.1
+PORTVERSION=	1.3
 CATEGORIES=	sysutils
 MASTER_SITES=	http://chipstips.com/download/
 
>Release-Note:
>Audit-Trail:
>Unformatted:



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