diff --git a/sysdeps/freebsd/ChangeLog b/sysdeps/freebsd/ChangeLog index 92551ff1..c50e49f5 100644 --- a/sysdeps/freebsd/ChangeLog +++ b/sysdeps/freebsd/ChangeLog @@ -1,3 +1,11 @@ +1998-10-03 Martin Baulig + + * procstate.c (glibtop_get_procstate_s): Use correct values for + the `state' field. + + * proclist.c (glibtop_get_proclist_p): Honor the GLIBTOP_EXCLUDE_IDLE + and GLIBTOP_EXCLUDE_SYSTEM flags of the `which' parameter. + 1998-08-24 Martin Baulig * *.c (glibtop_init_p): Using correct `(1 << GLIBTOP_SYSDPES_*)'. diff --git a/sysdeps/freebsd/proclist.c b/sysdeps/freebsd/proclist.c index 4f7ae29b..6c95e33f 100644 --- a/sysdeps/freebsd/proclist.c +++ b/sysdeps/freebsd/proclist.c @@ -58,12 +58,12 @@ glibtop_init_proclist_p (glibtop *server) unsigned * glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf, - int64_t which, int64_t arg) + int64_t real_which, int64_t arg) { struct kinfo_proc *pinfo; unsigned *pids = NULL; - int count; - int i; + int which, count; + int i,j; glibtop_init_p (server, (1 << GLIBTOP_SYSDEPS_PROCLIST), 0); @@ -71,7 +71,7 @@ glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf, glibtop_suid_enter (server); - which &= GLIBTOP_KERN_PROC_MASK; + which = (int)(real_which & GLIBTOP_KERN_PROC_MASK); /* Get the process data */ pinfo = kvm_getprocs (server->machine.kd, which, arg, &count); @@ -86,13 +86,19 @@ glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf, * Same as malloc is pids is NULL, which it is. */ pids = glibtop_realloc_r (server, pids, count * sizeof (unsigned)); /* Copy the pids over to this chain */ - for (i=0; i < count; i++) { - pids [i] = (unsigned) pinfo[i].kp_proc.p_pid; + for (i=j=0; i < count; i++) { + if ((real_which & GLIBTOP_EXCLUDE_IDLE) && + (pinfo[i].kp_proc.p_stat != SRUN)) + continue; + else if ((real_which & GLIBTOP_EXCLUDE_SYSTEM) && + (pinfo[i].kp_eproc.e_pcred.p_ruid == 0)) + continue; + pids [j++] = (unsigned) pinfo[i].kp_proc.p_pid; } /* end for */ /* Set the fields in buf */ - buf->number = count; + buf->number = j; buf->size = sizeof (unsigned); - buf->total = count * sizeof (unsigned); + buf->total = j * sizeof (unsigned); buf->flags = _glibtop_sysdeps_proclist; return pids; } diff --git a/sysdeps/freebsd/procstate.c b/sysdeps/freebsd/procstate.c index 92fa897c..c916f285 100644 --- a/sysdeps/freebsd/procstate.c +++ b/sysdeps/freebsd/procstate.c @@ -68,7 +68,26 @@ glibtop_get_proc_state_p (glibtop *server, buf->uid = pinfo [0].kp_eproc.e_pcred.p_svuid; buf->gid = pinfo [0].kp_eproc.e_pcred.p_svgid; - buf->state = pinfo [0].kp_proc.p_stat; + switch (pinfo [0].kp_proc.p_stat) { + case SIDL: + buf->state = 'I'; + break; + case SRUN: + buf->state = 'R'; + break; + case SSLEEP: + buf->state = 'S'; + break; + case SSTOP: + buf->state = 'T'; + break; + case SZOMB: + buf->state = 'Z'; + break; + default: + buf->state = '?'; + break; + } /* Set the flags for the data we're about to return*/ buf->flags = _glibtop_sysdeps_proc_state;