summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2004-02-22 17:54:32 +0000
committerdeischen <deischen@FreeBSD.org>2004-02-22 17:54:32 +0000
commit7d4838de1e98270717985faeb4575c75d07b9676 (patch)
tree8de9c227c9fc00c037cc868f2758ee315f8412c3
parent03f2963fdc806691158a8a21b797b34ad68aa5a2 (diff)
downloadFreeBSD-src-7d4838de1e98270717985faeb4575c75d07b9676.zip
FreeBSD-src-7d4838de1e98270717985faeb4575c75d07b9676.tar.gz
Add sysctls to allow showing threads for pgrp, tty, uid, ruid,
and pid.
-rw-r--r--sys/kern/kern_proc.c38
-rw-r--r--sys/sys/sysctl.h4
2 files changed, 35 insertions, 7 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 7becb69..4dc5e65 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -900,10 +900,18 @@ sysctl_kern_proc(SYSCTL_HANDLER_ARGS)
int *name = (int*) arg1;
u_int namelen = arg2;
struct proc *p;
- int flags, doingzomb;
+ int flags, doingzomb, oid_number;
int error = 0;
- if (oidp->oid_number == KERN_PROC_PID) {
+ oid_number = oidp->oid_number;
+ if (oid_number != KERN_PROC_ALL &&
+ (oid_number & KERN_PROC_INC_THREAD) == 0)
+ flags = KERN_PROC_NOTHREADS;
+ else {
+ flags = 0;
+ oid_number &= ~KERN_PROC_INC_THREAD;
+ }
+ if (oid_number == KERN_PROC_PID) {
if (namelen != 1)
return (EINVAL);
p = pfind((pid_t)name[0]);
@@ -913,11 +921,11 @@ sysctl_kern_proc(SYSCTL_HANDLER_ARGS)
PROC_UNLOCK(p);
return (error);
}
- error = sysctl_out_proc(p, req, KERN_PROC_NOTHREADS);
+ error = sysctl_out_proc(p, req, flags);
return (error);
}
- switch (oidp->oid_number) {
+ switch (oid_number) {
case KERN_PROC_ALL:
if (namelen != 0)
return (EINVAL);
@@ -963,12 +971,11 @@ sysctl_kern_proc(SYSCTL_HANDLER_ARGS)
PROC_UNLOCK(p);
continue;
}
- flags = 0;
/*
* TODO - make more efficient (see notes below).
* do by session.
*/
- switch (oidp->oid_number) {
+ switch (oid_number) {
case KERN_PROC_PGRP:
/* could do this by traversing pgrp */
@@ -1013,7 +1020,6 @@ sysctl_kern_proc(SYSCTL_HANDLER_ARGS)
break;
case KERN_PROC_PROC:
- flags |= KERN_PROC_NOTHREADS;
break;
default:
@@ -1187,3 +1193,21 @@ SYSCTL_NODE(_kern_proc, KERN_PROC_ARGS, args, CTLFLAG_RW | CTLFLAG_ANYBODY,
SYSCTL_NODE(_kern_proc, KERN_PROC_SV_NAME, sv_name, CTLFLAG_RD,
sysctl_kern_proc_sv_name, "Process syscall vector name (ABI type)");
+
+SYSCTL_NODE(_kern_proc, (KERN_PROC_PGRP | KERN_PROC_INC_THREAD), pgrp_td,
+ CTLFLAG_RD, sysctl_kern_proc, "Process table");
+
+SYSCTL_NODE(_kern_proc, (KERN_PROC_TTY | KERN_PROC_INC_THREAD), tty_td,
+ CTLFLAG_RD, sysctl_kern_proc, "Process table");
+
+SYSCTL_NODE(_kern_proc, (KERN_PROC_UID | KERN_PROC_INC_THREAD), uid_td,
+ CTLFLAG_RD, sysctl_kern_proc, "Process table");
+
+SYSCTL_NODE(_kern_proc, (KERN_PROC_RUID | KERN_PROC_INC_THREAD), ruid_td,
+ CTLFLAG_RD, sysctl_kern_proc, "Process table");
+
+SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td,
+ CTLFLAG_RD, sysctl_kern_proc, "Process table");
+
+SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td,
+ CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads");
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 3fdbcc0..d6b5196 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -421,6 +421,10 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
#define KERN_PROC_ARGS 7 /* get/set arguments/proctitle */
#define KERN_PROC_PROC 8 /* only return procs */
#define KERN_PROC_SV_NAME 9 /* get syscall vector name */
+#define KERN_PROC_INC_THREAD 0x10 /*
+ * modifier for pid, pgrp, tty,
+ * uid, ruid, and proc
+ */
/*
* KERN_IPC identifiers
OpenPOWER on IntegriCloud