[comp.sources.misc] v13i101: u386mon 1.10

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

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

#!/bin/sh
# This is part 03 of u386mon.1.10
if touch 2>&1 | fgrep 'mmdd' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= tune.c ==============
echo "x - extracting tune.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > tune.c &&
X/*+-------------------------------------------------------------------------
X	tune.c - u386mon tune struct display
X
X  Defined functions:
X	display_tune(win,y,x)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-17:33-wht@n4hgf-alpha sort identifiers */
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-14:59-wht-creation */
X
X#define M_TERMINFO
X
X#include <curses.h>
X#include <panel.h>
X#include <sys/types.h>
X#include <sys/tuneable.h>
X#include "u386mon.h"
X
X/*+-------------------------------------------------------------------------
X	display_tune(win,y,x)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_tune(win,y,x)
XWINDOW *win;
Xint y;
Xint x;
X{
X
X	use_cp(win,cpBANNER);
X	wmove(win,y++,x);
X	waddstr(win,"-- Tune ---------");
X	wmove(win,y++,x);
X	disp_static_int(win,"t_ageintvl  ","%5d",tune.t_ageinterval);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_bdflushr  ","%5d",tune.t_bdflushr);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_gpgshi    ","%5d",tune.t_gpgshi);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_gpgslo    ","%5d",tune.t_gpgslo);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_gpgsmsk   ","0x%03lx",tune.t_gpgsmsk);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_maxfc     ","%5d",tune.t_maxfc);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_maxsc     ","%5d",tune.t_maxsc);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_maxumem   ","%5d",tune.t_maxumem);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_minarmem  ","%5d",tune.t_minarmem);
X	wmove(win,y++,x);
X	disp_static_int(win,"t_minasmem  ","%5d",tune.t_minasmem);
X
X}	/* end of display_tune */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of tune.c */
SHAR_EOF
$TOUCH -am 0627015790 tune.c &&
chmod 0644 tune.c ||
echo "restore of tune.c failed"
set `wc -c tune.c`;Wc_c=$1
if test "$Wc_c" != "1941"; then
	echo original size 1941, current size $Wc_c
