wht@tridom.uucp (Warren Tucker) (09/26/89)
ads 1.00 - Asynchronous Data Scope for SCO XENIX 386 ...!gatech!emory!tridom!wht This program acts as a data scope of sorts for asynchronous lines on SCO XENIX 386 systems. The program lets you display the traffic between any two tty lines. A log and replay feature is supported in two ways: either during the data scope session or off-line using an auxiliary program (adsplog). ---- Cut Here and unpack ---- #!/bin/sh # shar: Shell Archiver (v1.22) # Packed Mon Sep 25 15:22:54 EDT 1989 by wht # from directory /u1/src/ads # # This is part 1 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # # Run the following text with /bin/sh to create: # Makefile # README # ads.c # ads.h # adsfuncs.h # adsplog.c # afterlint.c # cmdline.c # curseslint.h # keyboard.h # lineio.c # screen.c # time.c # x386sel/fixttiocom.c # x386sel/select-update # x386sel/select.asm # x386sel/select.txt # x386sel/ttiocom.c # zgcc # if test -r s2_seq_.tmp then echo "Must unpack archives in sequence!" next=`cat s2_seq_.tmp`; echo "Please unpack part $next next" exit 1; fi echo "x - extracting Makefile (Text)" sed 's/^X//' << 'SHAR_EOF' > Makefile && X# Makefile for ads X#+:EDITS: X#:09-22-1989-18:57-wht-add adsplog X#:05-14-1989-16:33-wht-creation X X.SUFFIXES: .o .c .h X XSHELL = /bin/sh X XCOMMONFLAGS = -i -Zi #-Ox XCFLAGS = $(COMMONFLAGS) -c -DLINT_ARGS XLFLAGS = $(COMMONFLAGS) -ltcap -ltermlib -lx X.c.o:; cc $(CFLAGS) $*.c X XSRC = \ X ads.c\ X adsplog.c\ X cmdline.c\ X lineio.c\ X screen.c\ X time.c X XADS_OBJ = \ X ads.o\ X cmdline.o\ X lineio.o\ X screen.o\ X time.o X XADSPLOG_OBJ = \ X adsplog.o\ X time.o X XSHAR_FILES = \ X Makefile\ X README\ X ads.c\ X ads.h\ X adsfuncs.h\ X adsplog.c\ X afterlint.c\ X cmdline.c\ X curseslint.h\ X keyboard.h\ X lineio.c\ X screen.c\ X time.c\ X x386sel/fixttiocom.c\ X x386sel/select-update\ X x386sel/select.asm\ X x386sel/select.txt\ X x386sel/ttiocom.c\ X zgcc X Xall: ads adsplog X Xads: $(ADS_OBJ) X cc $(LFLAGS) $(ADS_OBJ) -o $@ X Xadsplog: $(ADSPLOG_OBJ) X cc $(LFLAGS) $(ADSPLOG_OBJ) -o $@ X Xads.fls: $(SRC) X ls $(SRC) >ads.fls X Xlint: ads.fls afterlint X echo > adsfuncs.h X csh zgcc ads.fls adsfuncs.h $(CFLAGS) X Xclean: X rm -f $(ADS_OBJ) $(ADSPLOG_OBJ) X Xclobber: clean X rm -f ads X Xafterlint: X cc -Ox afterlint.c -o $@ X Xshar: X shar -v -D -c -o/tmp/ads.sh. -l32 $(SHAR_FILES) X X# X# MAKE DEPEND: regenerate .c:.h, .ol:.c, .ol:.asm dependencies automatically X# Xdepend: X rm -f depend.tmp X if test '$(SRC)' ;\ X then (grep '^#include' $(SRC) \ X | sed -e 's?:[^<]*<\([^>]*\)>.*?: /usr/include/\1?'\ X -e 's?:[^"]*"\([^"]*\)".*?: \1?'\ X -e 's?\(.*\)\.c?\1.o?'\ X >> depend.tmp) ;\ X fi X X echo '/^# DO NOT DELETE THIS LINE' >exdep.tmp X echo '.+1,$$d' >>exdep.tmp X echo 'r depend.tmp' >> exdep.tmp X echo 'w' >> exdep.tmp X cp Makefile Makefile.new X ex Makefile.new < exdep.tmp X /bin/rm exdep.tmp depend.tmp X echo '# DEPENDENCIES MUST END AT END OF FILE' >>Makefile.new X echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY'>>Makefile.new X echo '# see make depend above'>>Makefile.new X mv Makefile Makefile.bak X mv Makefile.new Makefile X X# DO NOT DELETE THIS LINE Xads.o: /usr/include/curses.h Xads.o: /usr/include/sys/select.h Xads.o: ads.h Xadsplog.o: /usr/include/stdio.h Xadsplog.o: ads.h Xcmdline.o: ads.h Xlineio.o: ads.h Xscreen.o: /usr/include/curses.h Xscreen.o: ads.h Xscreen.o: keyboard.h Xtime.o: /usr/include/stdio.h Xtime.o: /usr/include/sys/time.h Xtime.o: ads.h X# DEPENDENCIES MUST END AT END OF FILE X# IF YOU PUT STUFF HERE IT WILL GO AWAY X# see make depend above SHAR_EOF chmod 0644 Makefile || echo "restore of Makefile fails" echo "x - extracting README (Text)" sed 's/^X//' << 'SHAR_EOF' > README && X Xads 1.00 - Asynchronous Data Scope for SCO XENIX 386 X...!gatech!emory!tridom!wht X XThis program acts as a data scope of sorts for asynchronous lines Xon SCO XENIX 386 systems. The program lets you display the traffic Xbetween any two tty lines. A log and replay feature is supported Xin two ways: either during the data scope session or off-line Xusing an auxiliary program (adsplog). X XUse ads to display on-line data, log and replay during a test. XUse adsplog to display log files after testing has been completed. X XSCO XENIX V/386 Release 2.3.1 (and evidently 2.3.2) have Xa broken-dead, yet fixable, BSD-style select() feature which is Xneeded to support ads. Also, select() is missing from libc.a. XThe x386sel subdirectory in this release Xhas information (thanks to csch@netcs, ivar@acc, and ag@elgar) Xon how to fix the kernel and to add select() to libc.a. X XUsage for ads can be obtained by running the program without Xarguments. Sinc adsplog has default actions when no arguments are Xgiven, usage information is given here: X Xusage: adsplog [-t] [logname] X-t causes elapsed time information to be displayed. Xlogname defaults to 'ads.log' (the name used by ads) X Xafterlint and zgcc are used to build header file adsfuncs.h Xand may have other applications. X XFiles: X------------------------- XMakefile XREADME Xads.c Xads.h Xadsfuncs.h Xadsplog.c Xafterlint.c Xcmdline.c Xcurseslint.h Xkeyboard.h Xlineio.c Xscreen.c Xtime.c Xx386sel/fixttiocom.c Xx386sel/select-update Xx386sel/select.asm Xx386sel/select.txt Xx386sel/ttiocom.c Xzgcc SHAR_EOF chmod 0644 README || echo "restore of README fails" echo "x - extracting ads.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ads.c && Xchar *revision = "1.00"; X/*+------------------------------------------------------------------------- X ads.c - async data scope for SCO XENIX V/386 X ...!gatech!emory!tridom!wht X X Defined functions: X ads() X adslog(line) X adslog_control(state) X adslog_init(line) X adslog_read(pdevice,ptime_then,buf,bufmax,pcount) X adsplay() X endprog() X main(argc,argv,envp) X main_label() X play_label(eof) X XThis program was put together using several "junkbox" code fragments and Xain't (Southern USA for 'isn't) exactly as small as it could be. X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:09-22-1989-19:35-wht-more logging features */ X/*:09-06-1989-21:24-wht-logging */ X/*:05-13-1989-16:14-wht-creation */ X X#define M_TERMCAP X#include <curses.h> X#include <sys/select.h> X#include "ads.h" X XWINDOW *window_create(); Xlong time(); Xchar *strchr(); Xchar *secs_to_str(); X XLCB lcbs[2]; XLCB *l0 = &lcbs[0]; XLCB *l1 = &lcbs[1]; Xint logging = 0; XFILE *fplog = (FILE *)0; Xchar *adslog_name = LOGNAME; Xchar title[32]; Xchar devname0[32]; Xchar devname1[32]; XWINDOW *win; Xint ymax; Xlong time0; Xlong time_now; X X/*+------------------------------------------------------------------------- X endprog() - end program cleanly X--------------------------------------------------------------------------*/ Xvoid Xendprog() X{ X windows_end(); X exit(0); X} /* end of endprog */ X X/*+------------------------------------------------------------------------- X main_label() - display main screen label X--------------------------------------------------------------------------*/ Xvoid Xmain_label() X{ X clear_area(win,1,2,75); X wstandout(win); X waddstr(win," on line "); X wstandend(win); X waddstr(win, X " commands: l-log on n-log off r-replay log e-erase log q-quit"); X wrefresh(win); X} /* end of main_label */ X X/*+------------------------------------------------------------------------- X play_label(eof) - display replay screen label X--------------------------------------------------------------------------*/ Xvoid Xplay_label(eof) Xint eof; X{ X clear_area(win,1,2,75); X wstandout(win); X if(eof) X { X waddstr(win," replay EOF "); X wstandend(win); X waddstr(win, X " commands: r-rewind q-quit"); X } X else X { X waddstr(win," replaying "); X wstandend(win); X waddstr(win, X " commands: f-faster s-slower p-pause c-continue r-rewind q-quit"); X } X wrefresh(win); X} /* end of play_label */ X X/*+------------------------------------------------------------------------- X adslog_init(line) - initialize/reset logging buffer in lcb X--------------------------------------------------------------------------*/ Xvoid Xadslog_init(line) XLCB *line; X{ X line->logbuf_ptr = line->logbuf; X line->logbuf_count = 0; X} /* end of adslog_init */ X X/*+------------------------------------------------------------------------- X adslog(line) - write log information for line to log file X--------------------------------------------------------------------------*/ Xvoid Xadslog(line) XLCB *line; X{ Xlong time_val = time((long *)0); X X if(!line->logbuf_count) X return; X fputc(((line->line_num) ? 0x80 : 0) + line->logbuf_count,fplog); X fwrite((char *)&time_val,sizeof(long),1,fplog); X fwrite(line->logbuf,1,line->logbuf_count,fplog); X adslog_init(line); X X} /* end of adslog */ X X/*+------------------------------------------------------------------------- X adslog_read(ptime_then,buf,bufmax,pcount) - read log file X--------------------------------------------------------------------------*/ Xint Xadslog_read(pdevice,ptime_then,buf,bufmax,pcount) Xint *pdevice; Xlong *ptime_then; Xchar *buf; Xint bufmax; Xint *pcount; X{ Xint itmp; Xint first_byte; X X if((first_byte = fgetc(fplog)) == EOF) X return(EOF); X if(fread((char *)ptime_then,sizeof(long),1,fplog) != 1) X return(EOF); X *buf = 0; X X switch(first_byte & 0xFF) X { X case LOG_OPEN: X fgets(buf,bufmax,fplog); X if(itmp = strlen(buf)) X buf[itmp - 1] = 0; X return(LOG_OPEN); X X case LOG_TIMEOUT: X return(adslog_read(pdevice,ptime_then,buf,bufmax,pcount)); X X case LOG_CLOSE: X if(itmp = strlen(buf)) X buf[itmp - 1] = 0; X return(LOG_CLOSE); X } X X *pdevice = (first_byte & 0x80) ? 1 : 0; X *pcount = first_byte & 0x7F; X X if(fread(buf,1,*pcount,fplog) != *pcount) X return(EOF); X X return(*pdevice); X X} /* end of adslog_read */ X X/*+------------------------------------------------------------------------- X adslog_control(state) - turn on/off logging, display state on screen X--------------------------------------------------------------------------*/ Xvoid Xadslog_control(state) Xint state; X{ Xint y,x; X X getyx(win,y,x); X switch(state) X { X case 1: X if(logging) X break; X if(fplog = fopen(adslog_name,"a")) X { X logging = 1; X adslog_init(l0); X adslog_init(l1); X wmove(win,0,64); X waddstr(win," logging on "); X wmove(win,y,x); X wrefresh(win); X fputc(LOG_OPEN,fplog); X time_now = time((long *)0); X fwrite((char *)&time_now,sizeof(time_now),1,fplog); X fprintf(fplog,"%s %s\n",devname0,devname1); X } X else X fputc(7,stderr); X break; X case 0: X wmove(win,0,64); X wstandout(win); X waddstr(win," logging off "); X wstandend(win); X wmove(win,y,x); X wrefresh(win); X if(!logging) X break; X adslog(l0); X adslog(l1); X fputc(LOG_CLOSE,fplog); X time_now = time((long *)0); X fwrite((char *)&time_now,sizeof(time_now),1,fplog); X fclose(fplog); X logging = 0; X fplog = (FILE *)0; X wmove(win,y,x); X wrefresh(win); X break; X } X} /* end of adslog_control */ X X/*+------------------------------------------------------------------------- X no_log_file() - tell user that no log file can be found X--------------------------------------------------------------------------*/ Xvoid Xno_log_file() X{ X clear_area(win,1,2,75); X wstandout(win); X waddstr(win," no log file ... press any key to continue "); X wstandend(win); X wrefresh(win); X ttygetc(0); X main_label(); X X} /* end of no_log_file */ X X/*+------------------------------------------------------------------------- X adsplay() - replay log X--------------------------------------------------------------------------*/ Xvoid Xadsplay() X{ Xregister itmp; Xregister printable; Xint device; Xint count; Xint y; Xint x = 2; Xint log_type; Xint cmd; Xlong nap_msec; Xlong time_then; Xchar buf[128]; Xchar *bptr; X X if(!(fplog = fopen(adslog_name,"r"))) X { X no_log_file(); X return; X } X X for(y = 2; y < ymax + 1; y++) X clear_area(win,y,2,75); X X y = 5; X wmove(win,y,x); X wstandout(win); X waddstr(win," log segments recorded: "); X wstandend(win); X wrefresh(win); X y += 2; X while((log_type = adslog_read(&device,&time_then,buf, X sizeof(buf),&count)) != EOF) X { X if(log_type != LOG_OPEN) X continue; X wmove(win,y++,x); X waddstr(win,buf); X waddstr(win," on "); X waddstr(win,secs_to_str(time_then,4,(char *)0)); X } X y++; X wmove(win,y,x); X wstandout(win); X waddstr(win," press space to replay, 'q' to quit "); X wstandend(win); X wrefresh(win); X XSO_SUE_ME: /* labels have their place */ X switch(cmd = ttygetc(0)) X { X case ' ': X break; X case 'q': X y++; X for(itmp = 2; itmp < y; itmp++) X clear_area(win,itmp,2,75); X y = 3; X wmove(win,y,x); X fclose(fplog); X return; X default: X fputc(7,stderr); X goto SO_SUE_ME; X } X X y++; X for(itmp = 2; itmp < y; itmp++) X clear_area(win,itmp,2,75); X XREWIND: X play_label(0); X y = 3; X x = 2; X fclose(fplog); /* clearerr(fplog), rewind(fplog) ... */ X fplog = fopen(adslog_name,"r"); /* ... did not seem to work */ X nap_msec = 0L; X while((log_type = adslog_read(&device,&time_then,buf,sizeof(buf),&count)) X != EOF) X { X switch(log_type) X { X case LOG_OPEN: X case LOG_TIMEOUT: X case LOG_CLOSE: X continue; X } X X bptr = buf; X while(count--) X { X wmove(win,y,x); X if(!device) X wstandout(win); X printable = *bptr & 0x7F; X if((printable >= 0x20) && (printable != 0x7F)) X wprintw(win,"%c%02x",printable,*bptr); X else X wprintw(win,".%02x",*bptr); X if(!device) X wstandend(win); X waddch(win,' '); X x += 4; X if(x > 75) X { X y++; X x = 2; X if(y > ymax) X { X y = 3; X if(!nap_msec) X nap_msec = 300L; X } X if(y <= ymax) X { X clear_area(win,y,x,75); X if(y + 1 <= ymax) X clear_area(win,y + 1,x,75); X } X if(nap_msec) X { X wrefresh(win); X nap(nap_msec); X } X } X wrefresh(win); X bptr++; X if(rdchk(0)) X { XGET_CMD: X switch(cmd = ttygetc(0)) X { X case 'f': X if(nap_msec > 50) X nap_msec -= 50; X break; X case 's': X nap_msec += 50; X break; X case 'p': X goto GET_CMD; X case 'c': X break; X case 'r': X for(y = 2; y < ymax + 1; y++) X clear_area(win,y,2,75); X wrefresh(win); X goto REWIND; X case 'q': X fclose(fplog); X return; X default: X fputc(7,stderr); X break; X } X } X } X } X fclose(fplog); X play_label(1); X while(1) X { X switch(cmd = ttygetc(0)) X { X case 'r': X for(y = 2; y < ymax + 1; y++) X clear_area(win,y,2,75); X wrefresh(win); X goto REWIND; X case 'q': X fclose(fplog); X return; X default: X fputc(7,stderr); X break; X X } X } X X} /* end of adsplay */ X X/*+------------------------------------------------------------------------- X ads() - display async traffic on main screen, optionally logging X--------------------------------------------------------------------------*/ Xvoid Xads() X{ Xint fdmask; Xint fdmask_l0 = 1 << l0->iofd; Xint fdmask_l1 = 1 << l1->iofd; Xint fdmask_kbd = 1 << 0; Xint fdmask_source = fdmask_l0 | fdmask_l1 | fdmask_kbd; Xunsigned char rdchar; Xint y = 3; Xint x = 2; Xstruct timeval timeval_500msec; Xstruct stat statbuf; X X adslog_init(l0); X adslog_init(l1); X X while(1) X { X fdmask = fdmask_source; X timeval_500msec.tv_sec = 0; X timeval_500msec.tv_usec = 500L * 1000L; X select(32,&fdmask,(int *)0,(int *)0,&timeval_500msec); X if(!fdmask && logging) X { X adslog(l0); X adslog(l1); X fputc(LOG_TIMEOUT,fplog); X time_now = time((long *)0); X fwrite((char *)&time_now,sizeof(time_now),1,fplog); X } X if(fdmask & fdmask_l0) X { X while(rdchk(l0->iofd)) X { X read(l0->iofd,l0->logbuf_ptr,1); X write(l1->iofd,l0->logbuf_ptr,1); X rdchar = *l0->logbuf_ptr & 0x7F; X wmove(win,y,x); X wstandout(win); X if((rdchar >= 0x20) && (rdchar != 0x7F)) X wprintw(win,"%c%02x",rdchar,rdchar); X else X wprintw(win,".%02x",rdchar); X wstandend(win); X waddch(win,' '); X x += 4; X if(x > 75) X { X y++; X x = 2; X if(y > ymax) X y = 3; X if(y <= ymax) X { X clear_area(win,y,2,75); X if(y + 1 <= ymax) X clear_area(win,y + 1,2,75); X } X wrefresh(win); X } X if(logging) X { X adslog(l1); X l0->logbuf_ptr++; X if(++l0->logbuf_count == LOGBUFMAX) X adslog(l0); X } X } X wrefresh(win); X } X if(fdmask & fdmask_l1) X { X while(rdchk(l1->iofd)) X { X read(l1->iofd,l1->logbuf_ptr,1); X write(l0->iofd,l1->logbuf_ptr,1); X rdchar = *l1->logbuf_ptr & 0x7F; X wmove(win,y,x); X if((rdchar >= 0x20) && (rdchar != 0x7F)) X wprintw(win,"%c%02x ",rdchar,rdchar); X else X wprintw(win,".%02x ",rdchar); X x += 4; X if(x > 75) X { X y++; X x = 2; X if(y > ymax) X y = 3; X if(y <= ymax) X { X clear_area(win,y,2,75); X if(y + 1 <= ymax) X clear_area(win,y + 1,2,75); X } X wrefresh(win); X } X if(logging) X { X adslog(l0); X l1->logbuf_ptr++; X if(++l1->logbuf_count == LOGBUFMAX) X adslog(l1); X } X } X wrefresh(win); X } X if(fdmask & fdmask_kbd) X { X switch(rdchar = ttygetc(0)) X { X case 'l': X adslog_control(1); X break; X case 'n': X adslog_control(0); X break; X case 'e': X#if defined(NEUROTIC) X if(stat(adslog_name,&statbuf)) X { X no_log_file(); X break; X } X#endif X clear_area(win,1,2,75); X wstandout(win); X waddstr(win," erase log file (y,n)? "); X wstandend(win); X wrefresh(win); X if(ttygetc(0) == 'y') X { X adslog_control(0); X unlink(adslog_name); X } X main_label(); X break; X case 'r': X adslog_control(0); X adsplay(); X main_label(); X x = 2; X for(y = 2; y < ymax + 1; y++) X clear_area(win,y,2,75); X y = 3; X wmove(win,y,x); X wrefresh(win); X break; X case 'q': X adslog_control(0); X return; X } X } X } X} /* end of ads */ X X/*+------------------------------------------------------------------------- X main(argc,argv,envp) X--------------------------------------------------------------------------*/ Xmain(argc,argv,envp) Xint argc; Xchar **argv; Xchar **envp; X{ Xint itmp; Xint y,x; Xchar *parity_string(); Xchar *lopen_err_text(); X X cmdline(argc,argv); X X if(itmp = lopen(l0)) X { X fprintf(stderr,"line 1: %s\n",lopen_err_text(itmp)); X exit(1); X } X X if(itmp = lopen(l1)) X { X fprintf(stderr,"line 2: %s\n",lopen_err_text(itmp)); X exit(1); X } X l0->line_num = 0; X l1->line_num = 1; X X lflush(l0); X lflush(l1); X X signal(SIGHUP,endprog); X signal(SIGTERM,endprog); X signal(SIGINT,endprog); X X windows_start(); X ymax = LINES - 3; X sprintf(title,"ads %s",revision); X if(!(win = window_create(title,3,0,0,LINES-1,COLS - 1))) X { X windows_end(); X fprintf(stderr,"cannot create window!\n"); X exit(0); X } X X sprintf(devname0,"%s-%u-%c",l0->line + 5, X l0->baud,l0->parity,l0->baud,l0->parity); X wmove(win,0,18); X wstandout(win); X waddch(win,' '); X waddstr(win,devname0); X waddch(win,' '); X wstandend(win); X X sprintf(devname1,"%s-%u-%c",l1->line + 5, X l1->baud,l1->parity,l0->baud,l0->parity); X getyx(win,y,x); X wmove(win,y,x + 2); X waddch(win,' '); X waddstr(win,devname1); X waddch(win,' '); X X main_label(); X adslog_control(0); X ads(); X X windows_end(); X exit(0); X} /* end of main */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of ads.c */ SHAR_EOF chmod 0644 ads.c || echo "restore of ads.c fails" echo "x - extracting ads.h (Text)" sed 's/^X//' << 'SHAR_EOF' > ads.h && X/*+------------------------------------------------------------------------- X ads.h X ...!gatech!emory!tridom!wht X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-13-1989-15:44-wht-creation */ X X#if !defined(WINDOW) /* if curses.h not installed */ X#include <stdio.h> X#include <termio.h> X#else X#ifdef LINT_ARGS X#include "curseslint.h" X#endif X#endif X#include <ctype.h> X#include <fcntl.h> X#include <signal.h> X#include <sys/types.h> X#include <sys/stat.h> X#include <errno.h> X X#if !defined(ushort) X#define ushort unsigned short X#endif X#if !defined(uchar) X#define uchar unsigned char X#endif X#if !defined(uint) X#define uint unsigned int X#endif X#if !defined(ulong) X#define ulong unsigned long X#endif X X#define ff fprintf X#define se stderr X X/* log-related definitions */ X#define LOGNAME "ads.log" X#define LOGBUFMAX 64 X#define LOG_OPEN 0xF1 X#define LOG_TIMEOUT 0xF2 X#define LOG_CLOSE 0xF3 X X/* lopen() and related routines error codes */ X#define LOPEN_INVALID -1 /* for invalid tty name */ X#define LOPEN_OPNFAIL -2 /* could not open line */ X Xtypedef struct lcb X{ X int iofd; /* file descriptor for line */ X int parity; /* 0==NONE, 'e' == even, 'o' == odd */ X int line_num; /* line number: 0 or 1 */ X char LCKname[128]; /* lock file name */ X uint baud; /* baud rate */ X char descr[64]; /* description of remote */ X char line[64]; /* /dev/ttyname for outgoing line */ X struct termio termio; /* attributes for the line to remote */ X char logbuf[LOGBUFMAX]; /* log buffer */ X char *logbuf_ptr; /* pointer into log buffer */ X int logbuf_count; /* count of characters in log buffer */ X} LCB; X Xextern LCB lcbs[]; X X#include "adsfuncs.h" SHAR_EOF chmod 0644 ads.h || echo "restore of ads.h fails" echo "x - extracting adsfuncs.h (Text)" sed 's/^X//' << 'SHAR_EOF' > adsfuncs.h && X/*+----------------------------------------------------------------------- X adsfuncs.h X------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:09-25-1989-15:20-afterlint-creation */ X X#ifndef BUILDING_LINT_ARGS X#ifdef LINT_ARGS X X/* ads.c */ Xint adslog_read(int *,long *,char *,int ,int *); Xint main(int ,char * *,char * *); Xvoid ads(void); Xvoid adslog(struct lcb *); Xvoid adslog_control(int ); Xvoid adslog_init(struct lcb *); Xvoid adsplay(void); Xvoid endprog(void); Xvoid main_label(void); Xvoid no_log_file(void); Xvoid play_label(int ); X/* adsplog.c */ Xint main(int ,char * *,char * *); Xvoid logdump(char *,int ,int ); Xvoid logdump16(unsigned short ); Xvoid logdump4(unsigned char ); Xvoid logdump8(unsigned char ); X/* cmdline.c */ Xchar *str_token(char *,char *); Xint cmdline(int ,char * *); Xvoid parse_tty_arg(char *,struct lcb *); Xvoid usage(char *,char *); X/* lineio.c */ Xchar *lopen_err_text(int ); Xint lopen(struct lcb *); Xint lset_baud_rate(struct lcb *,int ); Xint valid_baud_rate(unsigned int ); Xvoid lbreak(struct lcb *); Xvoid lclear_xoff(struct lcb *); Xvoid lclose(struct lcb *); Xvoid lflush(struct lcb *); Xvoid lget_xon_xoff(struct lcb *,int *,int *); Xvoid lset_parity(struct lcb *,int ); Xvoid ltoggle_dtr(struct lcb *); Xvoid lxon_xoff(struct lcb *,int ); X/* screen.c */ Xint winbox(struct _win_st *); Xint winget_single(struct _win_st *,char *,char *); Xint wingets(struct _win_st *,int ,int ,char *,int ,unsigned char *,int ); Xstruct _win_st *window_create(char *,int ,int ,int ,int ,int ); Xunsigned int ttygetc(int ); Xvoid clear_area(struct _win_st *,int ,int ,int ); Xvoid clear_area_char(struct _win_st *,int ,int ,int ,char ); Xvoid putc_stderr(char ); Xvoid window_setup(struct _win_st *,char *,int ); Xvoid windows_end(void); Xvoid windows_start(void); X/* time.c */ Xchar *get_elapsed_time(long ); Xchar *get_tod(int ,char *); Xchar *secs_to_str(long ,int ,char *); X X#else /* compiler doesn't know about prototyping */ X X/* ads.c */ Xvoid ads(); Xvoid adslog(); Xvoid adslog_control(); Xvoid adslog_init(); Xvoid adsplay(); Xvoid endprog(); Xvoid main_label(); Xvoid no_log_file(); Xvoid play_label(); X/* adsplog.c */ Xvoid logdump(); Xvoid logdump16(); Xvoid logdump4(); Xvoid logdump8(); X/* cmdline.c */ Xchar *str_token(); Xvoid parse_tty_arg(); Xvoid usage(); X/* lineio.c */ Xchar *lopen_err_text(); Xvoid lbreak(); Xvoid lclear_xoff(); Xvoid lclose(); Xvoid lflush(); Xvoid lget_xon_xoff(); Xvoid lset_parity(); Xvoid ltoggle_dtr(); Xvoid lxon_xoff(); X/* screen.c */ Xstruct _win_st *window_create(); Xunsigned int ttygetc(); Xvoid clear_area(); Xvoid clear_area_char(); Xvoid putc_stderr(); Xvoid window_setup(); Xvoid windows_end(); Xvoid windows_start(); X/* time.c */ Xchar *get_elapsed_time(); Xchar *get_tod(); Xchar *secs_to_str(); X X#endif /* LINT_ARGS */ X#endif /* BUILDING_LINT_ARGS */ X X/* end of adsfuncs.h */ SHAR_EOF chmod 0644 adsfuncs.h || echo "restore of adsfuncs.h fails" echo "x - extracting adsplog.c (Text)" sed 's/^X//' << 'SHAR_EOF' > adsplog.c && X/*+------------------------------------------------------------------------- X adsplog.c - display log files produced by ads X ...!gatech!emory!tridom!wht X X usage: adsplog [-t] [logname] X -t causes elapsed time information to be displayed. X logname defaults to 'ads.log' (the name used by ads) X X Defined functions: X secs_to_str(secs,type,buf) X get_elapsed_time(elapsed_seconds) X get_tod(type,buf) X logdump(str,count,offset) X logdump16(int16) X logdump4(int4) X logdump8(int8) X main(argc,argv,envp) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:09-22-1989-19:42-wht-more logging features */ X/*:09-06-1989-21:24-wht-creation */ X X#include <stdio.h> X#include "ads.h" X XFILE *fplog; Xchar *adslog_name = LOGNAME; Xlong time0 = -1; X X/*+----------------------------------------------------------------------- X logdump#... subservient routines X------------------------------------------------------------------------*/ Xvoid logdump4(int4) Xuchar int4; X{ X int4 &= 15; X putchar((int4 >= 10) ? (int4 + 'A' - 10) : (int4 + '0')); X} X Xvoid logdump8(int8) Xuchar int8; X{ X logdump4(int8 >> 4); X logdump4(int8); X} X Xvoid logdump16(int16) Xushort int16; X{ X logdump8(int16 >> 8); X logdump8(int16); X} X X X/*+----------------------------------------------------------------- X logdump(str,count,offset) X------------------------------------------------------------------*/ Xvoid Xlogdump(str,count,offset) Xchar *str; Xint count; Xint offset; X{ Xint istr = 0; Xregister ipos; Xregister itmp; X X while(istr < count) X { X logdump8(istr + offset); X putchar(' '); X for(itmp = 0; itmp < 16; ++itmp) X { X ipos = istr + itmp; X if(ipos >= count) X { X fputs(" ",stdout); X continue; X } X putchar(' '); X logdump8(str[ipos]); X } X fputs(" | ",stdout); X for(itmp = 0; itmp < 16; ++itmp) X { X ipos = istr + itmp; X if( (ipos) >= count) X putchar(' '); X else X { X putchar((str[ipos] >= ' ' && str[ipos] < 0x7f) X ? str[ipos] : '.' ); X } X } X istr += 16; X fputs(" |\n",stdout); X if(istr < count) X fputs(" ",stdout); X } /* end of while(istr < count) */ X X} /* end of logdump */ X X/*+------------------------------------------------------------------------- X main(argc,argv,envp) X--------------------------------------------------------------------------*/ Xmain(argc,argv,envp) Xint argc; Xchar **argv; Xchar **envp; X{ Xint itmp; Xint device; Xint last_device = -1; Xint first_byte; Xint count; Xint offset; Xint show_timing = 0; Xlong time_then; Xchar buf[128]; X X for(itmp = 1; itmp < argc; itmp++) X { X if(*argv[itmp] == '-') X { X switch(*(argv[itmp] + 1)) X { X case 't': X show_timing = 1; X break; X } X continue; X } X adslog_name = argv[itmp]; X } X if(!(fplog = fopen(adslog_name,"r"))) X { X perror(adslog_name); X exit(1); X } X printf("--- %s printed %s ---\n",adslog_name,get_tod(4,(char *)0)); X while((first_byte = fgetc(fplog)) != EOF) X { X if(fread((char *)&time_then,sizeof(time_then),1,fplog) != 1) X { X puts("premature eof"); X exit(0); X } X X switch(first_byte & 0xFF) X { X case LOG_OPEN: X buf[0] = 0; X fgets(buf,sizeof(buf),fplog); X if(itmp = strlen(buf)) X buf[itmp - 1] = 0; X time0 = time_then; X printf("\nLOG OPEN: %s on %s\n",buf, X secs_to_str(time0,4,(char *)0)); X /* fall through */ X X case LOG_TIMEOUT: X offset = 0; X last_device = -1; X continue; X X case LOG_CLOSE: X if(itmp = strlen(buf)) X buf[itmp - 1] = 0; X printf("\nLOG CLOSE: %s\n", X secs_to_str(time0,4,(char *)0)); X continue; X } X X device = first_byte & 0x80; X count = first_byte & 0x7F; X X if(fread(buf,1,count,fplog) != count) X { X puts("premature eof"); X exit(0); X } X X if(device == last_device) X fputs(" ",stdout); X else X { X if(show_timing) X printf("%s\n",get_elapsed_time(time_then - time0)); X fputs(device ? "-> " : "<- ",stdout); X offset = 0; X } X X logdump(buf,count,offset); X X offset += count; X last_device = device; X } X exit(0); X} /* end of main */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of adsplog.c */ SHAR_EOF chmod 0644 adsplog.c || echo "restore of adsplog.c fails" echo "x - extracting afterlint.c (Text)" sed 's/^X//' << 'SHAR_EOF' > afterlint.c && X/* CHK=0xE825 */ X/*+------------------------------------------------------------------------- X afterlint.c -- process -Zg output X X Use with zgcc: X X #!/bin/csh X #zgcc -- build prototyping "LINT_ARGS" X echo C sources in $1';' result file $2 X rm -f zg.t X foreach i(`cat $1`) X cc -DBUILDING_LINT_ARGS -Zg $argv[3-] $i > zg1.t X sort zg1.t > zg2.t X echo '/ *' $i '* /' >> zg.t #remove spaces inside comment markers X cat zg2.t >> zg.t X end X afterlint zg.t $2 X rm -f zg.t zg?.t X echo Output in $2 X X Defined functions: X emit_editnote(fp) X main(argc,argv,envp) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-13-1988-19:50-wht-creation */ X X#include <stdio.h> X X#define ff fprintf X X#ifdef BSD4 X#include <sys/time.h> X#define strchr index X#define strrchr rindex Xchar *index(); Xchar *rindex(); X/**************************/ X#else /* assuming XENIX */ X/**************************/ X#include <time.h> X#include <sys/types.h> X#include <sys/timeb.h> Xchar *strchr(); Xchar *strrchr(); X#endif /* system dependencies */ X Xextern long time(); Xextern struct tm *localtime(); X X/*+------------------------------------------------------------------------- X emit_editnote(fp) X--------------------------------------------------------------------------*/ Xvoid Xemit_editnote(fp) XFILE *fp; X{ X struct tm *ltime; X long cur_time; X#ifdef XENIX X#ifdef MESSED_UP_DST X struct timeb tp; X#endif X#endif X X cur_time = time((long *)0); X X#ifdef XENIX X#ifdef MESSED_UP_DST X ftime(&tp); /* localtime() does not know about DST */ X if(tp.dstflag) /* so we adjust with ftime, which does know */ X cur_time += 3600L; /* problem in BSD too, but no ftime there */ X#endif X#endif X X ltime = localtime(&cur_time); X X fputs("/*+:EDITS:*/\n",fp); X X ff(fp,"/*:%02d-%02d-%04d-%02d:%02d-afterlint-creation */\n", X ltime->tm_mon+1,ltime->tm_mday,ltime->tm_year + 1900, X ltime->tm_hour,ltime->tm_min); X X} /* end of emit_editnote */ X X/*+------------------------------------------------------------------------- X main(argc,argv,envp) X--------------------------------------------------------------------------*/ Xmain(argc,argv,envp) Xint argc; Xchar **argv; Xchar **envp; X{ X register char *cptr; X register FILE *fpin; X register FILE *fpout; X char buf[256]; X char *basename; X X if(argc < 2) X { X ff(stderr,"usage: afterlint <infile> [<outfile>]\n"); X ff(stderr,"if outfile not supplied, output is to stdout\n"); X exit(1); X } X X if((fpin = fopen(argv[1],"r")) == NULL) X { X perror(argv[1]); X exit(1); X } X X if(argc > 2) X { X if((fpout = fopen(argv[2],"w")) == NULL) X { X perror(argv[2]); X exit(1); SHAR_EOF echo "End of part 1" echo "File afterlint.c is continued in part 2" echo "2" > s2_seq_.tmp exit 0 -- ------------------------------------------------------------------- Warren Tucker, Tridom Corporation ...!gatech!emory!tridom!wht "Might as well be frank, monsieur. It would take a miracle to get you out of Casablanca and the Germans have outlawed miracles."