[comp.sources.misc] v14i059: u386mon 2.20-S5R3 system monitor

wht@gatech.edu@n4hgf.UUCP (Warren Tucker) (08/17/90)

Posting-number: Volume 14, Issue 59
Submitted-by: wht@gatech.edu@n4hgf.UUCP (Warren Tucker)
Archive-name: u386mon-2.20/part06

#!/bin/sh
# This is part 06 of u386mon.2.20
if touch 2>&1 | fgrep 'amc' > /dev/null
 then TOUCH=touch
 else TOUCH=true
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/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.sysware.dk S5R31 updates */
X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
X/*:07-21-1990-16: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(unsigned short uid);
Xextern  int det_proc_init(void );
Xextern  int get_user(struct proc *tproc,struct user *tuser);
Xextern  int getpwent_and_enter(unsigned short uid);
Xextern  int ppproc_pid_compare(struct proc * *ppp1,struct proc * *ppp2);
Xextern  int uid_name_enter(unsigned short 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  PANEL *mkpanel(int rows,int cols,int tly,int tlx,char *userp);
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 caught_signal(int sig);
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);
Xextern  void leaving(void );
Xextern  void read_sysinfo_and_minfo(void );
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 det_proc_init();
Xextern  int get_user();
Xextern  int getpwent_and_enter();
Xextern  int ppproc_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  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 caught_signal();
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();
Xextern  void leaving();
Xextern  void read_sysinfo_and_minfo();
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 0810141890 lint_args.h &&
chmod 0644 lint_args.h ||
echo "restore of lint_args.h failed"
Wc_c="`wc -c < lint_args.h`"
test 7561 -eq "$Wc_c" ||
	echo lint_args.h: original size 7561, current size $Wc_c
# ============= 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	...!{gatech,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/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.sysware.dk S5R31 updates */
X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
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#if defined(HAS_BOOTINFO)
X#define Nindex_BOOTINFO             4
X#else
X#endif
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#define Nindex_REGION              67
X#ifdef M_UNIX
X#define Nindex_SIO_TTY             68
X#endif
X
X#if defined(HAS_BOOTINFO)
X#define bootinfoaddr (nlsym[Nindex_BOOTINFO].n_value)
X#endif
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 regionaddr (nlsym[Nindex_REGION].n_regionalue)
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#if defined(HAS_BOOTINFO)
X	{ "bootinfo" },
X#else
X	{ "spl" },	/*
X				 * dummy argument: unique text symbol present in all
X				 * implimenations (function name helps ensure uniqueness
X				 * since we don't "do" text)
X				 */
X#endif
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	{ "region" },
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 0810141890 nlsym.h &&
chmod 0644 nlsym.h ||
echo "restore of nlsym.h failed"
Wc_c="`wc -c < nlsym.h`"
test 6124 -eq "$Wc_c" ||
	echo nlsym.h: original size 6124, current size $Wc_c
