BSD 1 development
[unix-history] / s6 / procp.c
#
/*
* procp - print out many statistics about a process
*
* Jeff Schriebman UC Berkeley June 1977
*
* Data is output from the proc table, u dot area,
* file table, and inode table.
*/
#include "/usr/sys/param.h"
#include "/usr/sys/conf.h"
#include "/usr/sys/proc.h"
#include "/usr/sys/inode.h"
#include "/usr/sys/file.h"
#include "/usr/sys/tty.h"
#include "/usr/sys/user.h"
struct {
char name[8];
int type;
char *value;
} nl[3];
struct proc proc[1];
int ua[256];
int mem;
int swmem;
int swap;
int pid;
int baddr, laddr, mf;
char *coref;
struct ibuf {
char idevmin, idevmaj;
int inum;
int iflags;
char inl;
char iuid;
char igid;
char isize0;
int isize;
int iaddr[8];
char *ictime[2];
char *imtime[2];
int fill;
};
main(argc, argv)
char **argv;
{
register *p, i;
pid = getpid();
if (argc > 1)
pid = atoi(argv[1]);
printf("PID = %d\n", pid);
if(chdir("/dev") < 0) {
printf("cannot change to /dev\n");
done();
}
setup(&nl[0], "_proc");
setup(&nl[1], "_swapdev");
nlist("/unix", &nl);
if (nl[0].type==0) {
printf("No namelist\n");
done();
}
coref = "/dev/mem";
if ((mem = open(coref, 0)) < 0) {
printf("No mem\n");
done();
}
swmem = open(coref, 0);
/*
* Locate proc table
*/
if (getproc(pid)) {
printf("No proc\n");
done();
}
/*
* get u area
*/
getdev();
if (setcom()) {
printf("No U. area\n");
done();
}
pproc();
pudot();
pfile();
psig();
done();
}
/*
* print process table information
*/
pproc()
{
register *p;
p = proc;
printf("stat nice sig uid gid pgrp ppid wchan clock\n");
printf("%4d %4d %5o %4d %4d %5d %5d %6o %5d\n",
p->p_stat, p->p_nice, p->p_sig, p->p_uid&0377, (p->p_uid>>8)&0377,
p->p_pgrp, p->p_ppid, p->p_wchan, p->p_clktim);
}
pudot()
{
register *p, *n;
int j, k, jj, kk;
p = ua;
n = inode;
getino(p->u_cdir);
j = p->u_ttyd.d_major & 0377;
k = p->u_ttyd.d_minor & 0377;
jj = n->i_dev.d_major & 0377;
kk = n->i_dev.d_minor & 0377;
printf("ruid rgid direct inode tty dev cdir\n");
printf("%4d %4d %14s %6d %2d/%-2d %2d/%-2d %5d\n",
p->u_ruid&0377, p->u_rgid&0377, p->u_dent.u_name, p->u_dent.u_ino,
j, k, jj, kk, n->i_number);
}
pfile()
{
register *p, *n, i;
int j, k;
int t1, t2, t3;
p = ua[0].u_ofile;
n = &inode[0];
printf(" files inodes\n");
printf("num type count count dev inum uid gid\n");
for (i=0; i < NOFILE; i++) {
if (*p != 0) {
seek(mem, *p, 0);
read(mem, file, sizeof file[0]);
getino(file[0].f_inode);
t1 = t2 = t3 = ' ';
if (file[0].f_flag & FREAD)
t1 = 'R';
if (file[0].f_flag & FWRITE)
t2 = 'W';
if (file[0].f_flag & FPIPE)
t3 = 'P';
j = n->i_dev.d_minor;
k = n->i_dev.d_major;
printf("%3d %c%c%c %5d %4d %2d/%-2d %4d %4d %4d\n",
i, t1, t2, t3, file[0].f_count,
n->i_count, j, k, n->i_number, n->i_uid&0377, n->i_gid&0377);
}
p++;
}
}
psig()
{
register *p, i, s;
p = ua;
printf(" signals\n");
for (i=0; i< NSIG; i++) {
if ((s=p->u_signal[i]) == 0)
continue;
if (s & 01)
printf("%3d %5d ignored\n", i, s);
else
printf("%3d %5d caught\n", i, s);
}
}
getproc(a)
{
register *p, i;
seek(mem, nl[0].value, 0);
p = proc;
for (i=0; i<NPROC; i++) {
read(mem, proc, sizeof proc);
if (p->p_pid==a)
return(0);
}
return(1);
}
getino(a)
{
seek(mem, a, 0);
read(mem, inode, sizeof inode[0]);
}
getdev()
{
register struct { int dir_ino; char dir_n[14]; } *p;
register i, c;
int f;
char dbuf[512];
int sbuf[20];
seek(mem, nl[1].value, 0);
read(mem, &nl[1].value, 2);
f = open("/dev", 0);
if(f < 0) {
printf("cannot open /dev\n");
done();
}
swap = -1;
c = 0;
loop:
i = read(f, dbuf, 512);
if(i <= 0) {
close(f);
if(swap < 0) {
printf("no swap device\n");
done();
}
return;
}
while(i < 512)
dbuf[i++] = 0;
for(p = dbuf; p < dbuf+512; p++) {
if(p->dir_ino == 0)
continue;
if(swap >= 0)
continue;
if(stat(p->dir_n, sbuf) < 0)
continue;
if((sbuf->iflags & 060000) != 060000)
continue;
if(sbuf->iaddr[0] == nl[1].value)
swap = open(p->dir_n, 0);
}
goto loop;
}
setup(p, s)
char *p, *s;
{
while (*p++ = *s++);
}
setcom()
{
baddr = 0;
laddr = 0;
if (proc[0].p_flag&SLOAD) {
laddr = proc[0].p_addr;
mf = swmem;
} else {
baddr = proc[0].p_addr;
mf = swap;
}
baddr =+ laddr>>3;
laddr = (laddr&07)<<6;
seek(mf, baddr, 3);
seek(mf, laddr, 1);
if (read(mf, &ua[0], 512) != 512)
return(1);
return(0);
}
done()
{
exit();
}