/* xprzmodem.h: Definitions for xprzmodem.library; Version 2.0, 28 October 1989, by Rick Huebner. Released to the Public Domain; do as you like with this code. */ /* #define DEBUGLOG 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 64 /* 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 Zsdatabuf[KSIZE*2+2]; /* Modem output buffer for file data xmit */ 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 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 */ void *File; /* Handle of file being transferred */ 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 */ }; /* Option settings and other variables needed outside of XProtocolSend/Receive; separated from rest of Vars so that huge Vars struct doesn't have to be allocated except during transfers. Pointer to this struct kept in xpr_data. */ struct SetupVars { UBYTE *matchptr, *bufpos; short buflen; UBYTE option_t[2], option_o[2], option_b[8], option_f[8], option_s[4]; UBYTE option_r[4], option_a[4], option_d[4], option_k[4], option_p[256]; }; /* Function prototypes */ long __saveds XProtocolSend(struct XPR_IO *io); short getzrxinit(struct Vars *v); void sendbatch(struct Vars *v); short sendone(struct Vars *v); short sendname(struct Vars *v); short zsendfile(struct Vars *v,short blen); short zsendfdata(struct Vars *v); short getinsync(struct Vars *v); void saybibi(struct Vars *v); long __saveds XProtocolReceive(struct XPR_IO *io); short rcvbatch(struct Vars *v); short tryz(struct Vars *v); short rzfiles(struct Vars *v); short rzfile(struct Vars *v); short procheader(struct Vars *v); short putsec(struct Vars *v); void ackbibi(struct Vars *v); long __saveds XProtocolSetup(struct XPR_IO *io); long __saveds XProtocolCleanup(struct XPR_IO *io); long __saveds XProtocolHostMon(struct XPR_IO *io,UBYTE *serbuff,long actual,long maxsize); long __saveds XProtocolUserMon(struct XPR_IO *io,UBYTE *serbuff,long actual,long maxsize); struct Vars *setup(struct XPR_IO *io); UBYTE *find_option(UBYTE *buf,UBYTE option); void set_textmode(struct Vars *v); void canit(struct Vars *v); void zmputs(struct Vars *v,UBYTE *s); void xsendline(struct Vars *v,UBYTE c); short readock(struct Vars *v,short tenths); char char_avail(struct Vars *v); void update_rate(struct Vars *v); void *bfopen(struct Vars *v,UBYTE *mode); void bfclose(struct Vars *v); void bfseek(struct Vars *v,long pos); long bfread(struct Vars *v,UBYTE *buf,long length); long bfwrite(struct Vars *v,UBYTE *buf,long length); void ioerr(struct XPR_IO *io,char *msg); void upderr(struct Vars *v,char *msg); void updmsg(struct Vars *v,char *msg); long getfree(void); char exist(struct Vars *v); #ifdef DEBUG void dlog(struct Vars *v,UBYTE *s); #endif void zsbhdr(struct Vars *v,USHORT type); void zshhdr(struct Vars *v,USHORT type); void zsdata(struct Vars *v,short length,USHORT frameend); short zrdata(struct Vars *v,UBYTE *buf,short length); short zgethdr(struct Vars *v); short zrbhdr(struct Vars *v); short zrhhdr(struct Vars *v); void zputhex(struct Vars *v,UBYTE c); void zsendline(struct Vars *v,UBYTE c); short zgethex(struct Vars *v); short zdlread(struct Vars *v); short noxrd7(struct Vars *v); void stohdr(struct Vars *v,long pos); long rclhdr(struct Vars *v); extern ULONG UnixTimeOffset; ULONG GetSysTime(struct timeval *tv); void TimeOut(long ticks);