[comp.sources.misc] v14i004: u386mon 2.0 part 04/04

wht@n4hgf.UUCP (Warren Tucker) (07/16/90)

Posting-number: Volume 14, Issue 4
Submitted-by: wht@n4hgf.UUCP (Warren Tucker)
Archive-name: u386mon-2.0/part04

#!/bin/sh
# This is part 04 of u386mon.2.0
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/* CHK=0x3CB6 */
X/*+-----------------------------------------------------------------------
X	lint_args.h
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-11-1990-04:12-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  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 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  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 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 0715025190 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" != "7313"; then
	echo original size 7313, current size $Wc_c
fi
# ============= nlsym.h ==============
echo "x - extracting nlsym.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > nlsym.h &&
X/* CHK=0x23B9 */
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 0715025190 nlsym.h &&
chmod 0644 nlsym.h ||
echo "restore of nlsym.h failed"
set `wc -c nlsym.h`;Wc_c=$1
if test "$Wc_c" != "5472"; then
	echo original size 5472, current size $Wc_c
fi
# ============= u386mon.h ==============
echo "x - extracting u386mon.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > u386mon.h &&
X/* CHK=0x259A */
X/*+-------------------------------------------------------------------------
X	u386mon.h - UNIX 386 system monitor definitions
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
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#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
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#define use_cp(win,cp) wattrset(win,\
X	(color_avail) ? color_attr[cp] : mono_attr[cp])
X#endif
X
X/* if color par numbers are changed, disputil.c
X * color_attr and mono_attr tables
X * must also be changed
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;
Xextern long color_attr[];
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 0715025190 u386mon.h &&
chmod 0644 u386mon.h ||
echo "restore of u386mon.h failed"
set `wc -c u386mon.h`;Wc_c=$1
if test "$Wc_c" != "3631"; then
	echo original size 3631, current size $Wc_c
fi
# ============= 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"
set `wc -c renice/Makefile`;Wc_c=$1
if test "$Wc_c" != "1200"; then
	echo original size 1200, current size $Wc_c
fi
# ============= 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];
Xdaddr_t myreadcnt;
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 0715025190 renice/renice.c &&
chmod 0644 renice/renice.c ||
echo "restore of renice/renice.c failed"
set `wc -c renice/renice.c`;Wc_c=$1
if test "$Wc_c" != "4399"; then
	echo original size 4399, current size $Wc_c
fi
# ============= uutool/README ==============
if test ! -d 'uutool'; then
    echo "x - creating directory uutool"
    mkdir 'uutool'
fi
echo "x - extracting uutool/README (Text)"
sed 's/^X//' << 'SHAR_EOF' > uutool/README &&
XUUTOOL
X------
X
XUutool is a single program called with different names to
Xaccomplish specific functions.  These names are:
X
X     uupoke - "poke" a uucp connection into life
X              similar to "uucico -r1 [-x#] -[S|s]system name
X
X     uulstat - display summary uucp connection status
X
X     uukill -  terminate a uucico session (promptly, but
X               with finesse); kill uucico and any active
X               dialer programs
X
XThis is included with u386mon primarily as an example of alternate
Xuses of libkmem (see killpc.c), but I have found them very useful.
X
Xusage information
X-----------------
Xusage: uupoke [-a] [-v] [-x#] systemname ...
X       uulstat systemname ...
X       uukill systemname ...
X
Xuupoke [-a] [-v] [-x#] systemname ...
X----------------------------------
X
XCall each system in the 'systemname' list in turn.  The -a switch ("always")
Xcauses -S to be used in the uucico invocation; if -a is omited,
Xuupoke will make it's own analysis of work to be done and execute
Xuucico for a system only if outgoing work is found.
X
XThe -v switch causes uupoke to display status similar to uulstat
Xas it does its work.
X
XThe -x# switch sets the uucico debugging level.  The default is -x1.
XSetting -x0 may still result in -x1 output occurring due to
Xuucico switch interpretation.
X
Xuulstat systemsnames
X--------------------
X
XSummary status for each system in the 'systemname' list is displayed.
X
Xexample of inactive connection:
Xsystem: gatech: uucico not active
Xlast status: successful  (0 failed calls)
Xqueues:  input: 0  output: 0 data files: 0
Xlast call: Sat Jul 14 19:10:55 1990
Xnext call: none scheduled
X
Xexample of active connection:
Xsystem: gatech: uucico pid 9274 active on tty2b
Xlast status: CALL IN PROGRESS  (0 failed calls)
Xqueues:  input: 0  output: 0 data files: 0
Xlast call: Sun Jul 15 02:29:30 1990
Xnext call: now
X
Xuukill systemnames
X------------------
X
XOnly executable by root, this invocation promptly terminates
Xan active incoming or outgoing uucico session for each system
Xnamed in 'systemnames'.
SHAR_EOF
$TOUCH -am 0715025990 uutool/README &&
chmod 0644 uutool/README ||
echo "restore of uutool/README failed"
set `wc -c uutool/README`;Wc_c=$1
if test "$Wc_c" != "2027"; then
	echo original size 2027, current size $Wc_c
fi
# ============= uutool/Makefile ==============
echo "x - extracting uutool/Makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > uutool/Makefile &&
X#  CHK=0x9F4A
X#+-------------------------------------------------------------------
X#  Makefile for uutool 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/lib/uucp
X
X#LDFLAGS = -s
X
XLIB = -lx
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	uutool.c
X
XUUTOOL_OBJ =\
X	uutool.o\
X	killpc.o\
X	wstext.o\
X	../libnlsym.o\
X	../libkmem.o
X
Xall: uutool
X
X#must run as root
Xinstall: all
X	rm -f $(BINDIR)/uulstat $(BINDIR)/uupoke $(BINDIR)/uukill $(BINDIR)/uulstat
X	cp uutool $(BINDIR)/uulstat
X	chown uucp $(BINDIR)/uulstat
X	chmod 711 $(BINDIR)/uulstat
X	ln $(BINDIR)/uulstat $(BINDIR)/uupoke
X	ln $(BINDIR)/uulstat $(BINDIR)/uukill
X	@echo ' ';echo 'csh users rehash before executing'
X
Xuutool: $(UUTOOL_OBJ)
X	$(CC) $(LDFLAGS) -o $@ $(UUTOOL_OBJ) $(LIB)
X
X../libnlsym.o: ../libnlsym.c
X	cd ..;make libnlsym.o
X
X../libkmem.o: ../libkmem.c
X	cd ..;make libkmem.o
X
Xclean:
X	rm -f uutool.o libkmem-w.o core 
X
Xclobber: clean
X	rm -f uutool
X
SHAR_EOF
$TOUCH -am 0715024290 uutool/Makefile &&
chmod 0644 uutool/Makefile ||
echo "restore of uutool/Makefile failed"
set `wc -c uutool/Makefile`;Wc_c=$1
if test "$Wc_c" != "1344"; then
	echo original size 1344, current size $Wc_c
fi
# ============= uutool/killpc.c ==============
echo "x - extracting uutool/killpc.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > uutool/killpc.c &&
X/* CHK=0xFAEC */
X#define USE_KMEM
X/*+-------------------------------------------------------------------------
X	killpc.c
X
X  Defined functions:
X	kill_parent_and_children(ppid,sig_to_parent,sig_to_children)
X	leave_text(text,exit_code)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-15-1990-01:49-wht-creation */
X
X#include <stdio.h>
X#ifdef USE_KMEM
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
X#include "../nlsym.h"
X#include "../libkmem.h"
X#include "../libnlsym.h"
X
Xdaddr_t myreadcnt = 0L;
X#endif /* USE_KMEM */
X
Xextern int verbose;
X
X/*+-------------------------------------------------------------------------
X	leave_text(text,exit_code)
XIf exit_code == 255, do perror
X--------------------------------------------------------------------------*/
X#ifdef USE_KMEM
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#endif /* USE_KMEM */
X
X/*+-------------------------------------------------------------------------
X	kill_parent_and_children(ppid,sig_to_parent,sig_to_children)
X--------------------------------------------------------------------------*/
Xvoid
Xkill_parent_and_children(ppid,sig_to_parent,sig_to_children)
Xint ppid;
Xint sig_to_parent;
Xint sig_to_children;
X{
X#ifdef USE_KMEM
Xregister struct proc *tproc;
Xint iproc;
Xstatic struct proc *procs = (struct proc *)0;
Xstatic struct var v;
Xstatic char *memfail = "cannot alloc memory for proc table";
X
X	nlsym_read();
X	kinit(0);
X	if(!procs)
X	{
X		kread((caddr_t)&v,vaddr,sizeof(v));
X		if(!(procs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
X			leave_text(memfail,1);
X	}
X
X	kread((caddr_t)procs,procaddr,sizeof(struct proc) * v.v_proc);
X
X	for(iproc = 0; iproc < v.v_proc; iproc++)
X	{
X		tproc = &procs[iproc];
X		if(	tproc->p_stat &&
X			(tproc->p_ppid == ppid) &&
X			(tproc->p_pid != ppid))
X		{							/* eliminate from consideration */
X			kill(tproc->p_pid,sig_to_children);
X		}
X	}
X	kill(ppid,sig_to_parent);
X
X#else /* do not use kmem */
Xint col;
Xint ps_ppid_col;
Xint ps_pid_col;
Xchar psbuf[256];
Xchar psbuf2[256];
X#define MAX_PS_FIELDS 32
Xchar *fields[MAX_PS_FIELDS];
Xint nfields;
XFILE *popen();
XFILE *fpps = popen("ps -ef","r");
X
X	if(!fpps)
X	{
X		printf("cannot read process status\n");
X		return;
X	}
X	fgets(psbuf,sizeof(psbuf),fpps);
X	if(verbose)
X	{
X		printf("killing\n");
X		fputs(psbuf,stdout);
X	}
X	build_field_array(psbuf,fields,MAX_PS_FIELDS,&nfields);
X	for(col = 0; col < nfields; col++)
X	{
X		if(!strcmp("PPID",fields[col]))
X			ps_ppid_col = col;
X		else if(!strcmp("PID",fields[col]))
X			ps_pid_col = col;
X	}
X	while(fgets(psbuf,sizeof(psbuf),fpps))
X	{
X		if(verbose)
X			strcpy(psbuf2,psbuf);
X		build_field_array(psbuf,fields,MAX_PS_FIELDS,&nfields);
X		if(atoi(fields[ps_ppid_col]) == ppid)
X		{
X			if(verbose)
X				fputs(psbuf2,stdout);
X			kill(atoi(fields[ps_pid_col]),sig_to_children);
X		}
X		else if((atoi(fields[ps_pid_col]) == ppid) && verbose)
X			fputs(psbuf2,stdout);
X	}
X	pclose(fpps);
X	kill(ppid,sig_to_parent);
X	nap(2000L);
X#endif /* USE_KMEM */
X}	/* end of kill_parent_and_children */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of killpc.c */
SHAR_EOF
$TOUCH -am 0715023690 uutool/killpc.c &&
chmod 0644 uutool/killpc.c ||
echo "restore of uutool/killpc.c failed"
set `wc -c uutool/killpc.c`;Wc_c=$1
if test "$Wc_c" != "3354"; then
	echo original size 3354, current size $Wc_c
fi
# ============= uutool/uutool.c ==============
echo "x - extracting uutool/uutool.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > uutool/uutool.c &&
X/* CHK=0xCD46 */
Xchar *revision = "1.10";
X/*+-------------------------------------------------------------------------
X	uutool.c - HDB UUCP tool - uupoke/uukill/uulstat
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	basename(fullname)
X	build_field_array(cmd,field,field_max_quan,nfield_rtn)
X	cmd_uukill(uls)
X	cmd_uulstat(uls)
X	cmd_uupoke(uls,uucico_x_flag,poll_always)
X	dir_close(dirp)
X	dir_open(dirname)
X	dir_read(dirp)
X	get_uucp_lstat(system_name,uls)
X	lockpid_to_tty(lockpid)
X	main(argc,argv)
X	parse_field(parsestr,termchars)
X	read_status_file(system_name,buf,bufsize)
X	spooldirname(fname)
X	statdirname(fname)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:04-10-1990-21:20-wht@n4hgf-uupoke proceeds even if there is no status file */
X/*:04-03-1990-19:44-wht@n4hgf-version 1.00 working */
X
X#include <stdio.h>
X#include <signal.h>
X#include <errno.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
Xchar *ctime();
Xextern int errno;
Xextern char *sys_errlist[];
X
Xchar *wait_status_text();
X
X#define DDIR FILE
Xstruct dent
X{
X	unsigned short d_inode;
X	char d_name[14];
X};
X
Xchar *STATUSDIR = "/usr/spool/uucp/.Status";
Xchar *LOCKDIR = "/usr/spool/uucp/LCK..";
Xchar *WORKDIR = "/usr/spool/uucp/";
Xchar *SPOOLDIR = "/usr/spool/uucp";
X
X#define SS_OK                    0 	/* successful */
X#define SS_NO_DEVICE             1 	/* no device */
X#define SS_TIME_WRONG            2 	/* wrong time to call */
X#define SS_TALKING               3 	/* TALKING */
X#define SS_CONVERSATION          4 	/* conversation failed */
X#define SS_SEQBAD                5 	/* bad sequence check */
X#define SS_LOGIN_FAILED          6 	/* login failed */
X#define SS_DIAL_FAILED           7 	/* dial failed */
X#define SS_BAD_LOG_MCH           8 	/* bad login/machine */
X#define SS_LOCKED_DEVICE         9 	/* DEVICE LOCKED */
X#define SS_ASSERT_ERROR          10	/* assert error */
X#define SS_BADSYSTEM             11	/* system not in Systems */
X#define SS_CANT_ACCESS_DEVICE    12	/* can't access device */
X#define SS_DEVICE_FAILED         13	/* device failed */
X#define SS_WRONG_MCH             14	/* wrong machine name */
X#define SS_CALLBACK              15	/* callback required */
X#define SS_RLOCKED               16	/* remote has lock for me */
X#define SS_RUNKNOWN              17	/* remote does not know me */
X#define SS_RLOGIN                18	/* remote reject after login */
X#define SS_UNKNOWN_RESPONSE      19	/* remote reject, unknown msg */
X#define SS_STARTUP               20	/* startup failed */
X#define SS_CHAT_FAILED           21	/* caller script failed */
X#if defined(M_XENIX) || defined(M_UNIX)
X#define SS_CALL_IN_PROGRESS	     22	/* CALL IN PROGRESS */
X#define SS_CALL_FAILED           23	/* call failed (busy?) */
X#else
X#define SS_CALL_IN_PROGRESS	     22	/* CALL IN PROGRESS */
X#endif
X
X#define UUCMD_NONE 0
X#define UUCMD_LSTAT 1
X#define UUCMD_POLL 2
X#define UUCMD_KILL 3
X
Xtypedef struct uucp_lstat
X{
X	char system[16];
X	int uucico_active;
X	long secs_last_try;
X	long secs_next_try;
X	int retry_count;
X	int status;
X	int input_queue_count;
X	int output_queue_count;
X	int dfil_count;
X	int locking_pid;
X	char locked_tty[32];
X	char work_dir[64];
X	char stattxt[40];
X	char linebuf[512];
X} UUCP_LSTAT;
X
Xchar *errortext[] =
X{
X	/*       00000000001111111111222222 */
X	/*       01234567890123456789012346 */
X	/* 0 */ "successful",
X	/* 1 */ "no device",
X	/* 2 */ "wrong time to call",
X	/* 3 */ "TALKING",
X	/* 4 */ "conversation failed",
X	/* 5 */ "bad sequence check",
X	/* 6 */ "login failed",
X	/* 7 */ "dial failed",
X	/* 8 */ "bad login/machine",
X	/* 9 */ "DEVICE LOCKED",
X	/* 10*/ "assert error",
X	/* 11*/ "system not in Systems",
X	/* 12*/ "can't access device",
X	/* 13*/ "device failed",
X	/* 14*/ "wrong machine name",
X	/* 15*/ "callback required",
X	/* 16*/ "remote has lock for me",
X	/* 17*/ "remote does not know me",
X	/* 18*/ "remote reject after login",
X	/* 19*/ "remote reject, unknown msg",
X	/* 20*/ "startup failed",
X	/* 21*/ "caller script failed",
X#if defined(M_XENIX) || defined(M_UNIX)
X	/* 22*/ "CALL IN PROGRESS",
X	/* 23*/ "call failed (busy?)",
X#else
X	/* 22*/ "CALL IN PROGRESS",
X#endif
X};
X
X#if defined(M_XENIX) || defined(M_UNIX)
X#define SS_MSG_MAX 23
X#else
X#define SS_MSG_MAX 22
X#endif
X
Xint verbose = 0;
X
X/*+-----------------------------------------------------------------------
X	parse_field(parsestr,termchars)
X
XGet next field from string parsestr ((char *)0 on 2nd, 3rd, etc.
Xcalls), where fields are nonempty strings separated by runs of chars
Xfrom termchars.  Writes nulls into parsestr to end fields.
Xtermchars need not remain constant from call to call.
X
XTreats multiple occurrences of a termchar as one delimiter (does not
Xallow null fields).
X------------------------------------------------------------------------*/
Xchar *parse_field_static = (char *)0;
Xchar *parse_field(parsestr,termchars)
Xchar *parsestr;
Xchar *termchars;
X{
Xregister int first = 1;
Xregister char *termptr;
Xregister char *parseptr;
Xchar *field;
X
X	if(parsestr == (char *)0 && parse_field_static == (char *)0)
X		return((char *)0);
X
X	if(parsestr)
X		parseptr = parsestr;
X	else
X       parseptr = parse_field_static;
X
X	while(*parseptr)
X	{
X		if(!strchr(termchars,*parseptr))
X			break;
X		parseptr++;
X	}
X
X	if(!*parseptr)
X	{
X		parse_field_static = (char *)0;
X		return((char *)0);
X	}
X
X	field = parseptr;
X	if(*field == '\'')
X	{
X		field++;
X		parseptr++;
X		while(*parseptr)
X		{
X			if(*parseptr == '\'')
X			{
X				parse_field_static = parseptr + 1;
X				*parseptr = 0;
X				return(field);
X			}
X			parseptr++;
X		}
X		parse_field_static = (char *)0;
X		return(field);
X	}
X	while(*parseptr)
X	{
X		if(strchr(termchars,*parseptr))
X		{
X			*parseptr = 0;
X			parse_field_static = parseptr + 1;
X			while(*parse_field_static)
X			{
X				if(!strchr(termchars,*parse_field_static))
X					break;
X				parse_field_static++;
X			}
X			return(field);
X		}
X		parseptr++;
X	}
X	parse_field_static = (char *)0;
X	return(field);
X}	/* end of parse_field */
X
X/*+-------------------------------------------------------------------------
X	build_field_array(cmd,field,field_max_quan,&nfield)
X--------------------------------------------------------------------------*/
Xvoid
Xbuild_field_array(cmd,field,field_max_quan,nfield_rtn)
Xchar *cmd;
Xchar **field;
Xint field_max_quan;
Xint *nfield_rtn;
X{
Xregister itmp;
Xregister nfield;
X
X	for(itmp = 0; itmp < field_max_quan; itmp++)
X		field[itmp] = (char *)0;
X	field[0] = parse_field(cmd," \t\r\n");
X
X	for(nfield = 1; nfield < field_max_quan; ++nfield)
X	{
X		if((field[nfield] = parse_field((char *)0," \t\r\n")) == (char *)0) 
X			break;
X	}
X
X	*nfield_rtn = nfield;
X
X}	/* end of build_field_array */
X
X/*+-------------------------------------------------------------------------
X	dir_open(dirname)
X--------------------------------------------------------------------------*/
XDDIR *
Xdir_open(dirname)
Xchar *dirname;
X{
X	DDIR *fp = fopen(dirname,"r");
X	return(fp);
X}	/* end of dir_open */
X
X/*+-------------------------------------------------------------------------
X	dir_read(dirname)
X--------------------------------------------------------------------------*/
Xstruct dent *
Xdir_read(dirp)
XDDIR *dirp;
X{
Xstatic struct dent_w_null {
X	struct dent dent;
X	int null;
X} static_dent;
X
X
X	do {
X		if(fread((char *)&static_dent.dent,sizeof(struct dent),1,dirp) != 1)
X			return((struct dent *)0);
X	} while(!static_dent.dent.d_inode);
X
X	static_dent.null = 0;
X	return(&static_dent.dent);
X}	/* end of dir_open */
X
X/*+-------------------------------------------------------------------------
X	dir_close(dirp)
X--------------------------------------------------------------------------*/
Xvoid
Xdir_close(dirp)
XDDIR *dirp;
X{
X	if(dirp)
X		fclose(dirp);
X}	/* end of dir_close */
X
X/*+-------------------------------------------------------------------------
X	basename(fullname) - strip directory name from filename
X
Xreturns address of static string
X--------------------------------------------------------------------------*/
Xchar *
Xbasename(fullname)
Xchar *fullname;
X{
Xregister char *start;
Xstatic char outstr[256];
Xchar *strrchr();
X
X	start = strrchr(fullname,'/'); /* find last slash */
X	if(!start)
X		return(fullname);
X	start++;
X	strcpy(outstr,start);
X	return(outstr);
X}	/* end of basename */
X
X/*+-------------------------------------------------------------------------
X	statdirname(fname) - return base name prepended with status dir
X
Xreturns address of static string
X--------------------------------------------------------------------------*/
Xchar *
Xstatdirname(fname)
Xchar *fname;
X{
Xstatic char fullname[128];
Xstatic int fullname_cat_point = 0;
X
X	if(!fullname_cat_point)
X	{
X		strcpy(fullname,STATUSDIR);
X		strcat(fullname,"/");
X		fullname_cat_point = strlen(fullname);
X	}
X
X	strcpy(fullname + fullname_cat_point,fname);
X	return(fullname);
X
X}	/* end of statdirname */
X
X/*+-------------------------------------------------------------------------
X	spooldirname(fname) - return base name prepended with spool dir
X
Xreturns address of static string
X--------------------------------------------------------------------------*/
Xchar *
Xspooldirname(fname)
Xchar *fname;
X{
Xstatic char fullname[128];
Xstatic int fullname_cat_point = 0;
X
X	if(!fullname_cat_point)
X	{
X		strcpy(fullname,SPOOLDIR);
X		strcat(fullname,"/");
X		fullname_cat_point = strlen(fullname);
X	}
X
X	strcpy(fullname + fullname_cat_point,fname);
X	return(fullname);
X
X}	/* end of statdirname */
X
X/*+-------------------------------------------------------------------------
X	lockpid_to_tty(lockpid) - given pid, find first ttyname it has locked
X--------------------------------------------------------------------------*/
Xchar *
Xlockpid_to_tty(lockpid)
Xint lockpid;
X{
XDDIR *uspool_dp;
Xstruct dent *dp;
XFILE *fp;
Xint testpid;
Xstatic char rtnname[32];
X
X	if(uspool_dp = dir_open(SPOOLDIR))
X	{
X		while(dp = dir_read(uspool_dp))
X		{
X			if(strncmp(dp->d_name,"LCK..tty",8))
X				continue;
X			if(fp = fopen(spooldirname(dp->d_name),"r"))
X			{
X				fscanf(fp,"%d",&testpid);
X				fclose(fp);
X				if(testpid == lockpid)
X				{
X					strcpy(rtnname,dp->d_name + 5);
X					dir_close(uspool_dp);
X					return(rtnname);
X				}
X			}
X		}
X		dir_close(uspool_dp);
X	}
X	return((char *)0);
X}	/* end of lockpid_to_tty */
X
X/*+-------------------------------------------------------------------------
X	read_status_file(system_name,buf,bufsize)
X--------------------------------------------------------------------------*/
Xint
Xread_status_file(system_name,buf,bufsize)
Xchar *system_name;
Xchar *buf;
Xint bufsize;
X{
XFILE *fp;
X
X	if(!(fp = fopen(statdirname(system_name),"r")))
X		return(-1);
X	buf[0] = 0;
X	fgets(buf,bufsize,fp);
X	fclose(fp);
X	if(!buf[0])
X		return(-1);
X	buf[strlen(buf) - 1] = 0;
X	return(0);
X
X}	/* end of read_status_file */
X
X/*+-------------------------------------------------------------------------
X	get_uucp_lstat(system_name,uls)
X--------------------------------------------------------------------------*/
Xget_uucp_lstat(system_name,uls)
Xchar *system_name;
XUUCP_LSTAT *uls;
X{
Xint itmp;
Xchar s32[32];
Xstruct dent *dp;
XDDIR *work_dp;
XFILE *fp;
Xchar lock_name[64];
Xchar *ttyname;
X
X	memset((char *)uls,0,sizeof(UUCP_LSTAT));
X	strcpy(uls->system,system_name);
X	if(read_status_file(system_name,uls->linebuf,sizeof(uls->linebuf)))
X		return(-1);
X
X	sscanf(uls->linebuf,"%d %d %ld %ld",
X	    &uls->status,&uls->retry_count,
X		&uls->secs_last_try,&uls->secs_next_try);
X	uls->secs_next_try += uls->secs_last_try;
X
X	strcpy(uls->work_dir,WORKDIR);
X	strcat(uls->work_dir,system_name);
X
X	uls->input_queue_count = 0;
X	uls->output_queue_count = 0;
X	uls->dfil_count = 0;
X	if(work_dp = dir_open(uls->work_dir))
X	{
X		/* count files */
X		while(dp = dir_read(work_dp))
X		{
X			if(!strncmp(dp->d_name,"X.",2))
X				uls->input_queue_count++;
X			if(!strncmp(dp->d_name,"D.",2))
X				uls->dfil_count++;
X			if(!strncmp(dp->d_name,"C.",2))
X				uls->output_queue_count++;
X		}
X		dir_close(work_dp);
X	}
X
X	/* "kludges for screwy status stuff with HDB" thanks to Ed Carp */
X	strcpy(lock_name,LOCKDIR);
X	strcat(lock_name,system_name);
X	if(!access(lock_name,0) && (uls->status != SS_TALKING))
X		uls->status = SS_CALL_IN_PROGRESS;
X	if(uls->status == SS_BADSYSTEM)
X		uls->status = SS_DEVICE_FAILED;
X
X	uls->locking_pid = 0;
X	uls->locked_tty[0] = 0;
X	uls->uucico_active = 0;
X	if((uls->status == SS_TALKING) || (uls->status == SS_LOCKED_DEVICE ) ||
X		(uls->status == SS_CALL_IN_PROGRESS))
X	{
X		if(fp = fopen(lock_name,"r"))
X		{
X			fscanf(fp,"%d",&uls->locking_pid);
X			fclose(fp);
X			errno = 0;
X			uls->uucico_active = !kill(uls->locking_pid) || (errno != ESRCH);
X			if(!uls->uucico_active)
X				uls->locking_pid = 0;
X		}
X		if(uls->locking_pid)
X			strcpy(uls->locked_tty,lockpid_to_tty(uls->locking_pid));
X	}
X
X	if(uls->status > SS_MSG_MAX)
X		sprintf(uls->stattxt,"status %u",uls->status);
X	else
X		strcpy(uls->stattxt,errortext[uls->status]);
X	return(0);
X}	/* end of get_uucp_lstat */
X
X/*+-------------------------------------------------------------------------
X	cmd_uulstat(uls)
X--------------------------------------------------------------------------*/
Xvoid
Xcmd_uulstat(uls)
XUUCP_LSTAT *uls;
X{
X	printf("system: %s: ",uls->system);
X	if(uls->uucico_active)
X	{
X		printf("uucico pid %d active",uls->locking_pid);
X		if(uls->locked_tty[0])
X			printf(" on %s\n",uls->locked_tty);
X		else
X			printf(" on /dev/tty??\n");
X	}
X	else
X		printf("uucico not active\n");
X	printf("last status: %s",uls->stattxt);
X	printf("  (%d failed calls)\n",uls->retry_count);
X	printf("queues:  input: %d  output: %d data files: %d\n",
X		uls->input_queue_count,uls->output_queue_count,uls->dfil_count);
X	printf("last call: %s",ctime(&uls->secs_last_try));
X	printf("next call: %s",
X		(uls->uucico_active)
X			? "now\n"
X			: ((uls->output_queue_count)
X				? ctime(&uls->secs_next_try)
X				: "none scheduled\n")
X			);
X	printf("\n");
X}	/* end of cmd_uulstat */
X
X/*+-------------------------------------------------------------------------
X	cmd_uupoke(uls,uucico_x_flag,poll_always)
X--------------------------------------------------------------------------*/
Xvoid
Xcmd_uupoke(uls,uucico_x_flag,poll_always)
XUUCP_LSTAT *uls;
Xint uucico_x_flag;
Xint poll_always;
X{
Xint itmp;
Xint wait_status;
Xint uucico_pid;
Xchar uucico_x_arg[16];
Xchar system_arg[16];
X
X	if(uls->uucico_active)
X	{
X		printf("no poll made to %s (uucico already active)\n",uls->system);
X		return;
X	}
X
X	if(!poll_always && !uls->output_queue_count)
X	{
X		printf("no poll made to %s (no work to be done and no -a)\n",
X			uls->system);
X		return;
X	}
X
X	sprintf(uucico_x_arg,"-x%d",uucico_x_flag);
X	strcpy(system_arg,(poll_always) ? "-S" : "-s");
X	strcat(system_arg,uls->system);
X
X	if((uucico_pid = fork()) < 0)
X		printf("cannot fork: %s\n",sys_errlist[errno]);
X	else if(uucico_pid)
X	{
X		printf("uucico pid %d\n",uucico_pid);
X		while(((itmp = wait(&wait_status)) != uucico_pid) && (itmp != -1))
X			;
X		nap(250L);
X		printf("%s\n",wait_status_text(wait_status));
X	}
X	else
X	{
X		nap(250L);
X		close(2);
X		dup(1);
X		printf("UUCICO.POKE %s -r1 %s\n",uucico_x_arg,system_arg);
X		execl("/usr/lib/uucp/uucico","UUCICO.POKE","-r1",system_arg,
X			(uucico_x_flag) ? uucico_x_arg : "-x1",
X			(char *)0);
X		exit(255);
X	}
X
X}	/* end of cmd_uupoke */
X
X/*+-------------------------------------------------------------------------
X	cmd_uukill(uls)
X--------------------------------------------------------------------------*/
Xvoid
Xcmd_uukill(uls)
XUUCP_LSTAT *uls;
X{
X	if(getuid())
X	{
X		printf("no kill done (only root may do this!)\n");
X		return;
X	}
X	if(!uls->uucico_active)
X	{
X		printf("no kill done (uucico not active)\n");
X		return;
X	}
X	if(!uls->locking_pid)
X	{
X		printf("no kill done (cannot determine uucico pid)\n");
X		return;
X	}
X	kill_parent_and_children(uls->locking_pid,SIGHUP,SIGKILL);
X
X}	/* end of cmd_uukill */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv)
X--------------------------------------------------------------------------*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
Xint itmp;
Xint errflg = 0;
Xint poll_always = 0;
Xint cmd;
Xchar *cptr;
Xint uucico_x_flag = 0;
XUUCP_LSTAT ulsbuf;
XUUCP_LSTAT *uls = &ulsbuf;
Xextern char *optarg;
Xextern int optind;
X
X	setbuf(stdout,NULL);
X	setbuf(stderr,NULL);
X
X	while((itmp = getopt(argc,argv,"vx:a")) != -1)
X	{
X		switch(itmp)
X		{
X			case 'v':
X				verbose = 1;
X				break;
X			case 'x':
X				uucico_x_flag = atoi(optarg);
X				break;
X			case 'a':
X				poll_always = 1;
X				break;
X			case '?':
X				errflg++;
X		}
X	}
X
X	cmd = UUCMD_NONE;
X	cptr = basename(argv[0]);
X	if(!strcmp(cptr,"uulstat"))
X		cmd = UUCMD_LSTAT;
X	else if(!strcmp(cptr,"uupoke"))
X		cmd = UUCMD_POLL;
X	else if(!strcmp(cptr,"uukill"))
X		cmd = UUCMD_KILL;
X
X	if(errflg || (cmd == UUCMD_NONE) || (optind == argc))
X	{
X		printf("usage: uupoke [-a] [-v] [-x#] system ...\n");
X		printf("       uulstat system ...\n");
X		printf("       uukill system ...\n");
X		exit(1);
X	}
X
X	while(optind < argc)
X	{
X		if(get_uucp_lstat(cptr = argv[optind++],uls))
X		{
X			printf("could not get status on '%s'\n\n",cptr);
X			switch(cmd)
X			{
X				case UUCMD_POLL:
X					cmd_uupoke(uls,uucico_x_flag,1);
X					if(verbose)
X					{
X						fputs("after poll: ",stdout);
X						if(get_uucp_lstat(cptr,uls))
X							printf("could not get status on '%s'\n\n",cptr);
X						else
X							cmd_uulstat(uls);
X					}
X					break;
X			}
X		}
X		else
X		{
X			switch(cmd)
X			{
X				case UUCMD_LSTAT:
X					cmd_uulstat(uls);
X					break;
X				case UUCMD_POLL:
X					if(verbose)
X					{
X						fputs("before poll: ",stdout);
X						cmd_uulstat(uls);
X					}
X					cmd_uupoke(uls,uucico_x_flag,poll_always);
X					if(verbose)
X					{
X						fputs("after poll: ",stdout);
X						if(get_uucp_lstat(cptr,uls))
X							printf("could not get status on '%s'\n\n",cptr);
X						else
X							cmd_uulstat(uls);
X					}
X					break;
X				case UUCMD_KILL:
X					if(verbose)
X					{
X						fputs("before kill: ",stdout);
X						cmd_uulstat(uls);
X					}
X					cmd_uukill(uls);
X					break;
X			}
X		}
X	}
X	exit(0);
X
X}	/* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of uutool.c */
SHAR_EOF
$TOUCH -am 0715030090 uutool/uutool.c &&
chmod 0644 uutool/uutool.c ||
echo "restore of uutool/uutool.c failed"
set `wc -c uutool/uutool.c`;Wc_c=$1
if test "$Wc_c" != "17805"; then
	echo original size 17805, current size $Wc_c
