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.