On Sun, 24 Oct 2010, Philip Guenther wrote: > Grrr. Ken caught that I had failed to include another diff necessary for > the kernel build. To guarantee that I'm not missing others, I've stripped > unrelated diffs from my tree and am doing a full build. Once that's done > and I've proved to myself that I have all the necessary bits I'll send the > complete diff. Sorry about the piece-wise feed folks...
...and here's the complete diff, tested with a clean build. Philip Guenther Index: sys/sys/sysctl.h =================================================================== RCS file: /cvs/src/sys/sys/sysctl.h,v retrieving revision 1.106 diff -u -p -r1.106 sysctl.h --- sys/sys/sysctl.h 19 Aug 2010 18:14:13 -0000 1.106 +++ sys/sys/sysctl.h 24 Oct 2010 11:13:58 -0000 @@ -42,8 +42,6 @@ * These are for the eproc structure defined below. */ #ifndef _KERNEL -#include <sys/time.h> -#include <sys/ucred.h> #include <sys/proc.h> #include <sys/resource.h> #endif @@ -126,9 +124,7 @@ struct ctlname { #define KERN_HOSTID 11 /* int: host identifier */ #define KERN_CLOCKRATE 12 /* struct: struct clockinfo */ #define KERN_VNODE 13 /* struct: vnode structures */ -#if defined(_KERNEL) || defined(_LIBKVM) -#define KERN_PROC 14 /* struct: process entries */ -#endif +/*define gap: was KERN_PROC 14 */ #define KERN_FILE 15 /* struct: file entries */ #define KERN_PROF 16 /* node: kernel profiling info */ #define KERN_POSIX1 17 /* int: POSIX.1 version */ @@ -281,7 +277,7 @@ struct ctlname { /* - * KERN_PROC subtypes + * KERN_PROC2 subtypes */ #define KERN_PROC_ALL 0 /* everything but kernel threads */ #define KERN_PROC_PID 1 /* by process id */ @@ -308,42 +304,6 @@ struct ctlname { #define KERN_PROC_NENV 4 /* - * KERN_PROC subtype ops return arrays of augmented proc structures: - */ -struct kinfo_proc { - struct proc kp_proc; /* proc structure */ - struct eproc { - struct proc *e_paddr; /* address of proc */ - struct session *e_sess; /* session pointer */ - struct pcred e_pcred; /* process credentials */ - struct ucred e_ucred; /* current credentials */ - struct vmspace e_vm; /* address space */ - struct pstats e_pstats; /* process stats */ - int e_pstats_valid; /* pstats valid? */ - pid_t e_ppid; /* parent process id */ - pid_t e_pgid; /* process group id */ - short e_jobc; /* job control counter */ - dev_t e_tdev; /* controlling tty dev */ - pid_t e_tpgid; /* tty process group id */ - struct session *e_tsess; /* tty session pointer */ -#define WMESGLEN 7 - char e_wmesg[WMESGLEN+1]; /* wchan message */ - segsz_t e_xsize; /* text size */ - short e_xrssize; /* text rss */ - short e_xccount; /* text references */ - short e_xswrss; - long e_flag; -#define EPROC_CTTY 0x01 /* controlling tty vnode active */ -#define EPROC_SLEADER 0x02 /* session leader */ - char e_login[MAXLOGNAME]; /* setlogin() name */ -#define EMULNAMELEN 7 - char e_emul[EMULNAMELEN+1]; /* syscall emulation name */ - rlim_t e_maxrss; - struct plimit *e_limit; - } kp_eproc; -}; - -/* * KERN_PROC2 subtype ops return arrays of relatively fixed size * structures of process info. Use 8 byte alignment, and new * elements should only be added to the end of this structure so @@ -373,6 +333,8 @@ struct kinfo_proc2 { u_int64_t p_ru; /* PTR: Exit information. XXX */ int32_t p_eflag; /* LONG: extra kinfo_proc2 flags */ +#define EPROC_CTTY 0x01 /* controlling tty vnode active */ +#define EPROC_SLEADER 0x02 /* session leader */ int32_t p_exitsig; /* INT: signal to sent to parent on exit */ int32_t p_flag; /* INT: P_* flags. */ @@ -955,8 +917,6 @@ int sysctl_vnode(char *, size_t *, struc int sysctl_doprof(int *, u_int, void *, size_t *, void *, size_t); #endif int sysctl_dopool(int *, u_int, char *, size_t *); - -void fill_eproc(struct proc *, struct eproc *); void fill_file2(struct kinfo_file2 *, struct file *, struct filedesc *, int, struct vnode *, struct proc *, struct proc *); Index: sys/compat/common/kern_info_43.c =================================================================== RCS file: /cvs/src/sys/compat/common/kern_info_43.c,v retrieving revision 1.15 diff -u -p -r1.15 kern_info_43.c --- sys/compat/common/kern_info_43.c 15 Aug 2003 20:32:15 -0000 1.15 +++ sys/compat/common/kern_info_43.c 24 Oct 2010 11:11:52 -0000 @@ -225,14 +225,6 @@ compat_43_sys_getkerninfo(p, v, retval) kern_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p); break; - case KINFO_PROC: - name[0] = KERN_PROC; - name[1] = SCARG(uap, op) & 0xff; - name[2] = SCARG(uap, arg); - error = - kern_sysctl(name, 3, SCARG(uap, where), &size, NULL, 0, p); - break; - case KINFO_FILE: name[0] = KERN_FILE; error = Index: sys/kern/kern_sysctl.c =================================================================== RCS file: /cvs/src/sys/kern/kern_sysctl.c,v retrieving revision 1.193 diff -u -p -r1.193 kern_sysctl.c --- sys/kern/kern_sysctl.c 23 Sep 2010 13:24:22 -0000 1.193 +++ sys/kern/kern_sysctl.c 24 Oct 2010 11:13:56 -0000 @@ -273,7 +273,6 @@ kern_sysctl(int *name, u_int namelen, vo /* all sysctl names at this level are terminal except a ton of them */ if (namelen != 1) { switch (name[0]) { - case KERN_PROC: case KERN_PROC2: case KERN_PROF: case KERN_MALLOCSTATS: @@ -360,9 +359,8 @@ kern_sysctl(int *name, u_int namelen, vo case KERN_VNODE: return (sysctl_vnode(oldp, oldlenp, p)); #ifndef SMALL_KERNEL - case KERN_PROC: case KERN_PROC2: - return (sysctl_doproc(name, namelen, oldp, oldlenp)); + return (sysctl_doproc(name + 1, namelen - 1, oldp, oldlenp)); case KERN_PROC_ARGS: return (sysctl_proc_args(name + 1, namelen - 1, oldp, oldlenp, p)); @@ -1317,42 +1315,33 @@ sysctl_file2(int *name, u_int namelen, c /* * try over estimating by 5 procs */ -#define KERN_PROCSLOP (5 * sizeof (struct kinfo_proc)) +#define KERN_PROCSLOP 5 int sysctl_doproc(int *name, u_int namelen, char *where, size_t *sizep) { struct kinfo_proc2 *kproc2 = NULL; - struct eproc *eproc = NULL; struct proc *p; struct process *pr; char *dp; int arg, buflen, doingzomb, elem_size, elem_count; - int error, needed, type, op; + int error, needed, op; dp = where; buflen = where != NULL ? *sizep : 0; needed = error = 0; - type = name[0]; - if (type == KERN_PROC) { - if (namelen != 3 && !(namelen == 2 && - (name[1] == KERN_PROC_ALL || name[1] == KERN_PROC_KTHREAD))) - return (EINVAL); - op = name[1]; - arg = op == KERN_PROC_ALL ? 0 : name[2]; - elem_size = elem_count = 0; - eproc = malloc(sizeof(struct eproc), M_TEMP, M_WAITOK); - } else /* if (type == KERN_PROC2) */ { - if (namelen != 5 || name[3] < 0 || name[4] < 0 || - name[3] > sizeof(*kproc2)) - return (EINVAL); - op = name[1]; - arg = name[2]; - elem_size = name[3]; - elem_count = name[4]; + if (namelen != 4 || name[2] < 0 || name[3] < 0 || + name[2] > sizeof(*kproc2)) + return (EINVAL); + op = name[0]; + arg = name[1]; + elem_size = name[2]; + elem_count = name[3]; + + if (where != NULL) kproc2 = malloc(sizeof(struct kinfo_proc2), M_TEMP, M_WAITOK); - } + p = LIST_FIRST(&allproc); doingzomb = 0; again: @@ -1412,47 +1401,31 @@ again: if (p->p_flag & P_SYSTEM) continue; break; + case KERN_PROC_KTHREAD: /* no filtering */ break; + default: error = EINVAL; goto err; } - if (type == KERN_PROC) { - if (buflen >= sizeof(struct kinfo_proc)) { - fill_eproc(p, eproc); - error = copyout((caddr_t)p, - &((struct kinfo_proc *)dp)->kp_proc, - sizeof(struct proc)); - if (error) - goto err; - error = copyout((caddr_t)eproc, - &((struct kinfo_proc *)dp)->kp_eproc, - sizeof(*eproc)); - if (error) - goto err; - dp += sizeof(struct kinfo_proc); - buflen -= sizeof(struct kinfo_proc); - } - needed += sizeof(struct kinfo_proc); - } else /* if (type == KERN_PROC2) */ { - if (buflen >= elem_size && elem_count > 0) { - fill_kproc2(p, kproc2); - /* - * Copy out elem_size, but not larger than - * the size of a struct kinfo_proc2. - */ - error = copyout(kproc2, dp, - min(sizeof(*kproc2), elem_size)); - if (error) - goto err; - dp += elem_size; - buflen -= elem_size; - elem_count--; - } - needed += elem_size; + + if (buflen >= elem_size && elem_count > 0) { + fill_kproc2(p, kproc2); + /* + * Copy out elem_size, but not larger than + * the size of a struct kinfo_proc2. + */ + error = copyout(kproc2, dp, + min(sizeof(*kproc2), elem_size)); + if (error) + goto err; + dp += elem_size; + buflen -= elem_size; + elem_count--; } + needed += elem_size; } if (doingzomb == 0) { p = LIST_FIRST(&zombproc); @@ -1466,72 +1439,13 @@ again: goto err; } } else { - needed += KERN_PROCSLOP; + needed += KERN_PROCSLOP * elem_size; *sizep = needed; } err: - if (eproc) - free(eproc, M_TEMP); if (kproc2) free(kproc2, M_TEMP); return (error); -} - -/* - * Fill in an eproc structure for the specified process. - */ -void -fill_eproc(struct proc *p, struct eproc *ep) -{ - struct tty *tp; - - ep->e_paddr = p; - ep->e_sess = p->p_p->ps_pgrp->pg_session; - ep->e_pcred = *p->p_cred; - ep->e_ucred = *p->p_ucred; - if (p->p_stat == SIDL || P_ZOMBIE(p)) { - ep->e_vm.vm_rssize = 0; - ep->e_vm.vm_tsize = 0; - ep->e_vm.vm_dsize = 0; - ep->e_vm.vm_ssize = 0; - bzero(&ep->e_pstats, sizeof(ep->e_pstats)); - ep->e_pstats_valid = 0; - } else { - struct vmspace *vm = p->p_vmspace; - - ep->e_vm.vm_rssize = vm_resident_count(vm); - ep->e_vm.vm_tsize = vm->vm_tsize; - ep->e_vm.vm_dsize = vm->vm_dused; - ep->e_vm.vm_ssize = vm->vm_ssize; - ep->e_pstats = *p->p_stats; - ep->e_pstats_valid = 1; - } - if (p->p_p->ps_pptr) - ep->e_ppid = p->p_p->ps_pptr->ps_pid; - else - ep->e_ppid = 0; - ep->e_pgid = p->p_p->ps_pgrp->pg_id; - ep->e_jobc = p->p_p->ps_pgrp->pg_jobc; - if ((p->p_p->ps_flags & PS_CONTROLT) && - (tp = ep->e_sess->s_ttyp)) { - ep->e_tdev = tp->t_dev; - ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; - ep->e_tsess = tp->t_session; - } else - ep->e_tdev = NODEV; - ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0; - if (SESS_LEADER(p->p_p)) - ep->e_flag |= EPROC_SLEADER; - strncpy(ep->e_wmesg, p->p_wmesg ? p->p_wmesg : "", WMESGLEN); - ep->e_wmesg[WMESGLEN] = '\0'; - ep->e_xsize = ep->e_xrssize = 0; - ep->e_xccount = ep->e_xswrss = 0; - strncpy(ep->e_login, ep->e_sess->s_login, MAXLOGNAME-1); - ep->e_login[MAXLOGNAME-1] = '\0'; - strncpy(ep->e_emul, p->p_emul->e_name, EMULNAMELEN); - ep->e_emul[EMULNAMELEN] = '\0'; - ep->e_maxrss = p->p_rlimit ? p->p_rlimit[RLIMIT_RSS].rlim_cur : 0; - ep->e_limit = p->p_p->ps_limit; } /* Index: include/kvm.h =================================================================== RCS file: /cvs/src/include/kvm.h,v retrieving revision 1.14 diff -u -p -r1.14 kvm.h --- include/kvm.h 7 Jun 2009 03:09:34 -0000 1.14 +++ include/kvm.h 24 Oct 2010 11:11:07 -0000 @@ -53,23 +53,18 @@ __BEGIN_DECLS typedef struct __kvm kvm_t; -struct kinfo_proc; struct kinfo_proc2; int kvm_close(kvm_t *); int kvm_dump_inval(kvm_t *); int kvm_dump_mkheader(kvm_t *, off_t); int kvm_dump_wrtheader(kvm_t *, FILE *, int); -char **kvm_getargv(kvm_t *, const struct kinfo_proc *, int); char **kvm_getargv2(kvm_t *, const struct kinfo_proc2 *, int); -char **kvm_getenvv(kvm_t *, const struct kinfo_proc *, int); char **kvm_getenvv2(kvm_t *, const struct kinfo_proc2 *, int); char *kvm_geterr(kvm_t *); int kvm_getloadavg(kvm_t *, double [], int); char *kvm_getfiles(kvm_t *, int, int, int *); struct kinfo_file2 * kvm_getfile2(kvm_t *, int, int, size_t, int *); -struct kinfo_proc * - kvm_getprocs(kvm_t *, int, int, int *); struct kinfo_proc2 * kvm_getproc2(kvm_t *, int, int, size_t, int *); int kvm_nlist(kvm_t *, struct nlist *); Index: lib/libkvm/Makefile =================================================================== RCS file: /cvs/src/lib/libkvm/Makefile,v retrieving revision 1.14 diff -u -p -r1.14 Makefile --- lib/libkvm/Makefile 3 Feb 2010 20:49:00 -0000 1.14 +++ lib/libkvm/Makefile 24 Oct 2010 11:11:17 -0000 @@ -24,11 +24,9 @@ SRCS+= kvm.c kvm_file.c kvm_file2.c kvm_ kvm_cd9660.c kvm_udf.c kvm_ntfs.c MAN= kvm.3 kvm_dump.3 kvm_geterr.3 kvm_getfiles.3 kvm_getloadavg.3 \ - kvm_getprocs.3 kvm_nlist.3 kvm_open.3 kvm_read.3 + kvm_getproc2.3 kvm_nlist.3 kvm_open.3 kvm_read.3 -MLINKS+=kvm_getprocs.3 kvm_getargv.3 kvm_getprocs.3 kvm_getenvv.3 -MLINKS+=kvm_getprocs.3 kvm_getproc2.3 -MLINKS+=kvm_getprocs.3 kvm_getargv2.3 kvm_getprocs.3 kvm_getenvv2.3 +MLINKS+=kvm_getproc2.3 kvm_getargv2.3 kvm_getproc2.3 kvm_getenvv2.3 MLINKS+=kvm_getfiles.3 kvm_getfile2.3 MLINKS+=kvm_open.3 kvm_openfiles.3 kvm_open.3 kvm_close.3 MLINKS+=kvm_read.3 kvm_write.3 Index: lib/libkvm/kvm.3 =================================================================== RCS file: /cvs/src/lib/libkvm/kvm.3,v retrieving revision 1.7 diff -u -p -r1.7 kvm.3 --- lib/libkvm/kvm.3 31 May 2007 19:19:35 -0000 1.7 +++ lib/libkvm/kvm.3 24 Oct 2010 11:11:17 -0000 @@ -67,7 +67,7 @@ interface to physical memory .Xr kvm_getenvv 3 , .Xr kvm_geterr 3 , .Xr kvm_getloadavg 3 , -.Xr kvm_getprocs 3 , +.Xr kvm_getproc2 3 , .Xr kvm_nlist 3 , .Xr kvm_open 3 , .Xr kvm_openfiles 3 , Index: lib/libkvm/kvm.c =================================================================== RCS file: /cvs/src/lib/libkvm/kvm.c,v retrieving revision 1.48 diff -u -p -r1.48 kvm.c --- lib/libkvm/kvm.c 27 Oct 2009 23:59:28 -0000 1.48 +++ lib/libkvm/kvm.c 24 Oct 2010 11:11:17 -0000 @@ -177,7 +177,6 @@ _kvm_open(kvm_t *kd, const char *uf, con kd->nlfd = -1; kd->alive = 0; kd->filebase = 0; - kd->procbase = 0; kd->procbase2 = 0; kd->nbpg = getpagesize(); kd->swapspc = 0; @@ -636,8 +635,6 @@ kvm_close(kvm_t *kd) free((void *)kd->kcore_hdr); if (kd->filebase != 0) free((void *)kd->filebase); - if (kd->procbase != 0) - free((void *)kd->procbase); if (kd->procbase2 != 0) free(kd->procbase2); if (kd->swapspc != 0) Index: lib/libkvm/kvm_geterr.3 =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_geterr.3,v retrieving revision 1.7 diff -u -p -r1.7 kvm_geterr.3 --- lib/libkvm/kvm_geterr.3 31 May 2007 19:19:35 -0000 1.7 +++ lib/libkvm/kvm_geterr.3 24 Oct 2010 11:11:17 -0000 @@ -57,9 +57,9 @@ so the message should be copied out and .Sh SEE ALSO .Xr kvm 3 , .Xr kvm_close 3 , -.Xr kvm_getargv 3 , -.Xr kvm_getenvv 3 , -.Xr kvm_getprocs 3 , +.Xr kvm_getargv2 3 , +.Xr kvm_getenvv2 3 , +.Xr kvm_getproc2 3 , .Xr kvm_nlist 3 , .Xr kvm_open 3 , .Xr kvm_openfiles 3 , Index: lib/libkvm/kvm_getproc2.3 =================================================================== RCS file: lib/libkvm/kvm_getproc2.3 diff -N lib/libkvm/kvm_getproc2.3 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libkvm/kvm_getproc2.3 24 Oct 2010 11:25:12 -0000 @@ -0,0 +1,196 @@ +.\" $OpenBSD: kvm_getprocs.3,v 1.13 2007/05/31 19:19:35 jmc Exp $ +.\" $NetBSD: kvm_getprocs.3,v 1.13 2003/08/07 16:44:37 agc Exp $ +.\" +.\" Copyright (c) 1992, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software developed by the Computer Systems +.\" Engineering group at Lawrence Berkeley Laboratory under DARPA contract +.\" BG 91-66 and contributed to Berkeley. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)kvm_getproc2.3 8.1 (Berkeley) 6/4/93 +.\" +.Dd $Mdocdate: May 31 2007 $ +.Dt KVM_GETPROC2 3 +.Os +.Sh NAME +.Nm kvm_getproc2 , +.Nm kvm_getargv2 , +.Nm kvm_getenvv2 +.Nd access user process state +.Sh SYNOPSIS +.Fd #include <sys/param.h> +.Fd #include <sys/sysctl.h> +.Fd #include <kvm.h> +.Ft struct kinfo_proc2 * +.Fn kvm_getproc2 "kvm_t *kd" "int op" "int arg" "size_t elemsize" "int *cnt" +.Ft char ** +.Fn kvm_getargv2 "kvm_t *kd" "const struct kinfo_proc2 *p" "int nchr" +.Ft char ** +.Fn kvm_getenvv2 "kvm_t *kd" "const struct kinfo_proc2 *p" "int nchr" +.Sh DESCRIPTION +.Fn kvm_getproc2 +returns a (sub-)set of active processes in the kernel indicated by +.Fa kd . +The +.Fa op +and +.Fa arg +arguments constitute a predicate which limits the set of processes returned. +The value of +.Fa op +describes the filtering predicate as follows: +.Pp +.Bl -tag -width 20n -offset indent -compact +.It Dv KERN_PROC_KTHREAD +all processes (user-level plus kernel threads) +.It Dv KERN_PROC_ALL +all user-level processes +.It Dv KERN_PROC_PID +processes with process ID +.Fa arg +.It Dv KERN_PROC_PGRP +processes with process group +.Fa arg +.It Dv KERN_PROC_SESSION +processes with session +.Fa arg +.It Dv KERN_PROC_TTY +processes with +.Xr tty 4 +.Fa arg +.It Dv KERN_PROC_UID +processes with effective user ID +.Fa arg +.It Dv KERN_PROC_RUID +processes with real user ID +.Fa arg +.El +The +.Fa elemsize +argument specifies how large the +.Vt kinfo_proc2 +structure expected by the caller is. +If the size of that structure increases in size in a future release of +.Ox , +the kernel will only return the requested amount of data for +each array entry and programs that use +.Fn kvm_getproc2 +will continue to function without the need for recompilation. +.Pp +The number of processes found is returned in the reference parameter +.Fa cnt . +The processes are returned as a contiguous array of +.Vt kinfo_proc2 +structures, the definition for which is available in +.Aq Pa sys/sysctl.h . +This memory is locally allocated, and subsequent calls to +.Fn kvm_getproc2 +and +.Xr kvm_close 3 +will overwrite this storage. +.Pp +.Fn kvm_getargv2 +returns a null-terminated argument vector that corresponds to the +command line arguments passed to process indicated by +.Fa p . +Most likely, these arguments correspond to the values passed to +.Xr exec 3 +on process creation. +This information is, however, +deliberately under control of the process itself. +Note that the original command name can be found, unaltered, +in the +.Va p_comm +field of the process structure returned by +.Fn kvm_getproc2 . +.Pp +The +.Fa nchr +argument indicates the maximum number of characters, including null bytes, +to use in building the strings. +If this amount is exceeded, the string +causing the overflow is truncated and the partial result is returned. +This is handy for programs like +.Xr ps 1 +and +.Xr w 1 +that print only a one line summary of a command and should not copy +out large amounts of text only to ignore it. +If +.Fa nchr +is zero, no limit is imposed and all argument strings are returned in +their entirety. +.Pp +The memory allocated to the +.Li argv +pointers and string storage is owned by the +.Xr kvm 3 +library. +Subsequent +.Fn kvm_getproc2 +and +.Xr kvm_close 3 +calls will clobber this storage. +.Pp +The +.Fn kvm_getenvv2 +function is similar to +.Fn kvm_getargv2 +but returns the vector of environment strings. +This data is also alterable by the process. +.Sh RETURN VALUES +.Fn kvm_getproc2 , +.Fn kvm_getargv2 , +and +.Fn kvm_getenvv2 +all return +.Dv NULL +on failure. +.Sh SEE ALSO +.Xr kvm 3 , +.Xr kvm_close 3 , +.Xr kvm_geterr 3 , +.Xr kvm_nlist 3 , +.Xr kvm_open 3 , +.Xr kvm_openfiles 3 , +.Xr kvm_read 3 , +.Xr kvm_write 3 +.Sh HISTORY +These routines where designed as replacements for the defunct +.Fn kvm_getprocs , +.Fn kvm_getargv , +and +.Fn kvm_getenvv +functions. +Those functions used the kernel's own structures in their interfaces, +so their ABIs changed whenever those structures changed in the +kernel. +.Sh BUGS +These routines do not belong in the +.Xr kvm 3 +interface. Index: lib/libkvm/kvm_getprocs.3 =================================================================== RCS file: lib/libkvm/kvm_getprocs.3 diff -N lib/libkvm/kvm_getprocs.3 --- lib/libkvm/kvm_getprocs.3 31 May 2007 19:19:35 -0000 1.13 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,217 +0,0 @@ -.\" $OpenBSD: kvm_getprocs.3,v 1.13 2007/05/31 19:19:35 jmc Exp $ -.\" $NetBSD: kvm_getprocs.3,v 1.13 2003/08/07 16:44:37 agc Exp $ -.\" -.\" Copyright (c) 1992, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" This code is derived from software developed by the Computer Systems -.\" Engineering group at Lawrence Berkeley Laboratory under DARPA contract -.\" BG 91-66 and contributed to Berkeley. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)kvm_getprocs.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd $Mdocdate: May 31 2007 $ -.Dt KVM_GETPROCS 3 -.Os -.Sh NAME -.Nm kvm_getprocs , -.Nm kvm_getargv , -.Nm kvm_getenvv , -.Nm kvm_getproc2 , -.Nm kvm_getargv2 , -.Nm kvm_getenvv2 -.Nd access user process state -.Sh SYNOPSIS -.Fd #include <sys/param.h> -.Fd #include <sys/sysctl.h> -.Fd #include <kvm.h> -.Ft struct kinfo_proc * -.Fn kvm_getprocs "kvm_t *kd" "int op" "int arg" "int *cnt" -.Ft char ** -.Fn kvm_getargv "kvm_t *kd" "const struct kinfo_proc *p" "int nchr" -.Ft char ** -.Fn kvm_getenvv "kvm_t *kd" "const struct kinfo_proc *p" "int nchr" -.Ft struct kinfo_proc2 * -.Fn kvm_getproc2 "kvm_t *kd" "int op" "int arg" "size_t elemsize" "int *cnt" -.Ft char ** -.Fn kvm_getargv2 "kvm_t *kd" "const struct kinfo_proc2 *p" "int nchr" -.Ft char ** -.Fn kvm_getenvv2 "kvm_t *kd" "const struct kinfo_proc2 *p" "int nchr" -.Sh DESCRIPTION -.Fn kvm_getprocs -returns a (sub-)set of active processes in the kernel indicated by -.Fa kd . -The -.Fa op -and -.Fa arg -arguments constitute a predicate which limits the set of processes returned. -The value of -.Fa op -describes the filtering predicate as follows: -.Pp -.Bl -tag -width 20n -offset indent -compact -.It Dv KERN_PROC_KTHREAD -all processes (user-level plus kernel threads) -.It Dv KERN_PROC_ALL -all user-level processes -.It Dv KERN_PROC_PID -processes with process ID -.Fa arg -.It Dv KERN_PROC_PGRP -processes with process group -.Fa arg -.It Dv KERN_PROC_SESSION -processes with session -.Fa arg -.It Dv KERN_PROC_TTY -processes with -.Xr tty 4 -.Fa arg -.It Dv KERN_PROC_UID -processes with effective user ID -.Fa arg -.It Dv KERN_PROC_RUID -processes with real user ID -.Fa arg -.El -.Pp -The number of processes found is returned in the reference parameter -.Fa cnt . -The processes are returned as a contiguous array of -.Vt kinfo_proc -structures, the definition for which is available in -.Aq Pa sys/sysctl.h . -This memory is locally allocated, and subsequent calls to -.Fn kvm_getprocs -and -.Fn kvm_close -will overwrite this storage. -.Pp -.Fn kvm_getargv -returns a null-terminated argument vector that corresponds to the -command line arguments passed to process indicated by -.Fa p . -Most likely, these arguments correspond to the values passed to -.Xr exec 3 -on process creation. -This information is, however, -deliberately under control of the process itself. -Note that the original command name can be found, unaltered, -in the -.Va p_comm -field of the process structure returned by -.Fn kvm_getprocs . -.Pp -The -.Fa nchr -argument indicates the maximum number of characters, including null bytes, -to use in building the strings. -If this amount is exceeded, the string -causing the overflow is truncated and the partial result is returned. -This is handy for programs like -.Xr ps 1 -and -.Xr w 1 -that print only a one line summary of a command and should not copy -out large amounts of text only to ignore it. -If -.Fa nchr -is zero, no limit is imposed and all argument strings are returned in -their entirety. -.Pp -The memory allocated to the -.Li argv -pointers and string storage is owned by the -.Xr kvm 3 -library. -Subsequent -.Fn kvm_getprocs -and -.Xr kvm_close 3 -calls will clobber this storage. -.Pp -The -.Fn kvm_getenvv -function is similar to -.Fn kvm_getargv -but returns the vector of environment strings. -This data is also alterable by the process. -.Pp -.Fn kvm_getproc2 -is similar to -.Fn kvm_getprocs -but returns an array of -.Vt kinfo_proc2 -structures. -Additionally, only the first -.Fa elemsize -bytes of each array entry are returned. -If the size of the -.Vt kinfo_proc2 -structure increases in size in a future release of -.Ox , -the kernel will only return the requested amount of data for -each array entry and programs that use -.Fn kvm_getproc2 -will continue to function without the need for recompilation. -.Pp -The -.Fn kvm_getargv2 -and -.Fn kvm_getenvv2 -functions are equivalents to the -.Fn kvm_getargv -and -.Fn kvm_getenvv -functions that use a -.Vt kinfo_proc2 -structure to specify the process. -.Sh RETURN VALUES -.Fn kvm_getprocs , -.Fn kvm_getargv , -.Fn kvm_getenvv , -.Fn kvm_getproc2 , -.Fn kvm_getargv2 , -and -.Fn kvm_getenvv2 -all return -.Dv NULL -on failure. -.Sh SEE ALSO -.Xr kvm 3 , -.Xr kvm_close 3 , -.Xr kvm_geterr 3 , -.Xr kvm_nlist 3 , -.Xr kvm_open 3 , -.Xr kvm_openfiles 3 , -.Xr kvm_read 3 , -.Xr kvm_write 3 -.Sh BUGS -These routines do not belong in the -.Xr kvm 3 -interface. Index: lib/libkvm/kvm_nlist.3 =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_nlist.3,v retrieving revision 1.8 diff -u -p -r1.8 kvm_nlist.3 --- lib/libkvm/kvm_nlist.3 31 May 2007 19:19:35 -0000 1.8 +++ lib/libkvm/kvm_nlist.3 24 Oct 2010 11:11:17 -0000 @@ -85,10 +85,10 @@ If the kernel symbol table was unreadabl .Sh SEE ALSO .Xr kvm 3 , .Xr kvm_close 3 , -.Xr kvm_getargv 3 , -.Xr kvm_getenvv 3 , +.Xr kvm_getargv2 3 , +.Xr kvm_getenvv2 3 , .Xr kvm_geterr 3 , -.Xr kvm_getprocs 3 , +.Xr kvm_getproc2 3 , .Xr kvm_open 3 , .Xr kvm_openfiles 3 , .Xr kvm_read 3 , Index: lib/libkvm/kvm_open.3 =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_open.3,v retrieving revision 1.13 diff -u -p -r1.13 kvm_open.3 --- lib/libkvm/kvm_open.3 21 Jan 2009 22:18:00 -0000 1.13 +++ lib/libkvm/kvm_open.3 24 Oct 2010 11:11:17 -0000 @@ -188,10 +188,10 @@ function returns 0 on success and \-1 on .Sh SEE ALSO .Xr open 2 , .Xr kvm 3 , -.Xr kvm_getargv 3 , -.Xr kvm_getenvv 3 , +.Xr kvm_getargv2 3 , +.Xr kvm_getenvv2 3 , .Xr kvm_geterr 3 , -.Xr kvm_getprocs 3 , +.Xr kvm_getproc2 3 , .Xr kvm_nlist 3 , .Xr kvm_read 3 , .Xr kvm_write 3 Index: lib/libkvm/kvm_private.h =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_private.h,v retrieving revision 1.16 diff -u -p -r1.16 kvm_private.h --- lib/libkvm/kvm_private.h 12 Jan 2010 08:15:51 -0000 1.16 +++ lib/libkvm/kvm_private.h 24 Oct 2010 11:11:17 -0000 @@ -49,7 +49,6 @@ struct __kvm { int vmfd; /* virtual memory file (-1 if crashdump) */ int swfd; /* swap file (e.g., /dev/drum) */ int nlfd; /* namelist file (e.g., /vmunix) */ - struct kinfo_proc *procbase; struct kinfo_proc2 *procbase2; struct kinfo_file *filebase; int nbpg; /* page size */ @@ -93,7 +92,6 @@ struct __kvm { */ void _kvm_err(kvm_t *kd, const char *program, const char *fmt, ...); int _kvm_dump_mkheader(kvm_t *kd_live, kvm_t *kd_dump); -void _kvm_freeprocs(kvm_t *kd); void _kvm_freevtop(kvm_t *); int _kvm_initvtop(kvm_t *); int _kvm_kvatop(kvm_t *, u_long, paddr_t *); Index: lib/libkvm/kvm_proc.c =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_proc.c,v retrieving revision 1.41 diff -u -p -r1.41 kvm_proc.c --- lib/libkvm/kvm_proc.c 26 Jul 2010 01:56:27 -0000 1.41 +++ lib/libkvm/kvm_proc.c 24 Oct 2010 11:11:18 -0000 @@ -69,7 +69,6 @@ * most other applications are interested only in open/close/read/nlist). */ -#define __need_process #include <sys/param.h> #include <sys/user.h> #include <sys/proc.h> @@ -107,24 +106,8 @@ struct miniproc { }; /* - * Convert from struct proc and kinfo_proc{,2} to miniproc. + * Convert from struct kinfo_proc2 to miniproc. */ -#define PTOMINI(kp, p) \ - do { \ - (p)->p_stat = (kp)->p_stat; \ - (p)->p_pid = (kp)->p_pid; \ - (p)->p_paddr = NULL; \ - (p)->p_vmspace = (kp)->p_vmspace; \ - } while (/*CONSTCOND*/0); - -#define KPTOMINI(kp, p) \ - do { \ - (p)->p_stat = (kp)->kp_proc.p_stat; \ - (p)->p_pid = (kp)->kp_proc.p_pid; \ - (p)->p_paddr = (kp)->kp_eproc.e_paddr; \ - (p)->p_vmspace = (kp)->kp_proc.p_vmspace; \ - } while (/*CONSTCOND*/0); - #define KP2TOMINI(kp, p) \ do { \ (p)->p_stat = (kp)->p_stat; \ @@ -134,18 +117,13 @@ struct miniproc { } while (/*CONSTCOND*/0); -ssize_t kvm_uread(kvm_t *, const struct proc *, u_long, char *, size_t); - static char *_kvm_ureadm(kvm_t *, const struct miniproc *, u_long, u_long *); static ssize_t kvm_ureadm(kvm_t *, const struct miniproc *, u_long, char *, size_t); static char **kvm_argv(kvm_t *, const struct miniproc *, u_long, int, int); -static int kvm_deadprocs(kvm_t *, int, int, u_long, u_long, int); static char **kvm_doargv(kvm_t *, const struct miniproc *, int, void (*)(struct ps_strings *, u_long *, int *)); -static int kvm_proclist(kvm_t *, int, int, struct proc *, - struct kinfo_proc *, int); static int proc_verify(kvm_t *, const struct miniproc *); static void ps_str_a(struct ps_strings *, u_long *, int *); static void ps_str_e(struct ps_strings *, u_long *, int *); @@ -231,261 +209,6 @@ _kvm_ureadm(kvm_t *kd, const struct mini return (&kd->swapspc[offset]); } -char * -_kvm_uread(kvm_t *kd, const struct proc *p, u_long va, u_long *cnt) -{ - struct miniproc mp; - - PTOMINI(p, &mp); - return (_kvm_ureadm(kd, &mp, va, cnt)); -} - -/* - * Read proc's from memory file into buffer bp, which has space to hold - * at most maxcnt procs. - */ -static int -kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p, - struct kinfo_proc *bp, int maxcnt) -{ - struct session sess; - struct eproc eproc; - struct proc proc; - struct process process; - struct pgrp pgrp; - struct tty tty; - int cnt = 0; - - for (; cnt < maxcnt && p != NULL; p = LIST_NEXT(&proc, p_list)) { - if (KREAD(kd, (u_long)p, &proc)) { - _kvm_err(kd, kd->program, "can't read proc at %x", p); - return (-1); - } - if (KREAD(kd, (u_long)proc.p_p, &process)) { - _kvm_err(kd, kd->program, "can't read process at %x", proc.p_p); - return (-1); - } - if (KREAD(kd, (u_long)process.ps_cred, &eproc.e_pcred) == 0) - KREAD(kd, (u_long)eproc.e_pcred.pc_ucred, - &eproc.e_ucred); - - switch (what) { - case KERN_PROC_PID: - if (proc.p_pid != (pid_t)arg) - continue; - break; - - case KERN_PROC_UID: - if (eproc.e_ucred.cr_uid != (uid_t)arg) - continue; - break; - - case KERN_PROC_RUID: - if (eproc.e_pcred.p_ruid != (uid_t)arg) - continue; - break; - - case KERN_PROC_ALL: - if (proc.p_flag & P_SYSTEM) - continue; - break; - } - /* - * We're going to add another proc to the set. If this - * will overflow the buffer, assume the reason is because - * nprocs (or the proc list) is corrupt and declare an error. - */ - if (cnt >= maxcnt) { - _kvm_err(kd, kd->program, "nprocs corrupt"); - return (-1); - } - /* - * gather eproc - */ - eproc.e_paddr = p; - if (KREAD(kd, (u_long)process.ps_pgrp, &pgrp)) { - _kvm_err(kd, kd->program, "can't read pgrp at %x", - process.ps_pgrp); - return (-1); - } - eproc.e_sess = pgrp.pg_session; - eproc.e_pgid = pgrp.pg_id; - eproc.e_jobc = pgrp.pg_jobc; - if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) { - _kvm_err(kd, kd->program, "can't read session at %x", - pgrp.pg_session); - return (-1); - } - if ((process.ps_flags & PS_CONTROLT) && sess.s_ttyp != NULL) { - if (KREAD(kd, (u_long)sess.s_ttyp, &tty)) { - _kvm_err(kd, kd->program, - "can't read tty at %x", sess.s_ttyp); - return (-1); - } - eproc.e_tdev = tty.t_dev; - eproc.e_tsess = tty.t_session; - if (tty.t_pgrp != NULL) { - if (KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) { - _kvm_err(kd, kd->program, - "can't read tpgrp at &x", - tty.t_pgrp); - return (-1); - } - eproc.e_tpgid = pgrp.pg_id; - } else - eproc.e_tpgid = -1; - } else - eproc.e_tdev = NODEV; - eproc.e_flag = sess.s_ttyvp ? EPROC_CTTY : 0; - if (sess.s_leader == proc.p_p) - eproc.e_flag |= EPROC_SLEADER; - if (proc.p_wmesg) - (void)kvm_read(kd, (u_long)proc.p_wmesg, - eproc.e_wmesg, WMESGLEN); - - (void)kvm_read(kd, (u_long)proc.p_vmspace, - &eproc.e_vm, sizeof(eproc.e_vm)); - - eproc.e_xsize = eproc.e_xrssize = 0; - eproc.e_xccount = eproc.e_xswrss = 0; - - switch (what) { - case KERN_PROC_PGRP: - if (eproc.e_pgid != (pid_t)arg) - continue; - break; - - case KERN_PROC_TTY: - if ((process.ps_flags & PS_CONTROLT) == 0 || - eproc.e_tdev != (dev_t)arg) - continue; - break; - } - proc.p_flag |= process.ps_flags; - bcopy(&proc, &bp->kp_proc, sizeof(proc)); - bcopy(&eproc, &bp->kp_eproc, sizeof(eproc)); - ++bp; - ++cnt; - } - return (cnt); -} - -/* - * Build proc info array by reading in proc list from a crash dump. - * Return number of procs read. maxcnt is the max we will read. - */ -static int -kvm_deadprocs(kvm_t *kd, int what, int arg, u_long a_allproc, - u_long a_zombproc, int maxcnt) -{ - struct kinfo_proc *bp = kd->procbase; - struct proc *p; - int acnt, zcnt; - - if (KREAD(kd, a_allproc, &p)) { - _kvm_err(kd, kd->program, "cannot read allproc"); - return (-1); - } - acnt = kvm_proclist(kd, what, arg, p, bp, maxcnt); - if (acnt < 0) - return (acnt); - - if (KREAD(kd, a_zombproc, &p)) { - _kvm_err(kd, kd->program, "cannot read zombproc"); - return (-1); - } - zcnt = kvm_proclist(kd, what, arg, p, bp + acnt, maxcnt - acnt); - if (zcnt < 0) - zcnt = 0; - - return (acnt + zcnt); -} - -struct kinfo_proc * -kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt) -{ - int mib[4], st, nprocs; - size_t size; - - if (kd->procbase != 0) { - free((void *)kd->procbase); - /* - * Clear this pointer in case this call fails. Otherwise, - * kvm_close() will free it again. - */ - kd->procbase = 0; - } - if (ISALIVE(kd)) { - size = 0; - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = op; - mib[3] = arg; - st = sysctl(mib, 4, NULL, &size, NULL, 0); - if (st == -1) { - _kvm_syserr(kd, kd->program, "kvm_getprocs"); - return (0); - } - kd->procbase = _kvm_malloc(kd, size); - if (kd->procbase == 0) - return (0); - st = sysctl(mib, 4, kd->procbase, &size, NULL, 0); - if (st == -1) { - _kvm_syserr(kd, kd->program, "kvm_getprocs"); - return (0); - } - if (size % sizeof(struct kinfo_proc) != 0) { - _kvm_err(kd, kd->program, - "proc size mismatch (%d total, %d chunks)", - size, sizeof(struct kinfo_proc)); - return (0); - } - nprocs = size / sizeof(struct kinfo_proc); - } else { - struct nlist nl[4], *p; - - memset(nl, 0, sizeof(nl)); - nl[0].n_name = "_nprocs"; - nl[1].n_name = "_allproc"; - nl[2].n_name = "_zombproc"; - nl[3].n_name = NULL; - - if (kvm_nlist(kd, nl) != 0) { - for (p = nl; p->n_type != 0; ++p) - ; - _kvm_err(kd, kd->program, - "%s: no such symbol", p->n_name); - return (0); - } - if (KREAD(kd, nl[0].n_value, &nprocs)) { - _kvm_err(kd, kd->program, "can't read nprocs"); - return (0); - } - size = nprocs * sizeof(struct kinfo_proc); - kd->procbase = _kvm_malloc(kd, size); - if (kd->procbase == 0) - return (0); - - nprocs = kvm_deadprocs(kd, op, arg, nl[1].n_value, - nl[2].n_value, nprocs); -#ifdef notdef - size = nprocs * sizeof(struct kinfo_proc); - (void)realloc(kd->procbase, size); -#endif - } - *cnt = nprocs; - return (kd->procbase); -} - -void -_kvm_freeprocs(kvm_t *kd) -{ - if (kd->procbase) { - free(kd->procbase); - kd->procbase = 0; - } -} - void * _kvm_realloc(kvm_t *kd, void *p, size_t n) { @@ -511,7 +234,7 @@ kvm_argv(kvm_t *kd, const struct minipro int len, cc; /* - * Check that there aren't an unreasonable number of agruments, + * Check that there aren't an unreasonable number of arguments, * and that the address is in user space. */ if (narg > ARG_MAX || addr < VM_MIN_ADDRESS || addr >= VM_MAXUSER_ADDRESS) @@ -740,28 +463,6 @@ again: * Get the command args. This code is now machine independent. */ char ** -kvm_getargv(kvm_t *kd, const struct kinfo_proc *kp, int nchr) -{ - struct miniproc p; - - if (ISALIVE(kd)) - return (kvm_arg_sysctl(kd, kp->kp_proc.p_pid, nchr, 0)); - KPTOMINI(kp, &p); - return (kvm_doargv(kd, &p, nchr, ps_str_a)); -} - -char ** -kvm_getenvv(kvm_t *kd, const struct kinfo_proc *kp, int nchr) -{ - struct miniproc p; - - if (ISALIVE(kd)) - return (kvm_arg_sysctl(kd, kp->kp_proc.p_pid, nchr, 1)); - KPTOMINI(kp, &p); - return (kvm_doargv(kd, &p, nchr, ps_str_e)); -} - -char ** kvm_getargv2(kvm_t *kd, const struct kinfo_proc2 *kp, int nchr) { struct miniproc p; @@ -809,14 +510,4 @@ kvm_ureadm(kvm_t *kd, const struct minip len -= cc; } return (ssize_t)(cp - buf); -} - -ssize_t -kvm_uread(kvm_t *kd, const struct proc *p, u_long uva, char *buf, - size_t len) -{ - struct miniproc mp; - - PTOMINI(p, &mp); - return (kvm_ureadm(kd, &mp, uva, buf, len)); } Index: lib/libkvm/kvm_read.3 =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_read.3,v retrieving revision 1.7 diff -u -p -r1.7 kvm_read.3 --- lib/libkvm/kvm_read.3 31 May 2007 19:19:35 -0000 1.7 +++ lib/libkvm/kvm_read.3 24 Oct 2010 11:11:18 -0000 @@ -84,10 +84,10 @@ Otherwise, \-1 is returned. .Sh SEE ALSO .Xr kvm 3 , .Xr kvm_close 3 , -.Xr kvm_getargv 3 , -.Xr kvm_getenvv 3 , +.Xr kvm_getargv2 3 , +.Xr kvm_getenvv2 3 , .Xr kvm_geterr 3 , -.Xr kvm_getprocs 3 , +.Xr kvm_getproc2 3 , .Xr kvm_nlist 3 , .Xr kvm_open 3 , .Xr kvm_openfiles 3 Index: lib/libkvm/shlib_version =================================================================== RCS file: /cvs/src/lib/libkvm/shlib_version,v retrieving revision 1.9 diff -u -p -r1.9 shlib_version --- lib/libkvm/shlib_version 7 Jun 2009 03:09:34 -0000 1.9 +++ lib/libkvm/shlib_version 24 Oct 2010 11:11:18 -0000 @@ -1,2 +1,2 @@ -major=9 -minor=1 +major=10 +minor=0 Index: sbin/sysctl/sysctl.c =================================================================== RCS file: /cvs/src/sbin/sysctl/sysctl.c,v retrieving revision 1.173 diff -u -p -r1.173 sysctl.c --- sbin/sysctl/sysctl.c 19 Aug 2010 18:14:14 -0000 1.173 +++ sbin/sysctl/sysctl.c 24 Oct 2010 11:21:37 -0000 @@ -391,7 +391,6 @@ parse(char *string, int flags) return; warnx("use pstat to view %s information", string); return; - case KERN_PROC: case KERN_PROC2: if (flags == 0) return; Index: bin/ps/keyword.c =================================================================== RCS file: /cvs/src/bin/ps/keyword.c,v retrieving revision 1.30 diff -u -p -r1.30 keyword.c --- bin/ps/keyword.c 14 Feb 2010 00:17:14 -0000 1.30 +++ bin/ps/keyword.c 24 Oct 2010 11:10:14 -0000 @@ -90,7 +90,7 @@ VAR var[] = { {"cpuid", "CPUID", NULL, 0, pvar, 8, 0, POFF(p_cpuid), UINT64, "lld"}, {"cputime", "", "time"}, {"dsiz", "DSIZ", NULL, 0, dsize, 4}, - {"emul", "EMUL", NULL, LJUST, emulname, EMULNAMELEN}, + {"emul", "EMUL", NULL, LJUST, emulname, KI_EMULNAMELEN - 1}, {"etime", "", "start"}, {"f", "F", NULL, 0, pvar, 7, 0, POFF(p_flag), INT32, "x"}, {"flags", "", "f"}, @@ -171,7 +171,7 @@ VAR var[] = { {"usrpri", "", "upr"}, {"vsize", "", "vsz"}, {"vsz", "VSZ", NULL, 0, vsize, 5}, - {"wchan", "WCHAN", NULL, LJUST, wchan, 7}, + {"wchan", "WCHAN", NULL, LJUST, wchan, KI_WMESGLEN - 1}, {"xstat", "XSTAT", NULL, 0, pvar, 4, 0, POFF(p_xstat), UINT16, "x"}, {""}, }; Index: bin/ps/print.c =================================================================== RCS file: /cvs/src/bin/ps/print.c,v retrieving revision 1.46 diff -u -p -r1.46 print.c --- bin/ps/print.c 14 Feb 2010 00:17:14 -0000 1.46 +++ bin/ps/print.c 24 Oct 2010 11:10:14 -0000 @@ -432,16 +432,7 @@ wchan(const struct kinfo_proc2 *kp, VARE v = ve->var; if (kp->p_wchan) { - int n; - - if (kp->p_wmesg) { - n = min(v->width, WMESGLEN); - (void)printf("%-*.*s", n, n, kp->p_wmesg); - if (v->width > n) - (void)printf("%*s", v->width - n, ""); - } else - (void)printf("%-*lx", v->width, - (long)kp->p_wchan &~ KERNBASE); + (void)printf("%-*s", (int)v->width, kp->p_wmesg); } else (void)printf("%-*s", v->width, "-"); }