fi
# ============= u386mon.c ==============
echo "x - extracting u386mon.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > u386mon.c &&
Xchar *revision = "1.10";
X/*+-------------------------------------------------------------------------
X	u386mon.c - UNIX 386 system monitor
X
X  Defined functions:
X	calc_cpu_avg(per_state)
X	calc_wait_avg(per_state)
X	draw_cpuscale_literals(win,y,x)
X	draw_per_sec_literals(win,y,x)
X	draw_waitscale_literals(win,y,x)
X	extra_info_stuff()
X	extra_static_stuff()
X	get_cpu_avg(cpu_ticks,period)
X	get_elapsed_time(elapsed_seconds)
X	get_wait_avg(wait_ticks,period)
X	leave(exit_code)
X	leave_text(text,exit_code)
X	main(argc,argv,envp)
X	update_cpuscale(win,y,x,width,per_state)
X	update_waitscale(win,y,x,width,per_state,total_ticks)
X
X00000000001111111111222222222233333333334444444444555555555566666666667777777777
X01234567890123456789012345678901234567890123456789012345678901234567890123456789
X u386mon xxx.xxx                       PLOCK     INVALID      hh:mm:ss wht@n4hgf
X
X---- CPU --- tot usr ker brk ---------------------------------------------------
X Instant %   ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X---- Wait -- tot  io swp pio ---------------------------------------------------
X Instant %   ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-27-1990-01:07-wht@n4hgf-add ^R and ^L refresh */
X/*:06-25-1990-17:34-wht@n4hgf-add detail extra for 25 line tubes */
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-15-1990-18:32-wht@n4hgf-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 <sys/types.h>
X#include <sys/lock.h>
X#include <sys/utsname.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/var.h>
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
XPANEL *mkpanel();
X
Xstruct sysinfo sysinfo;
Xstruct sysinfo sysinfo_last;
X#define sysidelta(x) (sysinfo.x - sysinfo_last.x)
X
Xstruct minfo minfo;
Xstruct minfo minfo_last;
X#define midelta(x) (minfo.x - minfo_last.x)
X
Xstruct bootinfo bootinfo;
Xstruct tune tune;
Xstruct utsname utsname;
Xstruct var v;
Xtime_t now;
Xtime_t then;
Xint hz;
Xint nswap;
Xint maxmem;
Xint freemem;
Xdaddr_t myreadcnt = 0L;
X
XPANEL *pscr;
XWINDOW *wscr;
Xextern WINDOW *wdet;
X
X#define CPU_AVG_MAX		10
Xint cpu_avg_init = 0;
Xtime_t *cpu_avg[CPU_AVG_MAX];
Xtime_t cpu_ticks[5];
X
X#define WAIT_AVG_MAX	10
Xint wait_avg_init = 0;
Xtime_t *wait_avg[WAIT_AVG_MAX];
Xtime_t wait_ticks[5];
X
X/*+-------------------------------------------------------------------------
X	leave(exit_code)
X--------------------------------------------------------------------------*/
Xvoid
Xleave(exit_code)
Xint exit_code;
X{
X	wmove(wscr,CMD_TLY,0);
X	use_cp(wscr,cpLIT);
X	wclrtoeol(wscr);
X	pflush();
X	endwin();
X	exit(exit_code);
X}	/* end of leave */
X
X/*+-------------------------------------------------------------------------
X	leave_text(text,exit_code)
XIf exit_code == 255, do wperror
X--------------------------------------------------------------------------*/
Xvoid
Xleave_text(text,exit_code)
Xchar *text;
Xint exit_code;
X{
X	if(exit_code == 255)
X	{
X	int y;
X	register x;
X	extern int errno;
X	extern int sys_nerr;
X	extern char *sys_errlist[];
X
X		top_panel(pscr);
X		wmove(wscr,MSG_TLY - 2,0);
X		use_cp(wscr,cpHIGH);
X		x = 0;
X		while(x++ < COLS)
X			waddch(wscr,(chtype)' ');
X		wmove(wscr,MSG_TLY - 1,0);
X		wprintw(wscr,"errno %d",errno);
X		if(errno < sys_nerr)
X			wprintw(wscr,": %s",sys_errlist[errno]);
X		getyx(wscr,y,x);
X		while(x++ < COLS)
X			waddch(wscr,(chtype)' ');
X	}
X	disp_msg(cpHIGH,text);
X	leave(exit_code);
X}	/* end of leave */
X
X/*+-----------------------------------------------------------------------
X	char *get_elapsed_time(elapsed_seconds) - "ddd+hh:mm:ss" returned
X  static string address is returned
X------------------------------------------------------------------------*/
Xchar *
Xget_elapsed_time(elapsed_seconds)
Xtime_t elapsed_seconds;
X{
Xstatic char elapsed_time_str[32];
Xtime_t dd,hh,mm,ss;
X
X	dd = 0;
X	hh = elapsed_seconds / 3600;
X	if(hh > 24)
X	{
X		dd = hh / 24;
X		elapsed_seconds -= dd * 3600 * 24;
X		hh %= 24;
X	}
X	elapsed_seconds -= hh * 3600;
X	mm = elapsed_seconds / 60L;
X	elapsed_seconds -= mm * 60L;
X	ss = elapsed_seconds;
X
X	if(dd)
X		(void)sprintf(elapsed_time_str,"%3ld+%02ld:%02ld:%02ld",dd,hh,mm,ss);
X	else
X		(void)sprintf(elapsed_time_str,"    %2ld:%02ld:%02ld",hh,mm,ss);
X	return(elapsed_time_str);
X}	/* end of get_elapsed_time */
X
X/*+-------------------------------------------------------------------------
X	draw_cpuscale_literals(win)
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_cpuscale_literals(win,y,x)
XWINDOW *win;
Xint y;
Xint x;
X{
Xint x2 = x;
X
X	wmove(win,y,x);
X	use_cp(wscr,cpBANNER);
X	waddstr(win,"---- CPU --- tot usr ker brk ");
X	getyx(win,y,x2);
X	while(x2 < COLS)
X		waddch(win,(chtype)'-'),x2++;
X	use_cp(wscr,cpLIT);
X	wmove(win,y + 1,x);
X  	waddstr(win," Instant %  ");
X	wmove(win,y + 2,x);
X  	waddstr(win," 5 Sec Avg %");
X	wmove(win,y + 3,x);
X	waddstr(win,"10 Sec Avg %");
X
X}	/* end of draw_cpuscale_literals */
X
X/*+-------------------------------------------------------------------------
X	update_cpuscale(win,y,width,per_state)
X
X000000000011111111112222222222333333333344444444445555555555666666
X012345678901234567890123456789012345678901234567890123456789012345
Xtot usr ker misc 
X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X--------------------------------------------------------------------------*/
X#define _CPUSCALE_TX	0
X#define _CPUSCALE_UX	4
X#define _CPUSCALE_KX	8
X#define _CPUSCALE_BX	12
X#define _CPUSCALE_SX	16
X
Xtime_t
Xupdate_cpuscale(win,y,x,width,per_state)
XWINDOW *win;
Xint y;
Xint x;
Xregister width;
Xtime_t *per_state;
X{
Xregister itmp;
Xint accum = 0;
Xtime_t idle = per_state[CPU_IDLE] + per_state[CPU_WAIT];
Xtime_t cpu_ticks_total = idle + per_state[CPU_SXBRK] + 
X	per_state[CPU_IDLE] + per_state[CPU_KERNEL] + per_state[CPU_USER];
Xtime_t percent_user    = (per_state[CPU_USER]   * 100) / cpu_ticks_total;
Xtime_t percent_kernel  = (per_state[CPU_KERNEL] * 100) / cpu_ticks_total;
Xtime_t percent_break   = (per_state[CPU_SXBRK]  * 100) / cpu_ticks_total;
Xtime_t percent_busy    = percent_user + percent_kernel + percent_break;
X
X	if(!idle)			/* take care of integer div truncation */
X		percent_busy = 100;
X
X	wmove(win,y, x + _CPUSCALE_TX);
X	if(percent_busy < 70)
X		use_cp(wscr,cpLOW);
X	else if(percent_busy < 90)
X		use_cp(wscr,cpMED);
X	else
X		use_cp(wscr,cpHIGH);
X	wprintw(win,"%3ld",percent_busy);
X
X	wmove(win,y, x + _CPUSCALE_UX);
X	use_cp(wscr,cpINFO);
X	wprintw(win,"%3ld",percent_user);
X	
X	wmove(win,y, x + _CPUSCALE_KX);
X	wprintw(win,"%3ld",percent_kernel);
X	
X	wmove(win,y, x + _CPUSCALE_BX);
X	wprintw(win,"%3ld",percent_break);
X	
X	wmove(win,y, x + _CPUSCALE_SX);
X
X	use_cp(wscr,cpLOW);
X	itmp = (width * percent_user) / 100;
X	accum += itmp;
X	while(itmp--)
X		waddch(win,(chtype)'u');
X
X	use_cp(wscr,cpMED);
X	itmp = (width * percent_kernel) / 100;
X	accum += itmp;
X	while(itmp--)
X		waddch(win,(chtype)'k');
X
X	use_cp(wscr,cpHIGH);
X	itmp = (width * percent_break) / 100;
X	accum += itmp;
X	while(itmp--)
X		waddch(win,(chtype)'b');
X
X	if((percent_busy > 98) && ((width - accum) > 0))
X	{
X		waddch(win,(chtype)'*');
X		accum++;
X	}
X
X	if((itmp = (width - accum)) > 0)
X	{
X		while(itmp--)
X			waddch(win,(chtype)' ');
X	}
X	return(cpu_ticks_total);
X}	/* end of update_cpuscale */
X
X/*+-------------------------------------------------------------------------
X	calc_cpu_avg(per_state) - add per_state array to avg array
X--------------------------------------------------------------------------*/
Xvoid
Xcalc_cpu_avg(per_state)
Xtime_t per_state[];
X{
Xregister itmp;
X
X	if(!cpu_avg_init)
X	{
X		for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
X			(void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
X		cpu_avg_init = 1;
X	}
X	else
X	{
X		for(itmp = 0; itmp < CPU_AVG_MAX - 1; itmp++)
X			(void)memcpy(cpu_avg[itmp],cpu_avg[itmp + 1],sizeof(time_t) * 5);
X		(void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
X	}
X
X}	/* end of calc_cpu_avg */
X
X/*+-------------------------------------------------------------------------
X	get_cpu_avg(cpu_ticks,period)
X--------------------------------------------------------------------------*/
Xget_cpu_avg(cpu_ticks,period)
Xtime_t cpu_ticks[];
Xint period;
X{
Xregister iperiod = CPU_AVG_MAX;
Xregister istate;
Xregister count = period;
X
X	for(istate = 0; istate < 5; istate++)
X		cpu_ticks[istate] = 0;
X
X	while(count--)
X	{
X		iperiod--;
X		for(istate = 0; istate < 5; istate++)
X		{
X			cpu_ticks[istate] += (cpu_avg[iperiod])[istate];
X		}
X	}
X
X	for(istate = 0; istate < 5; istate++)
X		cpu_ticks[istate] /= period;
X
X}	/* end of get_cpu_avg */
X
X/*+-------------------------------------------------------------------------
X	draw_waitscale_literals(win)
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_waitscale_literals(win,y,x)
XWINDOW *win;
Xint y;
Xint x;
X{
Xint x2 = x;
X
X	wmove(win,y,x);
X	use_cp(wscr,cpBANNER);
X	waddstr(win,"---- Wait -- tot  io swp pio -- (% of real time) ");
X	getyx(win,y,x2);
X	while(x2 < COLS)
X		waddch(win,(chtype)'-'),x2++;
X	use_cp(wscr,cpLIT);
X	wmove(win,y + 1,x);
X  	waddstr(win," Instant %  ");
X	wmove(win,y + 2,x);
X  	waddstr(win," 5 Sec Avg %");
X	wmove(win,y + 3,x);
X	waddstr(win,"10 Sec Avg %");
X
X}	/* end of draw_waitscale_literals */
X
X/*+-------------------------------------------------------------------------
X	draw_per_sec_literals(win)
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_per_sec_literals(win,y,x)
XWINDOW *win;
Xint y;
Xint x;
X{
X
X	wmove(win,y,x);
X	use_cp(wscr,cpBANNER);
X	waddstr(win,"---- Sysinfo/Minfo --- (last 1 second activity) ");
X	getyx(win,y,x);
X	while(x < getmaxx(win))
X		waddch(win,(chtype)'-'),x++;
X
X}	/* end of draw_per_sec_literals */
X
X/*+-------------------------------------------------------------------------
X	update_waitscale(win,y,width,per_state)
X
X000000000011111111112222222222333333333344444444445555555555666666
X012345678901234567890123456789012345678901234567890123456789012345
Xtot  io swp pio 
X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X--------------------------------------------------------------------------*/
X#define _WAITSCALE_TX	0
X#define _WAITSCALE_IX	4
X#define _WAITSCALE_WX	8
X#define _WAITSCALE_PX	12
X#define _WAITSCALE_SX	16
X
Xtime_t
Xupdate_waitscale(win,y,x,width,per_state,total_ticks)
XWINDOW *win;
Xint y;
Xint x;
Xregister width;
Xtime_t *per_state;
Xtime_t total_ticks;
X{
Xregister itmp;
Xint accum = 0;
Xtime_t percent_io = 0L;
Xtime_t percent_swap = 0L;
Xtime_t percent_pio = 0L;
Xtime_t percent_total_wait;
Xtime_t total_wait;
X
X/* crock: because of latency, total_ticks < all wait ticks sometimes */
X	total_wait = per_state[W_IO] + per_state[W_SWAP] + per_state[W_PIO];
X	if(total_ticks < total_wait)
X		total_ticks = total_wait;
X
X	if(total_ticks)
X	{
X		percent_io    = (per_state[W_IO]   * 100) / total_ticks;
X		percent_swap  = (per_state[W_SWAP] * 100) / total_ticks;
X		percent_pio   = (per_state[W_PIO]  * 100) / total_ticks;
X	}
X
X	percent_total_wait = percent_io + percent_swap + percent_pio;
X	wmove(win,y, x + _WAITSCALE_TX);
X	if(percent_total_wait < 30)
X		use_cp(wscr,cpLOW);
X	else if(percent_total_wait < 50)
X		use_cp(wscr,cpMED);
X	else
X		use_cp(wscr,cpHIGH);
X	wprintw(win,"%3ld",percent_total_wait);
X
X	wmove(win,y, x + _WAITSCALE_IX);
X	use_cp(wscr,cpINFO);
X	wprintw(win,"%3ld",percent_io);
X	
X	wmove(win,y, x + _WAITSCALE_WX);
X	wprintw(win,"%3ld",percent_swap);
X	
X	wmove(win,y, x + _WAITSCALE_PX);
X	wprintw(win,"%3ld",percent_pio);
X	
X	wmove(win,y, x + _WAITSCALE_SX);
X
X	use_cp(wscr,cpLOW);
X	itmp = (width * percent_io) / 100;
X	accum += itmp;
X	while(itmp--)
X		waddch(win,(chtype)'i');
X
X	use_cp(wscr,cpMED);
X	itmp = (width * percent_swap) / 100;
X	accum += itmp;
X	while(itmp--)
X		waddch(win,(chtype)'s');
X
X	use_cp(wscr,cpHIGH);
X	itmp = (width * percent_pio) / 100;
X	accum += itmp;
X	while(itmp--)
X		waddch(win,(chtype)'p');
X
X	if((itmp = (width - accum)) > 0)
X	{
X		while(itmp--)
X			waddch(win,(chtype)' ');
X	}
X
X}	/* end of update_waitscale */
X
X/*+-------------------------------------------------------------------------
X	calc_wait_avg(per_state) - add per_state array to avg array
X--------------------------------------------------------------------------*/
Xvoid
Xcalc_wait_avg(per_state)
Xtime_t per_state[];
X{
Xregister itmp;
X
X	if(!wait_avg_init)
X	{
X		for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
X			(void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
X		wait_avg_init = 1;
X	}
X	else
X	{
X		for(itmp = 0; itmp < WAIT_AVG_MAX - 1; itmp++)
X			(void)memcpy(wait_avg[itmp],wait_avg[itmp + 1],sizeof(time_t) * 3);
X		(void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
X	}
X
X}	/* end of calc_wait_avg */
X
X/*+-------------------------------------------------------------------------
X	get_wait_avg(wait_ticks,period)
X--------------------------------------------------------------------------*/
Xget_wait_avg(wait_ticks,period)
Xtime_t wait_ticks[];
Xint period;
X{
Xregister iperiod = WAIT_AVG_MAX;
Xregister istate;
Xregister count = period;
X
X	for(istate = 0; istate < 3; istate++)
X		wait_ticks[istate] = 0;
X
X	while(count--)
X	{
X		iperiod--;
X		for(istate = 0; istate < 3; istate++)
X		{
X			wait_ticks[istate] += (wait_avg[iperiod])[istate];
X		}
X	}
X
X	for(istate = 0; istate < 3; istate++)
X		wait_ticks[istate] /= period;
X
X}	/* end of get_wait_avg */
X
X/*+-------------------------------------------------------------------------
X	extra_static_stuff()/extra_info_stuff() - for 43 line display
X--------------------------------------------------------------------------*/
Xvoid
Xextra_static_stuff()
X{
X	display_var(wscr,EXTRA_TLY,EXTRA1_TLX);
X	display_bootinfo(wscr,EXTRA_TLY,EXTRA2_TLX);
X	display_tune(wscr,EXTRA_TLY,EXTRA3_TLX);
X}	/* end of extra_static_stuff */
Xvoid
Xextra_info_stuff()
X{
X	display_proc(wscr,EXTRA_TLY,EXTRA4_TLX);
X}	/* end of extra_info_stuff */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv,envp)
X--------------------------------------------------------------------------*/
X/*ARGSUSED*/
Xmain(argc,argv,envp)
Xint argc;
Xchar **argv;
Xchar **envp;
X{
Xregister itmp;
Xregister char *cptr;
Xregister chtype cmd;
Xregister chtype initial_cmd = 0;
Xint errflg = 0;
Xint plock_indicator = 0;
Xtime_t total_ticks;
Xint y,x;
Xint invalidity = 0;
Xlong ltmp;
Xstruct tm *lt;
Xstatic char stdoutbuf[1024];
Xchar s80[80];
Xextern char *optarg;
Xextern int optind;
X
X/*
X * curses works better if standard output is fully buffered
X */
X	(void)setvbuf(stdout,stdoutbuf,_IOFBF,sizeof(stdoutbuf));
X
X/*
X * check out command line
X */
X	while((itmp = getopt(argc,argv,"lPps")) != -1)
X	{
X		switch(itmp)
X		{
X			case 'P':
X			case 'p':
X#ifdef M_UNIX
X			case 's':
X#endif
X				initial_cmd = (chtype) itmp;
X				break;
X			case 'l':
X				plock_indicator = 1;
X				break;
X			case '?':
X				errflg++;
X		}
X	}
X	if(errflg || (optind != argc))
X	{
X		static char *usage_str[]=
X		{
X			"usage: u386mon [-l] [-p | -P]",
X			"-l lock process into memory (if root)",
X			"-p begin with short ps display",
X			"-P begin with long ps display (if 43 line screen)",
X			(char *)0
X		};
X		char **cpptr = usage_str;
X		while(*cpptr)
X			(void)fprintf(stderr,"%s\n",*(cpptr++));
X		exit(1);
X	}
X
X/*
X * if man wants to plock() try it; fail silently if non-root
X */
X	if(plock_indicator && plock(PROCLOCK))
X		plock_indicator = 0;
X
X/*
X * Real(tm) performance monitor users will have done a kernel link
X * and won't need to rely on /etc/systemid
X */
X	if(uname(&utsname))
X	{
X		leave_text("uname failed",255);
X		exit(1);
X	}
X
X/*
X * allocate memory for cpu time array averaging buckets
X */
X	for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
X	{
X		if(!(cpu_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 5)))
X			leave_text("cannot alloc memory for cpu avg arrays",1);
X	}
X
X/*
X * allocate memory for wait time array averaging buckets
X */
X	for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
X	{
X		if(!(wait_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 3)))
X			leave_text("cannot alloc memory for wait avg arrays",1);
X	}
X
X/*
X * initialize curses environment
X */
X	if(!initscr())
X	{
X		(void)printf("curses init failed\n");
X		exit(1);
X	}
X	clear();
X	refresh();
X
X	if((LINES < 25) || (COLS < 80))
X	{
X		waddstr(stdscr,"\n\n\nNeed at least 80x25 screen\n\n");
X		refresh();
X		endwin();
X		exit(1);
X	}
X
X	noecho();
X	keypad(stdscr,1);
X	typeahead(-1);
X
X	start_color();
X	init_pair(cpLIT,cBLU,cBLK);
X	init_pair(cpINFO,cGRN,cBLK);
X	init_pair(cpLOW,cLTG,cBLK);
X	init_pair(cpMED,cYEL,cBLK);
X	init_pair(cpHIGH,cRED,cBLK);
X	init_pair(cpBANNER,cBLK,cWHT);
X	init_pair(cpREVERSE,cRED,cWHT);
X
X	/* a hack for now -- assuming AT char set */
X#ifdef HI_BIT_CAN_BE_SET
X	acs_map['l'] = A_ALTCHARSET | sTL;	
X	acs_map['m'] = A_ALTCHARSET | sTR;	
X	acs_map['j'] = A_ALTCHARSET | sBL;	
X	acs_map['k'] = A_ALTCHARSET | sBR;	
X	acs_map['x'] = A_ALTCHARSET | sVR;		/* vertical rule */
X	acs_map['q'] = A_ALTCHARSET | sHR;		/* horizontal rule */
X	acs_map['t'] = A_ALTCHARSET | sLT;		/* left hand T */
X	acs_map['u'] = A_ALTCHARSET | sRT;		/* right hand T */
X#endif
X
X	if(!(pscr = mkpanel(LINES,COLS,0,0)))
X	{
X		addstr("cannot make screen panel");
X		refresh();
X		endwin();
X		exit(1);
X	}
X	wscr = panel_window(pscr);
X	top_panel(pscr);
X
X/*
X * read nlist symbols, open /dev/kmem, /dev/mem, /dev/swap,
X * initialize detail environment
X * (all of these must occur after curses init)
X */
X	nlsym_read();
X	kinit(0);	/* read access only */
X	minit(0);	/* read access only */
X	sinit();
X	(void)setgid(getgid());	/* now that we have the fds open, drop egid */
X	detail_init();
X	init_uid_name_hash();	/* see det_proc.c */
X
X/*
X * start fireworks
X */
X	wmove(wscr,0,0);
X	use_cp(wscr,cpBANNER);
X	wprintw(wscr," u386mon %s  ",revision);
X	wprintw(wscr,"%s - %s %s ",utsname.nodename,
X		utsname.machine,utsname.release);
X	getyx(wscr,y,x);
X	while(x < getmaxx(wscr))
X		waddch(wscr,(chtype)' '),x++;
X	wmove(wscr,0,71);
X	waddstr(wscr,"wht@n4hgf");
X	if(plock_indicator)
X	{
X		wmove(wscr,0,38);
X		use_cp(wscr,cpMED);
X		waddstr(wscr," PLOCK ");
X		use_cp(wscr,cpBANNER);
X	}
X	wmove(wscr,CMD_TLY,0);
X	if(LINES >= 43)
X		waddstr(wscr," ESC=quit  P=long ps  p=short ps  m=main ");
X	else
X		waddstr(wscr," ESC=quit  p=ps  e=extra  m=main ");
X#ifdef M_UNIX
X	waddstr(wscr," s=sio ");
X#endif
X	if(geteuid() == 0)
X		waddstr(wscr," l=plock on  u=plock off ");
X	getyx(wscr,y,x);
X	while(x < getmaxx(wscr))
X		waddch(wscr,(chtype)' '),x++;
X	use_cp(wscr,cpLIT);
X
X/*
X * make initial kmem readings
X */
X	hz = (cptr = getenv("HZ")) ? atoi(cptr) : HZ;
X	kread((caddr_t)&maxmem,maxmemaddr,sizeof(maxmem));
X	kread((caddr_t)&nswap,nswapaddr,sizeof(nswap));
X	kread((caddr_t)&sysinfo_last,sysinfoaddr,sizeof(sysinfo_last));
X	kread((caddr_t)&minfo_last,minfoaddr,sizeof(minfo));
X	kread((caddr_t)&tune,tuneaddr,sizeof(tune));
X	kread((caddr_t)&v,vaddr,sizeof(v));
X	kread((caddr_t)&bootinfo,bootinfoaddr,sizeof(bootinfo));
X
X/*
X * initialize static display (literals)
X */
X	draw_cpuscale_literals(wscr,CPUSCALE_TLY,0);
X	draw_waitscale_literals(wscr,WAITSCALE_TLY,0);
X	draw_per_sec_literals(wscr,PER_SEC_TLY,0);
X
X	if(LINES >= 43)
X		extra_static_stuff();
X
X/*
X * while(user_not_bored) entertain_and_inform_user();
X */
X	(void)time(&then);
X	while(1)
X	{
X		nap(1000L);
X		(void)time(&now);
X		wmove(wscr,0,62);
X		use_cp(wscr,cpBANNER);
X		lt = localtime(&now);
X		wprintw(wscr,"%02d:%02d:%02d",lt->tm_hour,lt->tm_min,lt->tm_sec);
X
X		/* heuristic validity determination */
X		wmove(wscr,0,48);
X		if((now - then) > 4)
X		{
X			use_cp(wscr,cpHIGH);
X			waddstr(wscr," INVALID ");
X			invalidity += 3;
X		}
X		else if((itmp = ((now - then) > 3)) || (invalidity > 2))
X		{
X			use_cp(wscr,cpMED);
X			waddstr(wscr," INEXACT ");
X			if(itmp)
X				invalidity += 2;
X		}
X		if(invalidity && !(--invalidity))
X		{
X			use_cp(wscr,cpBANNER);
X			waddstr(wscr,"         ");
X		}
X		(void)time(&then);
X
X		kread((caddr_t)&freemem,freememaddr,sizeof(freemem));
X		kread((caddr_t)&sysinfo,sysinfoaddr,sizeof(sysinfo));
X		kread((caddr_t)&minfo,minfoaddr,sizeof(minfo));
X
X#ifdef RIGHTEOUS	/* going this way seems to get cpu+wait ticks > real time */
X		for (itmp = 0; itmp < 5; itmp++)
X			cpu_ticks[itmp] = sysidelta(cpu[itmp]);
X		for (itmp = 0; itmp < 3; itmp++)
X			wait_ticks[itmp] = sysidelta(wait[itmp]);
X#else
X		for (itmp = 0; itmp < 5; itmp++)
X		{
X			if(itmp != CPU_WAIT)
X				cpu_ticks[itmp] = sysidelta(cpu[itmp]);
X		}
X		cpu_ticks[CPU_WAIT] = 0;
X		for (itmp = 0; itmp < 3; itmp++)
X			cpu_ticks[CPU_WAIT] += (wait_ticks[itmp] = sysidelta(wait[itmp]));
X#endif
X
X		total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 1,CPUSCALE_SX,
X			CPUSCALE_WIDTH,cpu_ticks);
X
X		update_waitscale(wscr,WAITSCALE_TLY + 1,WAITSCALE_SX,
X			WAITSCALE_WIDTH,wait_ticks,total_ticks);
X
X		calc_cpu_avg(cpu_ticks);
X		calc_wait_avg(wait_ticks);
X
X		get_cpu_avg(cpu_ticks,5);
X		total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 2,CPUSCALE_SX,
X			CPUSCALE_WIDTH,cpu_ticks);
X
X		get_wait_avg(wait_ticks,5);
X		update_waitscale(wscr,WAITSCALE_TLY + 2,WAITSCALE_SX,
X			WAITSCALE_WIDTH,wait_ticks,total_ticks);
X
X		get_cpu_avg(cpu_ticks,10);
X		total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 3,CPUSCALE_SX,
X			CPUSCALE_WIDTH,cpu_ticks);
X
X		get_wait_avg(wait_ticks,10);
X		update_waitscale(wscr,WAITSCALE_TLY + 3,WAITSCALE_SX,
X			WAITSCALE_WIDTH,wait_ticks,total_ticks);
X
X
X		use_cp(wscr,cpINFO);
X		y = PER_SEC_TLY + 1;
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"bread    ","%7ld",sysidelta(bread));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"bwrite   ","%7ld",sysidelta(bwrite));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"lread    ","%7ld",sysidelta(lread));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"lwrite   ","%7ld",sysidelta(lwrite));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"swapin   ","%7ld",sysidelta(swapin));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"swapout  ","%7ld",sysidelta(swapout));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"bswapin  ","%7ld",sysidelta(bswapin));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"bswapout ","%7ld",sysidelta(bswapout));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"iget     ","%7ld",sysidelta(iget));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"namei    ","%7ld",sysidelta(namei));
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"dirblk   ","%7ld",sysidelta(dirblk));
X
X		wmove(wscr,y++,PER_SEC1_TLX);
X		if((ltmp = sysidelta(readch) - myreadcnt) < 0)
X			ltmp = 0;
X		disp_info_long(wscr,"readch   ","%7ld",ltmp);
X		myreadcnt = 0;	/* reset /dev/mem & /dev/kmem read count*/
X
X		wmove(wscr,y++,PER_SEC1_TLX);
X		disp_info_long(wscr,"writch   ","%7ld",sysidelta(writech));
X
X		y = PER_SEC_TLY + 1;
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,"rawch  ","%6ld",sysidelta(rawch));
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,"canch  ","%6ld",sysidelta(canch));
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,"outch  ","%6ld",sysidelta(outch));
X
X		y++;
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,"msg    ","%6ld",sysidelta(msg));
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,"sema   ","%6ld",sysidelta(sema));
X
X		y++;
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_static_long(wscr, "maxmem  ","%6ldk",(long)maxmem * NBPP / 1024);
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,   "frmem   ","%6ldk",(long)freemem * NBPP / 1024);
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_int (wscr,   "mem used","%6d%%",
X			100 - (int)((freemem * 100) / maxmem));
X
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_static_int(wscr, "nswap   ","%6ldk",nswap/2);
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_long(wscr,  "frswp   ","%6ldk",minfo.freeswap/2);
X		wmove(wscr,y++,PER_SEC2_TLX);
X		disp_info_int(wscr,   "swp used","%6d%%",
X			100 - (int)((minfo.freeswap * 100) / nswap));
X
X		y = PER_SEC_TLY + 1;
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"pswitch ","%5ld",sysidelta(pswitch));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"syscall ","%5ld",sysidelta(syscall));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"sysread ","%5ld",sysidelta(sysread));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"syswrit ","%5ld",sysidelta(syswrite));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"sysfork ","%5ld",sysidelta(sysfork));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"sysexec ","%5ld",sysidelta(sysexec));
X
X		y++;
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"runque  ","%5ld",sysidelta(runque));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"runocc  ","%5ld",sysidelta(runocc));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"swpque  ","%5ld",sysidelta(swpque));
X		wmove(wscr,y++,PER_SEC3_TLX);
X		disp_info_long(wscr,"swpocc  ","%5ld",sysidelta(swpocc));
X
X		y = PER_SEC_TLY + 1;
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"vfault  ","%3ld",midelta(vfault));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"demand  ","%3ld",midelta(demand));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"pfault  ","%3ld",midelta(pfault));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"cw      ","%3ld",midelta(cw));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"steal   ","%3ld",midelta(steal));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"frdpgs  ","%3ld",midelta(freedpgs));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"vfpg    ","%3ld",midelta(vfpg));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"sfpg    ","%3ld",midelta(sfpg));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"vspg    ","%3ld",midelta(vspg));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"sspg    ","%3ld",midelta(sspg));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"pnpfault","%3ld",sysidelta(pnpfault));
X		wmove(wscr,y++,PER_SEC4_TLX);
X		disp_info_long(wscr,"wrtfault","%3ld",sysidelta(wrtfault));
X
X		y = PER_SEC_TLY + 1;
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"unmodsw ","%3ld",midelta(unmodsw));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"unmodfl ","%3ld",midelta(unmodfl));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"psoutok ","%3ld",midelta(psoutok));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"psinfai ","%3ld",midelta(psinfail));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"psinok  ","%3ld",midelta(psinok));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"rsout   ","%3ld",midelta(rsout));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"rsin    ","%3ld",midelta(rsin));
X
X		y++;
X		wmove(wscr,y++,PER_SEC5_TLX);
X		use_cp(wscr,cpLIT);
X		waddstr(wscr,"pages on   ");
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"swap  ","%5ld",midelta(swap));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"cache ","%5ld",midelta(cache));
X		wmove(wscr,y++,PER_SEC5_TLX);
X		disp_info_long(wscr,"file  ","%5ld",midelta(file));
X
X		if(LINES >= 43)
X			extra_info_stuff();
X
X		sysinfo_last = sysinfo;
X		minfo_last = minfo;
X
X		detail_panel_update();
X
X		if(initial_cmd)
X		{
X			detail_panel_cmd(initial_cmd);
X			initial_cmd = 0;
X		}
X
X		pflush();
X
X		if(rdchk(0))
X		{
X			switch(cmd = wgetch(wscr))
X			{
X				case 'L' & 0x1F:		/* ^L */
X				case 'R' & 0x1F:		/* ^R */
X					touchwin(wscr);
X					if(wdet)
X						touchwin(wscr);
X					break;
X
X				case 'q':
X				case A_ESC:
X					goto GOOD_BYE;
X#ifdef M_UNIX
X				case 'b':
X					if(bootinfo.bootstrlen > 79)
X						itmp = 79;
X					else
X						itmp = bootinfo.bootstrlen;
X					kread(s80,bootinfoaddr +
X						(bootinfo.bootstr - (caddr_t)&bootinfo),itmp);
X					s80[itmp] = 0;
X					disp_msg(cpMED,s80);
X					break;
X#endif
X				case 'e':
X				case 'P':
X				case 'p':
X				case 'm':
X#ifdef M_UNIX
X				case 's':
X#endif
X					detail_panel_cmd(cmd);
X					break;
X				case 'l':
X					if(!plock_indicator)
X					{
X						if(!plock(PROCLOCK))
X						{
X							plock_indicator = 1;
X							wmove(wscr,0,38);
X							use_cp(wscr,cpMED);
X							waddstr(wscr," PLOCK ");
X						}
X					}
X					break;
X				case 'u':
X					if(plock_indicator)
X					{
X						if(!plock(UNLOCK))
X						{
X							plock_indicator = 0;
X							wmove(wscr,0,38);
X							use_cp(wscr,cpBANNER);
X							waddstr(wscr,"       ");
X						}
X					}
X					break;
X			}
X		}
X	}
X
XGOOD_BYE:
X	leave_text("",0);
X	/*NOTREACHED*/
X}	/* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of u386mon.c */
SHAR_EOF
$TOUCH -am 0627015790 u386mon.c &&
chmod 0644 u386mon.c ||
echo "restore of u386mon.c failed"
set `wc -c u386mon.c`;Wc_c=$1
if test "$Wc_c" != "28919"; then
	echo original size 28919, current size $Wc_c