# ============= u386mon.h ==============
echo "x - extracting u386mon.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > u386mon.h &&
X/*+-------------------------------------------------------------------------
X	u386mon.h - UNIX 386 system monitor definitions
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.sysware.dk S5R31 updates */
X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
X/*:07-10-1990-19:06-root@n4hgf-redesign attributes/color pairs */
X/*:07-10-1990-18:33-root@n4hgf-move pio wait to medium alert */
X/*:07-03-1990-03:21-root@n4hgf-add cpBANWARN and renumber */
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:27-r@n4hgf-version x0.12 seems bug free */
X/*:06-20-1990-03:03-root@n4hgf-trick use_cp into making bright fgnd colors */
X/*:06-19-1990-21:35-wht-get ready for release */
X
X#ifndef M_SYSV	/* for ISC */
X#define u_char unsigned char
X#define u_long unsigned long
X#endif
X
Xchar *getenv();
Xchar *strchr();
Xchar *strrchr();
X#ifdef __STDC__
Xvoid *malloc();
X#else
Xchar *malloc();
X#endif
X
X#define pW(pan) panel_window(pan)
X#define W WINDOW
X#define P PANEL
X
X/* color numbers for EGA/VGA */
X#ifdef COLOR_16_TERMINFO	/* wht 16-color fgnd/bgnd terminfo */
X#define cHIBIT	8
X#define cBLK	0
X#define cBLU	1
X#define cGRN	2
X#define cCYN	3
X#define cRED	4
X#define cMAG	5
X#define cBRN	6
X#define cWHT	7
X#define cGRY	(cBLK | cHIBIT)
X#define cLTB	(cBLU | cHIBIT)
X#define cLTG	(cGRN | cHIBIT)
X#define cLTC	(cCYN | cHIBIT)
X#define cLTR	(cRED | cHIBIT)
X#define cLTM	(cMAG | cHIBIT)
X#define cYEL	(cBRN | cHIBIT)
X#define cHIW	(cWHT | cHIBIT)
X#else
X#ifdef	COLOR_BLACK
X#define cBLK	COLOR_BLACK
X#define cBLU	COLOR_BLUE
X#define cGRN	COLOR_GREEN
X#define cCYN	COLOR_CYAN
X#define cRED	COLOR_RED
X#define cMAG	COLOR_MAGENTA
X#define cBRN	COLOR_YELLOW
X#define cWHT	COLOR_WHITE
X#define cGRY	COLOR_BLACK
X#define cLTB	COLOR_BLUE
X#define cLTG	COLOR_GREEN
X#define cLTC	COLOR_CYAN
X#define cLTR	COLOR_RED
X#define cLTM	COLOR_MAGENTA
X#define cYEL	COLOR_YELLOW
X#define cHIW	COLOR_WHITE
X#endif
X#endif
X
X#define sTL		0xDA
X#define sTR		0xBF
X#define sBL		0xC0
X#define sBR		0xD9
X#define sLT		0xC3	/* left hand T */
X#define sRT		0xB4	/* right hand T */
X#define sVR		0xB3	/* vertical rule */
X#define sHR		0xC4	/* horizontal rule */
X
X/* color pairs */
X#ifdef COLOR_16_TERMINFO	/* wht 16-color fgnd/bgnd terminfo */
X#define use_cp(win,cp) wattrset(win,COLOR_PAIR(cp))
X#else
X#ifdef COLOR_PAIR
X#define use_cp(win,cp) wattrset(win,\
X	(color_avail) ? color_attr[cp] : mono_attr[cp])
X#else
X#define use_cp(win,cp) wattrset(win,mono_attr[cp])
X#endif
X#endif
X
X/*
X * for SVR31
X */
X#ifndef getcury
X#define getcury(win)        ((win)->_cury)
X#endif
X#ifndef getcurx
X#define getcurx(win)        ((win)->_curx)
X#endif
X#ifndef getbegy
X#define getbegy(win)        ((win)->_begy)
X#endif
X#ifndef getbegx
X#define getbegx(win)        ((win)->_begx)
X#endif
X#ifndef getbegyx
X#define getbegyx(win,y,x)   ((y)=getbegy(win),(x)=getbegx(win))
X#endif
X#ifndef getmaxy
X#define getmaxy(win)        ((win)->_maxy)
X#endif
X#ifndef getmaxx
X#define getmaxx(win)        ((win)->_maxx)
X#endif
X#ifndef getmaxyx
X#define getmaxyx(win,y,x)   ((y)=getmaxy(win),(x)=getmaxx(win))
X#endif
X
X/* 
X * if color par numbers are changed, disputil.c
X * color_attr and mono_attr tables
X * must also be changed
X */
X
X#define cpINFO		1	/* information field */
X#define cpREVERSE	2	/* "reverse video" */
X#define cpBANWARN	3	/* banner warning */
X#define cpLOW		4	/* low/user/io */
X#define cpMED		5	/* medium/kernel/pio */
X#define cpHIGH		6	/* high/brk/swp */
X#define cpBANNER	7	/* banner */
X#define cpLIT		8	/* field literals */
Xextern int color_avail;
X#ifdef COLOR_PAIR
Xextern long color_attr[];
X#endif
Xextern long mono_attr[];
X
X#define MSG_TLY		(LINES - 2)
X#define CMD_TLY		(LINES - 1)
X#define LVMSG_Y		MSG_TLY
X#define LVMSG_X		0
X
X#define CPUSCALE_TLY		1
X#define CPUSCALE_SX			13
X#define CPUSCALE_WIDTH		50
X
X#define WAITSCALE_TLY		5
X#define WAITSCALE_SX		13
X#define WAITSCALE_WIDTH		50
X
X/* Sysinfo/Minfo per second area */
X#define PER_SEC_TLY			9
X#define PER_SEC1_TLX		0
X#define PER_SEC2_TLX		18
X#define PER_SEC3_TLX		35
X#define PER_SEC4_TLX		51
X#define PER_SEC5_TLX		66
X
X/* extra info area */
X#define EXTRA_TLY			26
X#define EXTRA1_TLX			0
X#define EXTRA2_TLX			18
X#define EXTRA3_TLX			43
X#define EXTRA4_TLX			62
X
X#include "lint_args.h"
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of u386mon.h */
SHAR_EOF
$TOUCH -am 0810141890 u386mon.h &&
chmod 0644 u386mon.h ||
echo "restore of u386mon.h failed"
Wc_c="`wc -c < u386mon.h`"
test 4612 -eq "$Wc_c" ||
	echo u386mon.h: original size 4612, current size $Wc_c
