Lines 131-144
Link Here
|
131 |
struct proc pproc; |
131 |
struct proc pproc; |
132 |
struct sysentvec sysent; |
132 |
struct sysentvec sysent; |
133 |
char svname[KI_EMULNAMELEN]; |
133 |
char svname[KI_EMULNAMELEN]; |
|
|
134 |
struct thread *td = NULL; |
134 |
|
135 |
|
135 |
kp = &kinfo_proc; |
136 |
kp = &kinfo_proc; |
136 |
kp->ki_structsize = sizeof(kinfo_proc); |
137 |
kp->ki_structsize = sizeof(kinfo_proc); |
137 |
/* |
138 |
/* |
138 |
* Loop on the processes. this is completely broken because we need to be |
139 |
* Loop on the processes, then threads within the process if requested. |
139 |
* able to loop on the threads and merge the ones that are the same process some how. |
|
|
140 |
*/ |
140 |
*/ |
141 |
for (; cnt < maxcnt && p != NULL; p = LIST_NEXT(&proc, p_list)) { |
141 |
if (what == KERN_PROC_ALL) |
|
|
142 |
what |= KERN_PROC_INC_THREAD; |
143 |
for (; cnt < maxcnt && p != NULL; ) { |
142 |
memset(kp, 0, sizeof *kp); |
144 |
memset(kp, 0, sizeof *kp); |
143 |
if (KREAD(kd, (u_long)p, &proc)) { |
145 |
if (KREAD(kd, (u_long)p, &proc)) { |
144 |
_kvm_err(kd, kd->program, "can't read proc at %p", p); |
146 |
_kvm_err(kd, kd->program, "can't read proc at %p", p); |
Lines 146-160
Link Here
|
146 |
} |
148 |
} |
147 |
if (proc.p_state == PRS_NEW) |
149 |
if (proc.p_state == PRS_NEW) |
148 |
continue; |
150 |
continue; |
|
|
151 |
if (td == NULL) |
152 |
td = TAILQ_FIRST(&proc.p_threads); |
149 |
if (proc.p_state != PRS_ZOMBIE) { |
153 |
if (proc.p_state != PRS_ZOMBIE) { |
150 |
if (KREAD(kd, (u_long)TAILQ_FIRST(&proc.p_threads), |
154 |
if (KREAD(kd, (u_long)td, &mtd)) { |
151 |
&mtd)) { |
|
|
152 |
_kvm_err(kd, kd->program, |
155 |
_kvm_err(kd, kd->program, |
153 |
"can't read thread at %p", |
156 |
"can't read thread at %p", td); |
154 |
TAILQ_FIRST(&proc.p_threads)); |
|
|
155 |
return (-1); |
157 |
return (-1); |
156 |
} |
158 |
} |
157 |
} |
159 |
if (what & KERN_PROC_INC_THREAD) |
|
|
160 |
td = TAILQ_NEXT(&mtd, td_plist); |
161 |
else |
162 |
td = NULL; |
163 |
} else |
164 |
td = NULL; |
158 |
if (KREAD(kd, (u_long)proc.p_ucred, &ucred) == 0) { |
165 |
if (KREAD(kd, (u_long)proc.p_ucred, &ucred) == 0) { |
159 |
kp->ki_ruid = ucred.cr_ruid; |
166 |
kp->ki_ruid = ucred.cr_ruid; |
160 |
kp->ki_svuid = ucred.cr_svuid; |
167 |
kp->ki_svuid = ucred.cr_svuid; |
Lines 184-210
Link Here
|
184 |
|
191 |
|
185 |
case KERN_PROC_GID: |
192 |
case KERN_PROC_GID: |
186 |
if (kp->ki_groups[0] != (gid_t)arg) |
193 |
if (kp->ki_groups[0] != (gid_t)arg) |
187 |
continue; |
194 |
goto next; |
188 |
break; |
195 |
break; |
189 |
|
196 |
|
190 |
case KERN_PROC_PID: |
197 |
case KERN_PROC_PID: |
191 |
if (proc.p_pid != (pid_t)arg) |
198 |
if (proc.p_pid != (pid_t)arg) |
192 |
continue; |
199 |
goto next; |
193 |
break; |
200 |
break; |
194 |
|
201 |
|
195 |
case KERN_PROC_RGID: |
202 |
case KERN_PROC_RGID: |
196 |
if (kp->ki_rgid != (gid_t)arg) |
203 |
if (kp->ki_rgid != (gid_t)arg) |
197 |
continue; |
204 |
goto next; |
198 |
break; |
205 |
break; |
199 |
|
206 |
|
200 |
case KERN_PROC_UID: |
207 |
case KERN_PROC_UID: |
201 |
if (kp->ki_uid != (uid_t)arg) |
208 |
if (kp->ki_uid != (uid_t)arg) |
202 |
continue; |
209 |
goto next; |
203 |
break; |
210 |
break; |
204 |
|
211 |
|
205 |
case KERN_PROC_RUID: |
212 |
case KERN_PROC_RUID: |
206 |
if (kp->ki_ruid != (uid_t)arg) |
213 |
if (kp->ki_ruid != (uid_t)arg) |
207 |
continue; |
214 |
goto next; |
208 |
break; |
215 |
break; |
209 |
} |
216 |
} |
210 |
/* |
217 |
/* |
Lines 223-228
Link Here
|
223 |
kp->ki_addr = 0; /* XXX uarea */ |
230 |
kp->ki_addr = 0; /* XXX uarea */ |
224 |
/* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */ |
231 |
/* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */ |
225 |
kp->ki_args = proc.p_args; |
232 |
kp->ki_args = proc.p_args; |
|
|
233 |
kp->ki_numthreads = proc.p_numthreads; |
226 |
kp->ki_tracep = proc.p_tracevp; |
234 |
kp->ki_tracep = proc.p_tracevp; |
227 |
kp->ki_textvp = proc.p_textvp; |
235 |
kp->ki_textvp = proc.p_textvp; |
228 |
kp->ki_fd = proc.p_fd; |
236 |
kp->ki_fd = proc.p_fd; |
Lines 353-370
Link Here
|
353 |
|
361 |
|
354 |
case KERN_PROC_PGRP: |
362 |
case KERN_PROC_PGRP: |
355 |
if (kp->ki_pgid != (pid_t)arg) |
363 |
if (kp->ki_pgid != (pid_t)arg) |
356 |
continue; |
364 |
goto next; |
357 |
break; |
365 |
break; |
358 |
|
366 |
|
359 |
case KERN_PROC_SESSION: |
367 |
case KERN_PROC_SESSION: |
360 |
if (kp->ki_sid != (pid_t)arg) |
368 |
if (kp->ki_sid != (pid_t)arg) |
361 |
continue; |
369 |
goto next; |
362 |
break; |
370 |
break; |
363 |
|
371 |
|
364 |
case KERN_PROC_TTY: |
372 |
case KERN_PROC_TTY: |
365 |
if ((proc.p_flag & P_CONTROLT) == 0 || |
373 |
if ((proc.p_flag & P_CONTROLT) == 0 || |
366 |
kp->ki_tdev != (dev_t)arg) |
374 |
kp->ki_tdev != (dev_t)arg) |
367 |
continue; |
375 |
goto next; |
368 |
break; |
376 |
break; |
369 |
} |
377 |
} |
370 |
if (proc.p_comm[0] != 0) |
378 |
if (proc.p_comm[0] != 0) |
Lines 386-391
Link Here
|
386 |
} |
394 |
} |
387 |
kp->ki_runtime = cputick2usec(proc.p_rux.rux_runtime); |
395 |
kp->ki_runtime = cputick2usec(proc.p_rux.rux_runtime); |
388 |
kp->ki_pid = proc.p_pid; |
396 |
kp->ki_pid = proc.p_pid; |
|
|
397 |
kp->ki_tid = mtd.td_tid; |
389 |
kp->ki_siglist = proc.p_siglist; |
398 |
kp->ki_siglist = proc.p_siglist; |
390 |
SIGSETOR(kp->ki_siglist, mtd.td_siglist); |
399 |
SIGSETOR(kp->ki_siglist, mtd.td_siglist); |
391 |
kp->ki_sigmask = mtd.td_sigmask; |
400 |
kp->ki_sigmask = mtd.td_sigmask; |
Lines 424-431
Link Here
|
424 |
kp->ki_pri.pri_native = mtd.td_base_pri; |
433 |
kp->ki_pri.pri_native = mtd.td_base_pri; |
425 |
kp->ki_lastcpu = mtd.td_lastcpu; |
434 |
kp->ki_lastcpu = mtd.td_lastcpu; |
426 |
kp->ki_wchan = mtd.td_wchan; |
435 |
kp->ki_wchan = mtd.td_wchan; |
427 |
if (mtd.td_name[0] != 0) |
|
|
428 |
strlcpy(kp->ki_tdname, mtd.td_name, MAXCOMLEN); |
429 |
kp->ki_oncpu = mtd.td_oncpu; |
436 |
kp->ki_oncpu = mtd.td_oncpu; |
430 |
if (mtd.td_name[0] != '\0') |
437 |
if (mtd.td_name[0] != '\0') |
431 |
strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname)); |
438 |
strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname)); |
Lines 437-442
Link Here
|
437 |
bcopy(&kinfo_proc, bp, sizeof(kinfo_proc)); |
444 |
bcopy(&kinfo_proc, bp, sizeof(kinfo_proc)); |
438 |
++bp; |
445 |
++bp; |
439 |
++cnt; |
446 |
++cnt; |
|
|
447 |
next: |
448 |
if (td == NULL) |
449 |
p = LIST_NEXT(&proc, p_list); |
440 |
} |
450 |
} |
441 |
return (cnt); |
451 |
return (cnt); |
442 |
} |
452 |
} |
Lines 573-578
Link Here
|
573 |
_kvm_err(kd, kd->program, "can't read nprocs"); |
583 |
_kvm_err(kd, kd->program, "can't read nprocs"); |
574 |
return (0); |
584 |
return (0); |
575 |
} |
585 |
} |
|
|
586 |
if (op == KERN_PROC_ALL || (op & KERN_PROC_INC_THREAD)) |
587 |
nprocs *= 10; /* XXX */ |
576 |
if (KREAD(kd, nl[3].n_value, &ticks)) { |
588 |
if (KREAD(kd, nl[3].n_value, &ticks)) { |
577 |
_kvm_err(kd, kd->program, "can't read ticks"); |
589 |
_kvm_err(kd, kd->program, "can't read ticks"); |
578 |
return (0); |
590 |
return (0); |