fi
# ============= var.c ==============
echo "x - extracting var.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > var.c &&
X/*+-------------------------------------------------------------------------
X	var.c - u386mon var struct display
X
X  Defined functions:
X	display_var(win,y,x)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
X/*:06-25-1990-17:33-wht@n4hgf-alpha sort identifiers */
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:27-r@n4hgf-version x0.12 seems bug free */
X/*:06-17-1990-14:59-wht-creation */
X
X#define M_TERMINFO
X
X#include <curses.h>
X#include <panel.h>
X#include <sys/types.h>
X#include <sys/var.h>
X#include "u386mon.h"
X
X/*+-------------------------------------------------------------------------
X	display_var(win,y,x)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_var(win,y,x)
XWINDOW *win;
Xint y;
Xint x;
X{
X	use_cp(win,cpBANNER);
X	wmove(win,y++,x);
X	waddstr(win,"-- Var ---------");
X	wmove(win,y++,x);
X	disp_static_int(win,"v_autoup   ","%5d",v.v_autoup);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_buf      ","%5d",v.v_buf);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_clist    ","%5d",v.v_clist);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_file     ","%5d",v.v_file);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_hbuf     ","%5d",v.v_hbuf);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_inode    ","%5d",v.v_inode);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_maxpmem  ","%5d",v.v_maxpmem);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_maxup    ","%5d",v.v_maxup);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_mount    ","%5d",v.v_mount);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_pbuf     ","%5d",v.v_pbuf);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_proc     ","%5d",v.v_proc);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_region   ","%5d",v.v_region);
X	wmove(win,y++,x);
X	disp_static_int(win,"v_vhndfrac ","%5d",v.v_vhndfrac);
X
X}	/* end of display_var */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of var.c */
SHAR_EOF
$TOUCH -am 0627015790 var.c &&
chmod 0644 var.c ||
echo "restore of var.c failed"
set `wc -c var.c`;Wc_c=$1
if test "$Wc_c" != "2079"; then
	echo original size 2079, current size $Wc_c
