#include "os/IRIX.h"
#include <sys/sysinfo.h>
#include <sys/swap.h>
#define SWAP_BLKSIZE 512 /* better if we extract the block size from
system
call but I don't know how */
char
* OS_initialize(){
struct
statvfs svfs;
static
char
* no_proc =
"/proc unavailable"
;
if
( statvfs(
"/proc"
, &svfs) == -1 ){
return
no_proc;
}
return
NULL;
}
void
OS_get_table(){
DIR *procdir;
struct
dirent *procdirp;
int
psdata;
int
pagesize;
char
pathbuf[MAXPATHLEN];
struct
prpsinfo psbuf;
struct
rminfo rminfo;
off_t tswap;
uint totswap;
char
state[20];
char
pctcpu[7];
char
pctmem[7];
if
( (pagesize = getpagesize()) == NULL )
return
;
if
( (procdir = opendir(
"/proc"
)) == NULL )
return
;
sysmp(MP_SAGET, MPSA_RMINFO, &rminfo,
sizeof
(rminfo));
swapctl(SC_GETSWAPTOT, &tswap);
while
( (procdirp = readdir(procdir)) != NULL ){
if
(
strtok
(procdirp->d_name,
"0123456789"
) != NULL ){
continue
; }
strcpy
( pathbuf,
"/proc/"
);
strcat
( pathbuf, procdirp->d_name );
if
( (psdata = open( pathbuf, O_RDONLY )) == -1 )
continue
;
if
( ioctl(psdata, PIOCPSINFO, &psbuf) == -1 )
continue
;
close(psdata);
#if defined(sgi) && (IRIX_VERSION >= 0x006005)
switch
( psbuf.pr_sname )
{
case
'S'
:
strcpy
(state, SLEEP);
break
;
case
'0'
:
case
'R'
:
strcpy
(state, RUN);
break
;
case
'Z'
:
strcpy
(state, ZOMBIE);
break
;
case
'T'
:
strcpy
(state, STOP);
break
;
case
'X'
:
strcpy
(state, XBRK);
break
;
}
#else
switch
( psbuf.pr_state)
{
case
SSLEEP:
strcpy
(state, SLEEP);
break
;
case
SRUN:
strcpy
(state, RUN);
break
;
case
SZOMB:
strcpy
(state, ZOMBIE);
break
;
case
SSTOP:
strcpy
(state, STOP);
break
;
case
SIDL:
strcpy
(state, IDLE);
break
;
case
SXBRK:
strcpy
(state, XBRK);
break
;
}
#endif
sprintf
( pctcpu,
"%3.2f"
,
(
float
) ((psbuf.pr_time.tv_sec) * 100) / ((
time
(NULL) - psbuf.pr_start.tv_sec ) * 100));
totswap = (
int
)tswap * SWAP_BLKSIZE / (
int
)pagesize;
sprintf
( pctmem,
"%5.2f"
,
((
double
)psbuf.pr_size)/(
double
)(rminfo.physmem+totswap)*100);
bless_into_proc( Format,
Fields,
psbuf.pr_uid,
psbuf.pr_gid,
psbuf.pr_pid,
psbuf.pr_ppid,
psbuf.pr_spid,
psbuf.pr_pgrp,
psbuf.pr_sid,
psbuf.pr_sonproc,
psbuf.pr_pri,
psbuf.pr_ttydev,
psbuf.pr_flag,
psbuf.pr_time.tv_sec,
psbuf.pr_ctime.tv_sec,
psbuf.pr_qtime.tv_sec,
psbuf.pr_size * pagesize,
psbuf.pr_rssize * pagesize,
psbuf.pr_wchan,
psbuf.pr_fname,
psbuf.pr_start.tv_sec,
pctcpu,
state,
pctmem,
psbuf.pr_psargs,
psbuf.pr_clname
);
}
closedir(procdir);
}