# ============= renice/Makefile ==============
if test ! -d 'renice'; then
    echo "x - creating directory renice"
    mkdir 'renice'
fi
echo "x - extracting renice/Makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > renice/Makefile &&
X#  CHK=0xD897
X#+-------------------------------------------------------------------
X#  Makefile for renice for SCO UNIX V/386
X#  ...!emory!n4hgf!wht
X#--------------------------------------------------------------------
X#+:EDITS:*/
X#:06-25-1990-04:14-wht@n4hgf-1.03-better error handling
X#:06-21-1990-14:27-r@n4hgf-version x0.12 seems bug free
X#:06-19-1990-21:37-wht@n4hgf-get ready for 0.08 release
X
X#------------> CFLAGS 
XCFLAGS = -c -Octl -DLINT_ARGS
X#CFLAGS = -c -O
X
X#------------> BINDIR
XBINDIR = /usr/local/bin
X
X#LDFLAGS = -s
X
X
X#handle Sys V make "feature" of using SHELL
XSHELL = /bin/sh
X
X#FCRC = fcrc -u $*.c ;
X.c.o:;	$(FCRC) $(CC) $(CFLAGS) $*.c 
X
XSRC = \
X	renice.c
X
XRENICE_OBJ =\
X	renice.o\
X	../libnlsym.o\
X	libkmem-w.o
X
Xall: renice
X
X#must run as root
Xinstall: all
X	mv renice $(BINDIR)
X	chmod 4711 $(BINDIR)/renice
X	chown root $(BINDIR)/renice
X	@echo ' ';echo 'csh users rehash before executing'
X
Xrenice: $(RENICE_OBJ)
X	$(CC) $(LDFLAGS) -o $@ $(RENICE_OBJ) $(LIB)
X
Xlibkmem-w.o: ../libkmem.c
X	cc $(CFLAGS) -I .. -DKWRITE_NEEDED ../libkmem.c; mv libkmem.o libkmem-w.o
X
X../libnlsym.o: ../libnlsym.c
X	cd ..;make libnlsym.o
X
Xclean:
X	rm -f renice.o libkmem-w.o core 
X
Xclobber: clean
X	rm -f renice
X
SHAR_EOF
$TOUCH -am 0715025190 renice/Makefile &&
chmod 0644 renice/Makefile ||
echo "restore of renice/Makefile failed"
Wc_c="`wc -c < renice/Makefile`"
test 1200 -eq "$Wc_c" ||
	echo renice/Makefile: original size 1200, current size $Wc_c
