Use M_IOBUF instead of M_TEMP for malloc'd buffers.
[unix-history] / sys / kern / kern_kinfo.c
index 6c98b4c..98c350c 100644 (file)
  * SUCH DAMAGE.
  *
  *     from: @(#)kern_kinfo.c  7.17 (Berkeley) 6/26/91
  * 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.8 1993/12/09 09:11:00 davidg Exp $
  */
 
 #include "param.h"
  */
 
 #include "param.h"
+#include "systm.h"
 #include "proc.h"
 #include "kinfo.h"
 #include "ioctl.h"
 #include "proc.h"
 #include "kinfo.h"
 #include "ioctl.h"
@@ -58,6 +59,7 @@ struct getkerninfo_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 getkerninfo(p, uap, retval)
        struct proc *p;
        register struct getkerninfo_args *uap;
 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;
 
        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:
        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;
        }
                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++;
        while (kinfo_lock.kl_lock) {
                kinfo_lock.kl_want++;
-               tsleep(&kinfo_lock, PRIBIO+1, "kinflck", 0);
+               tsleep((caddr_t)&kinfo_lock, PRIBIO+1, "kinflck", 0);
                kinfo_lock.kl_want--;
                kinfo_lock.kl_locked++;
        }
                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)
 release:
        kinfo_lock.kl_lock--;
        if (kinfo_lock.kl_want)
-               wakeup(&kinfo_lock);
+               wakeup((caddr_t)&kinfo_lock);
 done:
        if (!error)
                *retval = needed;
 done:
        if (!error)
                *retval = needed;
@@ -131,14 +134,18 @@ done:
  */
 #define KINFO_PROCSLOP (5 * sizeof (struct kinfo_proc))
 
  */
 #define KINFO_PROCSLOP (5 * sizeof (struct kinfo_proc))
 
+int
 kinfo_doproc(op, where, acopysize, arg, aneeded)
 kinfo_doproc(op, where, acopysize, arg, aneeded)
+       int op;
        char *where;
        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 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;
        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;
        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);
                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;
 }
        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.
  */
 /*
  * Get file structures.
  */
+int
 kinfo_file(op, where, acopysize, arg, aneeded)
 kinfo_file(op, where, acopysize, arg, aneeded)
+       int op;
        register char *where;
        register char *where;
-       int *acopysize, *aneeded;
+       int *acopysize;
+       int arg;
+       int *aneeded;
 {
        int buflen, needed, error;
        struct file *fp;
 {
        int buflen, needed, error;
        struct file *fp;