fi
# ============= libkmem.h ==============
echo "x - extracting libkmem.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > libkmem.h &&
X/*+-----------------------------------------------------------------------
X	libkmem.h
X	...!emory!n4hgf!wht
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/*:10-28-1988-14:46-afterlint-creation */
X
X#ifndef BUILDING_LINT_ARGS
X#ifdef LINT_ARGS
X
X/* libkmem.c */
Xvoid kinit(int );
Xvoid kread(char  *,long ,int );
Xvoid kwrite(long ,char  *,int );
X
X#else		/* compiler doesn't know about prototyping */
X
X/* libkmem.c */
Xvoid kinit();
Xvoid kread();
Xvoid kwrite();
X
X#endif /* LINT_ARGS */
X#endif /* BUILDING_LINT_ARGS */
X
X/* end of libkmem.h */
SHAR_EOF
$TOUCH -am 0627015790 libkmem.h &&
chmod 0644 libkmem.h ||
echo "restore of libkmem.h failed"
set `wc -c libkmem.h`;Wc_c=$1
if test "$Wc_c" != "859"; then
	echo original size 859, current size $Wc_c
fi
# ============= libmem.h ==============
echo "x - extracting libmem.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > libmem.h &&
X/*+-----------------------------------------------------------------------
X	libmem.h
X	...!emory!n4hgf!wht
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/*:10-28-1988-14:46-afterlint-creation */
X
X#ifndef BUILDING_LINT_ARGS
X#ifdef LINT_ARGS
X
X/* libmem.c */
Xvoid minit(int );
Xvoid mread(char  *,long ,int );
Xvoid mwrite(long ,char  *,int );
X
X#else		/* compiler doesn't mnow about prototyping */
X
X/* libmem.c */
Xvoid minit();
Xvoid mread();
Xvoid mwrite();
X
X#endif /* LINT_ARGS */
X#endif /* BUILDING_LINT_ARGS */
X
X/* end of libmem.h */
SHAR_EOF
$TOUCH -am 0627015790 libmem.h &&
chmod 0644 libmem.h ||
echo "restore of libmem.h failed"
set `wc -c libmem.h`;Wc_c=$1
if test "$Wc_c" != "855"; then
	echo original size 855, current size $Wc_c
