kp_proc and kp_eproc
Kris Kennaway
kris at obsecurity.org
Fri Apr 4 18:36:17 PST 2003
On Fri, Apr 04, 2003 at 06:07:12PM -0600, Glenn Johnson wrote:
> On Fri, Apr 04, 2003 at 03:54:05PM -0800, Julian Elischer wrote:
>
> > yes..
> >
> > The entire process structure and it's surrounding enviroment has been
> > through a blender.
> >
> > What do you wnat to do?
>
> I would like to learn what I need to do to get the software to compile
> on FreeBSD-5. I guess the question is, what information do I need to
> provide? The software in question is OpenPBS (http://www.openpbs.org),
> so it nothing proprietary. There were a whole bunch of dependency
> problems that I worked through manually and finally got to the point
> of the kp_proc failure. Here is a snippet of code that produces the
> failure:
Here are untested patches I made for this a while ago. There's also a
port PR somewhere.
--- src/resmom/freebsd/mom_mach.c.orig Tue Dec 4 16:38:48 2001
+++ src/resmom/freebsd/mom_mach.c Wed Jan 15 21:04:15 2003
@@ -368,11 +368,21 @@
continue;
nps++;
+#if __FreeBSD_version < 500000
cputime += tvk(pp->kp_proc.p_rtime);
-
- if (pp->kp_proc.p_ru == NULL) {
+#else
+ cputime += tvk(pp->ki_runtime);
+#endif
+
+#if __FreeBSD_version < 500000
+ if (pp->kp_proc.p_ru == NULL)
+#else
+ if (&pp->ki_rusage == NULL)
+#endif
+ {
struct pstats ps;
+#if __FreeBSD_version < 500000
DBPRT(("%s: p_stats 0x%lx\n", id,
(u_long)pp->kp_proc.p_stats))
if (pp->kp_proc.p_stats == NULL)
@@ -387,10 +397,27 @@
tv(ps.p_ru.ru_stime) +
tv(ps.p_cru.ru_utime) +
tv(ps.p_cru.ru_stime);
+#else
+ DBPRT(("%s: p_stats 0x%lx\n", id,
+ (u_long)pp->ki_user->u_stats))
+ if (&pp->ki_addr->u_stats == NULL)
+ continue;
+
+ if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+ sizeof(ps)) != sizeof(ps)) {
+ log_err(errno, id, "kvm_read(u_stats)");
+ continue;
+ }
+ cputime += tv(ps.p_ru.ru_utime) +
+ tv(ps.p_ru.ru_stime) +
+ tv(ps.p_cru.ru_utime) +
+ tv(ps.p_cru.ru_stime);
+#endif
}
else {
struct rusage ru;
+#if __FreeBSD_version < 500000
DBPRT(("%s: p_ru 0x%lx\n", id,
(u_long)pp->kp_proc.p_ru))
if (kvm_read(kd, (u_long)pp->kp_proc.p_ru, &ru,
@@ -402,6 +429,19 @@
}
DBPRT(("%s: ses %d pid %d cputime %d\n", id,
sess_tbl[i], pp->kp_proc.p_pid, cputime))
+#else
+ DBPRT(("%s: p_ru 0x%lx\n", id,
+ (u_long)pp->ki_rusage))
+ if (kvm_read(kd, (u_long)&pp->ki_rusage, &ru,
+ sizeof(ru)) != sizeof(ru)) {
+ log_err(errno, id, "kvm_read(session)");
+ continue;
+ }
+ cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
+ }
+ DBPRT(("%s: ses %d pid %d cputime %d\n", id,
+ sess_tbl[i], pp->ki_pid, cputime))
+#endif
}
if (nps == 0)
@@ -429,12 +469,19 @@
if (!injob(pjob, sess_tbl[i]))
continue;
-
+#if __FreeBSD_version < 500000
memsize += ctob(pp->kp_eproc.e_vm.vm_tsize +
pp->kp_eproc.e_vm.vm_dsize +
pp->kp_eproc.e_vm.vm_ssize);
DBPRT(("%s: ses %d pid=%d totmem=%lu\n", id,
sess_tbl[i], pp->kp_proc.p_pid, memsize))
+#else
+ memsize += ctob(pp->ki_tsize +
+ pp->ki_dsize +
+ pp->ki_ssize);
+ DBPRT(("%s: ses %d pid=%d totmem=%lu\n", id,
+ sess_tbl[i], pp->ki_pid, memsize))
+#endif
}
return (memsize);
@@ -457,10 +504,17 @@
if (!injob(pjob, sess_tbl[i]))
continue;
+#if __FreeBSD_version < 500000
memsize += ctob(pp->kp_eproc.e_vm.vm_rssize);
DBPRT(("%s: pid=%d ses=%d mem=%d totmem=%d\n", id,
pp->kp_proc.p_pid, sess_tbl[i],
pp->kp_eproc.e_vm.vm_rssize, memsize))
+#else
+ memsize += ctob(pp->ki_rssize);
+ DBPRT(("%s: pid=%d ses=%d mem=%d totmem=%d\n", id,
+ pp->ki_pid, sess_tbl[i],
+ pp->ki_rssize, memsize))
+#endif
}
return (memsize);
@@ -481,10 +535,18 @@
if (!injob(pjob, sess_tbl[i]))
continue;
+#if __FreeBSD_version < 500000
if (ctob(pp->kp_eproc.e_vm.vm_tsize +
pp->kp_eproc.e_vm.vm_dsize +
pp->kp_eproc.e_vm.vm_ssize) > limit)
return (TRUE);
+#else
+ if (ctob(pp->ki_tsize +
+ pp->ki_dsize +
+ pp->ki_ssize) > limit)
+ return (TRUE);
+#endif
+
}
return (FALSE);
@@ -722,7 +784,12 @@
struct kinfo_proc *a;
struct kinfo_proc *b;
{
+#if __FreeBSD_version < 500000
return((int)a->kp_eproc.e_paddr - (int)b->kp_eproc.e_paddr);
+#else
+ return((int)a->ki_paddr - (int)b->ki_paddr);
+#endif
+
}
int
@@ -730,7 +797,12 @@
struct session *key;
struct kinfo_proc *member;
{
+
+#if __FreeBSD_version < 500000
return((int)key->s_leader - (int)member->kp_eproc.e_paddr);
+#else
+ return((int)key->s_leader - (int)member->ki_paddr);
+#endif
}
/*
@@ -775,13 +847,20 @@
qsort(proc_tbl, nproc, sizeof(struct kinfo_proc), qs_cmp);
for (i=0, kp=proc_tbl; i<nproc; i++, kp++) {
+#if __FreeBSD_version < 500000
if (kvm_read(kd, (u_long)kp->kp_eproc.e_sess, &ss, sizeof(ss))
- != sizeof(ss)) {
+ != sizeof(ss))
+#else
+ if (kvm_read(kd, (u_long)kp->ki_paddr->p_pgrp->pg_session, &ss, sizeof(ss))
+ != sizeof(ss))
+#endif
+ {
sprintf(log_buffer,
"kvm_read: %s", kvm_geterr(kd));
log_err(errno, id, log_buffer);
return (PBSE_SYSTEM);
}
+#if __FreeBSD_version < 500000
if (ss.s_leader == kp->kp_eproc.e_paddr ||
ss.s_leader == NULL) {
sid = kp->kp_proc.p_pid;
@@ -791,6 +870,17 @@
sizeof(struct kinfo_proc), bs_cmp);
sid = leader ? leader->kp_proc.p_pid : 0;
}
+#else
+ if (ss.s_leader == kp->ki_paddr ||
+ ss.s_leader == NULL) {
+ sid = kp->ki_pid;
+ }
+ else {
+ leader = bsearch(&ss, proc_tbl, nproc,
+ sizeof(struct kinfo_proc), bs_cmp);
+ sid = leader ? leader->ki_pid : 0;
+ }
+#endif
sess_tbl[i] = sid;
}
@@ -995,9 +1085,16 @@
if (sesid != sess_tbl[i])
continue;
+#if __FreeBSD_version < 500000
DBPRT(("%s: send signal %d to pid %d\n", id,
sig, pp->kp_proc.p_pid))
(void)kill(pp->kp_proc.p_pid, sig);
+#else
+ DBPRT(("%s: send signal %d to pid %d\n", id,
+ sig, pp->ki_pid))
+ (void)kill(pp->ki_pid, sig);
+
+#endif
++ct;
}
return ct;
@@ -1102,8 +1199,13 @@
if (jobid != sess_tbl[i])
continue;
+#if __FreeBSD_version < 500000
cputime += tvk(pp->kp_proc.p_rtime);
+#else
+
+#endif
+#if __FreeBSD_version < 500000
if (pp->kp_proc.p_ru == NULL) {
struct pstats ps;
@@ -1132,6 +1234,36 @@
}
DBPRT(("%s: ses %d pid %d cputime %d\n", id,
jobid, pp->kp_proc.p_pid, cputime))
+#else
+ if (&pp->ki_rusage == NULL) {
+ struct pstats ps;
+
+ if (&pp->ki_addr->u_stats == NULL)
+ continue;
+
+ if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+ sizeof(ps)) != sizeof(ps)) {
+ log_err(errno, id, "kvm_read(u_stats)");
+ continue;
+ }
+ cputime += tv(ps.p_ru.ru_utime) +
+ tv(ps.p_ru.ru_stime) +
+ tv(ps.p_cru.ru_utime) +
+ tv(ps.p_cru.ru_stime);
+ }
+ else {
+ struct rusage ru;
+
+ if (kvm_read(kd, (u_long)pp->ki_paddr->p_ru, &ru,
+ sizeof(ru)) != sizeof(ru)) {
+ log_err(errno, id, "kvm_read(session)");
+ continue;
+ }
+ cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
+ }
+ DBPRT(("%s: ses %d pid %d cputime %d\n", id,
+ jobid, pp->ki_pid, cputime))
+#endif
}
@@ -1150,6 +1282,7 @@
for (i=0; i<nproc; i++) {
struct kinfo_proc *pp = &proc_tbl[i];
+#if __FreeBSD_version < 500000
if (pid != pp->kp_proc.p_pid)
continue;
@@ -1180,9 +1313,41 @@
break;
}
cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
- }
DBPRT(("%s: pid %d cputime %d\n", id, pid, cputime))
+#else
+ if (pid != pp->ki_pid)
+ continue;
+
+ cputime = tvk(pp->ki_runtime);
+
+ if (&pp->ki_rusage == NULL) {
+ struct pstats ps;
+
+ if (&pp->ki_addr->u_stats == NULL)
+ break;
+ if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+ sizeof(ps)) != sizeof(ps)) {
+ log_err(errno, id, "kvm_read(u_stats)");
+ break;
+ }
+ cputime += tv(ps.p_ru.ru_utime) +
+ tv(ps.p_ru.ru_stime) +
+ tv(ps.p_cru.ru_utime) +
+ tv(ps.p_cru.ru_stime);
+ }
+ else {
+ struct rusage ru;
+
+ if (kvm_read(kd, (u_long)&pp->ki_rusage, &ru,
+ sizeof(ru)) != sizeof(ru)) {
+ log_err(errno, id, "kvm_read(session)");
+ break;
+ }
+ cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
+ }
+#endif
+ DBPRT(("%s: pid %d cputime %d\n", id, pid, cputime))
sprintf(ret_string, "%.2f", (double)cputime * cputfactor);
return ret_string;
}
@@ -1245,9 +1410,16 @@
continue;
found = 1;
+
+#if __FreeBSD_version < 500000
addmem = pp->kp_eproc.e_vm.vm_tsize +
pp->kp_eproc.e_vm.vm_dsize +
pp->kp_eproc.e_vm.vm_ssize;
+#else
+ addmem = pp->ki_tsize +
+ pp->ki_dsize +
+ pp->ki_ssize;
+#endif
memsize += addmem;
}
if (found) {
@@ -1273,12 +1445,24 @@
for (i=0; i<nproc; i++) {
struct kinfo_proc *pp = &proc_tbl[i];
+#if __FreeBSD_version < 500000
if (pid != pp->kp_proc.p_pid)
continue;
+#else
+ if (pid != pp->ki_pid)
+ continue;
+#endif
+
+#if __FreeBSD_version < 500000
memsize = pp->kp_eproc.e_vm.vm_tsize +
pp->kp_eproc.e_vm.vm_dsize +
pp->kp_eproc.e_vm.vm_ssize;
+#else
+ memsize = pp->ki_tsize +
+ pp->ki_dsize +
+ pp->ki_ssize;
+#endif
sprintf(ret_string, "%ukb", ctob(memsize) >> 10); /* KB */
return ret_string;
}
@@ -1342,7 +1526,11 @@
continue;
found = 1;
+#if __FreeBSD_version < 500000
resisize += pp->kp_eproc.e_vm.vm_rssize;
+#else
+ resisize += pp->ki_rssize;
+#endif
}
if (found) {
sprintf(ret_string, "%ukb", ctob(resisize) >> 10); /* KB */
@@ -1369,10 +1557,19 @@
for (i=0; i<nproc; i++) {
struct kinfo_proc *pp = &proc_tbl[i];
+#if __FreeBSD_version < 500000
if (pid != pp->kp_proc.p_pid)
continue;
+#else
+ if (pid != pp->ki_pid)
+ continue;
+#endif
+#if __FreeBSD_version < 500000
resisize = pp->kp_eproc.e_vm.vm_rssize;
+#else
+ resisize = pp->ki_rssize;
+#endif
sprintf(ret_string, "%ukb", ctob(resisize) >> 10); /* KB */
return ret_string;
}
@@ -1446,12 +1643,22 @@
for (i=0; i<nproc; i++) {
struct kinfo_proc *pp = &proc_tbl[i];
+#if __FreeBSD_version < 500000
if (pp->kp_eproc.e_pcred.p_ruid == 0)
continue;
+#else
+ if (pp->ki_ruid == 0)
+ continue;
+#endif
jobid = sess_tbl[i];
+#if __FreeBSD_version < 500000
DBPRT(("%s: pid %d sid %u\n",
id, (int)pp->kp_proc.p_pid, jobid))
+#else
+ DBPRT(("%s: pid %d sid %u\n",
+ id, (int)pp->ki_pid, jobid))
+#endif
for (j=0; j<njids; j++) {
if (jids[j] == jobid)
break;
@@ -1531,13 +1738,22 @@
for (i=0; i<nproc; i++) {
struct kinfo_proc *pp = &proc_tbl[i];
+#if __FreeBSD_version < 500000
DBPRT(("%s[%d]: pid %d sid %u\n",
id, num_pids, pp->kp_proc.p_pid, sess_tbl[i]))
+#else
+ DBPRT(("%s[%d]: pid %d sid %u\n",
+ id, num_pids, pp->ki_pid, sess_tbl[i]))
+#endif
if (jobid != sess_tbl[i])
continue;
checkret(&fmt, 100);
+#if __FreeBSD_version < 500000
sprintf(fmt, " %d", pp->kp_proc.p_pid);
+#else
+ sprintf(fmt, " %d", pp->ki_pid);
+#endif
fmt += strlen(fmt);
num_pids++;
}
@@ -1575,11 +1791,20 @@
for (i=0; i<nproc; i++) {
struct kinfo_proc *pp = &proc_tbl[i];
+#if __FreeBSD_version < 500000
if ((uid = pp->kp_eproc.e_pcred.p_ruid) == 0)
continue;
DBPRT(("%s: pid %d uid %u\n",
id, (int)pp->kp_proc.p_pid, uid))
+#else
+ if ((uid = pp->ki_ruid) == 0)
+ continue;
+
+ DBPRT(("%s: pid %d uid %u\n",
+ id, (int)pp->ki_pid, uid))
+#endif
+
for (j=0; j<nuids; j++) {
if (uids[j] == uid)
break;
@@ -1842,10 +2067,16 @@
continue;
}
else {
+#if __FreeBSD_version < 500000
if (value != pp->kp_proc.p_pid)
continue;
+#else
+ if (value != pp->ki_pid)
+ continue;
+#endif
}
+#if __FreeBSD_version < 500000
if (pp->kp_proc.p_stats == NULL) {
rm_errno = RM_ERR_SYSTEM;
return NULL;
@@ -1857,6 +2088,19 @@
rm_errno = RM_ERR_SYSTEM;
return NULL;
}
+#else
+ if (&pp->ki_addr->u_stats == NULL) {
+ rm_errno = RM_ERR_SYSTEM;
+ return NULL;
+ }
+
+ if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+ sizeof(ps)) != sizeof(ps)) {
+ log_err(errno, id, "kvm_read(u_stats)");
+ rm_errno = RM_ERR_SYSTEM;
+ return NULL;
+ }
+#endif
found = 1;
start = MIN(start, ps.p_start.tv_sec);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20030404/f939c87a/attachment.bin
More information about the freebsd-current
mailing list