You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
7.4 KiB
229 lines
7.4 KiB
/*
|
|
* xmodem.hh -- Include file for ZMODEM private stuff
|
|
*
|
|
* Copyright 1989 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 6 $
|
|
* $Date: 7/12/02 8:20a $
|
|
*/
|
|
|
|
// These constants are used to turn on various types of debug display
|
|
// #define DEBUG_DUMPPACKET // Log bad packet contents to a file
|
|
|
|
#if defined(ERROR)
|
|
#undef ERROR
|
|
#endif
|
|
#if defined(CAN)
|
|
#undef CAN
|
|
#endif
|
|
|
|
#define OK 0
|
|
#define FALSE 0
|
|
#define TRUE 1
|
|
#if defined(ERROR)
|
|
#undef ERROR
|
|
#endif
|
|
#define ERROR (-1)
|
|
#define FILE_DONE 1
|
|
#define TRANSFER_DONE 2
|
|
|
|
/*
|
|
* Max value for HOWMANY is 255.
|
|
* A larger value reduces system overhead but may evoke kernel bugs.
|
|
* 133 corresponds to an XMODEM/CRC sector
|
|
*/
|
|
#ifndef HOWMANY
|
|
#define HOWMANY 133
|
|
#endif
|
|
|
|
/* Ward Christensen / CP/M parameters - Don't change these! */
|
|
#define ENQ 005
|
|
#define CAN ('X'&037)
|
|
#define XOFF ('s'&037)
|
|
#define XON ('q'&037)
|
|
#define SOH 1
|
|
#define STX 2
|
|
#define EOT 4
|
|
#define ACK 6
|
|
#define NAK 025
|
|
#define CPMEOF 032
|
|
#define WANTCRC 0103 /* send C not NAK to get crc not checksum */
|
|
#define TIMEOUT (-2)
|
|
#define RCDO (-3) /* Not too sure about this one */
|
|
#define ZCARRIER_LOST (-4)
|
|
#define ZFULLDISK (-5)
|
|
#define ERROFFSET 5
|
|
#define ERRORMAX 5
|
|
#define RETRYMAX 5
|
|
#define WCEOT (-10)
|
|
//#define PATHLEN 257 /* ready for 4.2 bsd ? */
|
|
#define PATHLEN MAX_PATH
|
|
#define UNIXFILE 0xF000 /* The S_IFMT file mask bit for stat */
|
|
|
|
/* Parameters for ZSINIT frame */
|
|
|
|
#define ZATTNLEN 32 /* Max length of attention string */
|
|
|
|
/* Control structure, allocated during transfers to hold control variables */
|
|
struct z_mdm_cntrl
|
|
{
|
|
HSESSION hSession; /* in case we actually need this */
|
|
HCOM hCom; /* derived from above */
|
|
|
|
int nMethod; /* Zmodem, or Zmodem wiht crash recovery? */
|
|
int fSavePartial; /* Save partially received files? */
|
|
unsigned long ulOverride; /* Override "file exists" overwrite options? */
|
|
|
|
long real_bytes; /* real number of bytes, not virtual number */
|
|
long file_bytes; /* number of bytes processed in current file */
|
|
long total_bytes; /* number of bytes total in previous files */
|
|
long actual_bytes; /* previous value includes skipped files */
|
|
int nSkip; /* true if skipping a file */
|
|
void *flagkey; /* used for detecting the user abort key */
|
|
jmp_buf flagkey_buf; /* used for long jump after user abort */
|
|
jmp_buf intrjmp;
|
|
ST_IOBUF *fh; /* handle for the current file */
|
|
long basesize; /* used when appending to a file */
|
|
long xfertimer; /* used for timing the transfers */
|
|
long xfertime; /* ditto */
|
|
int nfiles; /* total number of files to transfer */
|
|
int filen; /* number of the current file */
|
|
long filesize; /* size of the current file */
|
|
long nbytes; /* total number of bytes to transfer */
|
|
long Rxtimeout; /* Tenths of a second to wait for something */
|
|
const long *z_cr3tab; /* pointer to 32 bit checksum table */
|
|
const unsigned short *z_crctab; /* pointer to 16 bit checksum table */
|
|
int Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame received */
|
|
int Rxtype; /* Type of header received */
|
|
int Rxcount; /* Count of data bytes received */
|
|
char Rxhdr[4]; /* Received header */
|
|
char Txhdr[4]; /* Transmitted header */
|
|
long Rxpos; /* Received file position */
|
|
long Txpos; /* Transmitted file position */
|
|
int Txfcs32; /* TRUE means send binary frames with 32 bit FCS */
|
|
int Crc32t; /* Display flag indicating 32 bit CRC being sent */
|
|
int Crc32; /* Display flag indicating 32 bit CRC being received */
|
|
char Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */
|
|
int lastsent; /* Last char we sent */
|
|
int Not8bit; /* Seven bits seen on header */
|
|
long displayed_time;
|
|
|
|
int Zctlesc;
|
|
int Zrwindow;
|
|
BOOL Eofseen;
|
|
int tryzhdrtype;
|
|
BOOL Thisbinary;
|
|
int Filemode;
|
|
long Modtime;
|
|
int do_init;
|
|
TCHAR zconv; /* ZMODEM file conversion request */
|
|
TCHAR zmanag; /* ZMODEM file management request */
|
|
TCHAR ztrans; /* ZMODEM file transport request */
|
|
TCHAR *secbuf;
|
|
TCHAR *fname;
|
|
TCHAR *our_fname;
|
|
|
|
stFB stP; /* used in foo com functions */
|
|
|
|
TCHAR *txbuf;
|
|
int Filesleft;
|
|
long Totalleft;
|
|
int blklen;
|
|
int blkopt; /* do we override zmodem block length */
|
|
int Beenhereb4;
|
|
BOOL Wantfcs32; /* Do we want 32 bit crc */
|
|
int Rxflags;
|
|
unsigned Rxbuflen; /* receiver maximum buffer length */
|
|
unsigned Txwindow;
|
|
unsigned Txwcnt; /* counter used to space ack requests */
|
|
unsigned Txwspac; /* space between ZCRCQ requests */
|
|
char Myattn[1];
|
|
int errors;
|
|
int s_error;
|
|
int pstatus;
|
|
int last_event;
|
|
|
|
int Lskipnocor;
|
|
long Lastsync; /* last offset to which we got a ZRPOS */
|
|
long Lrxpos; /* receivers last reported offset */
|
|
};
|
|
|
|
typedef struct z_mdm_cntrl ZC;
|
|
|
|
#define updcrc(x,cp,crc) (x->z_crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)
|
|
#define UPDC32(x,b,c) (x->z_cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF))
|
|
|
|
/* from zmdm.c */
|
|
|
|
void zsbhdr (ZC *zc, int type, BYTE *hdr);
|
|
void zsbh32 (ZC *zc, BYTE *hdr, int type);
|
|
void zshhdr (ZC *zc, int type, BYTE *hdr);
|
|
void zsdata (ZC *zc, BYTE *buf, int length, int frameend);
|
|
void zsda32 (ZC *zc, BYTE *buf, int length, int frameend);
|
|
|
|
int zrdata (ZC *zc, BYTE *buf, int length);
|
|
int zrdat32 (ZC *zc, BYTE *buf, int length);
|
|
int zgethdr (ZC *zc, BYTE *hdr, int eflag);
|
|
int zrbhdr (ZC *zc, BYTE *hdr, int eflag);
|
|
int zrbhdr32 (ZC *zc, BYTE *hdr, int eflag);
|
|
int zrhhdr (ZC *zc, BYTE *hdr, int eflag);
|
|
|
|
void zputhex (ZC *zc, int c);
|
|
void zsendline (ZC *zc, int c);
|
|
int zgethex (ZC *zc);
|
|
int zgeth1 (ZC *zc);
|
|
int zdlread (ZC *zc);
|
|
int noxrd7 (ZC *zc);
|
|
void stohdr (ZC *zc, long pos);
|
|
long rclhdr (BYTE *hdr);
|
|
|
|
int zmdm_rl (ZC *zc, int timeout);
|
|
|
|
/* Functions used to fiddle with the displays */
|
|
|
|
void zmdms_progress (ZC *zc, int status);
|
|
void zmdms_newfile (ZC *zc, int filen, TCHAR *fname, long flength);
|
|
void zmdms_update (ZC *zc, int state);
|
|
|
|
void zmdmr_progress (ZC *zc, int status);
|
|
void zmdmr_update (ZC *zc, int status);
|
|
void zmdmr_filecnt (ZC *zc, int cnt);
|
|
void zmdmr_totalsize (ZC *zc, long bytes);
|
|
void zmdmr_newfile (ZC *zc, int filen, BYTE *theirname, TCHAR *ourname);
|
|
void zmdmr_filesize (ZC *zc, long fsize);
|
|
|
|
unsigned int zmdm_error (ZC *zc, int error);
|
|
int zmdm_retval (ZC *zc, int flag, int error);
|
|
|
|
/* from zmdm_rcv.c */
|
|
|
|
int tryz (ZC *zc);
|
|
int rzfiles (ZC *zc);
|
|
int rzfile (ZC *zc);
|
|
void zmputs (ZC *zc, char *s);
|
|
int closeit (ZC *zc);
|
|
void ackbibi (ZC *zc);
|
|
/* void bttyout (char c); */
|
|
|
|
/* from zmdm_snd.c */
|
|
|
|
int wcs (ZC *zc, TCHAR FAR *oname);
|
|
int wctxpn (ZC *zc, TCHAR FAR *name);
|
|
int zfilbuf (ZC *zc);
|
|
void canit (ZC *zc);
|
|
int getzrxinit (ZC *zc);
|
|
int sendzsinit (ZC *zc);
|
|
int zsendfile (ZC *zc, char *buf, int blen);
|
|
int zsendfdata (ZC *zc);
|
|
int getinsync (ZC *zc, int flag);
|
|
void saybibi (ZC *zc);
|
|
|
|
/* the following stuff is here as an attempt to match names into HA5 */
|
|
|
|
#define readline(h,x) zmdm_rl(h,x)
|
|
|
|
#define xsendline(h,p,c) fooComSendChar(h->hCom,p,c)
|
|
#define sendline(h,p,c) fooComSendChar(h->hCom,p,c)
|
|
#define flushmo(h,p) fooComSendPush(h->hCom,p)
|
|
|