fi
# ============= libswap.h ==============
echo "x - extracting libswap.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > libswap.h &&
X/*+-----------------------------------------------------------------------
X	libswap.h
X	...!emory!n4hgf!wht
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:03-root@n4hgf-creation from libmem */
X
X#ifndef BUILDING_LINT_ARGS
X#ifdef LINT_ARGS
X
X/* libswap.c */
Xvoid sinit(void );
Xvoid sread(char  *,long ,int );
X
X#else		/* compiler doesn't mnow about prototyping */
X
X/* libswap.c */
Xvoid sinit();
Xvoid sread();
Xvoid swrite();
X
X#endif /* LINT_ARGS */
X#endif /* BUILDING_LINT_ARGS */
X
X/* end of libswap.h */
SHAR_EOF
$TOUCH -am 0627015790 libswap.h &&
chmod 0644 libswap.h ||
echo "restore of libswap.h failed"
set `wc -c libswap.h`;Wc_c=$1
if test "$Wc_c" != "780"; then
	echo original size 780, current size $Wc_c
fi
# ============= libnlsym.h ==============
echo "x - extracting libnlsym.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > libnlsym.h &&
X/*+-----------------------------------------------------------------------
X	libnlsym.h
X	...!emory!n4hgf!wht
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/*:10-28-1988-14:47-afterlint-creation */
X
X#ifndef BUILDING_LINT_ARGS
X#ifdef LINT_ARGS
X
X/* libnlsym.c */
Xvoid nlsym_error(char * );
Xvoid nlsym_read(void);
X
X#else		/* compiler doesn't know about prototyping */
X
X/* libnlsym.c */
Xvoid nlsym_error();
Xvoid nlsym_read();
X
X#endif /* LINT_ARGS */
X#endif /* BUILDING_LINT_ARGS */
X
X/* end of libnlsym.h */
SHAR_EOF
$TOUCH -am 0627015790 libnlsym.h &&
chmod 0644 libnlsym.h ||
echo "restore of libnlsym.h failed"
set `wc -c libnlsym.h`;Wc_c=$1
if test "$Wc_c" != "826"; then
	echo original size 826, current size $Wc_c
