448fbef0f9
bump package patch version and nuke NEED_VERSION
209 lines
5.6 KiB
Plaintext
209 lines
5.6 KiB
Plaintext
$OpenBSD: patch-machdep_bsd-44_c,v 1.1 2002/09/08 12:46:03 jakob Exp $
|
|
|
|
--- machdep/bsd-44.c.orig Fri Apr 5 11:17:21 2002
|
|
+++ machdep/bsd-44.c Wed Apr 24 21:31:28 2002
|
|
@@ -38,11 +38,54 @@ static char rcsid[] = "$Id: bsd-44.c,v 1
|
|
#endif
|
|
#endif
|
|
|
|
+#if defined(BSD4_4) && (BSD < 199306)
|
|
+#include <sys/kinfo.h>
|
|
+#include <sys/kinfo_proc.h>
|
|
+#define _ALLPROCFLAG KINFO_PROC_ALL
|
|
+#else
|
|
+#include <sys/sysctl.h>
|
|
+#include <limits.h>
|
|
+#define _ALLPROCFLAG KERN_PROC_ALL
|
|
+#endif
|
|
+
|
|
#include <sys/resource.h>
|
|
+#include <err.h>
|
|
+#include <signal.h>
|
|
#include <stdio.h>
|
|
-#include <unistd.h>
|
|
+#include <stdlib.h>
|
|
#include <string.h>
|
|
-#include <signal.h>
|
|
+#include <unistd.h>
|
|
+
|
|
+#ifndef P_WEXIT /* backward compatibility */
|
|
+#define P_WEXIT SWEXIT
|
|
+#endif
|
|
+
|
|
+static char *pidmap[] = { "swapper", "init", "pagedaemon" };
|
|
+static int pidmapsiz = sizeof(pidmap) / sizeof(pidmap[0]);
|
|
+
|
|
+#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
|
|
+
|
|
|
|
/*
|
|
* Define SigNames, NSig, and TtyDevDir here; they are used by other
|
|
@@ -150,33 +193,6 @@ MdepAction(pid)
|
|
NULL_REGEX_FUNCS
|
|
|
|
/*
|
|
- * 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>
|
|
-#define _ALLPROCFLAG KINFO_PROC_ALL
|
|
-#else
|
|
-#include <sys/sysctl.h>
|
|
-#include <limits.h>
|
|
-#define _ALLPROCFLAG KERN_PROC_ALL
|
|
-#endif
|
|
-
|
|
-#ifndef P_WEXIT /* backward compatibility */
|
|
-#define P_WEXIT SWEXIT
|
|
-#endif
|
|
-
|
|
-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
|
|
-
|
|
-/*
|
|
* GetProc()
|
|
*
|
|
* Fill in and return a `struct ProcInfo' with information about the
|
|
@@ -187,54 +203,54 @@ GetProc()
|
|
{
|
|
static struct ProcInfo procinfo;
|
|
static int nproc = -1;
|
|
- static struct kinfo_proc *aproc;
|
|
- static kvm_t *kd = NULL;
|
|
-#ifdef _POSIX2_LINE_MAX
|
|
- char errbuf[_POSIX2_LINE_MAX];
|
|
-#else
|
|
- char errbuf[2048];
|
|
-#endif
|
|
+ static PROCTYPE *aproc;
|
|
+ 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;
|
|
@@ -246,22 +262,22 @@ GetProc()
|
|
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++;
|