ports/78243: [PATCH] sysutils/wmtop doesn't show any process on 5.x machines which disable procfs by default.

Yi-Hsuan Hsin mhsin at mhsin.org
Tue Mar 1 17:20:15 UTC 2005


>Number:         78243
>Category:       ports
>Synopsis:       [PATCH] sysutils/wmtop doesn't show any process on 5.x machines which disable procfs by default.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Mar 01 17:20:14 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Yi-Hsuan Hsin
>Release:        FreeBSD 5.3-RELEASE-p2 i386
>Organization:
NTU CSIE
>Environment:
System: FreeBSD b.mhsin.org 5.3-RELEASE-p2 FreeBSD 5.3-RELEASE-p2 #0: Wed Dec 22 00:38:19 CST 2004 root at b.mhsin.org:/usr/obj/usr/src/sys/b i386

wmtop-0.84

	
>Description:
	wmtop gets process information via procfs, but FreeBSD 5.x doesn't mount it by default. The 5.x users won't see any process shown by wmtop unless they mount procfs for some reasons.
>How-To-Repeat:
	Install and run wmtop on 5.x machines without procfs mounted.
>Fix:

	The following patch fixes the problem described above. Also thank rafan <rafan at infor.org> for the PORTDOCS fix.


diff -Nur wmtop.orig/Makefile wmtop/Makefile
--- wmtop.orig/Makefile	Sun Nov  2 16:45:21 2003
+++ wmtop/Makefile	Wed Mar  2 00:33:36 2005
@@ -17,13 +17,26 @@
 USE_X_PREFIX=	yes
 USE_XPM=	yes
 ALL_TARGET=	freebsd
+USE_REINPLACE=	yes
 
 MAN1=		wmtop.1
 
+.if !defined(NOPORTDOCS)
+PORTDOCS=	BUGS CHANGES COPYING README TODO
+.endif
+
+.include <bsd.port.pre.mk>
+
+.if ${OSVERSION} >= 500000
+post-patch:
+	${REINPLACE_CMD} -e 's/^\(LIBS.*\)/\1 -lkvm/' ${WRKSRC}/Makefile
+	${REINPLACE_CMD} -e 's/^\(FLAGS.*\)/\1 -DNO_PROCFS/' ${WRKSRC}/Makefile
+.endif
+
 do-install:
 	${INSTALL_PROGRAM} ${WRKSRC}/wmtop ${PREFIX}/bin/
 	${INSTALL_MAN} ${WRKSRC}/wmtop.1 ${PREFIX}/man/man1
-.ifndef(NOPORTDOCS)
+.if !defined(NOPORTDOCS)
 	@${INSTALL} -d -o ${SHAREOWN} -g ${SHAREGRP} -m 555 \
 		${PREFIX}/share/doc/${PORTNAME}
 .for file in BUGS CHANGES COPYING README TODO
@@ -32,4 +45,4 @@
 .endfor
 .endif # !NOPORTDOCS
 
