[comp.sources.misc] v13i100: u386mon 1.10

wht@gatech.edu@n4hgf.UUCP (Warren Tucker) (07/03/90)

Posting-number: Volume 13, Issue 100
Submitted-by: wht@gatech.edu@n4hgf.UUCP (Warren Tucker)
Archive-name: u386mon/part02

#!/bin/sh
# This is part 02 of u386mon.1.10
if touch 2>&1 | fgrep 'mmdd' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= det_proc.c ==============
echo "x - extracting det_proc.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > det_proc.c &&
X/* CHK=0xC5D1 */
X/*+-------------------------------------------------------------------------
X	det_proc.c - UNIX V/386 system monitor proc status detail
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	display_proc_stat(win,iproc,initial)
X	display_proc_stats(win,initial)
X	find_utmp_for_pgrp(pgrp)
X	get_cpu_time_str(ticks)
X	get_user(tproc,tuser)
X	getpwent_and_enter(uid)
X	init_uid_name_hash()
X	pgrp_to_ttyname(pgrp)
X	proc_pid_compare(p1,p2)
X	read_and_sort_procs(initial)
X	read_utmp()
X	uid_name_enter(uid,name)
X	uid_to_name(uid)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:01-05-1989-13:27-wht-creation */
X
X#define M_TERMINFO
X
X#include <curses.h>
X#include <panel.h>
X#include <signal.h>
X#include <string.h>
X#include <fcntl.h>
X#include <nlist.h>
X#include <errno.h>
X#include <time.h>
X#include <pwd.h>
X#include <sys/types.h>
X#include <utmp.h>
X#include <sys/stat.h>
X#include <sys/ascii.h>
X#undef NGROUPS_MAX
X#undef NULL
X#include <sys/param.h>
X#include <sys/bootinfo.h>
X#include <sys/tuneable.h>
X#include <sys/sysinfo.h>
X#include <sys/sysmacros.h>
X#include <sys/immu.h>
X#include <sys/region.h>
X#include <sys/proc.h>
X#include <sys/fs/s5dir.h>
X#include <sys/user.h>
X#include <sys/var.h>
X
X#include "nlsym.h"
X#include "libkmem.h"
X#include "libmem.h"
X#include "libswap.h"
X#include "libnlsym.h"
X#include "u386mon.h"
X
Xextern int errno;
X
Xextern int nprocs;
Xextern struct var v;
Xextern struct proc *procs;
Xextern struct proc *oldprocs;
X
Xint mypid;
Xint noldprocs = 0;
Xint nprocs = 0;
Xint max_procs_to_display;
X
Xstruct user user;
X
X#define min(a,b) (((a) > (b)) ? (b) : (a))
X
X#define p_slotnum	p_whystop	/* reuse a field we dont look at */
X
X#define MAX_UTMP 64
Xint nutmps = 0;
Xstruct utmp utmps[MAX_UTMP];
X
X/*+-------------------------------------------------------------------------
X	proc_pid_compare(p1,p2)
X--------------------------------------------------------------------------*/
Xproc_pid_compare(p1,p2)
Xstruct proc *p1;
Xstruct proc *p2;
X{
X	return(p1->p_pid - p2->p_pid);
X}	/* end of proc_pid_compare */
X
X/*+-------------------------------------------------------------------------
X	read_and_sort_procs(initial)
X--------------------------------------------------------------------------*/
Xvoid
Xread_and_sort_procs(initial)
Xint initial;
X{
Xregister int iproc;
Xregister char *cptr;
Xstruct proc *tproc;
X
X	disp_msg(cpINFO,"");
X	if(!initial)
X	{
X		(void)memcpy((char *)oldprocs,
X			(char *)procs,v.v_proc * sizeof(struct proc));
X		noldprocs = nprocs;
X	}
X
X/* read current procs */
X	grok_proc();
X
X/* if slot not in use, force to end when sorting */
X	nprocs = 0;
X	for(iproc = 0; iproc < v.v_proc; iproc++)
X	{
X		tproc = procs + iproc;
X		tproc->p_slotnum = iproc;		/* save slot number */
X		if(	(tproc->p_stat == 0) ||		/* if slot not in use, ... */
X			(tproc->p_pid == 1)  ||		/* ... or proc is init, ... */
X			(tproc->p_flag & SSYS))		/* ... or proc is system process */
X		{							/* eliminate from consideration */
X			tproc->p_pid = 32767;	/* force below selected procs in qsort */
X			continue;
X		}
X		nprocs++;
X	}
X
X/* if too many procs, whittle down */
X	if(nprocs > max_procs_to_display)
X	{
X		nprocs = 0;
X		for(iproc = 0; iproc < v.v_proc; iproc++)
X		{
X			tproc = procs + iproc;
X			if(tproc->p_pid == 32767)	/* previously eliminated? */
X				continue;
X			else if(get_user(tproc,&user))
X			{
X				if( !strcmp(cptr = user.u_comm,"csh") ||
X					!strcmp(cptr,"sh")		||
X					!strcmp(cptr,"ksh")		||
X					!strcmp(cptr,"getty")	||
X					!strcmp(cptr,"uugetty")		)
X				{
X					tproc->p_pid = 32767;
X					continue;
X				}
X			}
X			nprocs++;
X		}
X		disp_msg(cpLIT,"shells and gettys not displayed");
X	}
X
X/* if still too many procs, whittle swapped */
X	if(nprocs > max_procs_to_display)
X	{
X		nprocs = 0;
X		for(iproc = 0; iproc < v.v_proc; iproc++)
X		{
X			tproc = procs + iproc;
X			if(tproc->p_pid == 32767)	/* previously eliminated? */
X				continue;
X			else if((!(tproc->p_flag & SLOAD) && (tproc->p_stat != SRUN)) ||
X				(tproc->p_stat == SZOMB))
X			{
X				tproc->p_pid = 32767;
X				continue;
X			}
X			nprocs++;
X		}
X		disp_msg(cpLIT,"shells, gettys and swapped/zombie procs not displayed");
X	}
X/* if still too many procs, whittle hard */
X	if(nprocs > max_procs_to_display)
X	{
X		nprocs = 0;
X		for(iproc = 0; iproc < v.v_proc; iproc++)
X		{
X			tproc = procs + iproc;
X			if(tproc->p_pid == 32767)	/* previously eliminated? */
X				continue;
X			else if(tproc->p_stat == SSLEEP)
X			{
X				tproc->p_pid = 32767;
X				continue;
X			}
X			nprocs++;
X		}
X		disp_msg(cpLIT,
X			"shells, gettys and swapped/zombie/sleeping procs not displayed");
X	}
X
X	if(nprocs > max_procs_to_display)
X		disp_msg(cpMED,"display size too small for all processes");
X
X/* sort new procs array */
X	(void)qsort((char *)procs,(unsigned)v.v_proc,
X		sizeof(struct proc),proc_pid_compare);
X
X	if(initial)
X	{
X		(void)memcpy((char *)oldprocs,(char *)procs,
X			v.v_proc * sizeof(struct proc));
X		noldprocs = nprocs;
X	}
X
X}	/* end of read_and_sort_procs */
X
X/*+-------------------------------------------------------------------------
X	read_utmp()
X--------------------------------------------------------------------------*/
Xvoid
Xread_utmp()
X{
Xint utmpfd;
Xregister struct utmp *tutmp = utmps;
X
X	nutmps = 0;
X	if((utmpfd = open("/etc/utmp",O_RDONLY,755)) < 0)
X		leave_text("/etc/utmp open error",255);
X
X	while(read(utmpfd,(char *)(tutmp++),sizeof(struct utmp)) > 0)
X	{
X		/* ensure null termination
X		 * (clobbers 1st byte of ut_line, but we don't use it)
X		 */
X		tutmp->ut_id[sizeof(tutmp->ut_id)] = 0;
X		if(++nutmps == MAX_UTMP)
X			leave_text("too many utmp entries for me to handle",1);
X	}
X	(void)close(utmpfd);
X}	/* end of read_utmp */
X
X/*+-------------------------------------------------------------------------
X	find_utmp_for_pgrp(pgrp)
X--------------------------------------------------------------------------*/
Xstruct utmp *
Xfind_utmp_for_pgrp(pgrp)
Xint pgrp;
X{
Xstruct utmp *tutmp = utmps;
Xregister int count = nutmps;
X
X	while(count--)
X	{
X		if(tutmp->ut_pid == pgrp)
X			return(tutmp);
X		tutmp++;
X	}
X	return((struct utmp *)0);
X}	/* end of find_utmp_for_pgrp */
X
X/*+-------------------------------------------------------------------------
X	pgrp_to_ttyname(pgrp)
X--------------------------------------------------------------------------*/
Xchar *
Xpgrp_to_ttyname(pgrp)
Xint pgrp;
X{
Xregister itmp;
Xstruct utmp *tutmp;
X
X	if(!(tutmp = find_utmp_for_pgrp(pgrp)))
X	{
X		read_utmp();
X		tutmp = find_utmp_for_pgrp(pgrp);
X	}
X	if(!tutmp)
X		return("??");
X	else
X	{
X		itmp = strlen(tutmp->ut_id);
X		return(&tutmp->ut_id[(itmp >= 2) ? (itmp - 2) : 0]);
X	}
X}	/* end of pgrp_to_ttyname */
X
X/*+-------------------------------------------------------------------------
X	get_user(tproc,tuser)
X--------------------------------------------------------------------------*/
Xget_user(tproc,tuser)
Xstruct proc *tproc;
Xstruct user *tuser;
X{
X	register caddr_t uptr = (caddr_t)tuser;
X	register int ubrdcount = sizeof(struct user);
X	int ipde;
X	paddr_t mptr;
X
X	if(tproc->p_flag & SULOAD)
X	{
X		for(ipde = 0; ipde < tproc->p_usize; ipde++)
X		{
X			if(!tproc->p_ubptbl[ipde].pgm.pg_pres)	/* if not resident */
X				return(0);
X			mptr = tproc->p_ubptbl[ipde].pgm.pg_pfn * NBPP;
X			mread(uptr,(daddr_t)mptr,min(ubrdcount,NBPP));
X			uptr += NBPP;
X			if((ubrdcount -= NBPP) <= 0)
X				break;
X		}
X	}
X	else
X	{
X		mptr = tproc->p_ubdbd.dbd_blkno * NBPSCTR;
X		sread(uptr,mptr,ubrdcount);
X	}
X	/*
X	 * we can get crap from swap if things change after we get
X	 * an address to read from, so validate user as best we can
X	 */
X	return((tuser->u_ruid == tproc->p_uid) ||	/* validate it */
X			(tuser->u_ruid == tproc->p_suid));
X
X}	/* end of get_user */
X
X/*+-------------------------------------------------------------------------
Xuid to username conversion; thanks for the idea to William LeFebvre
X--------------------------------------------------------------------------*/
X#define UID_NAME_HASH_SIZE	127	/* prime */
X#define HASH_EMPTY			-1
X#define HASHIT(i)			((i) % UID_NAME_HASH_SIZE)
X
Xstruct uid_name_hash_entry {
X	int  uid;
X	char name[10];
X};
X
Xstruct uid_name_hash_entry uid_name_table[UID_NAME_HASH_SIZE];
Xint uid_count = 0;
X
X/*+-------------------------------------------------------------------------
X	init_uid_name_hash()
X--------------------------------------------------------------------------*/
Xvoid
Xinit_uid_name_hash()
X{
Xregister int ihash = 0;
Xregister struct uid_name_hash_entry *hashent = uid_name_table;
X
X	while(ihash++ < UID_NAME_HASH_SIZE)
X	{
X		hashent->uid = HASH_EMPTY;
X		hashent++;
X	}
X}	/* end of init_uid_name_hash */
X
X/*+-------------------------------------------------------------------------
X	uid_name_enter(uid,name)
X--------------------------------------------------------------------------*/
Xint
Xuid_name_enter(uid,name)
Xregister int uid;
Xregister char *name;
X{
Xregister int table_uid;
Xregister int hashval;
X
X	if(++uid_count >= UID_NAME_HASH_SIZE - 1)
X		leave_text("too many user names for me to handle",1);
X
X	hashval = HASHIT(uid);
X	while((table_uid = uid_name_table[hashval].uid) != HASH_EMPTY)
X	{
X		if(table_uid == uid)
X			return(hashval);
X		hashval = (hashval + 1) % UID_NAME_HASH_SIZE;
X	}
X
X	uid_name_table[hashval].uid = uid;
X	(void)strncpy(uid_name_table[hashval].name,name,
X		sizeof(uid_name_table[0].name));
X
X	return(hashval);
X
X}	/* end of uid_name_enter */
X
X/*+-------------------------------------------------------------------------
X	getpwent_and_enter(uid)
X--------------------------------------------------------------------------*/
Xgetpwent_and_enter(uid)
Xregister int uid;
X{
Xregister int hashval;
Xregister struct passwd *pwd;
Xchar errant[10];
Xstruct passwd *getpwuid();
X
X	pwd = getpwuid(uid);
X	endpwent();
X	if(pwd)
X	{
X		hashval = uid_name_enter(pwd->pw_uid,pwd->pw_name);
X		return(hashval);
X	}
X	(void)sprintf(errant,"%d",uid);
X	return(uid_name_enter(uid,errant));
X}	/* end of getpwent_and_enter */
X
X/*+-------------------------------------------------------------------------
X	uid_to_name(uid)
X--------------------------------------------------------------------------*/
Xchar *
Xuid_to_name(uid)
Xregister int uid;
X{
Xregister int uid_hash;
Xregister int table_uid;
X
X	uid_hash = HASHIT(uid);
X	while((table_uid = uid_name_table[uid_hash].uid) != uid)
X	{
X		if(table_uid == HASH_EMPTY)
X		{
X			/* not in hash table */
X			uid_hash = getpwent_and_enter(uid);
X			break;		/* out of while */
X		}
X		uid_hash = (uid_hash + 1) % UID_NAME_HASH_SIZE;
X	}
X	return(uid_name_table[uid_hash].name);
X}	/* end of char *uid_to_name */
X
X/*+-----------------------------------------------------------------------
X	char *get_cpu_time_str(ticks)
X  6-char static string address is returned
X------------------------------------------------------------------------*/
Xchar *
Xget_cpu_time_str(ticks)
Xtime_t ticks;
X{
Xstatic char timestr[10];
Xtime_t mm,ss;
Xextern int hz;
X
X	ticks /= hz;
X	mm = ticks / 60L;
X	ticks -= mm * 60L;
X	ss = ticks;
X
X	if(mm > 9999)
X		(void)strcpy(timestr,">9999m");
X	else if(mm > 999)
X		(void)sprintf(timestr,"%5ldm",mm);
X	else
X		(void)sprintf(timestr,"%3lu:%02lu",mm,ss);
X
X	return(timestr);
X
X}	/* end of get_cpu_time_str */
X
X#define PROC_Y		1
X#define PROC_X		0
X#define UID_X		2
X#define PID_X		12
X#define CPU_X		18
X#define PRI_X		22
X#define NICE_X		26
X#define UTIME_X		29
X#define STIME_X		36
X#define SIZE_X		43
X#define TTY_X		48
X#define CMD_X		52
X
X/*+-------------------------------------------------------------------------
X	display_proc_stat(win,iproc,initial)
X00000000001111111111222222222233333333334444444444555555555566666666667777777777
X01234567890123456789012345678901234567890123456789012345678901234567890123456789
XS     USER   PID  CPU PRI NI  UCPU   SCPU  SIZE TTY CMD
X#!########X ##### ### ### ## ###### ###### #### ### ########
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_proc_stat(win,iproc,initial)
XWINDOW *win;
Xregister int iproc;
Xregister int initial;
X{
Xregister int positioned = 0;
Xregister struct proc *tproc = procs + iproc;
Xstruct proc *oproc = oldprocs + iproc;
Xint got_user;
Xstatic char *p_stat_str = " sRzdipx";	/* dependent on values of SSLEEP etc */
Xchar buf[20];
X
X	use_cp(win,cpINFO);
X	if((tproc->p_stat == SRUN) && !(tproc->p_flag & SLOAD))
X		use_cp(win,cpHIGH);
X	else if((tproc->p_stat == SRUN) || (oproc->p_stat == SRUN))
X		use_cp(win,cpMED);
X	if(tproc->p_pid != tproc->p_pid)
X		initial = 1;
X
X	wmove(win,PROC_Y + iproc,PROC_X);
X	waddch(win,(chtype)p_stat_str[tproc->p_stat]);
X	waddch(win,(tproc->p_flag & SLOAD) ? (chtype)' ' : (chtype)'S');
X	positioned = 1;
X
X	if(initial)
X	{
X		if(!positioned)
X			wmove(win,PROC_Y + iproc,PROC_X + UID_X);
X		(void)sprintf(buf,"%8s",uid_to_name(tproc->p_uid));
X		waddstr(win,buf);
X		waddch(win,(tproc->p_uid != tproc->p_suid) ? '#' : ' ');
X		waddch(win,' ');
X		positioned = 1;
X	}
X	else
X		positioned = 0;
X
X	if(initial)
X	{
X		if(!positioned)
X			wmove(win,PROC_Y + iproc,PROC_X + PID_X);
X		(void)sprintf(buf,"%5d ",tproc->p_pid);
X		waddstr(win,buf);
X		positioned = 1;
X	}
X	else
X		positioned = 0;
X
X	if(initial || (tproc->p_cpu != oproc->p_cpu))
X	{
X		if(!positioned)
X			wmove(win,PROC_Y + iproc,PROC_X + CPU_X);
X		(void)sprintf(buf,"%3u ",tproc->p_cpu);
X		waddstr(win,buf);
X		positioned = 1;
X	}
X	else
X		positioned = 0;
X
X	if(initial || (tproc->p_pri != oproc->p_pri))
X	{
X		if(!positioned)
X			wmove(win,PROC_Y + iproc,PROC_X + PRI_X);
X		(void)sprintf(buf,"%3u ",tproc->p_pri);
X		waddstr(win,buf);
X		positioned = 1;
X	}
X	else
X		positioned = 0;
X
X	if(initial || (tproc->p_nice != oproc->p_nice))
X	{
X		if(!positioned)
X			wmove(win,PROC_Y + iproc,PROC_X + NICE_X);
X		(void)sprintf(buf,"%2d ",tproc->p_nice);
X		waddstr(win,buf);
X		positioned = 1;
X	}
X	else
X		positioned = 0;
X
X/* since not saving user area, always update fields from it */
X	if(!positioned)
X		wmove(win,PROC_Y + iproc,PROC_X + UTIME_X);
X	if(got_user = get_user(tproc,&user))
X	{
X		waddstr(win,get_cpu_time_str(user.u_utime));
X		waddch(win,' ');
X		waddstr(win,get_cpu_time_str(user.u_stime));
X		waddch(win,' ');
X/*
X * process size:
X *
X * There are ways that seem right to a man, but the end of them is death.
X * u_tsize and friends are not clicks, but in bytes.
X * I thought this would have been:
X *		(ctob((u_long)user.u_tsize + user.u_dsize + user.u_ssize)) / 1024);
X * At least this makes numbers agree with /bin/ps, although I cannot
X * figure out why there is one extra page charged by ps (user is 2 pages).
X *
X * This was evidentally wrong in SCO UNIX 3.2.0 and fixed in 3.2.1.
X * If you get lots of processes who size is reported as 4, define
X * USIZE_FIXED
X */
X		(void)sprintf(buf,"%4lu ",
X#ifdef USIZE_FIXED
X			(ctob((u_long)user.u_tsize + user.u_dsize + user.u_ssize)) / 1024
X#else
X			(((u_long)user.u_tsize + 511) / 1024) +
X			(((u_long)user.u_dsize + 511) / 1024) +
X			(((u_long)user.u_ssize + 511) / 1024) +
X			(((u_long)((user.u_tsize)?1:0) * NBPP) / 1024)
X#endif
X		);
X		waddstr(win,buf);
X	}
X	else
X		waddstr(win,"------ ------ ---- ");
X
X/*
X	positioned = 1;
X	if(!positioned)
X		wmove(win,PROC_Y + iproc,PROC_X + TTY_X);
X*/
X	(void)sprintf(buf,"%3.3s ",pgrp_to_ttyname(tproc->p_pgrp));
X	waddstr(win,buf);
X	positioned = 1;
X
X/*
X	if(!positioned)
X		wmove(win,PROC_Y + iproc,PROC_X + CMD_X);
X*/
X	if(got_user)
X	{
X	register char *cptr = user.u_psargs;
X	int y,x,maxx = getmaxx(win);
X		getyx(win,y,x);
X		while(*cptr && (x < maxx))
X		{
X			*cptr &= 0x7F;
X			if(*cptr < 0x20)
X				*cptr = 0x20;
X			waddch(win,*cptr);
X			cptr++,x++;
X		}
X	}
X	else
X	{
X		switch(tproc->p_stat)
X		{
X			case SZOMB:
X				waddstr(win,"<zombie>");
X				break;
X			case SXBRK:
X				waddstr(win,"<xbreak>");
X				break;
X			default:
X				waddstr(win,"<swapped>");
X		}
X	}
X
X	wclrtoeol(win);
X
X}	/* end of display_proc_stat */
X
X/*+-------------------------------------------------------------------------
X	display_proc_stats(win,initial)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_proc_stats(win,initial)
XWINDOW *win;
Xint initial;
X{
Xregister int iproc;
Xint y,x;
X
X	if(initial)
X	{
X		use_cp(win,cpBANNER);
X		wmove(win,0,0);
X		waddstr(win,
X			"S     USER   PID  CPU PRI NI  UCPU   SCPU  SIZE TTY CMD");
X		getyx(win,y,x);
X		while(x < getmaxx(win))
X			waddch(win,(chtype)' '),x++;
X	}
X	mypid = getpid();
X	max_procs_to_display = getmaxy(win) - PROC_Y;
X	read_and_sort_procs(initial);
X	max_procs_to_display = min(nprocs,max_procs_to_display);
X	for(iproc = 0; iproc < max_procs_to_display; iproc++)
X		display_proc_stat(win,iproc,1);
X	wclrtobot(win);
X}	/* end of display_proc_stats */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of det_proc.c */
SHAR_EOF
$TOUCH -am 0627015790 det_proc.c &&
chmod 0644 det_proc.c ||
echo "restore of det_proc.c failed"
set `wc -c det_proc.c`;Wc_c=$1
if test "$Wc_c" != "16615"; then
	echo original size 16615, current size $Wc_c
