v09i045: siotools part 2/2
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Tue Dec 5 14:09:47 AEST 1989
Posting-number: Volume 9, Issue 45
Submitted-by: wht%n4hgf at gatech.edu (Warren Tucker)
Archive-name: siotools/part02
#!/bin/sh
# This is a shell archive built by shar 3.03
# Created Mon Dec 4 18:28:32 EST 1989 by gatech!kd4nc!n4hgf!wht
# Source directory /u4/src/uusnap
#
# existing files WILL be overwriten
#
# This shar contains:
# siomon.c
# uusnap.c
#
touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$
if [ -s /tmp/s3_touch$$ ]
then
TOUCH=can
else
TOUCH=cannot
fi
rm -f /tmp/s3_touch$$
echo "x - extracting siomon.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > siomon.c &&
X/* CHK=0x4E4E */
Xchar *revision = "1.30";
X/*+-------------------------------------------------------------------------
X siomon.c -- watch XENIX/UNIX serial I/O
X ...!gatech!kd4nc!n4hgf!wht
X
X Sample output:
X 000000000011111111112222222222333333333344444444445555555555666666666677777
X 012345678901234567890123456789012345678901234567890123456789012345678901234
X 00 siomon 1.2 (UNIX V.3.2/i386) n4hgf delay: 1 21:54:54
X 01
X 02 tty raw can out speed state iflag oflag cflag lflag pgrp
X 03 --- --- --- ----- ----- ----- ------ ------ ------ ------ -----
X 04 1a 0 0 0 9600 OC 10045 0 6655 0 0
X 05 1b
X 06 1c
X 07 1d
X 08 1e
X 09 1f
X 10 1g
X 11 1h
X 12 2a
X 13 2b
X 14 2c
X 15 2d 0 0 0 9600 W 0 0 2275 0 0
X 16 2e
X 17 2f 0 0 0 4800 OC 10040 0 2374 0 0
X 18 2g 0 0 0 4800 OC 10005 0 6374 0 0
X 19 2h
X 20
X 21 State: W waiting for open to complete O open C carrier on
X 22 S stopped by XOFF D delay timeout in progress
X 23 Commands: + inc delay - dec delay ^L refresh q quit d detail
X
XUnder XENIX, termio.h is included twice (once by curses.h/tcap.h andf
Xagain by sys/tty.h. You need to bracket the termio.h under XENIX with
X #if !defined(TERMIO_HACK) || (defined(TERMIO_HACK) && !defined(IOCTYPE))
X ...
X #endif
X
X Defined functions:
X detail()
X disp_delay()
X display_tod()
X disp_tty(y,sionum,tty)
X leave()
X main(argc,argv,envp)
X main_template()
X
X Kudos to pyrnj.pyramid.com!romain (Romain Kang) for many suggestions
X regarding screen and CPU efficiency in the original itpmon.c for Pyramid
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:12-04-1989-16:45-wht-add more to detail */
X/*:11-28-1989-19:49-wht-no more sprintf and allow nap/rdchk in lieu of select */
X/*:11-22-1989-12:33-wht-rehost my Pyramid itpmon.c */
X
X/* -------- select(S) availability --------- */
X/* define HAVE_SELECT */ /* uncomment for XENIX/386 2.3.2 and later */
X#if (defined(M_UNIX) && (!defined(HAVE_SELECT))) /* automatic for UNIX */
X#define HAVE_SELECT
X#endif
X
X#include <curses.h>
X#include <signal.h>
X#include <sys/types.h>
X#include <sys/utsname.h>
X#include <time.h>
X
X#if defined(HAVE_SELECT)
X#include <sys/select.h>
X#endif
X
X#define TERMIO_HACK /* for XENIX termio.h multiple inclusion problem */
X#include <sys/tty.h>
X
X#include "wintty.h"
X#include "kmemsio.h"
X#include "utoa.h"
X
X#define HY 2 /* header line */
X#define TX 1
X#define RX 6
X#define CX 11
X#define OX 16
X#define SX 23
X#define FX 30
X
Xextern char _sobuf[];
Xextern int errno;
Xextern char *sys_errlist[];
X
Xint no_tod = 0;
Xint delay_secs = 1;
Xstruct utsname me;
X
X/*+-------------------------------------------------------------------------
X leave() - terminate curses, reset terminal and exit
X--------------------------------------------------------------------------*/
Xvoid
Xleave()
X{
X if(!stdscr)
X {
X nocrmode();
X echo();
X exit(0);
X }
X move(LINES - 1,0);
X refresh();
X endwin();
X exit(0);
X} /* end of leave */
X
X/*+-------------------------------------------------------------------------
X disp_tty(y,sionum,tty)
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_tty(y,sionum,tty)
Xint y;
Xint sionum;
Xregister struct tty *tty;
X{
Xregister int xo = (sionum > 15) ? 40 : 0; /* x offset */
Xregister unsigned int itmp;
Xregister opened = tty->t_state & (ISOPEN | WOPEN);
Xchar s8[8];
X
X move(y,TX + xo);
X addch((sionum < 8) ? '1' : '2');
X addch((sionum % 8) + 'a');
X
X if(!opened)
X {
X clrtoeol();
X return;
X }
X
X if((itmp = (unsigned)tty->t_rawq.c_cc) > 999)
X itmp = 999;
X utoda(s8,3,itmp);
X move(y,RX + xo);
X if(itmp > 10)
X standout();
X addstr(s8);
X if(itmp > 10)
X standend();
X
X if((itmp = (unsigned)tty->t_canq.c_cc) > 999)
X itmp = 999;
X utoda(s8,3,itmp);
X move(y,CX + xo);
X addstr(s8);
X
X if((itmp = (unsigned)tty->t_outq.c_cc + tty->t_tbuf.c_count) > 99999)
X itmp = 99999;
X utoda(s8,5,itmp);
X move(y,OX + xo);
X addstr(s8);
X
X move(y,SX + xo);
X addstr(B_to_baud_rate(tty->t_cflag & CBAUD));
X
X strcpy(s8," ");
X if(tty->t_state & WOPEN)
X s8[0] = 'W';
X else if(tty->t_state & ISOPEN)
X s8[0] = 'O';
X if(tty->t_state & CARR_ON)
X s8[1] = 'C';
X if(tty->t_state & BUSY)
X s8[2] = 'B';
X if(tty->t_state & TTSTOP)
X s8[3] = 'S';
X if(tty->t_state & TIMEOUT)
X s8[3] = 'D';
X move(y,FX + xo);
X addstr(s8);
X
X utooa(s8,7,tty->t_iflag);
X addstr(s8);
X
X utooa(s8,7,tty->t_oflag);
X addstr(s8);
X
X utooa(s8,7,tty->t_cflag);
X addstr(s8);
X
X utooa(s8,7,tty->t_lflag);
X addstr(s8);
X
X utoda(s8,6,tty->t_pgrp);
X addstr(s8);
X
X} /* end of disp_tty */
X
X/*+-------------------------------------------------------------------------
X disp_delay()
X--------------------------------------------------------------------------*/
Xvoid
Xdisp_delay()
X{
Xchar dmsg[12];
X
X move(0,50);
X addstr("delay: ");
X utoda(dmsg,2,delay_secs);
X addstr(dmsg);
X} /* end of disp_delay */
X
X/*+-------------------------------------------------------------------------
X display_tod()
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_tod()
X{
Xregister struct tm *lt; /* local time */
Xstruct tm *localtime();
Xlong now;
Xchar buf[10];
X
X if(no_tod)
X return;
X
X time(&now);
X lt = localtime(&now);
X utoda_lz(buf,2,lt->tm_hour);
X buf[2] = ':';
X utoda_lz(buf + 3,2,lt->tm_min);
X buf[5] = ':';
X utoda_lz(buf + 6,2,lt->tm_sec);
X move(0,COLS - 13);
X addstr(buf);
X} /* end of display_tod */
X
X/*+-------------------------------------------------------------------------
X main_template()
X--------------------------------------------------------------------------*/
Xvoid
Xmain_template()
X{
Xstatic char *header =
X " tty raw can out speed state iflag oflag cflag lflag pgrp";
Xstatic char *hyphens =
X " --- --- --- ----- ----- ----- ------ ------ ------ ------ -----";
XFILE *fp = fopen("/etc/systemid","r");
Xchar sysid[32];
X
X wclear(stdscr);
X move(0,0);
X standout();
X printw(" siomon %s (%s V.%s/%s)",
X revision,
X#if defined(M_UNIX)
X "UNIX",
X#else
X "XENIX",
X#endif
X me.release,me.machine);
X if(fp)
X {
X sysid[0] = 0;
X fgets(sysid,sizeof(sysid),fp);
X if(sysid[0])
X {
X sysid[strlen(sysid) - 1] = 0;
X printw(" %s ",sysid);
X }
X fclose(fp);
X }
X standend();
X move(HY,0);
X addstr(header);
X move(HY + 1,0);
X addstr(hyphens);
X move(LINES - 4,0);
X addstr(
X"State: W waiting for open to complete O open C carrier on");
X move(LINES - 3,0);
X addstr(
X" S stopped by XOFF D delay timeout in progress ");
X move(LINES - 2,0);
X addstr(
X"Commands: + inc delay - dec delay ^L refresh q quit d detail");
X move(LINES - 1,0);
X disp_delay();
X refresh();
X} /* end of main_template */
X
X/*+-------------------------------------------------------------------------
X detail()
X--------------------------------------------------------------------------*/
Xvoid
Xdetail()
X{
Xint y,x;
Xint sionum;
Xchar tty_name[16];
Xchar *cptr;
Xchar cmd;
Xint cmd_available;
X#if defined(HAVE_SELECT)
Xstruct timeval timeout;
Xint readfds;
X#else
Xlong ltimeout;
Xlong nap();
X#endif
X
X for(y = 0; y < 16; y++)
X {
X move(HY + 2 + y,0);
X clrtoeol();
X }
X move(HY + 2,0);
X addstr("display detail on /dev/tty__");
X getyx(stdscr,y,x);
X move(y,x - 2);
X refresh();
X resetty();
X getstr(tty_name);
X raw();
X noecho();
X
X if((strlen(tty_name) == 2) &&
X ((tty_name[0] == '1') || (tty_name[0] == '2')))
X sionum = ((tty_name[0] - '1') * 8) + ((tty_name[1] & 7) - 1);
X else
X {
X fputc(7,stderr);
X goto DETAIL_EXIT;
X }
X
X move(HY + 2 + 11,0);
X addstr("press ESC to return to main display (or -,+ delay cmds)");
X
X move(HY + 2,0);
X clrtoeol();
X wintty_template(stdscr,HY + 2 + 2,0,1);
X while(1)
X {
X display_tod();
X kmem_read_tty(sionum,1);
X disp_tty(HY + 2,sionum,&sio[0]);
X wintty(stdscr,HY + 2 + 2,0,&sio[0]);
X move(HY + 2 + 11,0);
X refresh();
X#if defined(HAVE_SELECT)
X readfds = 1; /* for standard input */
X timeout.tv_sec = delay_secs;
X timeout.tv_usec = (delay_secs) ? 0 : 100*1000L;
X cmd_available = (select(32,&readfds,0,0,&timeout) > 0);
X#else
X ltimeout = (delay_secs) ? (delay_secs * 1000L) : 100L;
X while(ltimeout > 0)
X {
X ltimeout -= nap(100L);
X if(cmd_available = rdchk(0))
X break;
X }
X#endif
X if(rdchk(0))
X {
X cmd = getch();
X if(cmd == 0x1B)
X break;
X switch(cmd)
X {
X case '+':
X delay_secs++;
X disp_delay();
X break;
X
X case '-':
X if(!delay_secs)
X break;
X delay_secs--;
X disp_delay();
X break;
X }
X }
X }
X
XDETAIL_EXIT:
X main_template();
X refresh();
X
X} /* end of detail */
X
X/*+-------------------------------------------------------------------------
X main(argc,argv,envp)
X--------------------------------------------------------------------------*/
Xmain(argc,argv,envp)
Xint argc;
Xchar **argv;
Xchar **envp;
X{
Xregister sionum;
Xchar *cptr;
Xint cmd_available;
X#if defined(HAVE_SELECT)
Xstruct timeval timeout;
Xint readfds;
X#else
Xlong ltimeout;
Xlong nap();
X#endif
X
X if((argc > 1) && !strcmp(argv[1],"-n"))
X no_tod = 1;
X
X signal(SIGINT,leave);
X signal(SIGTERM,leave);
X uname(&me);
X
X setbuf(stdout,_sobuf);
X initscr();
X crmode();
X noecho();
X if(!stdscr)
X {
X fprintf(stderr,"curses init failed\n");
X nocrmode();
X echo();
X exit(1);
X }
X main_template();
X
X move(4,0);
X standout();
X addstr(" initializing ");
X if(cptr = kmem_init_tty())
X {
X move(4,0);
X addstr(cptr);
X leave();
X }
X standend();
X refresh();
X
X move(4,0);
X addstr(" ");
X
X while(1)
X {
X kmem_read_tty(0,16);
X for(sionum = 0; sionum < SIO_NTTY; sionum++)
X disp_tty(HY + 2 + (sionum & 15),sionum,&sio[sionum]);
X display_tod();
X move(LINES - 1,0);
X refresh();
X
X#if defined(HAVE_SELECT)
X readfds = 1; /* for standard input */
X timeout.tv_sec = delay_secs;
X timeout.tv_usec = (delay_secs) ? 0 : 100*1000L;
X cmd_available = (select(32,&readfds,0,0,&timeout) > 0);
X#else
X ltimeout = (delay_secs) ? (delay_secs * 1000L) : 100L;
X while(ltimeout > 0)
X {
X ltimeout -= nap(100L);
X if(cmd_available = rdchk(0))
X break;
X }
X#endif
X
X if(cmd_available)
X {
X char ch;
X ch = getch();
X switch(ch & 0x7F)
X {
X case 'L' & 0x1F: /* redraw screen */
X case 'R' & 0x1F: /* redraw screen */
X main_template();
X continue;
X
X case '+':
X delay_secs++;
X disp_delay();
X break;
X
X case '-':
X if(!delay_secs)
X break;
X delay_secs--;
X disp_delay();
X break;
X
X case 'q': /* quit */
X case 0x1B:
X leave();
X break;
X
X case 'd': /* detail */
X detail();
X break;
X
X }
X }
X }
X} /* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of siomon.c */
SHAR_EOF
chmod 0644 siomon.c || echo "restore of siomon.c fails"
if [ $TOUCH = can ]
then
touch -m 1204182889 siomon.c
fi
echo "x - extracting uusnap.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > uusnap.c &&
X/* CHK=0xB1F9 */
Xchar *revision = "1.60";
X/*+-------------------------------------------------------------------------
X uusnap.c - display UUCP communications status for HDB systems
X ...gatech!kd4nc!n4hgf!wht
X
X Many ideas in this program came from uustatus.c by Ed Carp
X
X Defined functions:
X basename(fullname)
X bye(sig)
X cmd_line(text)
X datetime5(secs)
X detail()
X dir_close(dirp)
X dir_open(dirname)
X dir_read(dirp)
X display_status(sysnum,system_name,y,status_info)
X display_tod()
X display_tty(sionum,tty)
X get_status_info(system_name,buf,bufsize)
X lockpid_to_tty(lockpid)
X main(argc,argv)
X spooldirname(fname)
X statdirname(fname)
X
XUnder XENIX, termio.h is included twice (once by curses.h/tcap.h andf
Xagain by sys/tty.h. You need to bracket the termio.h under XENIX with
X #if !defined(TERMIO_HACK) || (defined(TERMIO_HACK) && !defined(IOCTYPE))
X ...
X #endif
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:12-04-1989-16:45-wht-add detail in full */
X/*:12-01-1989-16:53-wht-XENIX 286 work: no beep()! */
X/*:11-30-1989-17:48-wht-complete rewrite to add detail status */
X
X#include <curses.h>
X#include <signal.h>
X#include <time.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#define TERMIO_HACK /* for XENIX termio.h multiple inclusion problem */
X#include <sys/tty.h>
X#include <sys/utsname.h>
X#if defined(M_UNIX)
X#include <sys/select.h>
X#endif
X
X#include "wintty.h"
X#include "kmemsio.h"
X#include "utoa.h"
X
X#define FIRSTSYS_Y 4
X#define NAME_X 4
X#define RCNT_X 14
X#define QCNT_X 19
X#define LAST_X 24
X#define NEXT_X 30
X#define PID_X 36
X#define STATUS_X 42
X
X/* display_tty x offsets */
X#define TX 0
X#define RX 5
X#define CX 10
X#define OX 15
X#define SX 22
X#define FX 29
X
Xextern char _sobuf[];
Xextern int errno;
Xextern char *sys_errlist[];
X
X#define DDIR FILE
XDDIR *stat_dp;
XDDIR *work_dp;
Xstruct dent
X{
X unsigned short d_inode;
X char d_name[14];
X};
X
Xlong secs_now;
Xint systems;
Xint no_tod = 0;
Xchar sysnames[64 * 16]; /* sorta hack, but ka-plenty name space */
Xchar locked_tty[16];
X
Xchar *STATUSDIR = "/usr/spool/uucp/.Status";
Xchar *LOCKDIR = "/usr/spool/uucp/LCK..";
Xchar *WORKDIR = "/usr/spool/uucp/";
Xchar *SPOOLDIR = "/usr/spool/uucp";
Xchar *LOGFILE = "/tmp/uuexp.log";
X
X#define MAX_SYSTEMS (LINES - FIRSTSYS_Y - 6)
X#define WAITSECS_ACTIVE 1 /* sleep secs between samples when talking */
X#define WAITSECS_IDLE 7 /* sleep secs between samples when not talking */
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
Xstruct utsname me;
Xint uucico_active;
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
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 datetime5(secs) - return 5 char date or time string
X
Xneeds global 'secs_now' to reflect current time in "seconds since epoch"
X(done by display_tod()); returns 5 character 'mm/dd' if time now is more
Xthan 12 hours before now or 12 hours from now
X--------------------------------------------------------------------------*/
Xchar *
Xdatetime5(secs)
Xlong secs;
X{
Xregister long delta = secs_now - secs;
Xstruct tm *lt = localtime(&secs);
Xstatic char dt5[8];
X
X if(delta < 0)
X delta = -delta;
X
X if(delta > (12L * 3600))
X {
X utoda_lz(dt5,2,lt->tm_mon);
X dt5[2] = '/';
X utoda_lz(dt5 + 3,2,lt->tm_mday);
X }
X else
X {
X utoda_lz(dt5,2,lt->tm_hour);
X dt5[2] = ':';
X utoda_lz(dt5 + 3,2,lt->tm_min);
X }
X
X return(dt5);
X
X} /* end of datetime5 */
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 display_tod()
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_tod()
X{
Xregister struct tm *lt; /* local time */
Xstruct tm *localtime();
Xchar buf[10];
X
X (void)time(&secs_now);
X
X if(no_tod)
X return;
X
X lt = localtime(&secs_now);
X utoda_lz(buf,2,lt->tm_hour);
X buf[2] = ':';
X utoda_lz(buf + 3,2,lt->tm_min);
X buf[5] = ':';
X utoda_lz(buf + 6,2,lt->tm_sec);
X move(0,COLS - 13);
X addstr(buf);
X
X} /* end of display_tod */
X
X/*+-------------------------------------------------------------------------
X bye(sig) - exit cleanly
X--------------------------------------------------------------------------*/
Xvoid
Xbye(sig)
Xint sig;
X{
X if(stdscr)
X {
X standend();
X move(LINES - 4,0);
X clrtobot();
X refresh();
X echo();
X noraw();
X move(LINES - 1,0);
X refresh();
X endwin();
X }
X exit(0);
X} /* end of bye */
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 cmd_line(text)
X--------------------------------------------------------------------------*/
Xcmd_line(text)
Xchar *text;
X{
X move(LINES - 4,0);
X clrtoeol();
X
X if(!text)
X addstr(
X "type 'q' to quit, 'd' for detail, SPACE to update immediately");
X else
X addstr(text);
X
X} /* end of cmd_line */
X
X/*+-------------------------------------------------------------------------
X get_status_info(system_name,buf,bufsize)
X--------------------------------------------------------------------------*/
Xint
Xget_status_info(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 get_status_info */
X
X/*+-------------------------------------------------------------------------
X display_status(sysnum,system_name,y,status_info)
X
Xcalled with status_info either .Status/<system_name> line or null
Xif a tty is locked on the line, global locked_tty has "ttyxx"
Xreturns -1 if status_info null and can't get it, else 0
X--------------------------------------------------------------------------*/
Xdisplay_status(sysnum,system_name,y,status_info)
Xint sysnum;
Xchar *system_name;
Xint y;
Xchar *status_info;
X{
Xint itmp;
Xint retry_count;
Xint status;
Xint queue_count;
Xchar *stattxt;
Xint locking_pid;
Xchar *ttyname;
Xchar lock_name[64];
Xchar s32[32];
Xchar work_dir[64];
Xchar linebuf[512];
Xlong secs_last_try;
Xlong secs_next_try;
Xstruct dent *dp;
XFILE *fp;
X
X if(!status_info)
X {
X status_info = linebuf;
X if(get_status_info(system_name,status_info,sizeof(linebuf)))
X return(-1);
X }
X
X sscanf(status_info,"%d %d %ld %ld",
X &status,&retry_count,&secs_last_try,&secs_next_try);
X secs_next_try += secs_last_try; /* files has secs til next retry */
X
X strcpy(work_dir,WORKDIR);
X strcat(work_dir,system_name);
X
X queue_count = 0;
X if(work_dp = dir_open(work_dir))
X {
X /* count the number of C. queue_count */
X while(dp = dir_read(work_dp))
X {
X if(!strncmp(dp->d_name,"C.",2))
X queue_count++;
X if(queue_count > 99)
X break;
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) && (status != SS_TALKING))
X status = SS_CALL_IN_PROGRESS;
X if(status == SS_BADSYSTEM)
X status = SS_DEVICE_FAILED;
X
X move(y,0);
X utoda(s32,2,sysnum);
X addstr(s32);
X addch(' ');
X
X strcpy(s32,system_name);
X if(strlen(s32) > 10)
X s32[10] = 0;
X addstr(s32);
X
X move(y,RCNT_X);
X if(retry_count)
X {
X if(retry_count > 999)
X retry_count = 999;
X utoda(s32,3,retry_count);
X addstr(s32);
X }
X else
X addstr(" ");
X
X move(y,QCNT_X);
X if(queue_count)
X {
X if(queue_count > 99)
X addstr(">99");
X else
X {
X utoda(s32,3,queue_count);
X addstr(s32);
X }
X }
X else
X addstr(" ");
X
X move(y,LAST_X);
X addstr(datetime5(secs_last_try));
X
X move(y,NEXT_X);
X addstr(datetime5(secs_next_try));
X
X locking_pid = 0;
X locked_tty[0] = 0;
X move(y,PID_X);
X addstr(" ");
X ttyname = (char *)0;
X if( (status == SS_TALKING) ||
X (status == SS_LOCKED_DEVICE ) ||
X (status == SS_CALL_IN_PROGRESS))
X {
X uucico_active = 1;
X if(fp = fopen(lock_name,"r"))
X {
X fscanf(fp,"%d",&locking_pid);
X fclose(fp);
X }
X if(locking_pid)
X {
X strcpy(locked_tty,ttyname = lockpid_to_tty(locking_pid));
X move(y,PID_X);
X utoda(s32,5,locking_pid);
X addstr(s32);
X }
X standout();
X }
X
X move(y,STATUS_X);
X if(status > SS_MSG_MAX)
X {
X stattxt = s32;
X strcpy(stattxt,"status ");
X utoda_lz(stattxt + 7,3,status);
X }
X else
X stattxt = errortext[status];
X addstr(stattxt);
X if(ttyname)
X {
X addstr(" (");
X addstr(ttyname);
X addch(')');
X }
X standend();
X itmp = 27 - strlen(stattxt);
X while(itmp--)
X addch(' ');
X return(0);
X} /* end of display_status */
X
X/*+-------------------------------------------------------------------------
X display_tty(sionum,tty)
X--------------------------------------------------------------------------*/
Xvoid
Xdisplay_tty(sionum,tty)
Xint sionum;
Xregister struct tty *tty;
X{
Xregister int x;
Xregister int y;
Xregister unsigned int itmp;
Xchar s8[8];
X
X getyx(stdscr,y,x);
X move(y,TX + x);
X addch((sionum < 8) ? '1' : '2');
X addch((sionum % 8) + 'a');
X
X if((itmp = (unsigned)tty->t_rawq.c_cc) > 999)
X itmp = 999;
X utoda(s8,3,itmp);
X move(y,RX + x);
X if(itmp > 10)
X standout();
X addstr(s8);
X if(itmp > 10)
X standend();
X
X if((itmp = (unsigned)tty->t_canq.c_cc) > 999)
X itmp = 999;
X utoda(s8,3,itmp);
X move(y,CX + x);
X addstr(s8);
X
X if((itmp = (unsigned)tty->t_outq.c_cc + tty->t_tbuf.c_count) > 99999)
X itmp = 99999;
X utoda(s8,5,itmp);
X move(y,OX + x);
X addstr(s8);
X
X move(y,SX + x);
X addstr(B_to_baud_rate(tty->t_cflag & CBAUD));
X
X strcpy(s8," ");
X if(tty->t_state & WOPEN)
X s8[0] = 'W';
X else if(tty->t_state & ISOPEN)
X s8[0] = 'O';
X if(tty->t_state & CARR_ON)
X s8[1] = 'C';
X if(tty->t_state & BUSY)
X s8[2] = 'B';
X if(tty->t_state & TTSTOP)
X s8[3] = 'S';
X if(tty->t_state & TIMEOUT)
X s8[3] = 'D';
X move(y,FX + x);
X addstr(s8);
X
X utooa(s8,7,tty->t_iflag);
X addstr(s8);
X
X utooa(s8,7,tty->t_oflag);
X addstr(s8);
X
X utooa(s8,7,tty->t_cflag);
X addstr(s8);
X
X utooa(s8,7,tty->t_lflag);
X addstr(s8);
X
X utoda(s8,6,tty->t_pgrp);
X addstr(s8);
X
X} /* end of display_tty */
X
X/*+-------------------------------------------------------------------------
X detail()
X--------------------------------------------------------------------------*/
Xvoid
Xdetail()
X{
Xint y,x;
Xint sysdetail;
Xint ttnum;
Xchar *sysname;
Xchar *cptr;
X
Xstatic char *header =
X "tty raw can out speed state iflag oflag cflag lflag pgrp";
Xstatic char *hyphens =
X "--- --- --- ----- ----- ----- ------ ------ ------ ------ -----";
X
X
X cmd_line("display detail on system #: __");
X getyx(stdscr,y,x);
X move(y,x - 2);
X refresh();
X resetty();
X x = scanw("%d",&sysdetail);
X raw();
X noecho();
X sysdetail--;
X if(!x || (sysdetail > systems))
X {
X fputc(7,stderr);
X cmd_line((char *)0);
X refresh();
X return;
X }
X
X cmd_line("press any key to return to main display ");
X sysname = sysnames + (sysdetail << 4);
X y = FIRSTSYS_Y;
X move(y,0);
X clrtobot();
X
X move(y+4,0);
X addstr(header);
X move(y+5,0);
X addstr(hyphens);
X move(y+8,0);
X addstr(
X"State: W waiting for open to complete O open C carrier on");
X move(y+9,0);
X addstr(
X" S stopped by XOFF D delay timeout in progress ");
X
X
X while(1)
X {
X display_tod(); /* display time and get 'secs_now' */
X if(display_status(sysdetail + 1,sysname,FIRSTSYS_Y,(char *)0))
X {
X move(y,0);
X standout();
X printw("cannot get status for %s",sysname);
X standend();
X clrtobot();
X goto DETAIL_SLEEP;
X }
X
X /* 00000 */
X /* 01234 */
X /* ttyxx */
X move(y+6,0);
X if(locked_tty[0] && ((locked_tty[3] == '1') || (locked_tty[3] == '2')))
X {
X ttnum = ((locked_tty[3] - '1') * 8) + ((locked_tty[4] & 7) - 1);
X if(cptr = kmem_read_tty(ttnum,1))
X {
X standout();
X addstr(cptr);
X addstr(": ");
X addstr(locked_tty);
X cmd_line("press any key to return to main display ");
X standend();
X refresh();
X getch();
X goto DETAIL_EXIT;
X }
X clrtoeol();
X display_tty(ttnum,&sio[0]);
X wintty_template(stdscr,y+11,0,1);
X wintty(stdscr,y+11,0,&sio[0]);
X move(y+11,0);
X }
X else
X {
X printw(" no tty or non-async connection");
X clrtoeol();
X wintty_template(stdscr,y+11,0,0);
X }
X
XDETAIL_SLEEP:
X refresh();
X sleep(1);
X if(rdchk(0))
X {
X getch();
X break;
X }
X }
X
XDETAIL_EXIT:
X move(y = FIRSTSYS_Y,0);
X clrtobot();
X cmd_line((char *)0);
X refresh();
X
X} /* end of detail */
X
X/*+-------------------------------------------------------------------------
X main(argc,argv)
X--------------------------------------------------------------------------*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
Xint display_delta_y;
Xchar s32[32];
Xchar linebuf[512];
Xchar *sysname;
Xchar *cptr;
Xchar cmd;
XFILE *fp;
Xstruct dent *dp;
X#if defined(M_UNIX)
Xstruct timeval timeout;
Xint fdmask;
X#else
Xlong nap();
Xlong timeout;
X#endif
X
X if((argc > 1) && !strcmp(argv[1],"-n"))
X no_tod = 1;
X
X setbuf(stdout,_sobuf);
X
X if(!initscr())
X {
X fprintf(stderr,"curses init failed... check terminal type\n");
X exit(0);
X }
X savetty();
X noecho();
X raw();
X
X signal(SIGTERM,bye);
X signal(SIGINT,bye);
X signal(SIGHUP,bye);
X
X uname(&me);
X cmd_line((char *)0);
X
X move(0,0);
X standout();
X printw(" uusnap %s (%s V.%s/%s)",
X revision,
X#if defined(M_UNIX)
X "UNIX",
X#else
X "XENIX",
X#endif
X me.release,me.machine);
X if(fp = fopen("/etc/systemid","r"))
X {
X s32[0] = 0;
X fgets(s32,sizeof(s32),fp);
X if(s32[0])
X {
X s32[strlen(s32) - 1] = 0;
X printw(" %s ",s32);
X }
X fclose(fp);
X }
X standend();
X
X move(2,0);
X standout();
X addstr(" initializing ");
X refresh();
X if(cptr = kmem_init_tty())
X {
X move(2,0);
X addstr(cptr);
X bye(255);
X }
X standend();
X
X move(2,0);
X addstr(" # SYSTEM RCNT QCNT LAST NEXT PID STATUS");
X move(3,0);
X addstr("-- ------ ---- ---- ---- ---- --- ------");
X while(1)
X {
X uucico_active = 0; /* assume no uucico_active connections */
X display_tod(); /* display time and get 'secs_now' */
X
X if(!(stat_dp = dir_open(statdirname("."))))
X {
X move(6,0);
X printw("%s: %s",STATUSDIR,sys_errlist[errno]);
X move(7,0);
X addstr("I don't think HoneyDanBer UUCP is installed.");
X bye(255);
X }
X display_delta_y = systems = 0;
X move(LINES - 4,0);
X move(FIRSTSYS_Y,0);
X while(dp = dir_read(stat_dp))
X {
X if(display_delta_y > MAX_SYSTEMS)
X break;
X if(*dp->d_name == '.')
X continue;
X if(get_status_info(dp->d_name,linebuf,sizeof(linebuf)))
X continue;
X
X sysname = sysnames + (systems++ << 4);
X strcpy(sysname,dp->d_name);
X
X display_status(systems,sysname,display_delta_y + FIRSTSYS_Y,linebuf);
X display_delta_y++;
X }
X display_delta_y++;
X move(display_delta_y + FIRSTSYS_Y,0);
X addstr("UUCP connections active: ");
X utoda(s32,2,systems);
X addstr(s32);
X display_delta_y++;
X while(display_delta_y < MAX_SYSTEMS)
X {
X move(display_delta_y++ + FIRSTSYS_Y,0);
X clrtoeol();
X }
X
X dir_close(stat_dp);
X move(LINES - 4,0);
X refresh();
X
X#if defined(M_UNIX)
X timeout.tv_sec = (uucico_active) ? WAITSECS_ACTIVE : WAITSECS_IDLE;
X timeout.tv_usec = 0;
X fdmask = 1 << 0;
X select(32,&fdmask,(int *)0,(int *)0,&timeout);
X#else
X timeout = ((uucico_active) ? WAITSECS_ACTIVE : WAITSECS_IDLE) * 1000L;
X while(timeout > 0)
X {
X timeout -= nap(200L);
X if(rdchk(0))
X break;
X }
X#endif
X
X if(rdchk(0))
X {
X read(0,&cmd,1);
X cmd &= 0x7f;
X switch(cmd &= 0x7f)
X {
X case 'q':
X bye(0);
X case 'd':
X detail();
X break;
X }
X }
X }
X} /* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of uusnap.c */
SHAR_EOF
chmod 0644 uusnap.c || echo "restore of uusnap.c fails"
if [ $TOUCH = can ]
then
touch -m 1204182889 uusnap.c
fi
exit 0
More information about the Comp.sources.misc
mailing list