fi
# ============= uutool/wstext.c ==============
echo "x - extracting uutool/wstext.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > uutool/wstext.c &&
X/* CHK=0xBB16 */
X/*+-------------------------------------------------------------------------
X	wstext.c - wait status and signal to text strings
X	wht@n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-15-1990-02:38-wht-break out of uutool.c */
X
X#include <signal.h>
X
X/*+-------------------------------------------------------------------------
X	signal_name_text(sig)
X--------------------------------------------------------------------------*/
Xchar *
Xsignal_name_text(sig)
Xint sig;
X{
Xregister char *cptr;
Xstatic char sigunknown[20];
X
X	sig &= 0x7F;
X	switch(sig)
X	{
X		case SIGHUP:	cptr = "SIGHUP"; break;
X		case SIGINT:	cptr = "SIGINT"; break;
X		case SIGQUIT:	cptr = "SIGQUIT"; break;
X		case SIGILL:	cptr = "SIGILL"; break;
X		case SIGTRAP:	cptr = "SIGTRAP"; break;
X		case SIGIOT:	cptr = "SIGIOT"; break;
X		case SIGEMT:	cptr = "SIGEMT"; break;
X		case SIGFPE:	cptr = "SIGFPE"; break;
X		case SIGKILL:	cptr = "SIGKILL"; break;
X		case SIGBUS:	cptr = "SIGBUS"; break;
X		case SIGSEGV:	cptr = "SIGSEGV"; break;
X		case SIGSYS:	cptr = "SIGSYS"; break;
X		case SIGPIPE:	cptr = "SIGPIPE"; break;
X		case SIGALRM:	cptr = "SIGALRM"; break;
X		case SIGTERM:	cptr = "SIGTERM"; break;
X		case SIGUSR1:	cptr = "SIGUSR1"; break;
X		case SIGUSR2:	cptr = "SIGUSR2"; break;
X		case SIGCLD:	cptr = "SIGCLD"; break;
X		case SIGPWR:	cptr = "SIGPWR"; break;
X#if	defined(M_UNIX)
X		case SIGSTOP:   cptr = "SIGSTOP"; break;
X		case SIGTSTP:   cptr = "SIGTSTP"; break;
X		case SIGCONT:   cptr = "SIGCONT"; break;
X		case SIGTTIN:   cptr = "SIGTTIN"; break;
X		case SIGTTOU:   cptr = "SIGTTOU"; break;
X#endif
X		default:
X			sprintf(sigunknown,"SIGNAL %u",sig);
X			return(sigunknown);
X	}
X	return(cptr);
X
X}	/* end of signal_name_text */
X
X/*+-------------------------------------------------------------------------
X	wait_status_text(wait_status)
X--------------------------------------------------------------------------*/
Xchar *
Xwait_status_text(wait_status)
Xregister unsigned int wait_status;
X{
Xstatic char text[80];
X
X	if(wait_status & 0xFF)	/* exit never called by child */
X	{
X		sprintf(text,"[killed by %s",signal_name_text(wait_status & 0x7F));
X		if(wait_status & 0x80)
X			strcat(text,", core dumped");
X		strcat(text,"]");
X	}
X	else
X	{
X		wait_status >>= 8;
X		if(wait_status == 0)
X			strcpy(text,"[successful]");
X		else
X			sprintf(text,"[exit status %d]\n",wait_status);
X	}
X
X	return(text);
X
X}	/* end of wait_status_text */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of wstext.c */
SHAR_EOF
$TOUCH -am 0715024390 uutool/wstext.c &&
chmod 0644 uutool/wstext.c ||
echo "restore of uutool/wstext.c failed"
set `wc -c uutool/wstext.c`;Wc_c=$1
if test "$Wc_c" != "2504"; then
	echo original size 2504, current size $Wc_c
fi
exit 0
 
--------------------------------------------------------------------
Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
Sforzando (It., sfohr-tsahn'-doh).   A direction to perform the tone
or chord with special stress, or marked and sudden emphasis.