fi
# ============= det_sio.c ==============
echo "x - extracting det_sio.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > det_sio.c &&
X/* CHK=0xC5D1 */
X/*+-------------------------------------------------------------------------
X	det_sio.c - UNIX V/386 system monitor serial I/O detail
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	B_to_baud_rate(code)
X	cflag_to_baud_d_p_s(cflag)
X	grok_sio_tty()
X	display_siofull_init(win,tly,tlx,show_flag)
X	display_siofull_update(win,tly,tlx,tsio)
X	display_siosum_update(win,y,tsio)
X	tty_slot_compare(sio1,sio2)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-26-1990-03:17-wht@n4hgf-creation */
X
X#define M_TERMINFO
X
X#include <curses.h>
X#include <panel.h>
X#include <string.h>
X#include <nlist.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <sys/ascii.h>
X#undef NGROUPS_MAX
X#undef NULL
X#include <sys/param.h>
X#include <sys/tty.h>
X
X#include "nlsym.h"
X#include "libkmem.h"
X#include "libmem.h"
X#include "libswap.h"
X#include "libnlsym.h"
X#include "u386mon.h"
X
Xextern int errno;
Xextern int sys_nerr;
Xextern char *sys_errlist[];
X
X#define SIO_NTTY 16	/* for now */
Xstruct tty sio[SIO_NTTY];
X
X#define t_slot	t_delct
X
Xint nsio;	/* number of sios open */
X
Xtypedef struct slabel
X{
X	int y,x;
X	char *label;
X} SLABEL;
X
XSLABEL tty_slabels[] =
X{
X    {  0,  0, "iflag:" },
X    {  2,  0, "oflag:" },
X    {  3,  0, "cflag:" },
X    {  4,  0, "lflag:" },
X    {  5,  7, "INTR QUIT ERASE KILL EOF/VMIN  EOL/VTIME EOL2 SWTCH" },
X    {  6,  0, "cc:" },
X    {  7,  0, "state:" },
X    {  -1,-1, (char *)0}
X};
X
Xtypedef struct bitfld
X{
X	int y,x;
X	char *label;
X	int flag_num;
X	int mask;
X} BITFLD;
X
X#define IFLAG 1
X#define OFLAG 2
X#define LFLAG 3
X#define CFLAG 4
X#define STATE 5
X
XBITFLD ttybitflds[] =
X{
X    {  0,  7, "IGNBRK", IFLAG, IGNBRK },
X    {  0, 15, "BRKINT", IFLAG, BRKINT },
X    {  0, 23, "IGNPAR", IFLAG, IGNPAR },
X    {  0, 31, "PARMRK", IFLAG, PARMRK },
X    {  0, 39, "INPCK",  IFLAG, INPCK },
X    {  0, 46, "ISTRIP", IFLAG, ISTRIP },
X    {  0, 53, "INLCR",  IFLAG, INLCR },
X    {  0, 60, "IGNCR",  IFLAG, IGNCR },
X    {  0, 68, "ICRNL",  IFLAG, ICRNL },
X    {  1,  7, "IUCLC",  IFLAG, IUCLC },
X    {  1, 15, "IXON",   IFLAG, IXON },
X    {  1, 23, "IXOFF",  IFLAG, IXOFF },
X    {  1, 31, "IXANY",  IFLAG, IXANY },
X    {  2,  7, "OPOST",  OFLAG, OPOST },
X    {  2, 15, "OLCUC",  OFLAG, OLCUC },
X    {  2, 23, "ONLCR",  OFLAG, ONLCR },
X    {  2, 31, "OCRNL",  OFLAG, OCRNL },
X    {  2, 39, "ONOCR",  OFLAG, ONOCR },
X    {  2, 46, "ONLRET", OFLAG, ONLRET },
X    {  2, 53, "OFDEL",  OFLAG, OFDEL },
X    {  3, 23, "CREAD",  CFLAG, CREAD },
X    {  3, 31, "HUPCL",  CFLAG, HUPCL },
X    {  3, 39, "CLOCAL", CFLAG, CLOCAL },
X#ifdef RTSFLOW
X    {  3, 46, "RTSFLO", CFLAG, RTSFLOW },
X#endif
X#ifdef CTSFLOW
X    {  3, 53, "CTSFLO", CFLAG, CTSFLOW },
X#endif
X    {  4,  7, "ISIG",   LFLAG, ISIG },
X    {  4, 15, "ICANON", LFLAG, ICANON },
X    {  4, 23, "XCASE",  LFLAG, XCASE },
X    {  4, 31, "ECHO",   LFLAG, ECHO },
X    {  4, 39, "ECHOE",  LFLAG, ECHOE },
X    {  4, 46, "ECHOK",  LFLAG, ECHOK },
X    {  4, 53, "ECHONL", LFLAG, ECHONL },
X    {  4, 60, "NOFLSH", LFLAG, NOFLSH },
X    {  4, 68, "XCLUDE", LFLAG, XCLUDE },
X	{  7,  7, "TO",     STATE, TIMEOUT },
X	{  7, 10, "WO",     STATE, WOPEN },
X	{  7, 13, "O",      STATE, ISOPEN },
X	{  7, 15, "TB",     STATE, TBLOCK },
X	{  7, 18, "CD",     STATE, CARR_ON },
X	{  7, 21, "BY",     STATE, BUSY },
X	{  7, 24, "OSLP",   STATE, OASLP },
X	{  7, 29, "ISLP",   STATE, IASLP },
X	{  7, 34, "STOP",   STATE, TTSTOP },
X	{  7, 39, "EXT",    STATE, EXTPROC },
X	{  7, 43, "TACT",   STATE, TACT },
X	{  7, 48, "ESC",    STATE, CLESC },
X	{  7, 52, "RTO",    STATE, RTO },
X	{  7, 56, "IOW",    STATE, TTIOW },
X	{  7, 60, "XON",    STATE, TTXON },
X	{  7, 64, "XOFF",   STATE, TTXOFF },
X    {  -1,-1, (char *)0,    -1,    -1 }
X};
X
Xtypedef struct valyx
X{
X	int y,x;
X} VALYX;
X
XVALYX ttyvalyx[] =
X{
X#define Fc_intr       0
X	{  6,  8 },
X#define Fcc_quit      1
X	{  6, 13 },
X#define Fcc_erase     2
X	{  6, 18 },
X#define Fcc_kill      3
X	{  6, 24 },
X#define Fcc_eof       4
X	{  6, 30 },
X#define Fcc_eol       5
X	{  6, 40 },
X#define Fcc_eol2      6
X	{  6, 49 },
X#define Fcc_swtch     7
X	{  6, 54 },
X#define Fbaud_b_p_s   8
X	{  3,  7 }
X};
X
Xtypedef struct b_to_br
X{
X	char *baud_rate;
X	int B_code;
X} B_TO_BR;
X
XB_TO_BR speeds[] = 	/* ordered to put less common rates later in table */
X{					/* and the vagaries of baud rates above 9600 "handled" */
X	" 2400",	B2400,
X	" 1200",	B1200,
X	" 9600",	B9600,
X#if defined(B19200)
X	"19200",	B19200,
X#endif
X#if defined(B38400)
X	"38400",	B38400,
X#endif
X	" 4800",	B4800,
X	"  300",	B300,
X	"  110",	B110,
X	"  600",	B600,
X	"   75",	B75,
X	"   50",	B50,
X	"  HUP",	B0,
X	" EXTA",	EXTA,
X	" EXTB",	EXTB,
X
X	(char *)0,0
X};
X
X/*+-------------------------------------------------------------------------
X	tty_slot_compare(sio1,sio2)
X--------------------------------------------------------------------------*/
Xint
Xtty_slot_compare(sio1,sio2)
Xstruct tty *sio1;
Xstruct tty *sio2;
X{
X	return(sio1->t_slot - sio2->t_slot);
X}	/* end of tty_slot_compare */
X
X/*+-------------------------------------------------------------------------
X	grok_sio_tty()
X--------------------------------------------------------------------------*/
Xvoid
Xgrok_sio_tty()
X{
Xregister isio;
Xregister struct tty *tsio;
X
X	nsio = 0;
X	kread((caddr_t)sio,sio_ttyaddr,sizeof(struct tty) * SIO_NTTY);
X	for(isio = 0; isio < SIO_NTTY; isio++)
X	{
X		tsio = &sio[isio];
X		if(tsio->t_state & (WOPEN | ISOPEN))
X		{
X			tsio->t_slot = (ushort)isio;
X			nsio++;
X			continue;
X		}
X		tsio->t_slot = 127;
X	}
X	(void)qsort((char *)sio,(unsigned)SIO_NTTY,
X		sizeof(struct tty),tty_slot_compare);
X
X}	/* end of grok_sio_tty */
X
X/*+-------------------------------------------------------------------------
X	B_to_baud_rate(code) - convert CBAUD B_ code to baud rate string
X--------------------------------------------------------------------------*/
Xchar *
XB_to_baud_rate(code)
X{
Xregister int n;
X
X	for(n=0; speeds[n].baud_rate; n++)
X		if(speeds[n].B_code == code)
X			return(speeds[n].baud_rate);
X	return("-----");
X}	/* end of B_to_baud_rate */
X
X/*+-------------------------------------------------------------------------
X	cflag_to_baud_d_p_s(cflag)
X--------------------------------------------------------------------------*/
Xchar *
Xcflag_to_baud_d_p_s(cflag)
Xint cflag;
X{
Xregister char *cptr;
Xstatic char rtnstr[16];
X
X	strcpy(rtnstr,B_to_baud_rate(cflag & CBAUD));
X	cptr = rtnstr + strlen(rtnstr);
X	*cptr++ = '-';
X	switch(cflag & CSIZE)
X	{
X		case CS5: *cptr++ = '5'; break;
X		case CS6: *cptr++ = '6'; break;
X		case CS7: *cptr++ = '7'; break;
X		case CS8: *cptr++ = '8'; break;
X	}
X	*cptr++ = '-';
X	*cptr++ = (cflag & PARENB) ? ((cflag & PARODD) ? 'O' : 'E') : 'N';
X	*cptr++ = '-';
X	*cptr++ = (cflag & CSTOPB) ? '2' : '1';
X	*cptr = 0;
X	return(rtnstr);
X
X}	/* end of cflag_to_baud_d_p_s */
X
X/*+-----------------------------------------------------------------------
X	display_siofull_update(win,tly,tlx,tsio)
X
X000000000011111111112222222222333333333344444444445555555555666666666677777
X012345678901234567890123456789012345678901234567890123456789012345678901234
Xiflag: IGNBRK  BRKINT  IGNPAR  PARMRK  INPCK  ISTRIP INLCR  IGNCR   ICRNL
X       IUCLC   IXON    IXOFF   IXANY
Xoflag: OPOST   OLCUC   ONLCR   OCRNL   ONOCR  ONLRET OFDEL
Xcflag: 09600-8-N-1     CREAD   HUPCL   CLOCAL
Xlflag: ISIG    ICANON  XCASE   ECHO    ECHOE  ECHOK  ECHONL NOFLSH  XCLUDE
X       INTR QUIT ERASE KILL EOF/VMIN  EOL/VTIME EOL2 SWTCH 
Xcc:     03   1c   08    15    01        00       00   00   
X
X------------------------------------------------------------------------*/
Xvoid
Xdisplay_siofull_update(win,tly,tlx,tsio)
XWINDOW *win;
Xint tly;
Xint tlx;
Xstruct tty *tsio;
X{
Xregister flag;
Xregister i_cc;
Xregister char *cptr;
XBITFLD *bfptr = ttybitflds;
XVALYX *vptr = ttyvalyx;
X
X	use_cp(win,cpLOW);
X	while(bfptr->y >= 0)
X	{
X		switch(bfptr->flag_num)
X		{
X			case IFLAG: flag = tsio->t_iflag; break;
X			case OFLAG: flag = tsio->t_oflag; break;
X			case LFLAG: flag = tsio->t_lflag; break;
X			case CFLAG: flag = tsio->t_cflag; break;
X			case STATE: flag = tsio->t_state; break;
X		}
X		flag &= bfptr->mask;
X		wmove(win,bfptr->y + tly,bfptr->x + tlx);
X		if(flag)
X			use_cp(win,cpREVERSE);
X		waddstr(win,bfptr->label);
X		if(flag)
X			use_cp(win,cpLOW);
X		bfptr++;
X	}
X	for(i_cc = 0; i_cc < NCC; i_cc++)
X	{
X		wmove(win,vptr->y + tly,vptr->x + tlx);
X		wprintw(win,"%02x",tsio->t_cc[i_cc]);
X		vptr++;
X	}
X
X	vptr = &ttyvalyx[Fbaud_b_p_s];
X	clear_area(win,vptr->y + tly,vptr->x + tlx,12);
X	waddstr(win,cflag_to_baud_d_p_s(tsio->t_cflag));
X
X}	/* end of display_siofull_update */
X
X/*+-------------------------------------------------------------------------
X	display_siofull_init(win,tly,tlx,show_flag)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_siofull_init(win,tly,tlx,show_flag)
XWINDOW *win;
Xint tly;
Xint tlx;
Xint show_flag;
X{
Xregister y;
XSLABEL *sptr = tty_slabels;
X
X	use_cp(win,cpLIT);
X	for(y = 0; y < 7; y++)
X		clear_area(win,y,0,getmaxy(win));
X	if(show_flag)
X	{
X		while(sptr->y >= 0)
X		{
X			wmove(win,sptr->y + tly,sptr->x + tlx);
X			waddstr(win,sptr->label);
X			sptr++;
X		}
X	}
X
X}	/* end of display_siofull_init */
X
X/*+-------------------------------------------------------------------------
X	display_siosum_update(win,y,tsio)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_siosum_update(win,y,tsio)
Xregister WINDOW *win;
Xint y;
Xregister struct tty *tsio;
X{
Xregister unsigned int itmp;
Xregister opened = tsio->t_state & (ISOPEN | WOPEN);
Xchar s8[8];
X
X#define TX 1
X#define RX 6
X#define CX 11
X#define OX 16
X#define SX 23
X#define FX 30
X
X	wmove(win,y,TX);
X#ifdef M_UNIX
X	waddch(win,(tsio->t_slot < 8) ? '1' : '2');
X	waddch(win,(tsio->t_slot % 8) + 'a');
X#else
X	wprintw(win,"%02d",tsio->slot);
X#endif
X
X	if(!opened)
X	{
X		use_cp(win,cpINFO);
X		clear_area(win,y,TX,COLS - TX);
X		waddstr(win,"closed");
X		return;
X	}
X
X	wmove(win,y,RX);
X	if((itmp = (unsigned)tsio->t_rawq.c_cc) > 999)
X		itmp = 999;
X	if(itmp > 10)
X		use_cp(win,cpHIGH);
X	else if(itmp > 3)
X		use_cp(win,cpMED);
X	else
X		use_cp(win,cpLOW);
X	wprintw(win,"%3d",itmp);
X
X	if((itmp = (unsigned)tsio->t_canq.c_cc) > 999)
X		itmp = 999;
X	if(itmp > 20)
X		use_cp(win,cpHIGH);
X	else if(itmp > 10)
X		use_cp(win,cpMED);
X	else
X		use_cp(win,cpLOW);
X	wmove(win,y,CX);
X	wprintw(win,"%3d",itmp);
X
X	if((itmp = (unsigned)tsio->t_outq.c_cc + tsio->t_tbuf.c_count) > 99999)
X		itmp = 99999;
X	if(itmp > 75)
X		use_cp(win,cpHIGH);
X	else if(itmp > 20)
X		use_cp(win,cpMED);
X	else
X		use_cp(win,cpLOW);
X	wmove(win,y,OX);
X	wprintw(win,"%5d",itmp);
X
X	use_cp(win,cpINFO);
X	wmove(win,y,SX);
X	waddstr(win,B_to_baud_rate(tsio->t_cflag & CBAUD));
X
X	strcpy(s8,".....");
X	if(tsio->t_state & WOPEN)
X		s8[0] = 'W';
X	else if(tsio->t_state & ISOPEN)
X		s8[0] = 'O';
X	if(tsio->t_state & CARR_ON)
X		s8[1] = 'C';
X	if(tsio->t_state & BUSY)
X		s8[2] = 'B';
X	if(tsio->t_state & TTSTOP)
X		s8[3] = 'S';
X	if(tsio->t_state & TIMEOUT)
X		s8[4] = 'D';
X	wmove(win,y,FX);
X	waddstr(win,s8);
X
X	wprintw(win,"%7o",tsio->t_iflag);
X	wprintw(win,"%7o",tsio->t_oflag);
X	wprintw(win,"%7o",tsio->t_cflag);
X	wprintw(win,"%7o",tsio->t_lflag);
X	if(tsio->t_pgrp)
X		wprintw(win,"%6d",tsio->t_pgrp);
X	else
X		waddstr(win,"      ");
X
X}	/* end of display_siosum_update */
X
X/*+-------------------------------------------------------------------------
X	display_sio_summary(win,initial)
X--------------------------------------------------------------------------*/
Xdisplay_sio_summary(win,initial)
Xregister WINDOW *win;
Xint initial;
X{
Xregister int isio;
Xint max_displayable_sios = getmaxy(win) - 2;
Xstatic char *header  = 
X" tty  raw  can    out  speed  state  iflag  oflag  cflag  lflag  pgrp";
Xstatic couldnt_display_all = 0;
X
X	if(initial)
X	{
X		use_cp(win,cpBANNER);
X		clear_area(win,0,0,getmaxx(win));
X		waddstr(win,header);
X		disp_msg(cpLIT,
X"W=wait for open  O=open C=carrier on  B=output busy  S=stopped  T=timeout");
X		couldnt_display_all = 1;
X	}
X	grok_sio_tty();
X	for(isio = 0; (isio < nsio); isio++)
X	{
X		if(isio > max_displayable_sios)
X		{
X			wmove(win,getmaxy(win)-1);
X			use_cp(win,cpMED);
X			waddstr(win,"cannot display all active serial ports");
X			couldnt_display_all = 1;
X			return;
X		}
X		display_siosum_update(win,isio + 1,&sio[isio]);
X	}
X	if(couldnt_display_all)
X	{
X		use_cp(win,cpINFO);
X		clear_area(win,getmaxy(win)-1,0,getmaxx(win));
X		couldnt_display_all = 0;
X	}
X
X}	/* end of display_sio_summary */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of det_sio.c */
SHAR_EOF
$TOUCH -am 0627015790 det_sio.c &&
chmod 0644 det_sio.c ||
echo "restore of det_sio.c failed"
set `wc -c det_sio.c`;Wc_c=$1
if test "$Wc_c" != "12386"; then
	echo original size 12386, current size $Wc_c
