Ultrix-3.1/src/cmd/getu.c

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


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

#include <stdio.h>
#include <a.out.h>
#include <core.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/tty.h>
#include <sys/dir.h>

#include <sys/user.h>

static char Sccsid[] = "@(#)getu.c	3.0	4/21/86";

struct user u;
struct proc prc;
long sekpnt, psek;
int i, cnt, mem, val, *intpnt, onetime, nprc, rtn;
char *memfil = "/dev/mem";
char *nlfil = "/unix";

struct nlist nli[] = {
	{ "_proc" },
	{ "_nproc" },
	{ "" }
};
#define CHAR 1
#define INT  2
#define LONG 3
#define FLOAT 4
#define DOUBLE 5
#define STRING 6

struct {
	char *tnam;
	char *tfmt;
	int  tnum;
	int  ttyp;
}ustr[] = {
	"u_comm", "%-14s ", 1, STRING,
	"u_base", "%-6o ", 1, INT,
	"u_count", "%-6o ", 1, INT,
	"u_offset", "%-6O ", 1, LONG,
	"u_rsav", "%-6o ", 7, INT,
	"u_inemt", "%-6o ", 1, INT,
	"u_fpsaved", "%-6o ", 1, INT,
	"u_fps.u_fpsr", "%-6o ", 1, INT,
	"u_fps.u_fpregs", "%f ", 6, DOUBLE,
	"u_segflg", "%-6o ", 1, CHAR,
	"u_error", "%-6o ", 1, CHAR,
	"u_uid", "%-6o ", 1, INT,
	"u_gid", "%-6o ", 1, INT,
	"u_ruid", "%-6o ", 1, INT,
	"u_rgid", "%-6o ", 1, INT,
	"u_procp", "%-6o ", 1, INT,
	"u_ap", "%-6o ", 1, INT,
	"u_r.r_val1", "%-6o ", 1, INT,
	"u_r.r_val2", "%-6o ", 1, INT,
	"u_cdir", "%-6o ", 1, INT,
	"u_rdir", "%-6o ", 1, INT,
	"u_dbuf", "%-14s ", 1, STRING,
	"u_dirp", "%-6o ", 1, INT,
	"u_dent.d_name", "%-14s ", 1, STRING,
	"u_pdir", "%-6o ", 1, INT,
	"u_uisa", "%-6o ", 8, INT,
	"u_udsa", "%-6o ", 8, INT,
	"u_uisd", "%-6o ", 8, INT,
	"u_udsd", "%-6o ", 8, INT,
	"u_pofile", "%-6o ", NOFILE, CHAR,
	"u_ofile", "%-6o ", NOFILE, INT,
	"u_arg", "%-6o ", 5, INT,
	"u_tsize", "%-6o ", 1, INT,
	"u_dsize", "%-6o ", 1, INT,
	"u_ssize", "%-6o ", 1, INT,
	"u_qsav", "%-6o ", 7, INT,
	"u_ssav", "%-6o ", 7, INT,
	"u_signal", "%-6o ", NSIG, INT,
	"u_utime", "%-10O ", 1, LONG,
	"u_stime", "%-10O ", 1, LONG,
	"u_cutime", "%-10O ", 1, LONG,
	"u_cstime", "%-10O ", 1, LONG,
	"u_ar0", "%-6o ", 1, INT,
	"u_prof.pr_base", "%-6o ", 1, INT,
	"u_prof.pr_size", "%-6o ", 1, INT,
	"u_prof.pr_off", "%-6o ", 1, INT,
	"u_prof.pr_scale", "%-6o ", 1, INT,
	"u_intflg", "%-6o ", 1, CHAR,
	"u_sep", "%-6o ", 1, CHAR,
	"u_ttyp", "%-6o ", 1, INT,
	"u_ttyd", "%-6o ", 1, INT,
	"u_exdata.ux_mag", "%-6o ", 1, INT,
	"u_exdata.ux_tsize", "%-6o ", 1, INT,
	"u_exdata.ux_dsize", "%-6o ", 1, INT,
	"u_exdata.ux_bsize", "%-6o ", 1, INT,
	"u_exdata.ux_ssize", "%-6o ", 1, INT,
	"u_exdata.ux_entloc", "%-6o ", 1, INT,
	"u_exdata.ux_unused", "%-6o ", 1, INT,
	"u_exdata.ux_relflg", "%-6o ", 1, INT,
	"u_start", "%-10O ", 1, LONG,
	"u_acflag", "%-6o ", 1, CHAR,
	"u_fpflag", "%-6o ", 1, INT,
	"u_cmask", "%-6o ", 1, INT,
	"u_fperr.f_fec", "%-6o ", 1, INT,
	"u_fperr.f_fea", "%-6o ", 1, INT,
	"u_ovdata.uo_curov", "%-6o ", 1, INT,
	"u_ovdata.uo_ovbase", "%-6o ", 1, INT,
	"u_ovdata.uo_dbase", "%-6o ", 1, INT,
	"u_ovdata.uo_ov_offst", "%-6o ", 8, INT,
	"u_ovdata.uo_nseg", "%-6o ", 1, INT,
	"u_eosys", "%-6o", 1, CHAR,
	"", 0, 0, 0
};

