#include "os/FreeBSD-kvm.h" #include #include #include #include #include /* Make sure /proc is mounted and initialize some global vars */ char* OS_initialize(){ return NULL; } void OS_get_table(){ kvm_t *kd; char errbuf[2048]; struct kinfo_proc *procs; /* array of processes */ int count; /* returns number of processes */ int i; char ** argv; char state[20]; char start[20]; char time[20]; char flag[20]; char sflag[20]; static char format[128]; char cmndline[ARG_MAX]; int priority; /* Open the kvm interface, get a descriptor */ if ((kd = kvm_open(NULL, NULL, NULL, 0, errbuf)) == NULL) { fprintf(stderr, "kvm_open: %s\n", errbuf); ppt_croak("kvm_open: ", errbuf); } /* Get the list of processes. */ if ((procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &count)) == NULL) { kvm_close(kd); fprintf(stderr, "kvm_getprocs: %s\n", kvm_geterr(kd)); ppt_croak("kvm_getprocs: ", kvm_geterr(kd)); } /* Iterate through the processes in kinfo_proc, sending proc info */ /* to bless_into_proc for each proc */ for (i=0; i < count; i++) { static struct pstats ps; static struct session seslead; strcpy(format, Defaultformat); // retrieve the arguments cmndline[0] = '\0'; argv = kvm_getargv(kd, (const struct kinfo_proc *) &(procs[i]) , 0); if (argv) { int j = 0; while (argv[j] && strlen(cmndline) <= ARG_MAX) { strcat(cmndline, argv[j]); strcat(cmndline, " "); j++; } } switch (procs[i].ki_stat) { case SSTOP: strcpy(state, "stop"); break; case SSLEEP: strcpy(state, "sleep"); break; case SRUN: strcpy(state, "run"); break; case SIDL: strcpy(state, "idle"); break; case SWAIT: strcpy(state, "wait"); break; case SLOCK: strcpy(state, "lock"); break; case SZOMB: strcpy(state, "zombie"); break; default: strcpy(state, "???"); break; } sprintf(start, "%d.%d", procs[i].ki_start.tv_sec, procs[i].ki_start.tv_usec); sprintf(time, "%.6f", procs[i].ki_runtime/1000000.0); sprintf(flag, "0x%04x", procs[i].ki_flag); sprintf(sflag, "0x%04x", procs[i].ki_sflag); bless_into_proc( format, Fields, procs[i].ki_pid, procs[i].ki_ppid, procs[i].ki_ruid, procs[i].ki_uid, procs[i].ki_rgid, procs[i].ki_pgid, procs[i].ki_sid, flag, sflag, start, time, procs[i].ki_wmesg, state, "??", // will be resolved automatically procs[i].ki_tdev, procs[i].ki_comm, cmndline, procs[i].ki_pri.pri_user, procs[i].ki_nice, procs[i].ki_size, // virtual size procs[i].ki_rssize, // current resident set size in pages procs[i].ki_tsize, // text size (pages) XXX procs[i].ki_dsize, // data size (pages) XXX procs[i].ki_ssize // stack size (pages) ); } if (kd) kvm_close(kd); }