fi
# ============= disputil.c ==============
echo "x - extracting disputil.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > disputil.c &&
X/*+-------------------------------------------------------------------------
X	disputil.c - u386mon display utilities
X
X  Defined functions:
X	clear_area(win,y,x,len)
X	clear_area_char(win,y,x,len,fillchar)
X	disp_info_int(win,label,fmt,value)
X	disp_info_long(win,label,fmt,value)
X	disp_static_int(win,label,fmt,value)
X	disp_static_long(win,label,fmt,value)
X	mkpanel(rows,cols,tly,tlx)
X	pflush()
X	wperror(win,desc)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:06-17-1990-15:15-wht-creation */
X
X#define M_TERMINFO
X
X#include <curses.h>
X#include <panel.h>
X#include <sys/types.h>
X#include "u386mon.h"
X
X/*+-------------------------------------------------------------------------
X	clear_area_char(win,y,x,len,fillchar)
X--------------------------------------------------------------------------*/
Xvoid
Xclear_area_char(win,y,x,len,fillchar)
XWINDOW *win;
Xint y;
Xint x;
Xint len;
Xu_char fillchar;
X{
X	wmove(win,y,x);
X	while(len-- > 0)
X		waddch(win,(chtype)fillchar);
X	wmove(win,y,x);
X
X}	/* end of clear_area_char */
X
X/*+-------------------------------------------------------------------------
X	clear_area(win,y,x,len)
X--------------------------------------------------------------------------*/
Xvoid
Xclear_area(win,y,x,len)
XWINDOW *win;
Xint y;
Xint x;
Xint len;
X{
X	clear_area_char(win,y,x,len,' ');
X}	/* end of clear_area_char */
X
X/*+-------------------------------------------------------------------------
X	pflush() - do update_panels() and doupdate()
X--------------------------------------------------------------------------*/
Xvoid
Xpflush()
X{
X	update_panels();
X	curs_set(0);
X	doupdate();
X	curs_set(1);
X}	/* end of pflush */
X
X/*+-------------------------------------------------------------------------
X	wperror(win,desc)
X--------------------------------------------------------------------------*/
Xvoid
Xwperror(win,desc)
XWINDOW *win;
Xchar *desc;
X{
Xextern int errno;
Xextern int sys_nerr;
Xextern char *sys_errlist[];
X
X	waddstr(win,desc);
X	waddstr(win,": ");
X	if(errno < sys_nerr)
X		waddstr(win,sys_errlist[errno]);
X	else
X		wprintw(win,"error %u",errno);
X
X}	/* end of wperror */
X
X/*+-------------------------------------------------------------------------
X	mkpanel(rows,cols,tly,tlx) - alloc a win and panel and associate them
X--------------------------------------------------------------------------*/
XPANEL *
Xmkpanel(rows,cols,tly,tlx)
Xint rows;
Xint cols;
Xint tly;
Xint tlx;
X{
XWINDOW *win = newwin(rows,cols,tly,tlx);
XPANEL *pan;
X
X	if(!win)
X		return((PANEL *)0);
X	if(pan = new_panel(win))
X		return(pan);
X	delwin(win);
X	return((PANEL *)0);
X}	/* end of mkpanel */
X
X/*+-------------------------------------------------------------------------
X	disp_info_long(win,label,fmt,value)
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_info_long(win,label,fmt,value)
XWINDOW *win;
Xchar *label;
Xchar *fmt;
Xlong value;
X{
X	use_cp(win,cpLIT);
X	waddstr(win,label);
X	use_cp(win,cpINFO);
X	wprintw(win,fmt,value);
X}	/* end of disp_info_long */
X
X/*+-------------------------------------------------------------------------
X	disp_info_int(win,label,fmt,value)
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_info_int(win,label,fmt,value)
XWINDOW *win;
Xchar *label;
Xchar *fmt;
Xint value;
X{
X	use_cp(win,cpLIT);
X	waddstr(win,label);
X	use_cp(win,cpINFO);
X	wprintw(win,fmt,value);
X}	/* end of disp_info_int */
X
X/*+-------------------------------------------------------------------------
X	disp_static_long(win,label,fmt,value)
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_static_long(win,label,fmt,value)
XWINDOW *win;
Xchar *label;
Xchar *fmt;
Xlong value;
X{
X	use_cp(win,cpLIT);
X	waddstr(win,label);
X	wprintw(win,fmt,value);
X}	/* end of disp_static_long */
X
X/*+-------------------------------------------------------------------------
X	disp_static_int(win,label,fmt,value)
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_static_int(win,label,fmt,value)
XWINDOW *win;
Xchar *label;
Xchar *fmt;
Xint value;
X{
X	use_cp(win,cpLIT);
X	waddstr(win,label);
X	wprintw(win,fmt,value);
X}	/* end of disp_static_int */
X
X/*+-------------------------------------------------------------------------
X	disp_msg(cp,msg)
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_msg(cp,msg)
Xchtype cp;
Xchar *msg;
X{
Xextern WINDOW *wscr;
Xint y;
Xregister int x;
X
X	wmove(wscr,MSG_TLY,0);
X	use_cp(wscr,cp);
X	waddstr(wscr,msg);
X	getyx(wscr,y,x);
X	while(x < getmaxx(wscr))
X		waddch(wscr,(chtype)' '),x++;
X}	/* end of disp_msg */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of disputil.c */
SHAR_EOF
$TOUCH -am 0627015790 disputil.c &&
chmod 0644 disputil.c ||
echo "restore of disputil.c failed"
set `wc -c disputil.c`;Wc_c=$1
if test "$Wc_c" != "4936"; then
	echo original size 4936, current size $Wc_c