fi
# ============= lint_args.h ==============
echo "x - extracting lint_args.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > lint_args.h &&
X/*+-----------------------------------------------------------------------
X	lint_args.h
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-27-1990-02:01-afterlint-creation */
X
X#ifndef BUILDING_LINT_ARGS
X#ifdef LINT_ARGS
X
X/* bootinfo.c */
Xextern  char *bmemf_text(unsigned long flags);
Xextern  void display_bootinfo(struct _win_st *win,int y,int x);
X/* det_proc.c */
Xextern  char *get_cpu_time_str(long ticks);
Xextern  char *pgrp_to_ttyname(int pgrp);
Xextern  char *uid_to_name(int uid);
Xextern  int get_user(struct proc *tproc,struct user *tuser);
Xextern  int getpwent_and_enter(int uid);
Xextern  int proc_pid_compare(struct proc *p1,struct proc *p2);
Xextern  int uid_name_enter(int uid,char *name);
Xextern  struct utmp *find_utmp_for_pgrp(int pgrp);
Xextern  void display_proc_stat(struct _win_st *win,int iproc,int initial);
Xextern  void display_proc_stats(struct _win_st *win,int initial);
Xextern  void init_uid_name_hash(void );
Xextern  void read_and_sort_procs(int initial);
Xextern  void read_utmp(void );
X/* det_sio.c */
Xextern  char *B_to_baud_rate(int code);
Xextern  char *cflag_to_baud_d_p_s(int cflag);
Xextern  int display_sio_summary(struct _win_st *win,int initial);
Xextern  int tty_slot_compare(struct tty *sio1,struct tty *sio2);
Xextern  void display_siofull_init(struct _win_st *win,int tly,int tlx,int show_flag);
Xextern  void display_siofull_update(struct _win_st *win,int tly,int tlx,struct tty *tsio);
Xextern  void display_siosum_update(struct _win_st *win,int y,struct tty *tsio);
Xextern  void grok_sio_tty(void );
X/* detail.c */
Xextern  void detail_init(void );
Xextern  void detail_panel_cmd(unsigned long cmd);
Xextern  void detail_panel_update(void );
Xextern  void detpanel_destroy(void );
Xextern  void detpanel_extra_init(void );
Xextern  void detpanel_extra_update(void );
Xextern  void detpanel_ps_init(int full43);
Xextern  void detpanel_ps_update(void );
Xextern  void detpanel_sio_init(void );
Xextern  void detpanel_sio_update(void );
X/* disputil.c */
Xextern  struct PANEL *mkpanel(int rows,int cols,int tly,int tlx);
Xextern  void clear_area(struct _win_st *win,int y,int x,int len);
Xextern  void clear_area_char(struct _win_st *win,int y,int x,int len,unsigned char fillchar);
Xextern  void disp_info_int(struct _win_st *win,char *label,char *fmt,int value);
Xextern  void disp_info_long(struct _win_st *win,char *label,char *fmt,long value);
Xextern  void disp_msg(unsigned long cp,char *msg);
Xextern  void disp_static_int(struct _win_st *win,char *label,char *fmt,int value);
Xextern  void disp_static_long(struct _win_st *win,char *label,char *fmt,long value);
Xextern  void pflush(void );
Xextern  void wperror(struct _win_st *win,char *desc);
X/* libkmem.c */
Xextern  void kinit(int write_needed);
Xextern  void kread(char *caddr,long kaddr,int len);
X/* libmem.c */
Xextern  void minit(int write_needed);
Xextern  void mread(char *caddr,long maddr,int len);
X/* libnlsym.c */
Xextern  void nlsym_error(char *text);
Xextern  void nlsym_read(void );
X/* libswap.c */
Xextern  void sinit(void );
Xextern  void sread(char *caddr,long maddr,int len);
X/* nlsym.c */
Xextern  int main(int argc,char * *argv,char * *envp);
Xextern  void nlsym_write_error(int code);
X/* proc.c */
Xextern  char *pstat_text(char pstat);
Xextern  void display_proc(struct _win_st *win,int y,int x);
Xextern  void grok_proc(void );
X/* tune.c */
Xextern  void display_tune(struct _win_st *win,int y,int x);
X/* u386mon.c */
Xextern  char *get_elapsed_time(long elapsed_seconds);
Xextern  int get_cpu_avg(long *cpu_ticks,int period);
Xextern  int get_wait_avg(long *wait_ticks,int period);
Xextern  int main(int argc,char * *argv,char * *envp);
Xextern  long update_cpuscale(struct _win_st *win,int y,int x,int width,long *per_state);
Xextern  long update_waitscale(struct _win_st *win,int y,int x,int width,long *per_state,long total_ticks);
Xextern  void calc_cpu_avg(long *per_state);
Xextern  void calc_wait_avg(long *per_state);
Xextern  void draw_cpuscale_literals(struct _win_st *win,int y,int x);
Xextern  void draw_per_sec_literals(struct _win_st *win,int y,int x);
Xextern  void draw_waitscale_literals(struct _win_st *win,int y,int x);
Xextern  void extra_info_stuff(void );
Xextern  void extra_static_stuff(void );
Xextern  void leave(int exit_code);
Xextern  void leave_text(char *text,int exit_code);
X/* var.c */
Xextern  void display_var(struct _win_st *win,int y,int x);
X
X#else		/* compiler doesn't know about prototyping */
X
X/* bootinfo.c */
Xextern  char *bmemf_text();
Xextern  void display_bootinfo();
X/* det_proc.c */
Xextern  char *get_cpu_time_str();
Xextern  char *pgrp_to_ttyname();
Xextern  char *uid_to_name();
Xextern  int get_user();
Xextern  int getpwent_and_enter();
Xextern  int proc_pid_compare();
Xextern  int uid_name_enter();
Xextern  struct utmp *find_utmp_for_pgrp();
Xextern  void display_proc_stat();
Xextern  void display_proc_stats();
Xextern  void init_uid_name_hash();
Xextern  void read_and_sort_procs();
Xextern  void read_utmp();
X/* det_sio.c */
Xextern  char *B_to_baud_rate();
Xextern  char *cflag_to_baud_d_p_s();
Xextern  int display_sio_summary();
Xextern  int tty_slot_compare();
Xextern  void display_siofull_init();
Xextern  void display_siofull_update();
Xextern  void display_siosum_update();
Xextern  void grok_sio_tty();
X/* detail.c */
Xextern  void detail_init();
Xextern  void detail_panel_cmd();
Xextern  void detail_panel_update();
Xextern  void detpanel_destroy();
Xextern  void detpanel_extra_init();
Xextern  void detpanel_extra_update();
Xextern  void detpanel_ps_init();
Xextern  void detpanel_ps_update();
Xextern  void detpanel_sio_init();
Xextern  void detpanel_sio_update();
X/* disputil.c */
Xextern  struct PANEL *mkpanel();
Xextern  void clear_area();
Xextern  void clear_area_char();
Xextern  void disp_info_int();
Xextern  void disp_info_long();
Xextern  void disp_msg();
Xextern  void disp_static_int();
Xextern  void disp_static_long();
Xextern  void pflush();
Xextern  void wperror();
X/* libkmem.c */
Xextern  void kinit();
Xextern  void kread();
X/* libmem.c */
Xextern  void minit();
Xextern  void mread();
X/* libnlsym.c */
Xextern  void nlsym_error();
Xextern  void nlsym_read();
X/* libswap.c */
Xextern  void sinit();
Xextern  void sread();
X/* nlsym.c */
Xextern  int main();
Xextern  void nlsym_write_error();
X/* proc.c */
Xextern  char *pstat_text();
Xextern  void display_proc();
Xextern  void grok_proc();
X/* tune.c */
Xextern  void display_tune();
X/* u386mon.c */
Xextern  char *get_elapsed_time();
Xextern  int get_cpu_avg();
Xextern  int get_wait_avg();
Xextern  int main();
Xextern  long update_cpuscale();
Xextern  long update_waitscale();
Xextern  void calc_cpu_avg();
Xextern  void calc_wait_avg();
Xextern  void draw_cpuscale_literals();
Xextern  void draw_per_sec_literals();
Xextern  void draw_waitscale_literals();
Xextern  void extra_info_stuff();
Xextern  void extra_static_stuff();
Xextern  void leave();
Xextern  void leave_text();
X/* var.c */
Xextern  void display_var();
X
X#endif /* LINT_ARGS */
X#endif /* BUILDING_LINT_ARGS */
X
X/* end of lint_args.h */
SHAR_EOF
$TOUCH -am 0627020190 lint_args.h &&
chmod 0644 lint_args.h ||
echo "restore of lint_args.h failed"
set `wc -c lint_args.h`;Wc_c=$1
if test "$Wc_c" != "6985"; then
	echo original size 6985, current size $Wc_c