# ============= renice/renice.c ==============
echo "x - extracting renice/renice.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > renice/renice.c &&
X/* CHK=0xE998 */
X/*+-------------------------------------------------------------------------
X	renice.c - UNIX 386 renice
X
X * This program was written by me, Mike "Ford" Ditto, and
X * I hereby release it into the public domain in the interest
X * of promoting the development of free, quality software
X * for the hackers and users of the world.
X *
X * Feel free to use, copy, modify, improve, and redistribute
X * this program, but keep in mind the spirit of this
X * contribution; always provide source, and always allow
X * free redistribution (shareware is fine with me).  If
X * you use a significant part of this code in a program of
X * yours, I would appreciate being given the appropriate
X * amount of credit.
X *				-=] Ford [=-
X *
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:06-26-1990-15:09-wht@n4hgf-adapt Ford's work to UNIX 386 */
X
X#include <stdio.h>
X#include <errno.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
Xstruct var v;
Xstruct proc tproc;
Xint myuid;
Xchar *progname;
Xchar s128[128];
Xint myreadcnt = 0;			/* see libkmem.c, libmem.c, libswap.c */
Xdaddr_t myreadlen = 0;
X
X/*+-------------------------------------------------------------------------
X	leave_text(text,exit_code)
XIf exit_code == 255, do perror
X--------------------------------------------------------------------------*/
Xvoid
Xleave_text(text,exit_code)
Xchar *text;
Xint exit_code;
X{
X	if(exit_code == 255)
X		perror(text);
X	else
X	{
X		fputs(text,stderr);
X		fputs("\n",stderr);
X	}
X	exit(exit_code);
X}	/* end of leave_text */
X
X/*+-------------------------------------------------------------------------
X	renice(pid,value,relative) - change nice of process `pid'
Xbased on 'value' and 'relative'
X--------------------------------------------------------------------------*/
Xrenice(pid,value,relative)
Xint pid;
Xint value;
Xint relative;
X{
X	register i;
X	int tmpnice;
X
X	for(i = 0; i < v.v_proc; i++)
X	{
X		kread((caddr_t)&tproc,(daddr_t)((struct proc *)procaddr + i),
X		    sizeof(struct proc));
X		if(tproc.p_pid == pid)
X		{
X#ifdef DEBUG
X			fprintf(stderr,"Found it!  proc[%d], p_uid is %d\n",
X			    i,tproc.p_uid);
X
X			fprintf(stderr,"Old p_nice was %d\n",tproc.p_nice);
X#endif /* DEBUG */
X
X			tmpnice = tproc.p_nice;
X
X			if(relative)
X				tmpnice += value;
X			else
X				tmpnice = value;
X
X			if(tmpnice >= 40)
X				tmpnice = 40;
X			if(tmpnice < 0)
X				tmpnice = 0;
X
X#ifdef DEBUG
X			fprintf(stderr,"New p_nice is %d\n",tmpnice);
X#endif /* DEBUG */
X
X			if( 
X#ifdef WHT
X				(myuid && (myuid != 201))
X#else
X				myuid
X#endif
X			 	&& ((myuid != tproc.p_uid) || (tmpnice < tproc.p_nice)))
X			{
X				errno = EACCES;
X				sprintf(s128,"%s: can't renice process %d",progname,pid);
X				perror(s128);
X				return 1;
X			}
X
X			tproc.p_nice = tmpnice;
X
X			kwrite((daddr_t)&((struct proc *)procaddr)[i]
X			    + ( ((caddr_t)&tproc.p_nice) - (caddr_t)&tproc ),
X			    (caddr_t)&tproc.p_nice,sizeof(tproc.p_nice));
X			return(0);
X		}
X	}
X	fprintf(stderr,"%s: process %d not found.\n",progname,pid);
X
X	return(1);
X}	/* end of renice */
X
X/*+-------------------------------------------------------------------------
X	usage()
X--------------------------------------------------------------------------*/
Xvoid
Xusage()
X{
X    fprintf(stderr,"usage: %s [{+-}inc] [=prio] pid ...\n",progname);
X    exit(-1);
X}	/* end of usage */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv)
X--------------------------------------------------------------------------*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X	int status=0;
X	int pid;
X	int relative = 1;
X	int value = 0;
X
X	progname = *argv;
X	if(argc < 2)
X		usage();
X
X	myuid = getuid();
X	nlsym_read();
X	kinit(1);
X	kread((caddr_t)&v,vaddr,sizeof(v));
X
X	while(++argv,--argc)
X	{
X		switch(**argv)
X		{
X		case '-':
X			if(sscanf(*argv+1,"%d",&value) != 1)
X				usage();
X			relative = 1;
X			break;
X		case '+':
X			if(sscanf(*argv+1,"%d",&value) != 1)
X				usage();
X			value = -value;
X			relative = 1;
X			break;
X		case '=':
X			if(sscanf(*argv+1,"%d",&value) != 1)
X				usage();
X			relative = 0;
X			break;
X		default:
X			if(sscanf(*argv,"%d",&pid) != 1)
X				usage();
X			status += renice(pid,value,relative);
X		}
X	}
X
X	exit(status);
X}	/* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of renice.c */
SHAR_EOF
$TOUCH -am 0803053890 renice/renice.c &&
chmod 0644 renice/renice.c ||
echo "restore of renice/renice.c failed"
Wc_c="`wc -c < renice/renice.c`"
test 4465 -eq "$Wc_c" ||
	echo renice/renice.c: original size 4465, current size $Wc_c
# ============= panel/README ==============
if test ! -d 'panel'; then
    echo "x - creating directory panel"
    mkdir 'panel'