int *uofst[] = {
	&u.u_comm,
	&u.u_base,
	&u.u_count,
	&u.u_offset,
	&u.u_rsav,
	&u.u_inemt,
	&u.u_fpsaved,
	&u.u_fps.u_fpsr,
	&u.u_fps.u_fpregs,
	&u.u_segflg,
	&u.u_error,
	&u.u_uid,
	&u.u_gid,
	&u.u_ruid,
	&u.u_rgid,
	&u.u_procp,
	&u.u_ap,
	&u.u_r.r_val1,
	&u.u_r.r_val2,
	&u.u_cdir,
	&u.u_rdir,
	&u.u_dbuf,
	&u.u_dirp,
	&u.u_dent.d_name,
	&u.u_pdir,
	&u.u_uisa[0],
	&u.u_uisa[8],
	&u.u_uisd[0],
	&u.u_uisd[8],
	&u.u_pofile,
	&u.u_ofile,
	&u.u_arg,
	&u.u_tsize,
	&u.u_dsize,
	&u.u_ssize,
	&u.u_qsav,
	&u.u_ssav,
	&u.u_signal,
	&u.u_utime,
	&u.u_stime,
	&u.u_cutime,
	&u.u_cstime,
	&u.u_ar0,
	&u.u_prof.pr_base,
	&u.u_prof.pr_size,
	&u.u_prof.pr_off,
	&u.u_prof.pr_scale,
	&u.u_intflg,
	&u.u_sep,
	&u.u_ttyp,
	&u.u_ttyd,
	&u.u_exdata.ux_mag,
	&u.u_exdata.ux_tsize,
	&u.u_exdata.ux_dsize,
	&u.u_exdata.ux_bsize,
	&u.u_exdata.ux_ssize,
	&u.u_exdata.ux_entloc,
	&u.u_exdata.ux_unused,
	&u.u_exdata.ux_relflg,
	&u.u_start,
	&u.u_acflag,
	&u.u_fpflag,
	&u.u_cmask,
	&u.u_fperr.f_fec,
	&u.u_fperr.f_fea,
	&u.u_ovdata.uo_curov,
	&u.u_ovdata.uo_ovbase,
	&u.u_ovdata.uo_dbase,
	&u.u_ovdata.uo_ov_offst,
	&u.u_ovdata.uo_nseg,
	&u.u_eosys,
	0
};


	int scnt, brkcnt, entcnt, tval, tflg;
	char tststr[30];
	char cval, *pcval;
	int ival, *pival;
	long lval, *plval;
	float fval, *pfval;
	double dval, *pdval;