fi
# ============= libkmem.c ==============
echo "x - extracting libkmem.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > libkmem.c &&
X/*LINTLIBRARY*/
X/*+-------------------------------------------------------------------------
X	libkmem.c -- /dev/kmem routines for SCO UNIX/386 (maybe other *NIX)
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	kinit(write_needed)
X	kread(caddr,kaddr,len)
X	kwrite(kaddr,caddr,len)
X
X routines were originally written by Mike "Ford" Ditto: kudos!!!
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:12-07-1988-22:06-wht-put in test for initialized fdkmem */
X/*:10-27-1988-22:44-wht-creation of file */
X
X#include <sys/types.h>
X#include <fcntl.h>
X#include "libkmem.h"
X
Xvoid leave_text();
X
Xextern int errno;
X
Xstatic int fdkmem = -2;
Xdaddr_t lseek();
X
X/*+-------------------------------------------------------------------------
X	kinit(write_needed)
X--------------------------------------------------------------------------*/
Xvoid
Xkinit(write_needed)
Xint write_needed;
X{
X	if(fdkmem >= 0)
X		return;
X	if((fdkmem=open("/dev/kmem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
X		leave_text("can't open /dev/kmem",255);
X
X}	/* end of kinit */
X
X/*+-------------------------------------------------------------------------
X	kread(caddr,kaddr,len)
X--------------------------------------------------------------------------*/
Xvoid
Xkread(caddr,kaddr,len)
Xcaddr_t caddr;
Xdaddr_t kaddr;
Xint len;
X{
Xchar s80[80];
Xextern daddr_t myreadcnt;
X
X#if defined(M_I286)
X	kaddr &= 0xFFFFL;
X#endif
X
X	if(fdkmem == -2)
X		leave_text("kinit() not called",1);
X
X	if(lseek(fdkmem,kaddr,0) == -1L)
X	{
X		(void)sprintf(s80,"kmem read seek error addr %08lx",kaddr);
X		leave_text(s80,255);
X	}
X
X	if(read(fdkmem,caddr,len) != len)
X	{
X		(void)sprintf(s80,"kmem read error len %d addr %08lx",len,kaddr);
X		leave_text(s80,255);
X	}
X	myreadcnt += len;
X}	/* end of kread */
X
X/*+-------------------------------------------------------------------------
X	kwrite(kaddr,caddr,len)
X--------------------------------------------------------------------------*/
X#ifdef KWRITE_NEEDED
Xvoid
Xkwrite(kaddr,caddr,len)
Xdaddr_t kaddr;
Xcaddr_t caddr;
Xint len;
X{
Xchar s80[80];
X
X#if defined(M_I286)
X	kaddr &= 0xFFFFL;
X#endif
X
X	if(fdkmem == -2)
X		leave_text("kinit() not called",1);
X
X	if(lseek(fdkmem,kaddr,0) == -1L)
X	{
X		(void)sprintf(s80,
X			"/dev/kmem write seek error addr %08lx",kaddr);
X		leave_text(s80,255);
X	}
X	if(write(fdkmem,caddr,len) != len)
X	{
X		(void)sprintf(s80,
X			"/dev/kmem write error addr %08lx len %08lx",kaddr,len);
X		leave_text(s80,255);
X	}
X}	/* end of kwrite */
X#endif
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 0627015790 libkmem.c &&
chmod 0644 libkmem.c ||
echo "restore of libkmem.c failed"
set `wc -c libkmem.c`;Wc_c=$1
if test "$Wc_c" != "2780"; then
	echo original size 2780, current size $Wc_c
fi
# ============= libmem.c ==============
echo "x - extracting libmem.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > libmem.c &&
X/*LINTLIBRARY*/
X/*+-------------------------------------------------------------------------
X	libmem.c -- /dev/mem routines for SCO UNIX/386 (maybe other *NIX)
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	minit(write_needed)
X	mread(caddr,maddr,len)
X	mwrite(maddr,caddr,len)
X
X routines were originally written by Mike "Ford" Ditto: kudos!!!
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:12-07-1988-22:06-wht-put in test for initialized fdmem */
X/*:10-27-1988-22:44-wht-creation of file */
X
X#include <sys/types.h>
X#include <fcntl.h>
X#include "libmem.h"
X
Xvoid leave_text();
X
Xextern int errno;
X
Xstatic int fdmem = -2;
Xdaddr_t lseek();
X
X/*+-------------------------------------------------------------------------
X	minit(write_needed)
X--------------------------------------------------------------------------*/
Xvoid
Xminit(write_needed)
Xint write_needed;
X{
X	if(fdmem >= 0)
X		return;
X	if((fdmem=open("/dev/mem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
X		leave_text("can't open /dev/mem",255);
X
X}	/* end of minit */
X
X/*+-------------------------------------------------------------------------
X	mread(caddr,maddr,len)
X--------------------------------------------------------------------------*/
Xvoid
Xmread(caddr,maddr,len)
Xcaddr_t caddr;
Xdaddr_t maddr;
Xint len;
X{
Xchar s80[80];
Xextern daddr_t myreadcnt;
X
X#if defined(M_I286)
X	maddr &= 0xFFFFL;
X#endif
X
X	if(fdmem == -2)
X		leave_text("minit() not called",1);
X
X	if(lseek(fdmem,maddr,0) == -1L)
X	{
X		(void)sprintf(s80,"mem seek err (%08lx)",maddr);
X		leave_text(s80,1);
X	}
X
X	if(read(fdmem,caddr,len) != len)
X	{
X		(void)sprintf(s80,
X			"mem read errno %d len %d addr %08lx",errno,len,maddr);
X		leave_text(s80,1);
X	}
X	myreadcnt += len;
X}	/* end of mread */
X
X/*+-------------------------------------------------------------------------
X	mwrite(maddr,caddr,len)
X--------------------------------------------------------------------------*/
X#ifdef MWRITE_NEEDED
Xvoid
Xmwrite(maddr,caddr,len)
Xdaddr_t maddr;
Xcaddr_t caddr;
Xint len;
X{
Xchar s80[80];
X
X#if defined(M_I286)
X	maddr &= 0xFFFFL;
X#endif
X
X	if(fdmem == -2)
X		leave_text("minit() not called",1);
X
X	if(lseek(fdkmem,kaddr,0) == -1L)
X	{
X		(void)sprintf(s80,
X			"/dev/kmem seek error addr %08lx",kaddr);
X		leave_text(s80,255);
X	}
X	if(write(fdkmem,caddr,len) != len)
X	{
X		(void)sprintf(s80,
X			"/dev/kmem write error addr %08lx len %08lx",kaddr,len);
X		leave_text(s80,255);
X	}
X}	/* end of mwrite */
X#endif /* MWRITE_NEEDED */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 0627015790 libmem.c &&
chmod 0644 libmem.c ||
echo "restore of libmem.c failed"
set `wc -c libmem.c`;Wc_c=$1
if test "$Wc_c" != "2778"; then
	echo original size 2778, current size $Wc_c
fi
# ============= libswap.c ==============
echo "x - extracting libswap.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > libswap.c &&
X/*LINTLIBRARY*/
X/*+-------------------------------------------------------------------------
X	libswap.c -- /dev/swap routines for SCO UNIX/386 (maybe other *NIX)
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	sinit()
X	sread(caddr,maddr,len)
X
X routines were originally written by Mike "Ford" Ditto: kudos!!!
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-22-1990-02:00-root@n4hgf-creation from libmem */
X
X#include <sys/types.h>
X#include <fcntl.h>
X#include "libswap.h"
X
Xvoid leave_text();
X
Xextern int errno;
X
Xstatic int fdswap = -2;
Xdaddr_t lseek();
X
X/*+-------------------------------------------------------------------------
X	sinit()
X--------------------------------------------------------------------------*/
Xvoid
Xsinit()
X{
X	if(fdswap >= 0)
X		return;
X	if((fdswap=open("/dev/swap",O_RDONLY)) < 0)
X#ifdef M_SYS5
X		leave_text("can't open /dev/swap (chgrp mem /dev/swap)",1);
X#else
X		leave_text("can't open /dev/swap (chgrp sys /dev/swap)",1);
X#endif
X
X}	/* end of sinit */
X
X/*+-------------------------------------------------------------------------
X	sread(caddr,maddr,len)
X--------------------------------------------------------------------------*/
Xvoid
Xsread(caddr,maddr,len)
Xcaddr_t caddr;
Xdaddr_t maddr;
Xint len;
X{
Xchar s80[80];
Xextern daddr_t myreadcnt;
X
X#if defined(M_I286)
X	maddr &= 0xFFFFL;
X#endif
X
X	if(fdswap == -2)
X		leave_text("sinit() not called",1);
X
X	if(lseek(fdswap,maddr,0) == -1L)
X	{
X		(void)sprintf(s80,"swap seek error addr %08lx",maddr);
X		leave_text(s80,1);
X	}
X
X	if(read(fdswap,caddr,len) != len)
X	{
X		(void)sprintf(s80,"swap read error len %d addr %08lx",len,maddr);
X		leave_text(s80,255);
X	}
X	myreadcnt += len;
X}	/* end of sread */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 0627015790 libswap.c &&
chmod 0644 libswap.c ||
echo "restore of libswap.c failed"
set `wc -c libswap.c`;Wc_c=$1
if test "$Wc_c" != "1964"; then
	echo original size 1964, current size $Wc_c
fi
# ============= libnlsym.c ==============
echo "x - extracting libnlsym.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > libnlsym.c &&
X/*LINTLIBRARY*/
X/*+-------------------------------------------------------------------------
X	libnlsym.c -- common runtime for nlsym users
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	nlsym_error(text)
X	nlsym_read()
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-27-1990-01:55-wht@n4hgf-use 64 bits of unique check */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:10-27-1988-11:44-wht-creation */
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <fcntl.h>
X#include <nlist.h>
X
Xvoid leave_text();
X
X#define DEFINE_NLSYM
X#include "nlsym.h"
X#include "libnlsym.h"
X
Xextern int errno;
Xextern char *sys_errlist[];
X
X/*+-------------------------------------------------------------------------
X	nlsym_error(text)
X--------------------------------------------------------------------------*/
Xvoid
Xnlsym_error(text)
Xchar *text;
X{
Xchar s128[128];
X
X	(void)strcpy(s128,text);
X	(void)strcat(s128,": run nlsym");
X	leave_text(s128,(errno) ? 255 : 1);
X}	/* end of nlsym_error */
X
X/*+-------------------------------------------------------------------------
X	nlsym_read()
X--------------------------------------------------------------------------*/
Xvoid
Xnlsym_read()
X{
Xchar s80[80];
Xint itmp;
Xint fdnlsym;
Xstruct stat curstat;	/* current /unix status */
Xstruct stat unixstat;		/* /unix status at nlsym run (void)time */
Xlong unique1 = 0;
Xlong unique2 = 0;
X
X	if(stat(UNIX_KERNEL,&curstat) < 0)
X	{
X		(void)sprintf(s80,"cannot stat %s",UNIX_KERNEL);
X		nlsym_error(s80);
X	}
X
X	errno = 0;
X	if((fdnlsym = open(UNIX_NLSYM,O_RDONLY,0)) < 0)
X	{
X		(void)sprintf(s80,"%s open error\n",UNIX_NLSYM);
X		nlsym_error(s80);
X	}
X
X	if(read(fdnlsym,(char *)&unixstat,sizeof(unixstat)) != sizeof(unixstat))
X		nlsym_error("nlsym_read: /unix stat read error");
X
X	if(read(fdnlsym,(char *)nlsym,sizeof(nlsym)) != sizeof(nlsym))
X		nlsym_error("nlsym_read: nlsym read error");
X
X	if(read(fdnlsym,(char *)&unique1,sizeof(unique1)) != sizeof(unique1))
X		nlsym_error("nlsym_read: `unique' read error");
X
X	if(read(fdnlsym,(char *)&unique2,sizeof(unique2)) != sizeof(unique2))
X		nlsym_error("nlsym_read: `unique' read error");
X
X	(void)close(fdnlsym);
X
X	if( (unique1 != NLSYM_UNIQUE1) ||
X		(unique2 != NLSYM_UNIQUE2) ||
X		(unixstat.st_ino != curstat.st_ino) ||
X		(unixstat.st_mtime != curstat.st_mtime) ||
X		(unixstat.st_size != curstat.st_size))
X	{
X		(void)sprintf(s80,"%s out of date",UNIX_NLSYM);
X		nlsym_error(s80);
X	}
X
X}	/* end of nlsym_read */
SHAR_EOF
$TOUCH -am 0627020090 libnlsym.c &&
chmod 0644 libnlsym.c ||
echo "restore of libnlsym.c failed"
set `wc -c libnlsym.c`;Wc_c=$1
if test "$Wc_c" != "2706"; then
	echo original size 2706, current size $Wc_c
fi
# ============= nlsym.c ==============
echo "x - extracting nlsym.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > nlsym.c &&
X/*+-------------------------------------------------------------------------
X	nlsym.c -- utility nlist - fast access to kernel /dev/kmem offsets
X	...!emory!n4hgf!wht
X
X  Defined functions:
X	main(argc,argv,envp)
X	nlsym_write_error(code)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-27-1990-01:55-wht@n4hgf-use 64 bits of unique check */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:05-12-1989-18:27-wht-fix endless loop error on cannot nlist */
X/*:10-27-1988-10:58-wht-creation */
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <fcntl.h>
X#include <nlist.h>
X
X#define DEFINE_NLSYM
X#include "nlsym.h"
X
X/*+-------------------------------------------------------------------------
X	nlsym_write_error(code)
X--------------------------------------------------------------------------*/
Xvoid
Xnlsym_write_error(code)
Xint code;
X{
X	(void)fprintf(stderr,"code %d: ",code);
X	perror(UNIX_NLSYM);
X	exit(1);
X}	/* end of nlsym_write_error */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv,envp)
X--------------------------------------------------------------------------*/
X/*ARGSUSED*/
Xmain(argc,argv,envp)
Xint argc;
Xchar **argv;
Xchar **envp;
X{
Xregister int itmp;
Xregister struct nlist *nn;
Xstruct stat unixstat;		/* /unix status at nlsym run (void)time */
Xint fdnlsym;
Xint nlist_error = 0;
Xlong unique;
XFILE *kludge;
X
X	(void)nlist(UNIX_KERNEL,nlsym);
X
X	nn = nlsym;
X	while(nn->n_name)
X	{
X		if(!nn->n_sclass)
X		{
X			(void)printf("%s: can't nlist\n", nn->n_name);
X			nlist_error = 1;
X			nn++;
X			continue;
X		}
X		(void)printf("%-12.12s  storage class: %04x value: %08lx\n",
X			nn->n_name,
X			nn->n_sclass,
X			nn->n_value);
X		nn++;
X	}
X
X	if(nlist_error)
X	{
X		(void)fprintf(stderr,"%s NOT produced\n",UNIX_NLSYM);
X		exit(1);
X	}
X
X	if((kludge = fopen(UNIX_NLSYM,"w")) == NULL)	/* scratch/create */
X		nlsym_write_error(-1);
X	(void)fclose(kludge);
X
X	if((fdnlsym = open(UNIX_NLSYM,O_WRONLY,0)) < 0)
X		nlsym_write_error(fdnlsym);
X
X	if(stat(UNIX_KERNEL,&unixstat) < 0)
X	{
X		(void)fputs("cannot stat ",stderr);
X		perror(UNIX_KERNEL);
X		exit(1);
X	}
X
X	if((itmp = write(fdnlsym,&unixstat,sizeof(unixstat))) != sizeof(unixstat))
X		nlsym_write_error(itmp);
X
X	if((itmp = write(fdnlsym,nlsym,sizeof(nlsym))) != sizeof(nlsym))
X		nlsym_write_error(itmp);
X
X	unique = NLSYM_UNIQUE1;
X	if((itmp = write(fdnlsym,&unique,sizeof(unique))) != sizeof(unique))
X		nlsym_write_error(itmp);
X
X	unique = NLSYM_UNIQUE2;
X	if((itmp = write(fdnlsym,&unique,sizeof(unique))) != sizeof(unique))
X		nlsym_write_error(itmp);
X
X	(void)close(fdnlsym);
X	exit(0);
X	/*NOTREACHED*/
X}	/* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 0627015790 nlsym.c &&
chmod 0644 nlsym.c ||
echo "restore of nlsym.c failed"
set `wc -c nlsym.c`;Wc_c=$1
if test "$Wc_c" != "2933"; then
	echo original size 2933, current size $Wc_c
fi
# ============= proc.c ==============
echo "x - extracting proc.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > proc.c &&
X/*+-------------------------------------------------------------------------
X	proc.c - u386mon proc table functions
X
X  Defined functions:
X	display_proc(win,y,x)
X	grok_proc()
X	pstat_text(pstat)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
X/*:06-17-1990-16:46-wht-creation */
X
X#define M_TERMINFO
X
X#include <curses.h>
X#include <panel.h>
X#include <sys/types.h>
X#undef NGROUPS_MAX
X#undef NULL
X#include <sys/param.h>
X#include <sys/immu.h>
X#include <sys/region.h>
X#include <sys/proc.h>
X#include <sys/var.h>
X#include <nlist.h>
X#include "nlsym.h"
X#include "libkmem.h"
X#include "libnlsym.h"
X#include "u386mon.h"
X
Xextern struct var v;
X
Xstruct proc *procs = (struct proc *)0;
Xstruct proc *oldprocs = (struct proc *)0;
X
Xint procs_per_pstat[SXBRK + 1];
Xint procs_in_core;
Xint procs_alive;
X
X/*+-------------------------------------------------------------------------
X	pstat_text(pstat)
X--------------------------------------------------------------------------*/
Xchar *
Xpstat_text(pstat)
Xchar pstat;
X{
Xstatic char errant[10];
X
X	switch(pstat)
X	{
X		case SSLEEP:   return("sleep ");
X		case SRUN:     return("run   ");
X		case SZOMB:    return("zombie");
X		case SSTOP:    return("stop  ");
X		case SIDL:     return("idle  ");
X		case SONPROC:  return("onproc");
X		case SXBRK:    return("xbrk  ");
X	}
X	(void)sprintf(errant,"%06u?",(unsigned char)pstat);
X	return(errant);
X
X}	/* end of pstat_text */
X
X/*+-------------------------------------------------------------------------
X	grok_proc() - read and examine kernel process table
X--------------------------------------------------------------------------*/
Xvoid
Xgrok_proc()
X{
Xregister iproc;
Xregister struct proc *pp;
X
X	if(!procs)
X	{
X		if(!(procs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
X			leave_text("cannot alloc memory for proc table",1);
X		if(!(oldprocs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
X			leave_text("cannot alloc memory for proc table",1);
X	}
X	kread((caddr_t)procs,procaddr,sizeof(struct proc) * v.v_proc);
X	for(iproc = 0; iproc < SXBRK + 1; iproc++)
X		procs_per_pstat[iproc] = 0;
X	procs_in_core = 0;
X	procs_alive = 0;
X
X	for(iproc = 0; iproc < v.v_proc; iproc++)
X	{
X		pp = procs + iproc;
X
X		if(pp->p_stat)
X			procs_alive++;
X
X		procs_per_pstat[pp->p_stat]++;	/* count # procs in each state */
X
X		if(pp->p_flag & SLOAD)			/* count # procs in memory */
X			procs_in_core++;
X	}
X
X}	/* end of grok_proc */
X
X/*+-------------------------------------------------------------------------
X	display_proc(win,y,x)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_proc(win,y,x)
XWINDOW *win;
Xint y;
Xint x;
X{
Xregister istat;
X
X	grok_proc();
X
X	use_cp(win,cpBANNER);
X	wmove(win,y++,x);
X	waddstr(win,"-- Proc ---");
X	for(istat = SSLEEP; istat <= SXBRK; istat++)
X	{
X		wmove(win,y++,x);
X		disp_info_int(win,pstat_text(istat),"  %3d",procs_per_pstat[istat]);
X	}
X	wmove(win,y++,x);
X	disp_info_int(win,"total ","  %3d",procs_alive);
X	wmove(win,y++,x);
X	disp_info_int(win,"in mem","  %3d",procs_in_core);
X}	/* end of display_proc */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of proc.c */
SHAR_EOF
$TOUCH -am 0627015790 proc.c &&
chmod 0644 proc.c ||
echo "restore of proc.c failed"
set `wc -c proc.c`;Wc_c=$1
if test "$Wc_c" != "3411"; then
	echo original size 3411, current size $Wc_c
fi
echo "End of part 2, continue with part 3"
exit 0