fi
echo "x - extracting panel/README (Text)"
sed 's/^X//' << 'SHAR_EOF' > panel/README &&
XLIBPANEL 1.2 README - last revised Wed Jul 25 01:07:33 EDT 1990
X
XThis is a public domain implementation of the S5R3 terminfo
Xcurses panels layer.  It was written primarily to assist in
Xporting u386mon 2.0 (comp.sources.misc v14i001-4) to systems
Xlacking panels support.  It meets those needs and may be
Xuseful in other applications.  u386mon 2.10 and beyond use
Xthe package.
X
XFUNCTIONALITY
X-------------
X
XPanels are terminfo curses(3) windows with the added feature of depth.
XPanel functions allow the use of stacked windows and ensure the proper
Xportions of each window and the curses stdscr window are hidden or
Xdisplayed when panels are added, moved, modified or removed.  The set
Xof currently visible panels is the stack of panels.  Stdscr beneath
Xall panels, and is not considered part of the stack.
X
XA window is associated with every panel.  The panel routines enable
Xyou to create, move, hides, and show panels, as well as position a
Xpanel at an appropriate position in the stack.
X
XPanel routines are a functional layer added to terminfo curses(3),
Xmake only high-level curses calls, and work anywhere terminfo curses
Xdoes.
X
XCOMPATIBILITY
X-------------
X
XReasonable care has been taken to ensure compatibility with the native
Xpanel facility introducted with S5R3.2.  The PANEL data structures are
Xmerely similar.  The programmer is cautioned not to directly use
X'PANEL' fields.
X
XThe functions show_panel() and top_panel() are identical in thes
Ximplementation, and work equally well with displayed or hidden panels.
XIn the native implementation, show_panel() is intended for making a
Xhidden panel visible (at the top of the stack) and top_panel() is
Xintended for making an already-visible panel move to the top of the
Xstack.  You are cautioned to use the correct function to ensure
Xcompatibility with native panel libraries.
X
XUSE
X---
X
XTo make this panels implementation work for you, install
Xpanel.h in /usr/include or modify each of your panel-using
Xsources in a fashion similar to:
X
Xold:
X#include <curses.h>
X#include <panel.h>
X
Xnew:
X#include <curses.h>
X#ifdef NATIVE_PANELS
X#include <panel.h>
X#else
X#include "panel.h"
X#endif
X
XInclude libpanel.o in your link line and panel away.
X
XCOMPILE TIME SWITCHES
X---------------------
X__STDC__ is used to detect nouveau compilers.  Depending on who/where
Xyou are, on what day of the week, The Great Programmer help you.
XI only use it to satisfy lint that malloc is a good function to use.
X
XLINT_ARGS causes a Microsoft 5.1 flavor of function prototypes to
Xbe used.
X
XNATIVE_PANELS is detected by panel.h.  If NATIVE_PANELS *is* defined,
Xthen an error is emited to keep you from using the wrong panel.h.
X
XTESTING
X-------
X
XA rudimentary test program, PTEST, is supplied.  It requires
Xthe nap() system call.  If You do not have nap, add -DNONAP
Xto your CFLAGS line.
X
X
XComments are appreciated, especially bug fixes and information
Xhelping to port the module to another system.
X
XNO FSF, LPF, FOO or LSD -- just free.
X
XWarren Tucker N4HGF
X{gatech,emory}!n4hgf!wht -or- wht@n4hgf.Mt-Park.GA.US
SHAR_EOF
$TOUCH -am 0728184490 panel/README &&
chmod 0644 panel/README ||
echo "restore of panel/README failed"
Wc_c="`wc -c < panel/README`"
test 3033 -eq "$Wc_c" ||
	echo panel/README: original size 3033, current size $Wc_c
