summaryrefslogtreecommitdiff
path: root/sysutils/skill/patches/patch-ab
diff options
context:
space:
mode:
authorsimonb <simonb@pkgsrc.org>2000-06-26 07:54:40 +0000
committersimonb <simonb@pkgsrc.org>2000-06-26 07:54:40 +0000
commit5eba22ab357a32d772a733e3659e2012704fa530 (patch)
tree6554b6b39d6504190db49dd2b72fb2751ee84ced /sysutils/skill/patches/patch-ab
parentcbd809df6dda0d492671720a85a04e6d3b5449cd (diff)
downloadpkgsrc-5eba22ab357a32d772a733e3659e2012704fa530.tar.gz
Use the kern.proc (or kern.proc2 if available) sysctl directly, so that
libkvm isn't needed, and skill/snice can run without setgid. Tested on 1.3.3, 1.4 and 1.5A, and should work all the way back to NetBSD 0.8. Note: applies for NetBSD only, not Solaris :)
Diffstat (limited to 'sysutils/skill/patches/patch-ab')
-rw-r--r--sysutils/skill/patches/patch-ab158
1 files changed, 158 insertions, 0 deletions
diff --git a/sysutils/skill/patches/patch-ab b/sysutils/skill/patches/patch-ab
new file mode 100644
index 00000000000..da1b40f86d7
--- /dev/null
+++ b/sysutils/skill/patches/patch-ab
@@ -0,0 +1,158 @@
+$NetBSD: patch-ab,v 1.5 2000/06/26 07:54:42 simonb Exp $
+
+--- machdep/bsd-44.c.orig Sun Feb 20 07:37:39 2000
++++ machdep/bsd-44.c Fri Jun 23 13:33:09 2000
+@@ -135,9 +135,6 @@
+ * Now, set up everything we need to write a GetProc() routine.
+ */
+
+-#include <kvm.h>
+-#include <fcntl.h>
+-
+ #if defined(BSD4_4) && (BSD < 199306)
+ #include <sys/kinfo.h>
+ #include <sys/kinfo_proc.h>
+@@ -155,8 +152,28 @@
+ static char *pidmap[] = { "swapper", "init", "pagedaemon" };
+ static int pidmapsiz = sizeof(pidmap) / sizeof(pidmap[0]);
+
+-#define PROC(kprocp) kprocp->kp_proc
+-#define EPROC(kprocp) kprocp->kp_eproc
++#ifdef KERN_PROC2
++#define CMDLEN KI_MAXCOMLEN
++#define PROCTYPE struct kinfo_proc2
++#define SYSCTL_TO_USE KERN_PROC2
++#define SYSCTL_MIBS 6
++#define PROC_COMM(kprocp) kprocp->p_comm
++#define PROC_FLAG(kprocp) kprocp->p_flag
++#define PROC_PID(kprocp) kprocp->p_pid
++#define PROC_STAT(kprocp) kprocp->p_stat
++#define PROC_TDEV(kprocp) kprocp->p_tdev
++#define PROC_UID(kprocp) kprocp->p_uid
++#else
++#define PROCTYPE struct kinfo_proc
++#define SYSCTL_TO_USE KERN_PROC
++#define SYSCTL_MIBS 4
++#define PROC_COMM(kprocp) kprocp->kp_proc.p_comm
++#define PROC_FLAG(kprocp) kprocp->kp_proc.p_flag
++#define PROC_PID(kprocp) kprocp->kp_proc.p_pid
++#define PROC_STAT(kprocp) kprocp->kp_proc.p_stat
++#define PROC_TDEV(kprocp) kprocp->kp_eproc.e_tdev
++#define PROC_UID(kprocp) kprocp->kp_eproc.e_ucred.cr_uid
++#endif
+
+ /*
+ * GetProc()
+@@ -169,54 +186,59 @@
+ {
+ static struct ProcInfo procinfo;
+ static int nproc = -1;
+- static struct kinfo_proc *aproc;
+- static kvm_t *kd = NULL;
++ static PROCTYPE *aproc;
+ #ifdef _POSIX2_LINE_MAX
+ char errbuf[_POSIX2_LINE_MAX];
+ #else
+ char errbuf[2048];
+ #endif
++ int mib[6];
++ size_t size;
+
+ /*
+ * If this is our first time here, prepare to read procs from kernel.
+ */
+ if (nproc == -1) {
+- kd = kvm_openfiles((char *)NULL, (char *)NULL, (char *)NULL,
+- O_RDONLY, errbuf);
+- if (kd == NULL) {
+- fprintf(stderr, "%s: %s\n", ProgName, errbuf);
+- exit(EX_SERR);
+- }
++ mib[0] = CTL_KERN;
++ mib[1] = SYSCTL_TO_USE;
++ mib[2] = _ALLPROCFLAG;
++ mib[3] = 0;
++#ifdef KERN_PROC2
++ mib[4] = sizeof(PROCTYPE);
++ mib[5] = 0;
++#endif
++ if (sysctl(mib, SYSCTL_MIBS, NULL, &size, NULL, 0) < 0)
++ err(1, "sysctl kern.proc2");
++ aproc = (PROCTYPE *)malloc(size);
++ if (aproc == NULL)
++ errx(1, "out of memory");
+
+- if ((aproc=kvm_getprocs(kd, _ALLPROCFLAG, 0, &nproc)) == NULL) {
+- fprintf(stderr, "%s: %s\n", ProgName, kvm_geterr(kd));
+- exit(EX_SERR);
+- }
++#ifdef KERN_PROC2
++ mib[5] = size / sizeof(PROCTYPE);
++#endif
++ if (sysctl(mib, SYSCTL_MIBS, aproc, &size, NULL, 0) < 0)
++ err(1, "sysctl kern.proc2");
++ nproc = size / sizeof(PROCTYPE);
+ }
+
+- if (nproc == 0) {
+- if (kd != NULL) {
+- kvm_close(kd);
+- kd = NULL;
+- }
+- return((struct ProcInfo *)NULL);
+- }
++ if (nproc == 0)
++ return(NULL);
+
+ do {
+- if (PROC(aproc).p_stat != 0) {
++ if (PROC_STAT(aproc) != 0) {
+ /*
+ * Make sure this isn't a "zombie" or "exiting"
+ * process. If it is, fill in procinfo and return.
+ */
+ procinfo.pi_flags = 0;
+- procinfo.pi_pid = (pid_T) PROC(aproc).p_pid;
+- procinfo.pi_uid = (uid_T) EPROC(aproc).e_ucred.cr_uid;
++ procinfo.pi_pid = (pid_T) PROC_PID(aproc);
++ procinfo.pi_uid = (uid_T) PROC_UID(aproc);
+
+- if (PROC(aproc).p_stat == SZOMB) { /* zombie */
++ if (PROC_STAT(aproc) == SZOMB) { /* zombie */
+ static char *zombie = "<defunct>";
+ procinfo.pi_flags |= PI_ZOMBIE;
+ procinfo.pi_cmd = zombie;
+- } else if (PROC(aproc).p_flag & P_WEXIT) { /* exiting */
++ } else if (PROC_FLAG(aproc) & P_WEXIT) { /* exiting */
+ static char *exiting = "<exiting>";
+ procinfo.pi_flags |= PI_SWEXIT;
+ procinfo.pi_cmd = exiting;
+@@ -228,22 +250,22 @@
+ return(&procinfo);
+ }
+ }
+- } while (PROC(aproc).p_stat == 0);
++ } while (PROC_STAT(aproc) == 0);
+
+ /*
+ * We now have a process (`aproc').
+ * Fill in the rest of `procinfo'.
+ */
+- if (EPROC(aproc).e_tdev != NODEV) { /* controlling tty */
++ if (PROC_TDEV(aproc) != NODEV) { /* controlling tty */
+ procinfo.pi_flags |= PI_CTLTTY;
+- procinfo.pi_tty = (tty_T) EPROC(aproc).e_tdev;
++ procinfo.pi_tty = (tty_T) PROC_TDEV(aproc);
+ }
+
+- if (PROC(aproc).p_pid < pidmapsiz) { /* special */
+- procinfo.pi_cmd = pidmap[PROC(aproc).p_pid];
++ if (PROC_PID(aproc) < pidmapsiz) { /* special */
++ procinfo.pi_cmd = pidmap[PROC_PID(aproc)];
+ procinfo.pi_flags |= PI_ASKUSR;
+ } else /* set path-stripped command name */
+- SETCMD(procinfo.pi_cmd, PROC(aproc).p_comm, MAXCOMLEN)
++ SETCMD(procinfo.pi_cmd, PROC_COMM(aproc), MAXCOMLEN)
+
+ nproc--;
+ aproc++;