#include "os/NetBSD.h"
/* Given a path to a /proc/XXX/status file and a pointer to a procstat
struct, fill the struct */
struct procstat* get_procstat( char* path, struct procstat* prs){
FILE* fp;
if( (fp = fopen( path, "r" )) != NULL ){
fscanf(fp,
"%s %d %d %d %d %d,%d %s %d,%d %d,%d %d,%d %s %d %d %d,%d,%s",
&prs->comm,
&prs->pid,
&prs->ppid,
&prs->pgid,
&prs->sid,
&prs->tdev_maj,
&prs->tdev_min,
&prs->flags,
&prs->start,
&prs->start_mic,
&prs->utime,
&prs->utime_mic,
&prs->stime,
&prs->stime_mic,
&prs->wchan,
&prs->euid,
&prs->ruid,
&prs->rgid,
&prs->egid,
&prs->groups
);
fclose(fp);
return(prs);
}
else{
return(NULL);
}
}
/* Make sure /proc is mounted and initialize some global vars */
char* OS_initialize(){
char cbuf[1024];
char bbuf[32];
struct statfs sfs;
static char* no_proc = "/proc unavailable";
if( statfs("/proc", &sfs) == -1 ){
return no_proc;
}
return NULL;
}
void OS_get_table(){
DIR *procdir;
struct dirent *procdirp;
FILE *fp;
char pathbuf[PATH_MAX];
/* for bless_into_proc */
struct procstat prs;
static char format[F_LASTFIELD + 2];
char cmndline[ARG_MAX];
if( (procdir = opendir("/proc")) == NULL ){
return;
}
/* Iterate through all the process entries (numeric) under /proc */
while( (procdirp = readdir(procdir)) != NULL ){
/* Only look at this file if it's a proc id; that is, all numbers */
if( strtok(procdirp->d_name, "0123456789") == NULL ){
/* zero our format */
strcpy(format, Defaultformat);
sprintf(pathbuf, "%s%s", "/proc/", procdirp->d_name);
/* get stuff out of /proc/PROC_ID/status */
memset(&prs, 0, sizeof(prs));
strcat( pathbuf, "/status" );
if (get_procstat(pathbuf, &prs) != NULL) {
int i;
char utime[20];
double utime_f;
char stime[20];
double stime_f;
char time[20];
double time_f;
char start[20];
double start_f;
char *ttydev;
int ttynum;
utime_f = prs.utime + prs.utime_mic/1000000;
stime_f = prs.stime + prs.stime_mic/1000000;
time_f = utime_f + stime_f;
start_f = prs.start + prs.start_mic/1000000;
sprintf(utime, "%f", utime_f);
sprintf(stime, "%f", stime_f);
sprintf(time, "%f", time_f);
sprintf(start, "%f", start_f);
ttynum = makedev(prs.tdev_maj, prs.tdev_min);
ttydev = devname(ttynum, S_IFCHR);
if (ttydev == NULL) ttydev = "??";
/* get stuff out of /proc/PROC_ID/cmdline */
sprintf(pathbuf, "%s%s%s", "/proc/", procdirp->d_name, "/cmdline");
if( (fp = fopen( pathbuf, "r" )) != NULL ){
size_t got;
if( (got = fread(cmndline, sizeof(char), ARG_MAX, fp)) > 0 ){
size_t i;
for(i = 0; i < got; i++){
if( cmndline[i] == '\0' ) cmndline[i] = ' ';
}
cmndline[got] = '\0'; /* necessary? */
format[F_CMNDLINE] = tolower(format[F_CMNDLINE]);
}
fclose(fp);
}
bless_into_proc( format,
Fields,
prs.ruid,
prs.rgid,
prs.pid,
prs.ppid,
prs.pgid,
prs.sid,
prs.flags,
utime,
stime,
time,
prs.wchan,
start,
prs.euid,
prs.egid,
prs.comm,
prs.wchan,
ttydev,
ttynum,
cmndline
);
}
}
}
closedir(procdir);
}