wht@n4hgf.uucp (Warren Tucker) (01/06/91)
Submitted-by: wht@n4hgf.uucp (Warren Tucker) Posting-number: Volume 16, Issue 46 Archive-name: ecu3/part22 ---- Cut Here and feed the following to sh ---- #!/bin/sh # This is part 22 of ecu3 if touch 2>&1 | fgrep 'amc' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= z/zlint.h ============== if test ! -d 'z'; then echo 'x - creating directory z' mkdir 'z' fi echo 'x - extracting z/zlint.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'z/zlint.h' && X/*+----------------------------------------------------------------------- X zlint.h X------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:09-06-1990-22:42-afterlint-creation */ X X#ifndef BUILDING_LINT_ARGS X#ifdef LINT_ARGS X X/* zcommon.c */ Xint get_home_dir(char *); Xint mode(int ); Xint sendbrk(void ); Xint zmputs(char *); Xstatic unsigned int getspeed(int ); Xvoid get_curr_dir(char *,int ); X/* zcurses.c */ Xchar *get_elapsed_time(long ); Xchar *get_tod(int ,char *); Xchar *mode_map(unsigned short ,char *); Xint clear_area(struct _win_st *,int ,int ,int ); Xint clear_area_char(struct _win_st *,int ,int ,int ,char ); Xint report_comm_baud_rate(unsigned int ); Xint report_error_count(void ); Xint report_file_byte_io(long ); Xint report_file_open_length(long ); Xint report_file_open_mode(unsigned short ); Xint report_file_rcv_started(char *,long ,long ,unsigned short ); Xint report_protocol_crc_type(char *); Xint report_protocol_type(char *); Xint report_rx_tx_count(void ); Xint report_xfer_mode(char *); Xvoid report_file_close(void ); Xvoid report_file_open_tod(void ); Xvoid report_file_send_open(char *,struct stat *); Xvoid report_init(char *); Xvoid report_last_rxhdr(char *,int ); Xvoid report_last_txhdr(char *,int ); Xvoid report_mode(int ); Xvoid report_rx_ind(int ); Xvoid report_rxblklen(int ); Xvoid report_rxpos(long ); Xvoid report_str(char *,int ); Xvoid report_top_line(char *); Xvoid report_transaction(char *); Xvoid report_tx_ind(int ); Xvoid report_txblklen(int ); Xvoid report_txpos(long ); Xvoid report_uninit(int ); Xvoid report_window(void ); X/* zdebug.c */ X/* zmodem.c */ Xint noxrd7(void ); Xint stohdr(long ); Xint zdlread(void ); Xint zgeth1(void ); Xint zgethdr(char *,int ); Xint zgethex(void ); Xint zputhex(int ); Xint zrbhdr(char *); Xint zrbhdr32(char *); Xint zrdat32(char *,int ); Xint zrdata(char *,int ); Xint zrhhdr(char *); Xint zsbh32(char *,int ); Xint zsbhdr(int ,unsigned char *); Xint zsda32(char *,int ,int ); Xint zsdata(unsigned char *,int ,int ); Xint zsendline(int ); Xint zshhdr(int ,unsigned char *); Xlong rclhdr(char *); X X#else /* compiler doesn't know about prototyping */ X X/* zcommon.c */ Xstatic unsigned int getspeed(); Xvoid get_curr_dir(); X/* zcurses.c */ Xchar *get_elapsed_time(); Xchar *get_tod(); Xchar *mode_map(); Xvoid report_file_close(); Xvoid report_file_open_tod(); Xvoid report_file_send_open(); Xvoid report_init(); Xvoid report_last_rxhdr(); Xvoid report_last_txhdr(); Xvoid report_mode(); Xvoid report_rx_ind(); Xvoid report_rxblklen(); Xvoid report_rxpos(); Xvoid report_str(); Xvoid report_top_line(); Xvoid report_transaction(); Xvoid report_tx_ind(); Xvoid report_txblklen(); Xvoid report_txpos(); Xvoid report_uninit(); Xvoid report_window(); X/* zdebug.c */ X/* zmodem.c */ Xlong rclhdr(); X X#endif /* LINT_ARGS */ X#endif /* BUILDING_LINT_ARGS */ X X/* end of zlint.h */ SHAR_EOF $TOUCH -am 0919224990 'z/zlint.h' && chmod 0644 z/zlint.h || echo 'restore of z/zlint.h failed' Wc_c="`wc -c < 'z/zlint.h'`" test 2818 -eq "$Wc_c" || echo 'z/zlint.h: original size 2818, current size' "$Wc_c" # ============= z/zmodem.c ============== echo 'x - extracting z/zmodem.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'z/zmodem.c' && X/*+------------------------------------------------------------------------- X zmodem.c - ZMODEM protocol primitives X based on code by Chuck Forsberg X X Entry point Functions: X zsbhdr(type,hdr) send binary header X zshhdr(type,hdr) send hex header X zgethdr(hdr,eflag) receive header - binary or hex X zsdata(buf,len,frameend) send data X zrdata(buf,len) receive data X stohdr(pos) store position data in Txhdr X long rclhdr(hdr) recover position offset from header X X Defined functions: X noxrd7() X rclhdr(hdr) X stohdr(pos) X zdlread() X zgeth1() X zgethdr(hdr,eflag) X zgethex() X zputhex(c) X zrbhdr(hdr) X zrbhdr32(hdr) X zrdat32(buf,length) X zrdata(buf,length) X zrhhdr(hdr) X zsbh32(hdr,type) X zsbhdr(type,hdr) X zsda32(buf,length,frameend) X zsdata(buf,length,frameend) X zsendline(c) X zshhdr(type,hdr) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:08-14-1990-20:41-wht@n4hgf-ecu3.00-flush old edit history */ X X#include "zmodem.h" /* wht */ X#include "zlint.h" X Xextern char s128[]; /* wht */ Xextern int Zctlesc; /* wht */ Xextern int Zmodem; /* wht */ Xextern long cr3tab[]; /* wht */ Xextern unsigned Baudrate; /* wht */ Xextern unsigned short crctab[]; /* wht */ X Xint Rxtimeout = 100; /* Tenths of seconds to wait for something */ X X#if !defined(UNSL) X#define UNSL X#endif X X X Xstatic lastsent; /* Last char we sent */ Xstatic evenp; /* Even parity seen on header */ X X/* Globals used by ZMODEM functions */ Xchar Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ Xchar Rxhdr[4]; /* Received header */ Xchar Txhdr[4]; /* Transmitted header */ Xint Crc32; /* Display flag indicating 32 bit CRC being received */ Xint Crc32t; /* Display flag indicating 32 bit CRC being sent */ Xint Rxcount; /* Count of data bytes received */ Xint Rxframeind; /* ZBIN ZBIN32,or ZHEX type of frame received */ Xint Rxtimeout; /* Tenths of seconds to wait for something */ Xint Rxtype; /* Type of header received */ Xint Txfcs32; /* TURE means send binary frames with 32 bit FCS */ Xint Zrwindow; /* RX window size (controls garbage count) */ Xlong Rxpos; /* Received file position */ Xlong Txpos; /* Transmitted file position */ X Xchar *frametypes[] = X{ X "Carrier Lost", /* -3 */ X "TIMEOUT", /* -2 */ X "ERROR", /* -1 */ X/* #define FTOFFSET 3 moved to zmodem.h */ X "ZRQINIT", X "ZRINIT", X "ZSINIT", X "ZACK ", X "ZFILE", X "ZSKIP", X "ZNAK ", X "ZABORT", X "ZFIN ", X "ZRPOS", X "ZDATA", X "ZEOF ", X "ZFERR", X "ZCRC ", X "ZCHALLENGE", X "ZCOMPL", X "ZCAN ", X "ZFREECNT", X "ZCOMMAND", X "ZSTDERR", X "xxxxx" X#define FRTYPES 22 /* Total number of frame types in this array */ X /* not including psuedo negative entries */ X}; X Xstatic char masked[] = "8 bit transparent path required"; Xstatic char badcrc[] = "Bad CRC"; X X/* Send ZMODEM binary header hdr of type type */ Xzsbhdr(type,hdr) Xregister unsigned char *hdr; X{ X register int n; X register unsigned crc; X X report_tx_ind(1); X sprintf(s128,"hdr %s %ld",frametypes[type+FTOFFSET],rclhdr(hdr)); X report_last_txhdr(s128,0); X X xsendline(ZPAD); X xsendline(ZDLE); X X if(Crc32t=Txfcs32) X zsbh32(hdr,type); X else X { X xsendline(ZBIN); X zsendline(type); X crc = updcrc(type,0); X X for(n=4; --n >= 0; ++hdr) X { X zsendline(*hdr); X crc = updcrc(*hdr,crc); X } X crc = updcrc(0,updcrc(0,crc)); X zsendline(crc>>8); X zsendline(crc); X } X if(type != ZDATA) X flushline(); X report_tx_ind(0); X} X X X/* Send ZMODEM binary header hdr of type type */ Xzsbh32(hdr,type) Xregister char *hdr; X{ X register int n; X register UNSL long crc; X X report_tx_ind(1); X xsendline(ZBIN32); X zsendline(type); X crc = 0xFFFFFFFFL; X crc = UPDC32(type,crc); X X for(n=4; --n >= 0; ++hdr) X { X crc = UPDC32((0377 & *hdr),crc); X zsendline(*hdr); X } X crc = ~crc; X for(n=4; --n >= 0;) X { X zsendline((int)crc); X crc >>= 8; X } X report_tx_ind(0); X} X X/* Send ZMODEM HEX header hdr of type type */ Xzshhdr(type,hdr) Xregister unsigned char *hdr; X{ X register int n; X register unsigned short crc; X X report_tx_ind(1); X X sprintf(s128,"hdr %s %ld",frametypes[type+FTOFFSET],rclhdr(hdr)); X report_last_txhdr(s128,0); X sendline(ZPAD); X sendline(ZPAD); X sendline(ZDLE); X sendline(ZHEX); X zputhex(type); X Crc32t = 0; X X crc = updcrc(type,0); X for(n=4; --n >= 0; ++hdr) X { X zputhex(*hdr); X crc = updcrc(*hdr,crc); X/* crc = updcrc((0377 & *hdr),crc); original - wht */ X } X crc = updcrc(0,updcrc(0,crc)); X zputhex(crc>>8); X zputhex(crc); X X /* Make it printable on remote machine */ X sendline(015); X sendline(012); X /* X * Uncork the remote in case a fake XOFF has stopped data flow X */ X if(type != ZFIN && type != ZACK) X sendline(021); X flushline(); X report_tx_ind(0); X} X X/* X * Send binary array buf of length length,with ending ZDLE sequence frameend X */ Xstatic char *Zendnames[] = { "ZCRCE","ZCRCG","ZCRCQ","ZCRCW"}; X Xzsdata(buf,length,frameend) Xregister unsigned char *buf; X{ X register unsigned short crc; X X report_tx_ind(1); X X sprintf(s128,"data %s %d bytes",Zendnames[frameend-ZCRCE&3],length); X report_last_txhdr(s128,0); X if(Crc32t) X zsda32(buf,length,frameend); X else X { X crc = 0; X for(;--length >= 0; ++buf) X { X zsendline(*buf); X crc = updcrc(*buf,crc); X } X xsendline(ZDLE); X xsendline(frameend); X crc = updcrc(frameend,crc); X X crc = updcrc(0,updcrc(0,crc)); X zsendline(crc>>8); X zsendline(crc); X } X if(frameend == ZCRCW) X { X xsendline(XON); X flushline(); X } X report_tx_ind(0); X X} X Xzsda32(buf,length,frameend) Xregister char *buf; X{ X register int c; X register UNSL long crc; X X report_tx_ind(1); X X crc = 0xFFFFFFFFL; X for(;--length >= 0; ++buf) X { X c = *buf & 0377; X if(c & 0140) X xsendline(lastsent = c); X else X zsendline(c); X crc = UPDC32(c,crc); X } X xsendline(ZDLE); X xsendline(frameend); X crc = UPDC32(frameend,crc); X X crc = ~crc; X for(length=4; --length >= 0;) X { X zsendline((int)crc); X crc >>= 8; X } X report_tx_ind(0); X} X X/* X * Receive array buf of max length with ending ZDLE sequence X * and CRC. Returns the ending character or error code. X * NB: On errors may store length+1 bytes! X */ Xzrdata(buf,length) Xregister char *buf; X{ X register int c; X register unsigned short crc; X register char *end; X register int d; X X report_rx_ind(1); X X if(Rxframeind == ZBIN32) X { X report_rx_ind(0); X return(zrdat32(buf,length)); X } X X crc = Rxcount = 0; X end = buf + length; X while(buf <= end) X { X if((c = zdlread()) & ~0377) X { Xcrcfoo: X switch(c) X { X case GOTCRCE: X case GOTCRCG: X case GOTCRCQ: X case GOTCRCW: X crc = updcrc(((d=c)&0377),crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = updcrc(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = updcrc(c,crc); X if(crc & 0xFFFF) X { X report_str(badcrc,0); X report_rx_ind(0); X return(ERROR); X } X Rxcount = length - (end - buf); X report_rxblklen(Rxcount); X sprintf(s128,"data %s %d bytes", X Zendnames[d-GOTCRCE&3],Rxcount); X report_last_rxhdr(s128,0); X report_rx_ind(0); X return(d); X case GOTCAN: X report_str("Sender Cancelled",1); X report_rx_ind(0); X return(ZCAN); X case TIMEOUT: X report_str("TIMEOUT",1); X report_rx_ind(0); X return(c); X default: X report_str("Bad data subpacket",1); X report_rx_ind(0); X return(c); X } X } X *buf++ = c; X crc = updcrc(c,crc); X } X report_str("Data subpacket too long",1); X report_rx_ind(0); X return(ERROR); X} X Xzrdat32(buf,length) Xregister char *buf; X{ X register int c; X register UNSL long crc; X register char *end; X register int d; X X report_rx_ind(1); X crc = 0xFFFFFFFFL; X Rxcount = 0; X end = buf + length; X while(buf <= end) X { X if((c = zdlread()) & ~0377) X { Xcrcfoo: X switch(c) X { X case GOTCRCE: X case GOTCRCG: X case GOTCRCQ: X case GOTCRCW: X d = c; X c &= 0377; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if((c = zdlread()) & ~0377) X goto crcfoo; X crc = UPDC32(c,crc); X if(crc != 0xDEBB20E3) X { X report_str(badcrc,0); X report_rx_ind(0); X return(ERROR); X } X Rxcount = length - (end - buf); X report_rxblklen(Rxcount); X sprintf(s128,"data %s %d bytes", X Zendnames[d-GOTCRCE&3],Rxcount); X report_last_rxhdr(s128,0); X report_rx_ind(0); X return(d); X case GOTCAN: X report_str("Sender Canceled",1); X report_rx_ind(0); X return(ZCAN); X case TIMEOUT: X report_str("TIMEOUT",1); X report_rx_ind(0); X return(c); X default: X report_str("Bad data subpacket",1); X report_rx_ind(0); X return(c); X } X } X *buf++ = c; X crc = UPDC32(c,crc); X } X report_str("Data subpacket too long",1); X report_rx_ind(0); X return(ERROR); X} X X X/* X * Read a ZMODEM header to hdr,either binary or hex. X * eflag controls local display of non zmodem characters: X * 0: no display X * 1: display printing characters only X * 2: display all non ZMODEM characters X * On success,set Zmodem to 1,set Rxpos and return type of header. X * Otherwise return negative on error. X * Return ERROR instantly if ZCRCW sequence,for fast error recovery. X */ Xzgethdr(hdr,eflag) Xchar *hdr; X{ Xregister int c,n,cancount; X X report_rx_ind(1); X n = Zrwindow + Baudrate; /* Max bytes before start of frame */ X Rxframeind = Rxtype = 0; X Xstartover: X cancount = 5; Xagain: X /* Return immediate ERROR if ZCRCW sequence seen */ X switch(c = readline(Rxtimeout)) X { X case RCDO: X case TIMEOUT: X goto fifi; X case CAN: Xgotcan: X if(--cancount <= 0) X { X c = ZCAN; X goto fifi; X } X switch(c = readline(1)) X { X case TIMEOUT: X goto again; X case ZCRCW: X c = ERROR; X /* **** FALL THRU TO **** */ X case RCDO: X goto fifi; X default: X break; X case CAN: X if(--cancount <= 0) X { X c = ZCAN; X goto fifi; X } X goto again; X } X /* **** FALL THRU TO **** */ X default: Xagn2: X if( --n == 0) X { X report_str("Garbage count exceeded",1); X report_last_rxhdr("Noise",0); X report_rx_ind(0); X return(ERROR); X } X goto startover; X case ZPAD|0200: /* This is what we want. */ X case ZPAD: /* This is what we want. */ X evenp = c & 0200; X break; X } X cancount = 5; Xsplat: X switch(c = noxrd7()) X { X case ZPAD: X goto splat; X case RCDO: X case TIMEOUT: X goto fifi; X default: X goto agn2; X case ZDLE: /* This is what we want. */ X break; X } X X switch(c = noxrd7()) X { X case RCDO: X case TIMEOUT: X goto fifi; X case ZBIN: X Rxframeind = ZBIN; X Crc32 = FALSE; X c = zrbhdr(hdr); X break; X case ZBIN32: X Crc32 = Rxframeind = ZBIN32; X c = zrbhdr32(hdr); X break; X case ZHEX: X Rxframeind = ZHEX; X Crc32 = FALSE; X c = zrhhdr(hdr); X break; X case CAN: X goto gotcan; X default: X goto agn2; X } X Rxpos = hdr[ZP3] & 0377; X Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377); X Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377); X Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377); Xfifi: X switch(c) X { X case GOTCAN: X c = ZCAN; X /* **** FALL THRU TO **** */ X case ZNAK: X case ZCAN: X case ERROR: X case TIMEOUT: X case RCDO: X sprintf(s128,"Got %s",frametypes[c+FTOFFSET]); X report_str(s128,1); X /* **** FALL THRU TO **** */ X default: X if(c >= -3 && c <= FRTYPES) X sprintf(s128,"hdr %s %ld",frametypes[c+FTOFFSET],Rxpos); X else X sprintf(s128,"hdr 0x%02x? %ld",c,Rxpos); X report_last_rxhdr(s128,0); X } X report_rx_ind(0); X return(c); X} X X/* Receive a binary style header (type and position) */ Xzrbhdr(hdr) Xregister char *hdr; X{ X register int c,n; X register unsigned short crc; X X if((c = zdlread()) & ~0377) X return(c); X Rxtype = c; X crc = updcrc(c,0); X X for(n=4; --n >= 0; ++hdr) X { X if((c = zdlread()) & ~0377) X return(c); X crc = updcrc(c,crc); X *hdr = c; X } X if((c = zdlread()) & ~0377) X return(c); X crc = updcrc(c,crc); X if((c = zdlread()) & ~0377) X return(c); X crc = updcrc(c,crc); X if(crc & 0xFFFF) X { X if(evenp) X report_str(masked,1); X report_str(badcrc,0); X return(ERROR); X } X#if defined(ZMODEM) X Protocol = ZMODEM; X#endif X Zmodem = 1; X return(Rxtype); X} X X/* Receive a binary style header (type and position) with 32 bit FCS */ Xzrbhdr32(hdr) Xregister char *hdr; X{ X register int c,n; X register UNSL long crc; X X if((c = zdlread()) & ~0377) X return(c); X Rxtype = c; X crc = 0xFFFFFFFFL; X crc = UPDC32(c,crc); X X for(n=4; --n >= 0; ++hdr) X { X if((c = zdlread()) & ~0377) X return(c); X crc = UPDC32(c,crc); X *hdr = c; X } X for(n=4; --n >= 0;) X { X if((c = zdlread()) & ~0377) X return(c); X crc = UPDC32(c,crc); X } X if(crc != 0xDEBB20E3) X { X if(evenp) X report_str(masked,1); X report_str(badcrc,0); X return(ERROR); X } X#if defined(ZMODEM) X Protocol = ZMODEM; X#endif X Zmodem = 1; X return(Rxtype); X} X X X/* Receive a hex style header (type and position) */ Xzrhhdr(hdr) Xchar *hdr; X{ X register int c; X register unsigned short crc; X register int n; X X if((c = zgethex()) < 0) X return(c); X Rxtype = c; X crc = updcrc(c,0); X X for(n=4; --n >= 0; ++hdr) X { X if((c = zgethex()) < 0) X return(c); X crc = updcrc(c,crc); X *hdr = c; X } X if((c = zgethex()) < 0) X return(c); X crc = updcrc(c,crc); X if((c = zgethex()) < 0) X return(c); X crc = updcrc(c,crc); X if(crc & 0xFFFF) X { X report_str(badcrc,0); X return(ERROR); X } X if(readline(1) == '\r') /* Throw away possible cr/lf */ X readline(1); X#if defined(ZMODEM) X Protocol = ZMODEM; X#endif X Zmodem = 1; X return(Rxtype); X} X X/* Send a byte as two hex digits */ Xzputhex(c) Xregister int c; X{ X static char digits[] = "0123456789abcdef"; X X sendline(digits[(c&0xF0)>>4]); X sendline(digits[(c)&0xF]); X} X X/* X * Send character c with ZMODEM escape sequence encoding. X * Escape XON,XOFF. Escape CR following @ (Telenet net escape) X */ Xzsendline(c) X{ X X /* Quick check for non control characters */ X if(c & 0140) X xsendline(lastsent = c); X else X { X switch(c &= 0377) X { X case ZDLE: X xsendline(ZDLE); X xsendline(lastsent = (c ^= 0100)); X break; X case 015: X case 0215: X if(!Zctlesc && (lastsent & 0177) != '@') X goto sendit; X /* **** FALL THRU TO **** */ X case 020: X case 021: X case 023: X case 0220: X case 0221: X case 0223: X xsendline(ZDLE); X c ^= 0100; Xsendit: X xsendline(lastsent = c); X break; X default: X if(Zctlesc && ! (c & 0140)) X { X xsendline(ZDLE); X c ^= 0100; X } X xsendline(lastsent = c); X } X } X} X X/* Decode two lower case hex digits into an 8 bit byte value */ Xzgethex() X{ X register int c; X X c = zgeth1(); X return(c); X} Xzgeth1() X{ X register int c,n; X X if((c = noxrd7()) < 0) X return(c); X n = c - '0'; X if(n > 9) X n -= ('a' - ':'); X if(n & ~0xF) X return(ERROR); X if((c = noxrd7()) < 0) X return(c); X c -= '0'; X if(c > 9) X c -= ('a' - ':'); X if(c & ~0xF) X return(ERROR); X c += (n<<4); X return(c); X} X X/* X * Read a byte,checking for ZMODEM escape encoding X * including CAN*5 which represents a quick abort X */ Xzdlread() X{ X register int c; X Xagain: X /* Quick check for non control characters */ X if((c = readline(Rxtimeout)) & 0140) X return(c); X switch(c) X { X case ZDLE: X break; X case 023: X case 0223: X case 021: X case 0221: X goto again; X default: X if(Zctlesc && !(c & 0140)) X { X goto again; X } X return(c); X } Xagain2: X if((c = readline(Rxtimeout)) < 0) X return(c); X if(c == CAN && (c = readline(Rxtimeout)) < 0) X return(c); X if(c == CAN && (c = readline(Rxtimeout)) < 0) X return(c); X if(c == CAN && (c = readline(Rxtimeout)) < 0) X return(c); X switch(c) X { X case CAN: X return(GOTCAN); X case ZCRCE: X case ZCRCG: X case ZCRCQ: X case ZCRCW: X return(c | GOTOR); X case ZRUB0: X return(0177); X case ZRUB1: X return(0377); X case 023: X case 0223: X case 021: X case 0221: X goto again2; X default: X if(Zctlesc && ! (c & 0140)) X { X goto again2; X } X if((c & 0140) == 0100) X return(c ^ 0100); X break; X } X sprintf(s128,"Bad escape sequence %x",c); X report_str(s128,1); X return(ERROR); X} X X/* X * Read a character from the modem line with timeout. X * Eat parity,XON and XOFF characters. X */ Xnoxrd7() X{ X register int c; X X for(;;) X { X if((c = readline(Rxtimeout)) < 0) X return(c); X switch(c &= 0177) X { X case XON: X case XOFF: X continue; X default: X if(Zctlesc && !(c & 0140)) X continue; X case '\r': X case '\n': X case ZDLE: X return(c); X } X } X} X X/* Store long integer pos in Txhdr */ Xstohdr(pos) Xlong pos; X{ X Txhdr[ZP0] = pos; X Txhdr[ZP1] = pos>>8; X Txhdr[ZP2] = pos>>16; X Txhdr[ZP3] = pos>>24; X} X X/* Recover a long integer from a header */ Xlong Xrclhdr(hdr) Xregister char *hdr; X{ X register long l; X X l = (hdr[ZP3] & 0377); X l = (l << 8) | (hdr[ZP2] & 0377); X l = (l << 8) | (hdr[ZP1] & 0377); X l = (l << 8) | (hdr[ZP0] & 0377); X return(l); X} X X/* end of zmodem.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0814204290 'z/zmodem.c' && chmod 0644 z/zmodem.c || echo 'restore of z/zmodem.c failed' Wc_c="`wc -c < 'z/zmodem.c'`" test 16442 -eq "$Wc_c" || echo 'z/zmodem.c: original size 16442, current size' "$Wc_c" # ============= z/zmodem.h ============== echo 'x - extracting z/zmodem.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'z/zmodem.h' && X/*+------------------------------------------------------------------------- X zmodem.h -- common include filefor ecurz/ecusz X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:08-14-1990-20:41-wht@n4hgf-ecu3.00-flush old edit history */ X X#if defined(pyr) X#include <sys/types.h> X#include <sys/stat.h> X#include <sgtty.h> X#define OS "BSD4.x" X#if defined(LLITOUT) X#include <strings.h> X#endif X#endif X X#if defined(M_UNIX) X#define OS "UNIX" X#undef M_XENIX X#endif X X#if !defined(OS) X#if !defined(M_XENIX) X#define XENIX X#endif X#endif X X#if defined(M_XENIX) || defined(M_UNIX) X#include <sys/types.h> X#include <sys/stat.h> X#include <termio.h> X#include <sys/ioctl.h> X#include <string.h> X#define MODE2OK X#endif X X#if defined(pyr) X#if defined(TIOCSBRK) X#define CANBREAK X#endif X#endif X#if defined(M_XENIX) || defined(M_UNIX) X#define CANBREAK X#endif X X#if !defined(READCHECK) X#if defined(FIONREAD) X#define READCHECK X#endif X#if defined(SV) X#define READCHECK X#endif X#endif X X#define ACK 6 X#define CAN ('X'&037) X#define CPMEOF 032 X#define ENQ 005 X#define EOT 4 X#define ERROR (-1) X#define ERRORMAX 5 X#define FALSE 0 X#define NAK 025 X#define OK 0 X#define PATHLEN 257 /* ready for 4.2 bsd ? */ X#define RCDO (-3) X#define SOH 1 X#define STX 2 X#define TIMEOUT (-2) X#define TRUE 1 X#define UNIXFILE 0xF000 /* The S_IFMT file mask bit for stat */ X#define WANTCRC 0103 /* send C not NAK to get crc not checksum */ X X#define WANTG 0107 /* Send G not NAK to get nonstop batch xmsn */ X#define WCEOT (-10) X#define XOFF ('s'&037) X#define XON ('q'&037) X X/* X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. X * NOTE: First argument must be in range 0 to 255. X * Second argument is referenced twice. X * X * Programmers may incorporate any or all code into their programs, X * giving proper credit within the source. Publication of the X * source routines is permitted so long as proper credit is given X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, X * Omen Technology. X */ X X#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ (cp)) X#define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)) X X X#define ZPAD '*' /* 052 Padding character begins frames */ X#define ZDLE 030 /* Ctrl-X Zmodem escape - `ala BISYNC DLE */ X#define ZDLEE (ZDLE^0100) /* Escaped ZDLE as transmitted */ X#define ZBIN 'A' /* Binary frame indicator */ X#define ZHEX 'B' /* HEX frame indicator */ X#define ZBIN32 'C' /* Binary frame with 32 bit FCS */ X X/* Frame types (see array "frametypes" in zm.c) */ X#define ZRQINIT 0 /* Request receive init */ X#define ZRINIT 1 /* Receive init */ X#define ZSINIT 2 /* Send init sequence (optional) */ X#define ZACK 3 /* ACK to above */ X#define ZFILE 4 /* File name from sender */ X#define ZSKIP 5 /* To sender: skip this file */ X#define ZNAK 6 /* Last packet was garbled */ X#define ZABORT 7 /* Abort batch transfers */ X#define ZFIN 8 /* Finish session */ X#define ZRPOS 9 /* Resume data trans at this position */ X#define ZDATA 10 /* Data packet(s) follow */ X#define ZEOF 11 /* End of file */ X#define ZFERR 12 /* Fatal Read or Write error Detected */ X#define ZCRC 13 /* Request for file CRC and response */ X#define ZCHALLENGE 14 /* Receiver's Challenge */ X#define ZCOMPL 15 /* Request is complete */ X#define ZCAN 16 /* Other end canned session with CAN*5 */ X#define ZFREECNT 17 /* Request for free bytes on filesystem */ X#define ZCOMMAND 18 /* Command from sending program */ X#define ZSTDERR 19 /* Output to standard error, data follows */ X X/* ZDLE sequences */ X#define ZCRCE 'h' /* CRC next, frame ends, header packet follows */ X#define ZCRCG 'i' /* CRC next, frame continues nonstop */ X#define ZCRCQ 'j' /* CRC next, frame continues, ZACK expected */ X#define ZCRCW 'k' /* CRC next, ZACK expected, end of frame */ X#define ZRUB0 'l' /* Translate to rubout 0177 */ X#define ZRUB1 'm' /* Translate to rubout 0377 */ X X/* zdlread return values (internal) */ X/* -1 is general error, -2 is timeout */ X#define GOTOR 0400 X#define GOTCRCE (ZCRCE|GOTOR) /* ZDLE-ZCRCE received */ X#define GOTCRCG (ZCRCG|GOTOR) /* ZDLE-ZCRCG received */ X#define GOTCRCQ (ZCRCQ|GOTOR) /* ZDLE-ZCRCQ received */ X#define GOTCRCW (ZCRCW|GOTOR) /* ZDLE-ZCRCW received */ X#define GOTCAN (GOTOR|030) /* CAN*5 seen */ X X/* Byte positions within header array */ X#define ZF0 3 /* First flags byte */ X#define ZF1 2 X#define ZF2 1 X#define ZF3 0 X#define ZP0 0 /* Low order 8 bits of position */ X#define ZP1 1 X#define ZP2 2 X#define ZP3 3 /* High order 8 bits of file position */ X X/* Bit Masks for ZRINIT flags byte ZF0 */ X#define CANFDX 01 /* Rx can send and receive true FDX */ X#define CANOVIO 02 /* Rx can receive data during disk I/O */ X#define CANBRK 04 /* Rx can send a break signal */ X#define CANCRY 010 /* Receiver can decrypt */ X#define CANLZW 020 /* Receiver can uncompress */ X#define CANFC32 040 /* Receiver can use 32 bit Frame Check */ X#define ESCCTL 0100 /* Receiver expects ctl chars to be escaped */ X#define ESC8 0200 /* Receiver expects 8th bit to be escaped */ X X/* Parameters for ZSINIT frame */ X#define ZATTNLEN 32 /* Max length of attention string */ X/* Bit Masks for ZSINIT flags byte ZF0 */ X#define TESCCTL 0100 /* Transmitter expects ctl chars to be escaped */ X#define TESC8 0200 /* Transmitter expects 8th bit to be escaped */ X X/* Parameters for ZFILE frame */ X/* Conversion options one of these in ZF0 */ X#define ZCBIN 1 /* Binary transfer - inhibit conversion */ X#define ZCNL 2 /* Convert NL to local end of line convention */ X#define ZCRESUM 3 /* Resume interrupted file transfer */ X/* Management include options, one of these ored in ZF1 */ X#define ZMSKNOLOC 0200 /* Skip file if not present at rx */ X/* Management options, one of these ored in ZF1 */ X#define ZMMASK 037 /* Mask for the choices below */ X#define ZMNEWL 1 /* Transfer if source newer or longer */ X#define ZMCRC 2 /* Transfer if different file CRC or length */ X#define ZMAPND 3 /* Append contents to existing file (if any) */ X#define ZMCLOB 4 /* Replace existing file */ X#define ZMNEW 5 /* Transfer if source newer */ X /* Number 5 is alive ... */ X#define ZMDIFF 6 /* Transfer if dates or lengths different */ X#define ZMPROT 7 /* Protect destination file */ X/* Transport options, one of these in ZF2 */ X#define ZTLZW 1 /* Lempel-Ziv compression */ X#define ZTCRYPT 2 /* Encryption */ X#define ZTRLE 3 /* Run Length encoding */ X/* Extended options for ZF3, bit encoded */ X#define ZXSPARS 64 /* Encoding for sparse file operations */ X X/* Parameters for ZCOMMAND frame ZF0 (otherwise 0) */ X#define ZCACK1 1 /* Acknowledge, then do command */ X X/* FTOFFSET is offset for frametypes array in ecuzm.c */ X#define FTOFFSET 3 X Xlong rclhdr(); X X#include "zlint.h" X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0919224990 'z/zmodem.h' && chmod 0644 z/zmodem.h || echo 'restore of z/zmodem.h failed' Wc_c="`wc -c < 'z/zmodem.h'`" test 6728 -eq "$Wc_c" || echo 'z/zmodem.h: original size 6728, current size' "$Wc_c" # ============= sea/Makefile ============== if test ! -d 'sea'; then echo 'x - creating directory sea' mkdir 'sea' fi echo 'x - extracting sea/Makefile (Text)' sed 's/^X//' << 'SHAR_EOF' > 'sea/Makefile' && X# CHK=0x8F7A X#+---------------------------------------------------------- X# Makefile for ecusea X#----------------------------------------------------------- X#+:EDITS:*/ X#:05-07-1990-21:21-wht@n4hgf-omit fcrc usage in release makes X#:01-03-1990-15:30-wht-quit using -Ox --- Oi screws up too much X#:11-23-1989-02:37-wht-start support for UNIX V/386 X#:11-19-1989-00:21-wht-model mismatch on 286 fixed X#:10-11-1989-18:46-wht-needed more work to get makes to work away from my system X#:07-03-1989-22:58-wht------ x2.00 ----- X XCFLAGS = -i -K -DLINT_ARGS `sysdep =M_I386 -DM_TERMCAP -Oactl =M_I286 -M2 -O` XLFLAGS = -lx -ltcap -ltermlib X XSRC = \ X ecusea.c\ X scurses.c X XOBJ = \ X ecusea.o\ X scurses.o X Xecusea: $(OBJ) Makefile X cc $(CFLAGS) $(OBJ) $(LFLAGS) -o ecusea X Xecusea.fls: $(SRC) X ls $(SRC) >ecusea.fls X Xlint: lint_args.h X Xlint_args.h : ecusea.fls X echo > lint_args.h X csh ../zgcc ecusea.fls lint_args.h $(CFLAGS) X SHAR_EOF $TOUCH -am 0817114990 'sea/Makefile' && chmod 0644 sea/Makefile || echo 'restore of sea/Makefile failed' Wc_c="`wc -c < 'sea/Makefile'`" test 913 -eq "$Wc_c" || echo 'sea/Makefile: original size 913, current size' "$Wc_c" true || echo 'restore of sea/ecusea.c failed' echo End of part 22, continue with part 23 exit 0 -------------------------------------------------------------------- Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US Hacker Extraordinaire d' async PADs, pods, proteins and protocols exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.