2 * Copyright (c) 1989, 1992, 1993
3 * The Regents of the University of California. All rights reserved.
5 * This code is derived from software developed by the Computer Systems
6 * Engineering group at Lawrence Berkeley Laboratory under DARPA contract
7 * BG 91-66 and contributed to Berkeley.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 #if defined(LIBC_SCCS) && !defined(lint)
36 static char sccsid
[] = "@(#)kvm_proc.c 8.3 (Berkeley) 9/23/93";
37 #endif /* LIBC_SCCS and not lint */
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD$");
44 * Proc traversal interface for kvm. ps and w are (probably) the exclusive
45 * users of this code, so we've factored it out into a separate module.
46 * Thus, we keep this grunge out of the other kvm applications (i.e.,
47 * most other applications are interested only in open/close/read/nlist).
50 #include <sys/param.h>
51 #define _WANT_UCRED /* make ucred.h give us 'struct ucred' */
52 #include <sys/ucred.h>
53 #include <sys/queue.h>
54 #include <sys/_lock.h>
55 #include <sys/_mutex.h>
56 #include <sys/_task.h>
57 #define _WANT_PRISON /* make jail.h give us 'struct prison' */
63 #include <sys/sysent.h>
64 #include <sys/ioctl.h>
75 #include <vm/vm_param.h>
77 #include <sys/sysctl.h>
83 #include "kvm_private.h"
85 #define KREAD(kd, addr, obj) \
86 (kvm_read(kd, addr, (char *)(obj), sizeof(*obj)) != sizeof(*obj))
92 * Read proc's from memory file into buffer bp, which has space to hold
93 * at most maxcnt procs.
96 kvm_proclist(kd
, what
, arg
, p
, bp
, maxcnt
)
100 struct kinfo_proc
*bp
;
104 struct kinfo_proc kinfo_proc
, *kp
;
109 struct vmspace vmspace
;
110 struct sigacts sigacts
;
111 struct pstats pstats
;
118 struct sysentvec sysent
;
119 char svname
[KI_EMULNAMELEN
];
122 kp
->ki_structsize
= sizeof(kinfo_proc
);
124 * Loop on the processes. this is completely broken because we need to be
125 * able to loop on the threads and merge the ones that are the same process some how.
127 for (; cnt
< maxcnt
&& p
!= NULL
; p
= LIST_NEXT(&proc
, p_list
)) {
128 memset(kp
, 0, sizeof *kp
);
129 if (KREAD(kd
, (u_long
)p
, &proc
)) {
130 _kvm_err(kd
, kd
->program
, "can't read proc at %x", p
);
133 if (proc
.p_state
!= PRS_ZOMBIE
) {
134 if (KREAD(kd
, (u_long
)TAILQ_FIRST(&proc
.p_threads
),
136 _kvm_err(kd
, kd
->program
,
137 "can't read thread at %x",
138 TAILQ_FIRST(&proc
.p_threads
));
142 if (KREAD(kd
, (u_long
)proc
.p_ucred
, &ucred
) == 0) {
143 kp
->ki_ruid
= ucred
.cr_ruid
;
144 kp
->ki_svuid
= ucred
.cr_svuid
;
145 kp
->ki_rgid
= ucred
.cr_rgid
;
146 kp
->ki_svgid
= ucred
.cr_svgid
;
147 kp
->ki_ngroups
= ucred
.cr_ngroups
;
148 bcopy(ucred
.cr_groups
, kp
->ki_groups
,
149 NGROUPS
* sizeof(gid_t
));
150 kp
->ki_uid
= ucred
.cr_uid
;
151 if (ucred
.cr_prison
!= NULL
) {
152 if (KREAD(kd
, (u_long
)ucred
.cr_prison
, &pr
)) {
153 _kvm_err(kd
, kd
->program
,
154 "can't read prison at %x",
158 kp
->ki_jid
= pr
.pr_id
;
162 switch(what
& ~KERN_PROC_INC_THREAD
) {
165 if (kp
->ki_groups
[0] != (gid_t
)arg
)
170 if (proc
.p_pid
!= (pid_t
)arg
)
175 if (kp
->ki_rgid
!= (gid_t
)arg
)
180 if (kp
->ki_uid
!= (uid_t
)arg
)
185 if (kp
->ki_ruid
!= (uid_t
)arg
)
190 * We're going to add another proc to the set. If this
191 * will overflow the buffer, assume the reason is because
192 * nprocs (or the proc list) is corrupt and declare an error.
195 _kvm_err(kd
, kd
->program
, "nprocs corrupt");
202 kp
->ki_addr
= 0; /* XXX uarea */
203 /* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */
204 kp
->ki_args
= proc
.p_args
;
205 kp
->ki_tracep
= proc
.p_tracevp
;
206 kp
->ki_textvp
= proc
.p_textvp
;
207 kp
->ki_fd
= proc
.p_fd
;
208 kp
->ki_vmspace
= proc
.p_vmspace
;
209 if (proc
.p_sigacts
!= NULL
) {
210 if (KREAD(kd
, (u_long
)proc
.p_sigacts
, &sigacts
)) {
211 _kvm_err(kd
, kd
->program
,
212 "can't read sigacts at %x", proc
.p_sigacts
);
215 kp
->ki_sigignore
= sigacts
.ps_sigignore
;
216 kp
->ki_sigcatch
= sigacts
.ps_sigcatch
;
219 if ((proc
.p_flag
& P_INMEM
) && proc
.p_stats
!= NULL
) {
220 if (KREAD(kd
, (u_long
)proc
.p_stats
, &pstats
)) {
221 _kvm_err(kd
, kd
->program
,
222 "can't read stats at %x", proc
.p_stats
);
225 kp
->ki_start
= pstats
.p_start
;
228 * XXX: The times here are probably zero and need
229 * to be calculated from the raw data in p_rux and
232 kp
->ki_rusage
= pstats
.p_ru
;
233 kp
->ki_childstime
= pstats
.p_cru
.ru_stime
;
234 kp
->ki_childutime
= pstats
.p_cru
.ru_utime
;
235 /* Some callers want child-times in a single value */
236 timeradd(&kp
->ki_childstime
, &kp
->ki_childutime
,
241 kp
->ki_ppid
= proc
.p_oppid
;
242 else if (proc
.p_pptr
) {
243 if (KREAD(kd
, (u_long
)proc
.p_pptr
, &pproc
)) {
244 _kvm_err(kd
, kd
->program
,
245 "can't read pproc at %x", proc
.p_pptr
);
248 kp
->ki_ppid
= pproc
.p_pid
;
251 if (proc
.p_pgrp
== NULL
)
253 if (KREAD(kd
, (u_long
)proc
.p_pgrp
, &pgrp
)) {
254 _kvm_err(kd
, kd
->program
, "can't read pgrp at %x",
258 kp
->ki_pgid
= pgrp
.pg_id
;
259 kp
->ki_jobc
= pgrp
.pg_jobc
;
260 if (KREAD(kd
, (u_long
)pgrp
.pg_session
, &sess
)) {
261 _kvm_err(kd
, kd
->program
, "can't read session at %x",
265 kp
->ki_sid
= sess
.s_sid
;
266 (void)memcpy(kp
->ki_login
, sess
.s_login
,
267 sizeof(kp
->ki_login
));
268 kp
->ki_kiflag
= sess
.s_ttyvp
? KI_CTTY
: 0;
269 if (sess
.s_leader
== p
)
270 kp
->ki_kiflag
|= KI_SLEADER
;
271 if ((proc
.p_flag
& P_CONTROLT
) && sess
.s_ttyp
!= NULL
) {
272 if (KREAD(kd
, (u_long
)sess
.s_ttyp
, &tty
)) {
273 _kvm_err(kd
, kd
->program
,
274 "can't read tty at %x", sess
.s_ttyp
);
277 if (tty
.t_dev
!= NULL
) {
278 if (KREAD(kd
, (u_long
)tty
.t_dev
, &t_cdev
)) {
279 _kvm_err(kd
, kd
->program
,
280 "can't read cdev at %x",
285 kp
->ki_tdev
= t_cdev
.si_udev
;
290 if (tty
.t_pgrp
!= NULL
) {
291 if (KREAD(kd
, (u_long
)tty
.t_pgrp
, &pgrp
)) {
292 _kvm_err(kd
, kd
->program
,
293 "can't read tpgrp at %x",
297 kp
->ki_tpgid
= pgrp
.pg_id
;
300 if (tty
.t_session
!= NULL
) {
301 if (KREAD(kd
, (u_long
)tty
.t_session
, &sess
)) {
302 _kvm_err(kd
, kd
->program
,
303 "can't read session at %x",
307 kp
->ki_tsid
= sess
.s_sid
;
313 if ((proc
.p_state
!= PRS_ZOMBIE
) && mtd
.td_wmesg
)
314 (void)kvm_read(kd
, (u_long
)mtd
.td_wmesg
,
315 kp
->ki_wmesg
, WMESGLEN
);
317 (void)kvm_read(kd
, (u_long
)proc
.p_vmspace
,
318 (char *)&vmspace
, sizeof(vmspace
));
319 kp
->ki_size
= vmspace
.vm_map
.size
;
320 kp
->ki_rssize
= vmspace
.vm_swrss
; /* XXX */
321 kp
->ki_swrss
= vmspace
.vm_swrss
;
322 kp
->ki_tsize
= vmspace
.vm_tsize
;
323 kp
->ki_dsize
= vmspace
.vm_dsize
;
324 kp
->ki_ssize
= vmspace
.vm_ssize
;
326 switch (what
& ~KERN_PROC_INC_THREAD
) {
329 if (kp
->ki_pgid
!= (pid_t
)arg
)
333 case KERN_PROC_SESSION
:
334 if (kp
->ki_sid
!= (pid_t
)arg
)
339 if ((proc
.p_flag
& P_CONTROLT
) == 0 ||
340 kp
->ki_tdev
!= (dev_t
)arg
)
344 if (proc
.p_comm
[0] != 0)
345 strlcpy(kp
->ki_comm
, proc
.p_comm
, MAXCOMLEN
);
346 (void)kvm_read(kd
, (u_long
)proc
.p_sysent
, (char *)&sysent
,
348 (void)kvm_read(kd
, (u_long
)sysent
.sv_name
, (char *)&svname
,
351 strlcpy(kp
->ki_emul
, svname
, KI_EMULNAMELEN
);
352 if ((proc
.p_state
!= PRS_ZOMBIE
) &&
353 (mtd
.td_blocked
!= 0)) {
354 kp
->ki_kiflag
|= KI_LOCKBLOCK
;
357 (u_long
)mtd
.td_lockname
,
358 kp
->ki_lockname
, LOCKNAMELEN
);
359 kp
->ki_lockname
[LOCKNAMELEN
] = 0;
362 * XXX: This is plain wrong, rux_runtime has nothing
363 * to do with struct bintime, rux_runtime is just a 64-bit
364 * integer counter of cputicks. What we need here is a way
365 * to convert cputicks to usecs. The kernel does it in
366 * kern/kern_tc.c, but the function can't be just copied.
368 bintime2timeval(&proc
.p_rux
.rux_runtime
, &tv
);
369 kp
->ki_runtime
= (u_int64_t
)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
370 kp
->ki_pid
= proc
.p_pid
;
371 kp
->ki_siglist
= proc
.p_siglist
;
372 SIGSETOR(kp
->ki_siglist
, mtd
.td_siglist
);
373 kp
->ki_sigmask
= mtd
.td_sigmask
;
374 kp
->ki_xstat
= proc
.p_xstat
;
375 kp
->ki_acflag
= proc
.p_acflag
;
376 kp
->ki_lock
= proc
.p_lock
;
377 if (proc
.p_state
!= PRS_ZOMBIE
) {
378 kp
->ki_swtime
= (ticks
- proc
.p_swtick
) / hz
;
379 kp
->ki_flag
= proc
.p_flag
;
381 kp
->ki_nice
= proc
.p_nice
;
382 kp
->ki_traceflag
= proc
.p_traceflag
;
383 if (proc
.p_state
== PRS_NORMAL
) {
384 if (TD_ON_RUNQ(&mtd
) ||
386 TD_IS_RUNNING(&mtd
)) {
388 } else if (mtd
.td_state
==
390 if (P_SHOULDSTOP(&proc
)) {
393 TD_IS_SLEEPING(&mtd
)) {
394 kp
->ki_stat
= SSLEEP
;
395 } else if (TD_ON_LOCK(&mtd
)) {
404 /* Stuff from the thread */
405 kp
->ki_pri
.pri_level
= mtd
.td_priority
;
406 kp
->ki_pri
.pri_native
= mtd
.td_base_pri
;
407 kp
->ki_lastcpu
= mtd
.td_lastcpu
;
408 kp
->ki_wchan
= mtd
.td_wchan
;
409 if (mtd
.td_name
[0] != 0)
410 strlcpy(kp
->ki_ocomm
, mtd
.td_name
, MAXCOMLEN
);
411 kp
->ki_oncpu
= mtd
.td_oncpu
;
412 if (mtd
.td_name
[0] != '\0')
413 strlcpy(kp
->ki_ocomm
, mtd
.td_name
, sizeof(kp
->ki_ocomm
));
419 bcopy(&kinfo_proc
, bp
, sizeof(kinfo_proc
));
427 * Build proc info array by reading in proc list from a crash dump.
428 * Return number of procs read. maxcnt is the max we will read.
431 kvm_deadprocs(kd
, what
, arg
, a_allproc
, a_zombproc
, maxcnt
)
438 struct kinfo_proc
*bp
= kd
->procbase
;
442 if (KREAD(kd
, a_allproc
, &p
)) {
443 _kvm_err(kd
, kd
->program
, "cannot read allproc");
446 acnt
= kvm_proclist(kd
, what
, arg
, p
, bp
, maxcnt
);
450 if (KREAD(kd
, a_zombproc
, &p
)) {
451 _kvm_err(kd
, kd
->program
, "cannot read zombproc");
454 zcnt
= kvm_proclist(kd
, what
, arg
, p
, bp
+ acnt
, maxcnt
- acnt
);
458 return (acnt
+ zcnt
);
462 kvm_getprocs(kd
, op
, arg
, cnt
)
467 int mib
[4], st
, nprocs
;
471 if (kd
->procbase
!= 0) {
472 free((void *)kd
->procbase
);
474 * Clear this pointer in case this call fails. Otherwise,
475 * kvm_close() will free it again.
485 temp_op
= op
& ~KERN_PROC_INC_THREAD
;
487 temp_op
== KERN_PROC_ALL
|| temp_op
== KERN_PROC_PROC
?
488 3 : 4, NULL
, &size
, NULL
, 0);
490 _kvm_syserr(kd
, kd
->program
, "kvm_getprocs");
494 * We can't continue with a size of 0 because we pass
495 * it to realloc() (via _kvm_realloc()), and passing 0
496 * to realloc() results in undefined behavior.
500 * XXX: We should probably return an invalid,
501 * but non-NULL, pointer here so any client
502 * program trying to dereference it will
503 * crash. However, _kvm_freeprocs() calls
504 * free() on kd->procbase if it isn't NULL,
505 * and free()'ing a junk pointer isn't good.
506 * Then again, _kvm_freeprocs() isn't used
509 kd
->procbase
= _kvm_malloc(kd
, 1);
514 kd
->procbase
= (struct kinfo_proc
*)
515 _kvm_realloc(kd
, kd
->procbase
, size
);
516 if (kd
->procbase
== 0)
518 st
= sysctl(mib
, temp_op
== KERN_PROC_ALL
||
519 temp_op
== KERN_PROC_PROC
? 3 : 4,
520 kd
->procbase
, &size
, NULL
, 0);
521 } while (st
== -1 && errno
== ENOMEM
);
523 _kvm_syserr(kd
, kd
->program
, "kvm_getprocs");
527 * We have to check the size again because sysctl()
528 * may "round up" oldlenp if oldp is NULL; hence it
529 * might've told us that there was data to get when
530 * there really isn't any.
533 kd
->procbase
->ki_structsize
!= sizeof(struct kinfo_proc
)) {
534 _kvm_err(kd
, kd
->program
,
535 "kinfo_proc size mismatch (expected %d, got %d)",
536 sizeof(struct kinfo_proc
),
537 kd
->procbase
->ki_structsize
);
541 nprocs
= size
== 0 ? 0 : size
/ kd
->procbase
->ki_structsize
;
543 struct nlist nl
[6], *p
;
545 nl
[0].n_name
= "_nprocs";
546 nl
[1].n_name
= "_allproc";
547 nl
[2].n_name
= "_zombproc";
548 nl
[3].n_name
= "_ticks";
549 nl
[4].n_name
= "_hz";
552 if (kvm_nlist(kd
, nl
) != 0) {
553 for (p
= nl
; p
->n_type
!= 0; ++p
)
555 _kvm_err(kd
, kd
->program
,
556 "%s: no such symbol", p
->n_name
);
559 if (KREAD(kd
, nl
[0].n_value
, &nprocs
)) {
560 _kvm_err(kd
, kd
->program
, "can't read nprocs");
563 if (KREAD(kd
, nl
[3].n_value
, &ticks
)) {
564 _kvm_err(kd
, kd
->program
, "can't read ticks");
567 if (KREAD(kd
, nl
[4].n_value
, &hz
)) {
568 _kvm_err(kd
, kd
->program
, "can't read hz");
571 size
= nprocs
* sizeof(struct kinfo_proc
);
572 kd
->procbase
= (struct kinfo_proc
*)_kvm_malloc(kd
, size
);
573 if (kd
->procbase
== 0)
576 nprocs
= kvm_deadprocs(kd
, op
, arg
, nl
[1].n_value
,
577 nl
[2].n_value
, nprocs
);
579 size
= nprocs
* sizeof(struct kinfo_proc
);
580 (void)realloc(kd
->procbase
, size
);
584 return (kd
->procbase
);
598 _kvm_realloc(kd
, p
, n
)
603 void *np
= (void *)realloc(p
, n
);
607 _kvm_err(kd
, kd
->program
, "out of memory");
613 #define MAX(a, b) ((a) > (b) ? (a) : (b))
617 * Read in an argument vector from the user address space of process kp.
618 * addr if the user-space base address of narg null-terminated contiguous
619 * strings. This is used to read in both the command arguments and
620 * environment strings. Read at most maxcnt characters of strings.
623 kvm_argv(kd
, kp
, addr
, narg
, maxcnt
)
625 struct kinfo_proc
*kp
;
630 char *np
, *cp
, *ep
, *ap
;
636 * Check that there aren't an unreasonable number of agruments,
637 * and that the address is in user space.
639 if (narg
> 512 || addr
< VM_MIN_ADDRESS
|| addr
>= VM_MAXUSER_ADDRESS
)
643 * kd->argv : work space for fetching the strings from the target
644 * process's space, and is converted for returning to caller
648 * Try to avoid reallocs.
650 kd
->argc
= MAX(narg
+ 1, 32);
651 kd
->argv
= (char **)_kvm_malloc(kd
, kd
->argc
*
655 } else if (narg
+ 1 > kd
->argc
) {
656 kd
->argc
= MAX(2 * kd
->argc
, narg
+ 1);
657 kd
->argv
= (char **)_kvm_realloc(kd
, kd
->argv
, kd
->argc
*
663 * kd->argspc : returned to user, this is where the kd->argv
664 * arrays are left pointing to the collected strings.
666 if (kd
->argspc
== 0) {
667 kd
->argspc
= (char *)_kvm_malloc(kd
, PAGE_SIZE
);
670 kd
->arglen
= PAGE_SIZE
;
673 * kd->argbuf : used to pull in pages from the target process.
674 * the strings are copied out of here.
676 if (kd
->argbuf
== 0) {
677 kd
->argbuf
= (char *)_kvm_malloc(kd
, PAGE_SIZE
);
682 /* Pull in the target process'es argv vector */
683 cc
= sizeof(char *) * narg
;
684 if (kvm_uread(kd
, kp
, addr
, (char *)kd
->argv
, cc
) != cc
)
687 * ap : saved start address of string we're working on in kd->argspc
688 * np : pointer to next place to write in kd->argspc
689 * len: length of data in kd->argspc
690 * argv: pointer to the argv vector that we are hunting around the
691 * target process space for, and converting to addresses in
692 * our address space (kd->argspc).
694 ap
= np
= kd
->argspc
;
698 * Loop over pages, filling in the argument vector.
699 * Note that the argv strings could be pointing *anywhere* in
700 * the user address space and are no longer contiguous.
701 * Note that *argv is modified when we are going to fetch a string
702 * that crosses a page boundary. We copy the next part of the string
703 * into to "np" and eventually convert the pointer.
705 while (argv
< kd
->argv
+ narg
&& *argv
!= 0) {
707 /* get the address that the current argv string is on */
708 addr
= (u_long
)*argv
& ~(PAGE_SIZE
- 1);
710 /* is it the same page as the last one? */
712 if (kvm_uread(kd
, kp
, addr
, kd
->argbuf
, PAGE_SIZE
) !=
718 /* offset within the page... kd->argbuf */
719 addr
= (u_long
)*argv
& (PAGE_SIZE
- 1);
721 /* cp = start of string, cc = count of chars in this chunk */
722 cp
= kd
->argbuf
+ addr
;
723 cc
= PAGE_SIZE
- addr
;
725 /* dont get more than asked for by user process */
726 if (maxcnt
> 0 && cc
> maxcnt
- len
)
729 /* pointer to end of string if we found it in this page */
730 ep
= memchr(cp
, '\0', cc
);
734 * at this point, cc is the count of the chars that we are
735 * going to retrieve this time. we may or may not have found
736 * the end of it. (ep points to the null if the end is known)
739 /* will we exceed the malloc/realloced buffer? */
740 if (len
+ cc
> kd
->arglen
) {
743 char *op
= kd
->argspc
;
746 kd
->argspc
= (char *)_kvm_realloc(kd
, kd
->argspc
,
751 * Adjust argv pointers in case realloc moved
754 off
= kd
->argspc
- op
;
755 for (pp
= kd
->argv
; pp
< argv
; pp
++)
760 /* np = where to put the next part of the string in kd->argspc*/
761 /* np is kinda redundant.. could use "kd->argspc + len" */
763 np
+= cc
; /* inc counters */
767 * if end of string found, set the *argv pointer to the
768 * saved beginning of string, and advance. argv points to
769 * somewhere in kd->argv.. This is initially relative
770 * to the target process, but when we close it off, we set
771 * it to point in our address space.
777 /* update the address relative to the target process */
781 if (maxcnt
> 0 && len
>= maxcnt
) {
783 * We're stopping prematurely. Terminate the
793 /* Make sure argv is terminated. */
800 struct ps_strings
*p
;
804 *addr
= (u_long
)p
->ps_argvstr
;
810 struct ps_strings
*p
;
814 *addr
= (u_long
)p
->ps_envstr
;
819 * Determine if the proc indicated by p is still active.
820 * This test is not 100% foolproof in theory, but chances of
821 * being wrong are very low.
825 struct kinfo_proc
*curkp
;
827 struct kinfo_proc newkp
;
833 mib
[2] = KERN_PROC_PID
;
834 mib
[3] = curkp
->ki_pid
;
836 if (sysctl(mib
, 4, &newkp
, &len
, NULL
, 0) == -1)
838 return (curkp
->ki_pid
== newkp
.ki_pid
&&
839 (newkp
.ki_stat
!= SZOMB
|| curkp
->ki_stat
== SZOMB
));
843 kvm_doargv(kd
, kp
, nchr
, info
)
845 struct kinfo_proc
*kp
;
847 void (*info
)(struct ps_strings
*, u_long
*, int *);
852 static struct ps_strings arginfo
;
853 static u_long ps_strings
;
856 if (ps_strings
== 0) {
857 len
= sizeof(ps_strings
);
858 if (sysctlbyname("kern.ps_strings", &ps_strings
, &len
, NULL
,
860 ps_strings
= PS_STRINGS
;
864 * Pointers are stored at the top of the user stack.
866 if (kp
->ki_stat
== SZOMB
||
867 kvm_uread(kd
, kp
, ps_strings
, (char *)&arginfo
,
868 sizeof(arginfo
)) != sizeof(arginfo
))
871 (*info
)(&arginfo
, &addr
, &cnt
);
874 ap
= kvm_argv(kd
, kp
, addr
, cnt
, nchr
);
876 * For live kernels, make sure this process didn't go away.
878 if (ap
!= 0 && ISALIVE(kd
) && !proc_verify(kp
))
884 * Get the command args. This code is now machine independent.
887 kvm_getargv(kd
, kp
, nchr
)
889 const struct kinfo_proc
*kp
;
895 static unsigned long buflen
;
896 static char *buf
, *p
;
901 _kvm_err(kd
, kd
->program
,
902 "cannot read user space from dead kernel");
907 bufsz
= sizeof(buflen
);
908 i
= sysctlbyname("kern.ps_arg_cache_limit",
909 &buflen
, &bufsz
, NULL
, 0);
913 buf
= malloc(buflen
);
917 bufp
= malloc(sizeof(char *) * argc
);
923 oid
[2] = KERN_PROC_ARGS
;
926 i
= sysctl(oid
, 4, buf
, &bufsz
, 0, 0);
927 if (i
== 0 && bufsz
> 0) {
936 sizeof(char *) * argc
);
938 } while (p
< buf
+ bufsz
);
943 if (kp
->ki_flag
& P_SYSTEM
)
945 return (kvm_doargv(kd
, kp
, nchr
, ps_str_a
));
949 kvm_getenvv(kd
, kp
, nchr
)
951 const struct kinfo_proc
*kp
;
954 return (kvm_doargv(kd
, kp
, nchr
, ps_str_e
));
958 * Read from user space. The user context is given by p.
961 kvm_uread(kd
, kp
, uva
, buf
, len
)
963 struct kinfo_proc
*kp
;
969 char procfile
[MAXPATHLEN
];
974 _kvm_err(kd
, kd
->program
,
975 "cannot read user space from dead kernel");
979 sprintf(procfile
, "/proc/%d/mem", kp
->ki_pid
);
980 fd
= open(procfile
, O_RDONLY
, 0);
982 _kvm_err(kd
, kd
->program
, "cannot open %s", procfile
);
989 if (lseek(fd
, (off_t
)uva
, 0) == -1 && errno
!= 0) {
990 _kvm_err(kd
, kd
->program
, "invalid address (%x) in %s",
994 amount
= read(fd
, cp
, len
);
996 _kvm_syserr(kd
, kd
->program
, "error reading %s",
1001 _kvm_err(kd
, kd
->program
, "EOF reading %s", procfile
);
1010 return ((ssize_t
)(cp
- buf
));