home *** CD-ROM | disk | FTP | other *** search
- From: wht@n4hgf.uucp (Warren Tucker)
- Newsgroups: comp.sources.misc
- Subject: v16i046: ECU async comm package rev 3.0, Part22/35
- Message-ID: <1991Jan6.052511.28426@sparky.IMD.Sterling.COM>
- Date: 6 Jan 91 05:25:11 GMT
- Approved: kent@sparky.imd.sterling.com
- X-Checksum-Snefru: 6becbbd6 68a865c7 07f8e1b3 21e97136
-
- 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.
-