-.include <bsd.port.mk>
+.include <bsd.port.post.mk>
diff -Nur wmtop.orig/files/patch-la wmtop/files/patch-la
--- wmtop.orig/files/patch-la	Thu Jan  1 08:00:00 1970
+++ wmtop/files/patch-la	Wed Mar  2 00:33:36 2005
@@ -0,0 +1,120 @@
+--- wmtop.c.orig	Wed Mar  7 05:30:56 2001
++++ wmtop.c	Fri Feb 25 22:34:36 2005
+@@ -70,6 +70,13 @@
+ #include "xpm/wmtop-neon2.xpm"
+ #include "xpm/wmtop-rainbow.xpm"
+ 
++#ifdef NO_PROCFS
++#include <kvm.h>
++#include <sys/sysctl.h>
++#include <sys/user.h>
++#include <sys/resource.h>
++#endif
++
+ /******************************************/
+ /* Defines                                */
+ /******************************************/
+@@ -191,6 +198,9 @@
+     int rss;
+     int time_stamp;
+     int counted;
++#ifdef NO_PROCFS
++    struct kinfo_proc *kp;
++#endif
+ };
+ 
+ /******************************************/
+@@ -455,17 +465,19 @@
+  * Anyone hoping to port wmtop should look here first.
+  */
+ int process_parse_procfs(struct process *process) {
++#if !defined(NO_PROCFS)
+     char line[WMTOP_BUFLENGTH],filename[WMTOP_BUFLENGTH],procname[WMTOP_BUFLENGTH];
+     int ps;
+     struct stat sbuf;
+-    int user_time,kernel_time;
+     int rc;
++#endif
++    int user_time,kernel_time;
+ #if defined(LINUX)
+     char *r,*q;
+     char deparenthesised_name[WMTOP_BUFLENGTH];
+ 		int endl;
+ #endif /* defined(LINUX) */
+-#if defined(FREEBSD)
++#if defined(FREEBSD) && !defined(NO_PROCFS)
+     int us,um,ks,km;
+ #endif /* defined(FREEBSD) */
+ 
+@@ -473,6 +485,15 @@
+     assert(process->id==0x0badfeed);
+ #endif /* defined(PARANOID) */
+ 
++#if defined(NO_PROCFS)
++#define GETV(u) ((u).tv_sec * 1000 + (u).tv_usec / 1000)
++    process->time_stamp = g_time;
++    if(process->name)
++        wmtop_free(process->name);
++    process->name = wmtop_strdup(process->kp->ki_comm);
++    process->user_time = GETV(process->kp->ki_rusage.ru_utime);
++    process->kernel_time = GETV(process->kp->ki_rusage.ru_stime);
++#else
+     sprintf(filename,PROCFS_TEMPLATE,process->pid);
+ 
+     /*
+@@ -582,6 +603,7 @@
+     process->user_time = us*1000+um/1000;
+     process->kernel_time = ks*1000+km/1000;
+ #endif /* defined(FREEBSD) */
++#endif /* defined(NO_PROCFS) */
+ 
+     process->rss *= getpagesize();
+ 
+@@ -607,6 +629,39 @@
+ /******************************************/
+ 
+ int update_process_table() {
++#if defined(NO_PROCFS)
++    kvm_t *kd;
++    int n;
++    struct kinfo_proc *p;
++
++    if((kd = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "wmtop")) == NULL)
++        return 1;
++
++    if((p = kvm_getprocs(kd, KERN_PROC_ALL, 0, &n)) == NULL)
++        return 1;
++
++    for(; n > 0; n --, p ++)
++    {
++      char **argv;
++      struct process *pp;
++
++      if((argv = kvm_getargv(kd, p, 0)) == NULL ||
++         argv[0] == NULL)
++        continue;
++
++      pp = find_process(p->ki_pid);
++      if(!pp)
++          pp = new_process(p->ki_pid);
++
++      pp->kp = p;
++      calculate_cpu(pp);
++    }
++
++    if(kvm_close(kd) != 0)
++        return 1;
++
++    return 0;
++#else
+     DIR *dir;
+     struct dirent *entry;
+ 
+@@ -640,6 +695,7 @@
+     closedir(dir);
+ 
+     return 0;
++#endif /* defined(NO_PROCFS) */
+ }
+ 
+ /******************************************/
diff -Nur wmtop.orig/pkg-plist wmtop/pkg-plist
--- wmtop.orig/pkg-plist	Sun Jun 10 03:39:02 2001
+++ wmtop/pkg-plist	Wed Mar  2 00:33:36 2005
@@ -1,7 +1 @@
 bin/wmtop
-%%PORTDOCS%%share/doc/wmtop/BUGS
-%%PORTDOCS%%share/doc/wmtop/CHANGES
-%%PORTDOCS%%share/doc/wmtop/COPYING
-%%PORTDOCS%%share/doc/wmtop/README
-%%PORTDOCS%%share/doc/wmtop/TODO
-%%PORTDOCS%%@dirrm share/doc/wmtop

>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list