v14i004: u386mon 2.0 part 04/04
Warren Tucker
wht at n4hgf.UUCP
Mon Jul 16 09:10:25 AEST 1990
Posting-number: Volume 14, Issue 4
Submitted-by: wht at 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 at n4hgf-1.10-incorporate suggestions from alpha testers */
X/*:06-27-1990-01:55-wht at n4hgf-use 64 bits of unique check */
X/*:06-25-1990-04:14-wht at n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht at n4hgf-v1.01-add ISC support thanks to peter at radig.de */
X/*:06-21-1990-14:26-r at 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 at n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-10-1990-19:06-root at n4hgf-redesign attributes/color pairs */
X/*:07-10-1990-18:33-root at n4hgf-move pio wait to medium alert */
X/*:07-03-1990-03:21-root at n4hgf-add cpBANWARN and renumber */
X/*:06-27-1990-01:57-wht at n4hgf-1.10-incorporate suggestions from alpha testers */
X/*:06-25-1990-04:14-wht at n4hgf-1.02-better error handling */
X/*:06-24-1990-20:53-wht at n4hgf-v1.01-add ISC support thanks to peter at radig.de */
X/*:06-21-1990-14:27-r at n4hgf-version x0.12 seems bug free */
X/*:06-20-1990-03:03-root at 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 at n4hgf-1.03-better error handling
X#:06-21-1990-14:27-r at n4hgf-version x0.12 seems bug free
X#:06-19-1990-21:37-wht at 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 at 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 at n4hgf-1.03-better error handling
X#:06-21-1990-14:27-r at n4hgf-version x0.12 seems bug free
X#:06-19-1990-21:37-wht at 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 at 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 at n4hgf-uupoke proceeds even if there is no status file */
X/*:04-03-1990-19:44-wht at 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 at 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 at 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.
More information about the Comp.sources.misc
mailing list