fi
# ============= nlsym.h ==============
echo "x - extracting nlsym.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > nlsym.h &&
X/*+-------------------------------------------------------------------------
X	nlsym.h -- utility nlist - fast access to kernel /dev/kmem offsets
X	...!emory!n4hgf!wht
X
XThe nlsym file contains three records:
X1.  struct stat unixstat - stat buffer from /unix at file creation time
X2.  struct nlist nlsym - the structure of nlist'd information
X3.  long unique - a unique identifier to help ensure correct nlsym length
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:07-wht-creation */
X
X#define UNIX_KERNEL		"/unix"
X#define UNIX_NLSYM		"/unix.nlsym"
X#define NLSYM_UNIQUE1	0x1BADD00DL
X#define NLSYM_UNIQUE2	0xDEADB1FFL
X
X#define Nindex_AVAILRMEM            0
X#define Nindex_AVAILSMEM            1
X#define Nindex_BDEVCNT              2
X#define Nindex_BDEVSW               3
X#define Nindex_BOOTINFO             4
X#define Nindex_CDEVCNT              5
X#define Nindex_CDEVSW               6
X#define Nindex_CFREE                7
X#define Nindex_CFREECNT             8
X#define Nindex_CFREELIST            9
X#define Nindex_CONSSW              10
X#define Nindex_CURPROC             11
X#define Nindex_DINFO               12
X#define Nindex_DSTFLAG             13
X#define Nindex_DUMPDEV             14
X#define Nindex_EMAP                15
X#define Nindex_FFREELIST           16
X#define Nindex_FILE                17
X#define Nindex_FMODCNT             18
X#define Nindex_FMODSW              19
X#define Nindex_FREEMEM             20
X#define Nindex_FSINFO              21
X#define Nindex_FSTYPSW             22
X#define Nindex_HZ                  23
X#define Nindex_IDLESERVER          24
X#define Nindex_IFREELIST           25
X#define Nindex_INODE               26
X#define Nindex_KPTBL               27
X#define Nindex_LBOLT               28
X#define Nindex_LINECNT             29
X#define Nindex_LINESW              30
X#define Nindex_MAXCLICK            31
X#define Nindex_MAXMEM              32
X#define Nindex_MINFO               33
X#define Nindex_MOUNT               34
X#define Nindex_MSGLISTCNT          35
X#define Nindex_NFSTYP              36
X#define Nindex_NPTALLOCED          37
X#define Nindex_NPTFREE             38
X#define Nindex_NSERVERS            39
X#define Nindex_NSWAP               40
X#define Nindex_NSYSENT             41
X#define Nindex_OLDPROC             42
X#define Nindex_OLD_CURPROC         43
X#define Nindex_PANICSTR            44
X#define Nindex_PHYSMEM             45
X#define Nindex_PIPEDEV             46
X#define Nindex_PROC                47
X#define Nindex_RCINFO              48
X#define Nindex_ROOTDEV             49
X#define Nindex_RUNQ                50
X#define Nindex_SHLBINFO            51
X#define Nindex_SWAPDEV             52
X#define Nindex_SWPLO               53
X#define Nindex_SYSERR              54
X#define Nindex_SYSINFO             55
X#define Nindex_SYSSEGS             56
X#define Nindex_SYSWAIT             57
X#define Nindex_TIME                58
X#define Nindex_TIMEZONE            59
X#define Nindex_TTHIWAT             60
X#define Nindex_TTLOWAT             61
X#define Nindex_TUNE                62
X#define Nindex_U                   63
X#define Nindex_USERTABLE           64
X#define Nindex_V                   65
X#define Nindex_WIN_UBLK            66
X#ifdef M_UNIX
X#define Nindex_SIO_TTY             67
X#endif
X
X#define bootinfoaddr (nlsym[Nindex_BOOTINFO].n_value)
X#define freememaddr (nlsym[Nindex_FREEMEM].n_value)
X#define lboltaddr (nlsym[Nindex_LBOLT].n_value)
X#define maxmemaddr (nlsym[Nindex_MAXMEM].n_value)
X#define minfoaddr (nlsym[Nindex_MINFO].n_value)
X#define nswapaddr (nlsym[Nindex_NSWAP].n_value)
X#define physmemaddr (nlsym[Nindex_PHYSMEM].n_value)
X#define procaddr (nlsym[Nindex_PROC].n_value)
X#define sysinfoaddr (nlsym[Nindex_SYSINFO].n_value)
X#define tuneaddr (nlsym[Nindex_TUNE].n_value)
X#define vaddr (nlsym[Nindex_V].n_value)
X#ifdef M_UNIX
X#define sio_ttyaddr (nlsym[Nindex_SIO_TTY].n_value)
X#endif
X
X#ifdef DEFINE_NLSYM
Xstruct nlist nlsym[] =
X{
X	{ "availrmem" },
X	{ "availsmem" },
X	{ "bdevcnt" },
X	{ "bdevsw" },
X	{ "bootinfo" },
X	{ "cdevcnt" },
X	{ "cdevsw" },
X	{ "cfree" },
X	{ "cfreecnt" },
X	{ "cfreelist" },
X	{ "conssw" },
X	{ "curproc" },
X	{ "dinfo" },
X	{ "Dstflag" },
X	{ "dumpdev" },
X	{ "emap" },
X	{ "ffreelist" },
X	{ "file" },
X	{ "fmodcnt" },
X	{ "fmodsw" },
X	{ "freemem" },
X	{ "fsinfo" },
X	{ "fstypsw" },
X	{ "Hz" },
X	{ "idleserver" },
X	{ "ifreelist" },
X	{ "inode" },
X	{ "kptbl" },
X	{ "lbolt" },
X	{ "linecnt" },
X	{ "linesw" },
X	{ "maxclick" },
X	{ "maxmem" },
X	{ "minfo" },
X	{ "mount" },
X	{ "msglistcnt" },
X	{ "nfstyp" },
X	{ "nptalloced" },
X	{ "nptfree" },
X	{ "nservers" },
X	{ "nswap" },
X	{ "nsysent" },
X	{ "oldproc" },
X	{ "old_curproc" },
X	{ "panicstr" },
X	{ "physmem" },
X	{ "pipedev" },
X	{ "proc" },
X	{ "rcinfo" },
X	{ "rootdev" },
X	{ "runq" },
X	{ "shlbinfo" },
X	{ "swapdev" },
X	{ "swplo" },
X	{ "syserr" },
X	{ "sysinfo" },
X	{ "syssegs" },
X	{ "syswait" },
X	{ "time" },
X	{ "Timezone" },
X	{ "tthiwat" },
X	{ "ttlowat" },
X	{ "tune" },
X	{ "u" },
X	{ "usertable" },
X	{ "v" },
X	{ "win_ublk" },
X#ifdef M_UNIX
X	{ "sio_tty" },
X#endif
X	{ (char *)0 }
X};
X#else
Xextern struct nlist nlsym[];
X#endif
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
$TOUCH -am 0627015790 nlsym.h &&
chmod 0644 nlsym.h ||
echo "restore of nlsym.h failed"
set `wc -c nlsym.h`;Wc_c=$1
if test "$Wc_c" != "5457"; then
	echo original size 5457, current size $Wc_c
fi
echo "End of part 3, continue with part 4"
exit 0