v16i046: ECU async comm package rev 3.0, Part22/35
Warren Tucker
wht at n4hgf.uucp
Sun Jan 6 16:25:11 AEST 1991
Submitted-by: wht at 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 at 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 at 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 at 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 at n4hgf.Mt-Park.GA.US
Hacker Extraordinaire d' async PADs, pods, proteins and protocols
exit 0 # Just in case...
--
Kent Landfield INTERNET: kent at 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 at uunet.uu.net.
More information about the Comp.sources.misc
mailing list