diff options
Diffstat (limited to 'sys/kern/kern_kinfo.c')
| -rw-r--r-- | sys/kern/kern_kinfo.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/sys/kern/kern_kinfo.c b/sys/kern/kern_kinfo.c index e9c97b6d3a0c..5d6da494162b 100644 --- a/sys/kern/kern_kinfo.c +++ b/sys/kern/kern_kinfo.c @@ -31,10 +31,11 @@ * SUCH DAMAGE. * * from: @(#)kern_kinfo.c 7.17 (Berkeley) 6/26/91 - * $Id: kern_kinfo.c,v 1.3 1993/10/16 15:24:18 rgrimes Exp $ + * $Id: kern_kinfo.c,v 1.9 1993/12/19 00:51:26 wollman Exp $ */ #include "param.h" +#include "systm.h" #include "proc.h" #include "kinfo.h" #include "ioctl.h" @@ -58,6 +59,7 @@ struct getkerninfo_args { }; /* ARGSUSED */ +int getkerninfo(p, uap, retval) struct proc *p; register struct getkerninfo_args *uap; @@ -67,10 +69,6 @@ getkerninfo(p, uap, retval) int bufsize; /* max size of users buffer */ int needed, locked, (*server)(), error = 0; - if (error = copyin((caddr_t)uap->size, (caddr_t)&bufsize, - sizeof (bufsize))) - goto done; - switch (ki_type(uap->op)) { case KINFO_PROC: @@ -97,9 +95,14 @@ getkerninfo(p, uap, retval) error = (*server)(uap->op, NULL, NULL, uap->arg, &needed); goto done; } + + if (error = copyin((caddr_t)uap->size, (caddr_t)&bufsize, + sizeof (bufsize))) + goto done; + while (kinfo_lock.kl_lock) { kinfo_lock.kl_want++; - sleep(&kinfo_lock, PRIBIO+1); + tsleep((caddr_t)&kinfo_lock, PRIBIO+1, "kinflck", 0); kinfo_lock.kl_want--; kinfo_lock.kl_locked++; } @@ -119,7 +122,7 @@ getkerninfo(p, uap, retval) release: kinfo_lock.kl_lock--; if (kinfo_lock.kl_want) - wakeup(&kinfo_lock); + wakeup((caddr_t)&kinfo_lock); done: if (!error) *retval = needed; @@ -131,14 +134,18 @@ done: */ #define KINFO_PROCSLOP (5 * sizeof (struct kinfo_proc)) +int kinfo_doproc(op, where, acopysize, arg, aneeded) + int op; char *where; - int *acopysize, *aneeded; + int *acopysize; + int arg; + int *aneeded; { register struct proc *p; register struct kinfo_proc *dp = (struct kinfo_proc *)where; - register needed = 0; - int buflen; + register int needed = 0; + int buflen = 0; int doingzomb; struct eproc eproc; int error = 0; @@ -243,8 +250,10 @@ fill_eproc(p, ep) ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0; if (SESS_LEADER(p)) ep->e_flag |= EPROC_SLEADER; - if (p->p_wmesg) + if (p->p_wmesg) { strncpy(ep->e_wmesg, p->p_wmesg, WMESGLEN); + ep->e_wmesg[WMESGLEN] = 0; /* prevents fault on long wmesg */ + } ep->e_xsize = ep->e_xrssize = 0; ep->e_xccount = ep->e_xswrss = 0; } @@ -252,9 +261,13 @@ fill_eproc(p, ep) /* * Get file structures. */ +int kinfo_file(op, where, acopysize, arg, aneeded) + int op; register char *where; - int *acopysize, *aneeded; + int *acopysize; + int arg; + int *aneeded; { int buflen, needed, error; struct file *fp; |
