/* * Copyright (c) 2001 by Shawn A. Clifford * This file may be distributed under the same terms as Perl. * * Modification History: * * Who When Description * --- ---------- -------------------------------------------- * SAC 30July2001 Original code */ #include "os/SunOS.h" char* OS_initialize(void) { return NULL; } void OS_get_table(void) { struct proc *p; struct user *u; struct ucred cr; struct sess sess; char **arg; char **env; char cmdline[_POSIX_ARG_MAX]; char fname[_POSIX_PATH_MAX]; kvm_t *kd; int i, count; int ttynum; /* Open the kernel for reading */ if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL) { ppt_croak("kvm_open: can't open kernel"); } /* * Loop over all processes */ while ((p = kvm_nextproc(kd)) != NULL) { /* Get the u-area for this process or skip this process */ if ((u = kvm_getu(kd, p)) == NULL) continue; /* Get the command line arguments for this process or skip */ bzero(fname, sizeof(fname)); if (kvm_getcmd(kd, p, u, &arg, &env) < 0) { sprintf(fname, "%s", u->u_comm); sprintf(cmdline, "%s", u->u_comm); } else { sprintf(fname, "%s", arg[0]); bzero(cmdline, sizeof(cmdline)); i=0; while (arg[i] != NULL) { count = sizeof(cmdline) - strlen(cmdline) - 1; strncat(cmdline, arg[i++], count); if (arg[i] != NULL) strcat(cmdline, " "); } } /* Get the process credentials */ if (kvm_read(kd, p->p_cred, &cr, sizeof(struct ucred)) < 0) continue; /* Get the session info */ kvm_read(kd, p->p_sessp, &sess, sizeof(struct sess)); ttynum = minor(sess.s_ttyd); if (major(sess.s_ttyd) == 0) ttynum = -1; /* Send if off to Perl */ bless_into_proc( Format, Fields, cr.cr_ruid, cr.cr_rgid, cr.cr_uid, cr.cr_gid, p->p_pid, p->p_ppid, p->p_pgrp, p->p_pri, p->p_flag, (p->p_dsize+p->p_ssize)*4, p->p_rssize*4, p->p_nice, p->p_time, fname, cmdline, p->p_cpticks, p->p_pctcpu, States[(int)p->p_stat], sess.s_sid, sess.s_sid, ttynum ); } /* Close the kernel and exit */ kvm_close(kd); }