1BSD/s6/procp.c

Compare this file to the similar file:
Show the results in this format:

#
/*
 * 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();
}