/* defs.h: Definitions for xprzmodem.library; Version 1.0, 29 July 1989, by Rick Huebner. Released to the Public Domain; do as you like with this code. */ /* #define DEBUG 1 */ /* Return codes */ #define OK 0 #define ERROR (-1) #define TIMEOUT (-2) #define RCDO (-3) /* Relevant control characters */ #define CR ('M'&0x1F) /* ^M */ #define DLE ('P'&0x1F) /* ^P */ #define XON ('Q'&0x1F) /* ^Q */ #define XOFF ('S'&0x1F) /* ^S */ #define CAN ('X'&0x1F) /* ^X */ #define CPMEOF ('Z'&0x1F) /* ^Z */ /* Misc. program constants */ #define LZMANAG 0 /* Default ZMODEM file management mode */ #define LZTRANS 0 /* Default ZMODEM file transport mode */ #define PATHLEN 256 /* What's the max legal path size? */ #define CONFIGLEN 32 /* Max length of transfer options string */ #define KSIZE 1024 /* Max allowable packet size */ #define MINBLOCK 32 /* Min allowable packet size */ #define MAXGOODNEEDED 8192 /* Max # good bytes required to bump packet size */ /* Provision for future 7-bit ZMODEM; for now, there's no difference */ #define sendline xsendline /* Replacement for global variables normally used, in order to make code fully reentrant; each invocation allocs their own Vars, and passes the struct pointer down through the entire program so they're always available. Pointer to this struct is usually able to be a register variable, so access is no worse than any stack variable (all register-relative). Kinda kludgey, but the original ZModem code design depended on lots of globals, and I didn't want to redesign the whole damn thing. Besides, it's more efficient than constantly pushing & popping args all over the place. */ struct Vars { struct XPR_IO io; /* Copy of XProtocol IO struct passed in by term prog. */ struct XPR_UPDATE xpru; /* Scratchpad xpr_update() control struct */ UBYTE Zconv; /* ZMODEM file conversion request */ UBYTE Zmanag; /* ZMODEM file management request */ UBYTE Ztrans; /* ZMODEM file transport request */ UBYTE Lastsent; /* Last text char written by putsec() */ UBYTE Lastzsent; /* Last char sent by zsendline() */ UBYTE Fileflush; /* Flush file I/O buffer before closing? */ UBYTE Msgbuf[128]; /* Scratchpad buffer for printing messages */ UBYTE Filename[PATHLEN]; /* Name of the file being up/downloaded */ UBYTE Modembuf[256]; /* Input buffer for data from modem */ UBYTE *Modemchar; /* Next char to get from Modembuf */ UBYTE *Filebuf; /* File I/O buffer address */ UBYTE *Filebufptr; /* Current position within Filebuf */ char Rxbinary; /* Force binary mode download? */ char Rxascii; /* Force text mode download? */ char Thisbinary; /* Receive this file in binary mode? */ char Lzconv; /* Suggested binary/text mode for uploads */ char Eofseen; /* Text-mode EOF marker (^Z) received on download? */ short Filcnt; /* Number of files opened for transmission */ short Errcnt; /* Number of files unreadable */ short Noroom; /* Flags 'insufficient disk space' errors */ short Rxbuflen; /* Largest frame they're willing to xfer */ short Tframlen; /* Largest frame we're willing to xfer */ short Rxtimeout; /* Tenths of seconds to wait for something */ short Tryzhdrtype; /* Header type to send corresponding to Last rx close */ short Modemcount; /* Number of bytes available in Modembuf */ long File; /* Handle of file being transferred */ long Oldstatus; /* Original terminal program's modem settings */ long Baud; /* BPS setting of modem */ long Strtpos; /* Starting byte position of transfer */ long Starttime; /* Time transfer started */ long Fsize; /* Size of file being transferred */ long Rxbytes; /* Number of bytes received so far */ long Filebufpos; /* File offset of data in Filebuf */ long Filebufmax; /* Size of Filebuf */ long Filebuflen; /* Number of bytes currently stored in Filebuf */ long Filebufcnt; /* Number of bytes remaining/written in Filebuf */ UBYTE Pktbuf[KSIZE]; /* File data packet buffer */ UBYTE Rxhdr[4]; /* Received header */ UBYTE Txhdr[4]; /* Transmitted header */ UBYTE Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ short Rxframeind; /* ZBIN or ZHEX; type of frame received */ short Rxtype; /* Type of header received */ short Rxcount; /* Count of data bytes received */ short Znulls; /* Number of nulls to send at beginning of ZDATA hdr */ long Rxpos; /* Received file position */ long Txpos; /* Transmitted file position */ }; /* Function declarations; change to ANSI prototypes when Manx gets their act together */ long XProtocolSend(); short getzrxinit(); void sendbatch(); short sendone(); short sendname(); short zsendfile(); short zsendfdata(); short getinsync(); void saybibi(); long XProtocolReceive(); short rcvbatch(); short tryz(); short rzfiles(); short rzfile(); short procheader(); short putsec(); void ackbibi(); long XProtocolSetup(); long XProtocolCleanup(); struct Vars *setup(); void canit(); void zmputs(); void xsendline(); short readock(); char char_avail(); void update_rate(); long bfopen(); void bfclose(); void bfseek(); long bfread(); long brwrite(); void ioerr(); void upderr(); void updmsg(); long getfree(); char exist(); void zsbhdr(); void zshhdr(); void zsdata(); short zrdata(); short zgethdr(); short zrbhdr(); short zrhhdr(); void zputhex(); void zsendline(); short zgethex(); short zdlread(); short noxrd7(); void stohdr(); long rclhdr(); long calla(); long callaa(); long callad(); long calladda(); long calld(); long calldaa();