main(argc, argp)
int argc;
char *argp[];
{
	char *ap;

	if(argc > 4) {
		printf("arg cnt ?\n");
		exit(1);
	}
    if(argc > 1){
	if(argp[1] [0] == '-') {
		if(argp[1][1] >= '0' && argp[1][1] <= '7'){
			sscanf(&argp[1][1], "%O", &sekpnt);
			sekpnt = sekpnt << 6;
			if(sekpnt < 0L){
			    printf("getu: %s invalid address\n", &argp[1][1]);
			    exit(1);
			}
			onetime++;
		}
	}
	if(onetime && argc == 4){
		memfil = argp[3];
		nlfil = argp[2];
	}
	else if(onetime && argc == 3)
		memfil = argp[2];
	else if(onetime == 0 && argc == 3){
		memfil = argp[2];
		nlfil = argp[1];
	}
	else if(onetime == 0 && argc == 2)
		memfil = argp[1];
   }
	nlist(nlfil, nli);
	if(nli[0].n_type == 0) {
		printf("\ngetu: Can't access namelist in %s\n", nlfil);
		exit(1);
	}
	if((mem = open(memfil, 0)) <= 0){
		printf("cannot open %s\n", memfil);
		exit(1);
	}
	if(onetime){
		printf("%-s %-s ",nlfil,memfil);
		printf(" at %O\t", sekpnt);
		fflush(stdout);
		system("date");
		fflush(stdout);
		showu(sekpnt);
		exit(0);
	}
	lseek(mem, (long)nli[1].n_value, 0);
	read(mem, &nprc, sizeof nprc);
	psek = (long)nli[0].n_value;
	lseek(mem, (long)nli[0].n_value, 0);
	for(i = 0; i < nprc; i++){
		lseek(mem, psek + (i * sizeof(struct proc)), 0);
		rtn = read(mem, &prc, sizeof(struct proc));
		if((prc.p_flag & SLOAD) == 0)
			continue;
		if(prc.p_stat == SZOMB)
			continue;
		printf("%c\r", '');
		if(i == 0){
			printf("%-s %-s ",nlfil,memfil);
			system("date");
		}
		sekpnt = (long)((unsigned)prc.p_addr);
		sekpnt = sekpnt << 6;
		showu(sekpnt);
	}
}

showu(pnt)
long pnt;
{
/*
	int scnt, brkcnt, entcnt, tval, tflg;
	char tststr[30];
	char cval, *pcval;
	int ival, *pival;
	long lval, *plval;
	float fval, *pfval;
	double dval, *pdval;
*/
	int i;
	if(onetime == 0){
		printf("address = %O pid = %d\n", pnt, prc.p_pid);
	}
	lseek(mem, pnt, 0);
	read(mem, &u, sizeof u);
	for(scnt = 0; *ustr[scnt].tnam; scnt++){
		brkcnt = 0;
		switch(ustr[scnt].ttyp){
			case CHAR:
				pcval = uofst[scnt];
				sprintf(&tststr, ustr[scnt].tfmt, (int)*pcval);
				break;
			case STRING:
				pcval = uofst[scnt];
				sprintf(&tststr, ustr[scnt].tfmt, pcval);
				break;
			case LONG:
				plval = uofst[scnt];
				sprintf(&tststr, ustr[scnt].tfmt, *plval);
				break;
			case FLOAT:
				pfval = uofst[scnt];
				sprintf(&tststr, ustr[scnt].tfmt, *pfval);
				break;
			case DOUBLE:
				pdval = uofst[scnt];
				sprintf(&tststr, ustr[scnt].tfmt, *pdval);
				break;
			case INT:
			default:
				pival = uofst[scnt];
				sprintf(&tststr, ustr[scnt].tfmt, *pival);
				break;
		}
		printf("%s", ustr[scnt].tnam);
		if(ustr[scnt].tnum > 1){
			printf("\n");
			tval = strlen(&tststr);
			tval *= ustr[scnt].tnum;
			if(tval > 76)
				brkcnt = (ustr[scnt].tnum/((tval/76)+1));
		}
		else
			printf(" = ");
		for(entcnt = 0, i = 0; entcnt < ustr[scnt].tnum; entcnt++, i++){
/*			if(brkcnt && entcnt == brkcnt) */
			if((i == brkcnt) && brkcnt) {
				printf("\n");
				i = 0;
			}
			switch(ustr[scnt].ttyp){
				case CHAR:
					ival = *pcval;
					printf(ustr[scnt].tfmt, ival);
					pcval++;
					break;
				case STRING:
					printf(ustr[scnt].tfmt, pcval);
					pcval++;
					break;
				case LONG:
					printf(ustr[scnt].tfmt, *plval);
					plval++;
					break;
				case FLOAT:
					printf(ustr[scnt].tfmt, *pfval);
					pfval++;
					break;
				case DOUBLE:
					printf(ustr[scnt].tfmt, *pdval);
					pdval++;
					break;
				case INT:
				default:
					printf(ustr[scnt].tfmt, *pival);
					pival++;
					break;
			}
		}
		printf("\n");
	}
	printf("\n\f");
}