# ============= panel/panel.3 ==============
echo "x - extracting panel/panel.3 (Text)"
sed 's/^X//' << 'SHAR_EOF' > panel/panel.3 &&
X.\" @(#)panel.3	1.1 7/23/90
X.TH PANEL 3 "23 July 1990" "wht@n4hgf"
X.SH NAME
Xpanel - surrogate PANEL library routines
X.SH SYNTAX
X.B "include "panel.h"
X
X.B "cc [flags] sourcefiles libpanel.[co] -lcurses -[otherlibs]
X
X.B "PANEL *new_panel(win);"
X.br
XWINDOW *win;
X
X.B "int bottom_panel(pan);"
X.br
XPANEL *pan;
X
X.B "int top_panel(pan);"
X.br
XPANEL *pan;
X
X.B "int show_panel(pan);"
X.br
XPANEL *pan;
X
X.B "void update_panels();"
X
X.B "int hide_panel(pan);"
X.br
XPANEL *pan;
X
X.B "WINDOW *panel_window(pan);"
X.br
XPANEL *pan;
X
X.B "int replace_panel(pan,window);"
X.br
XPANEL *pan;
X.br
XWINDOW *window;
X
X.B "int move_panel(pan,starty,startx);"
X.br
XPANEL *pan;
X.br
Xint starty;
X.br
Xint startx;
X
X.B "int panel_hidden(pan);"
X.br
XPANEL *pan;
X
X.B "PANEL *panel_above(pan);"
X.br
XPANEL *pan;
X
X.B "PANEL *panel_below(pan);"
X.br
XPANEL *pan;
X
X.B "int set_panel_userptr(pan,ptr);"
X.br
XPANEL *pan;
X.br
Xchar *ptr;
X
X.B "char *panel_userptr(pan);"
X.br
XPANEL *pan;
X
X.B "int del_panel(pan);"
X.br
XPANEL *pan;
X
X.SH DESCRIPTION
XPanels are terminfo curses(3) windows with the added feature of
Xdepth.  Panel functions allow the use of stacked windows and
Xensure the proper portions of each window and the curses stdscr
Xwindow are hidden or displayed when panels are added, moved,
Xmodified or removed.  The set of currently visible panels is the
Xstack of panels.  Stdscr beneath all panels, and is not
Xconsidered part of the stack.
X
XA window is associated with every panel.  The panel routines
Xenable you to create, move, hides, and show panels, as well as
Xposition a panel at an appropriate position in the stack.
X
XPanel routines are a functional layer added to terminfo curses(3), make
Xonly high-level curses calls, and work anywhere terminfo curses does.
X
X.SH FUNCTIONS
X.B "new_panel(win)"
Xallocates a 'PANEL',
Xassovciates it with win,
Xplaces the panel on the top of the stack (causes it to be dispalyed
Xabove any other panel) and
Xreturns a pointer to the new panel.
X
X.B "void update_panels()"
Xrefreshes the virtual screen to reflect the relations between the
Xpanels in the stack, but does not call doupdate() to refresh the
Xphysical screen.  Use this function and not wrefresh or wnoutrefresh.
Xupdate_panels() may be called more than once before a call to
Xdoupdate(), but doupdate() is the function responsible for
Xupdating the physical screen.
X.br
Xe.g.,
X.br
Xupdate_panels();   /* panel(3) call */
X.br
Xdoupdate();        /* curses(3) call */
X
X.B "del_panel(pan)"
Xremoves pan from the stack,
Xdeletes the 'PANEL', but not its associated window.
X
X.B "hide_panel(pan)"
Xremoves the panel from the panel stack and thus hides it
Xfrom view.  The 'PANEL' is not lost, merely removed
Xfrom the stack.
X
X.B "show_panel(pan)"
Xmakes a hidden panel visible by placing it on top of
Xthe panels in the panel stack.
XSee COMPATIBILITY below.
X
X.B "top_panel(pan)"
Xputs the given visible panel on top of all panels in the stack.
XSee COMPATIBILITY below.
X
X.B "bottom_panel(pan)"
Xputs panel at the bottom of all panels.
X
X.B "move_panel(pan,starty,startx)"
Xmoves the given panel window so that
Xits upper-left corner is at starty, startx.  
XIt does not change the position of the panel in the stack.
XBe sure to use this function, not mvwin(), to move a panel window.
X
X.B "replace_panel(pan,window)"
Xreplaces the current window of panel with window.
XIt does not change the position of the panel in the stack.
X
X.B "panel_above(pan)"
Xreturns a pointer to the panel above pan.  If
Xthe panel argument is (PANEL *)0, it returns a pointer to the
Xbottom panel in the stack.
X
X.B "panel_below(pan)"
Xreturns a pointer to the panel just below pan.
XIf the panel argument is (PANEL *)0,
Xit returns a pointer to the top panel in the stack.
X
X.B "set_panel_userptr(pan,ptr)"
Xsets the panel's user pointer.
X
X.B "panel_userptr(pan)"
Xreturns the user pointer for a given panel.
X
X.B "panel_window(pan)"
Xreturns a pointer to the window of panel.
X
X.SH DIAGNOSTICS
XEach routine that returns a pointer returns NULL if an error
Xoccurs.  Each routine that returns an int value returns OK if it
Xexecutes successfully and ERR if not.
X
X.SH COMPATIBILITY
XReasonable care has been taken to ensure compatibility with
Xthe native panel facility introducted with S5R3.2.  The PANEL
Xdata structures are merely  similar.  The programmer
Xis cautioned not to directly use 'PANEL' fields.
X
XThe functions show_panel() and top_panel() are identical
Xin thes implementation, and work equally well with
Xdisplayed or hidden panels.
XIn the native implementation,
Xshow_panel() is intended for making a hidden panel visible
X(at the top of the stack) and top_panel() is intended for
Xmaking an already-visible panel move to the top of the stack.
XYou are cautioned to use the correct function to ensure
Xcompatibility with native panel libraries.
X
X.SH FILES
Xpanel.h
X.br
Xlibpanel.c
X
X.SH "SEE ALSO"
Xcurses(3)
X
X.SH "AUTHOR"
Xwht@n4hgf.Mt-Park.GA.US ({emory,gatech}!n4hgf!wht), primarily
Xto assist in porting u386mon to systems without a native
Xpanels library.
SHAR_EOF
$TOUCH -am 0723153290 panel/panel.3 &&
chmod 0644 panel/panel.3 ||
echo "restore of panel/panel.3 failed"
Wc_c="`wc -c < panel/panel.3`"
test 4935 -eq "$Wc_c" ||
	echo panel/panel.3: original size 4935, current size $Wc_c
# ============= panel/ptest.c ==============
echo "x - extracting panel/ptest.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > panel/ptest.c &&
X/*+-------------------------------------------------------------------------
X	ptest.c
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-24-1990-23:20-wht@n4hgf-move debug code to libpanel.c */
X/*:07-20-1990-18:28-wht-creation */
X
X#define M_TERMINFO
X#include <curses.h>
X#include "libpanel.h"
X
XPANEL *p1;
XPANEL *p2;
XPANEL *p3;
XPANEL *p4;
XPANEL *p5;
XWINDOW *w1;
XWINDOW *w2;
XWINDOW *w3;
XWINDOW *w4;
XWINDOW *w5;
X
Xlong nap_msec = 500L;
X
Xchar *mod[] = 
X{
X	"test ",
X	"TEST ",
X	"(**) ",
X	"*()* ",
X	"<--> ",
X	"LAST "
X};
X
X/*+-------------------------------------------------------------------------
X	wait_a_while(msec)
X--------------------------------------------------------------------------*/
Xvoid
Xwait_a_while(msec)
Xlong msec;
X{
X#ifdef NONAP
X	if(nap_msec == 1)
X		getchar();
X	else if(msec > 1000L)
X		sleep((int)msec/1000L);
X	else
X		sleep(1);
X#else
X	if(nap_msec == 1)
X		getchar();
X	else
X		nap(nap_msec);
X#endif
X}	/* end of wait_a_while */
X
X/*+-------------------------------------------------------------------------
X	saywhat(text)
X--------------------------------------------------------------------------*/
Xvoid
Xsaywhat(text)
Xchar *text;
X{
Xint y,x;
X
X#ifdef PANEL_DEBUG
X	if(!dfp)
X	{
X		dfp = fopen("p.log","w");
X		fputs("-------\n",dfp);
X	}
X	fprintf(dfp,"\n--> %s\n",text);
X#endif
X
X	wmove(stdscr,LINES - 1,0);
X	wprintw(stdscr,"%-20.20s",text);
X
X}	/* end of saywhat */
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	rmpanel(pan)
X--------------------------------------------------------------------------*/
Xvoid
Xrmpanel(pan)
XPANEL *pan;
X{
XWINDOW *win = pan->win;
X	del_panel(pan);
X	delwin(win);
X}	/* end of rmpanel */
X
X/*+-------------------------------------------------------------------------
X	pflush()
X--------------------------------------------------------------------------*/
Xvoid
Xpflush()
X{
X	update_panels();
X	doupdate();
X}	/* end of pflush */
X
X/*+-------------------------------------------------------------------------
X	fill_panel(win)
X--------------------------------------------------------------------------*/
Xfill_panel(pan)
XPANEL *pan;
X{
XWINDOW *win = pan->win;
Xchar num = *(pan->user + 1);
Xint y,x;
X
X	box(win,'|','-');
X	wmove(win,1,1);
X	wprintw(win,"-pan%c-",num);
X	for(y = 2; y < getmaxy(win) - 1; y++)
X	{
X		for(x = 1; x < getmaxx(win) - 1; x++)
X		{
X			wmove(win,y,x);
X			waddch(win,num);
X		}
X	}
X}	/* end of fill_panel */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv)
X--------------------------------------------------------------------------*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
Xint itmp;
Xregister y,x;
Xlong atol();
X
X	if((argc > 1) && atol(argv[1]))
X		nap_msec = atol(argv[1]);
X
X	initscr();
X
X	for(y = 0; y < LINES - 1; y++)
X	{
X		for(x = 0; x < COLS; x++)
X			wprintw(stdscr,"%d",(y + x) % 10);
X	}
X	for(y = 0; y < 5; y++)
X	{
X		p1 = mkpanel(10,10,0,0);
X		w1 = panel_window(p1);
X		set_panel_userptr(p1,"p1");
X
X		p2 = mkpanel(14,14,5,5);
X		w2 = panel_window(p2);
X		set_panel_userptr(p2,"p2");
X
X		p3 = mkpanel(6,8,12,12);
X		w3 = panel_window(p3);
X		set_panel_userptr(p3,"p3");
X
X		p4 = mkpanel(10,10,10,30);
X		w4 = panel_window(p4);
X		set_panel_userptr(p4,"p4");
X
X		p5 = mkpanel(10,10,13,37);
X		w5 = panel_window(p5);
X		set_panel_userptr(p5,"p5");
X
X		fill_panel(p1);
X		fill_panel(p2);
X		fill_panel(p3);
X		fill_panel(p4);
X		fill_panel(p5);
X		hide_panel(p4);
X		hide_panel(p5);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("h3 s1 s2 s4 s5;");
X		move_panel(p1,0,0);
X		hide_panel(p3);
X		show_panel(p1);
X		show_panel(p2);
X		show_panel(p4);
X		show_panel(p5);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("s1;");
X		show_panel(p1);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("s2;");
X		show_panel(p2);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("m2;");
X		move_panel(p2,10,10);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("s3;");
X		show_panel(p3);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("m3;");
X		move_panel(p3,5,5);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("b3;");
X		bottom_panel(p3);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("s4;");
X		show_panel(p4);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("s5;");
X		show_panel(p5);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t3;");
X		top_panel(p3);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t1;");
X		top_panel(p1);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t2;");
X		top_panel(p2);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t3;");
X		top_panel(p3);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t4;");
X		top_panel(p4);
X		pflush();
X		wait_a_while(nap_msec);
X
X		for(itmp = 0; itmp < 6; itmp++)
X		{
X			saywhat("m4;");
X			wmove(w4,3,1);
X			waddstr(w4,mod[itmp]);
X			move_panel(p4,4,itmp*10);
X			wmove(w5,4,1);
X			waddstr(w5,mod[itmp]);
X			pflush();
X			wait_a_while(nap_msec);
X			saywhat("m5;");
X			wmove(w4,4,1);
X			waddstr(w4,mod[itmp]);
X			move_panel(p5,7,(itmp*10) + 6);
X			wmove(w5,3,1);
X			waddstr(w5,mod[itmp]);
X			pflush();
X			wait_a_while(nap_msec);
X		}
X
X		saywhat("m4;");
X		move_panel(p4,4,itmp*10);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t5;");
X		top_panel(p5);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t2;");
X		top_panel(p2);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("t1;");
X		top_panel(p1);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("d2;");
X		rmpanel(p2);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("h3;");
X		hide_panel(p3);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("d1;");
X		rmpanel(p1);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("d4; ");
X		rmpanel(p4);
X		pflush();
X		wait_a_while(nap_msec);
X
X		saywhat("d5; ");
X		rmpanel(p5);
X		pflush();
X		wait_a_while(nap_msec);
X		if(nap_msec == 1)
X			break;
X		nap_msec = 100L;
X	}
X	endwin();
X	exit(0);
X}	/* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of ptest.c */
SHAR_EOF
$TOUCH -am 0801123590 panel/ptest.c &&
chmod 0644 panel/ptest.c ||
echo "restore of panel/ptest.c failed"
Wc_c="`wc -c < panel/ptest.c`"
test 6321 -eq "$Wc_c" ||
	echo panel/ptest.c: original size 6321, current size $Wc_c
# ============= panel/Makefile ==============
echo "x - extracting panel/Makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > panel/Makefile &&
XCFLAGS = -O
X#CFLAGS = -O -DLINT_ARGS
X
XSHARFLS = \
X	README\
X	Makefile\
X	panel.3\
X	config.h\
X	libpanel.h\
X	libpanel.c
X
XOBJ = ptest.o libpanel.o
X
Xptest: $(OBJ)
X	cc -o $@ $(OBJ) -lcurses -lx
X
X$(OBJ): Makefile libpanel.h
X
Xshar:
X	shar -n libpanel -a $(SHARFLS) > libpanel.sh
X
Xclean:
X	rm -rf $(OBJ) core a.out cscope.out tags
X
Xclobber: clean
X	rm -rf ptest
SHAR_EOF
$TOUCH -am 0806190890 panel/Makefile &&
chmod 0644 panel/Makefile ||
echo "restore of panel/Makefile failed"
Wc_c="`wc -c < panel/Makefile`"
test 349 -eq "$Wc_c" ||
	echo panel/Makefile: original size 349, current size $Wc_c
exit 0