|
|
1.1 root 1: /*
2: * zmodem.h
3: * zmodem constants
4: * (C) Mattheij Computer Service 1994
5: */
6:
7: /* $Id: zmodem.h,v 1.39 2006/02/24 09:50:50 rswindell Exp $ */
8:
9: #ifndef _ZMODEM_H
10: #define _ZMODEM_H
11:
12: #include <stdio.h> /* FILE */
13:
14: /*
15: * ascii constants
16: */
17:
18: #ifndef SOH
19: #define SOH 0x01
20: #define STX 0x02
21: #define EOT 0x04
22: #define ENQ 0x05
23: #define ACK 0x06
24: #if 0
25: #define LF 0x0a
26: #define CR 0x0d
27: #endif
28: #define DLE 0x10
29: #define XON 0x11
30: #define XOFF 0x13
31: #define NAK 0x15
32: #define CAN 0x18
33: #endif
34:
35: /*
36: * zmodem constants
37: */
38:
39: #define ZBLOCKLEN 1024 /* "true" Zmodem max subpacket length */
40:
41: #define ZMAXHLEN 0x10 /* maximum header information length */
42: #define ZMAXSPLEN 0x400 /* maximum subpacket length */
43:
44:
45: #define ZPAD 0x2a /* pad character; begins frames */
46: #define ZDLE 0x18 /* ctrl-x zmodem escape */
47: #define ZDLEE 0x58 /* escaped ZDLE */
48:
49: #define ZBIN 0x41 /* binary frame indicator (CRC16) */
50: #define ZHEX 0x42 /* hex frame indicator */
51: #define ZBIN32 0x43 /* binary frame indicator (CRC32) */
52: #define ZBINR32 0x44 /* run length encoded binary frame (CRC32) */
53:
54: #define ZVBIN 0x61 /* binary frame indicator (CRC16) */
55: #define ZVHEX 0x62 /* hex frame indicator */
56: #define ZVBIN32 0x63 /* binary frame indicator (CRC32) */
57: #define ZVBINR32 0x64 /* run length encoded binary frame (CRC32) */
58:
59: #define ZRESC 0x7e /* run length encoding flag / escape character */
60:
61: /*
62: * zmodem frame types
63: */
64:
65: #define ZRQINIT 0x00 /* request receive init (s->r) */
66: #define ZRINIT 0x01 /* receive init (r->s) */
67: #define ZSINIT 0x02 /* send init sequence (optional) (s->r) */
68: #define ZACK 0x03 /* ack to ZRQINIT ZRINIT or ZSINIT (s<->r) */
69: #define ZFILE 0x04 /* file name (s->r) */
70: #define ZSKIP 0x05 /* skip this file (r->s) */
71: #define ZNAK 0x06 /* last packet was corrupted (?) */
72: #define ZABORT 0x07 /* abort batch transfers (?) */
73: #define ZFIN 0x08 /* finish session (s<->r) */
74: #define ZRPOS 0x09 /* resume data transmission here (r->s) */
75: #define ZDATA 0x0a /* data packet(s) follow (s->r) */
76: #define ZEOF 0x0b /* end of file reached (s->r) */
77: #define ZFERR 0x0c /* fatal read or write error detected (?) */
78: #define ZCRC 0x0d /* request for file CRC and response (?) */
79: #define ZCHALLENGE 0x0e /* security challenge (r->s) */
80: #define ZCOMPL 0x0f /* request is complete (?) */
81: #define ZCAN 0x10 /* pseudo frame;
82: other end cancelled session with 5* CAN */
83: #define ZFREECNT 0x11 /* request free bytes on file system (s->r) */
84: #define ZCOMMAND 0x12 /* issue command (s->r) */
85: #define ZSTDERR 0x13 /* output data to stderr (??) */
86:
87: /*
88: * ZDLE sequences
89: */
90:
91: #define ZCRCE 0x68 /* CRC next, frame ends, header packet follows */
92: #define ZCRCG 0x69 /* CRC next, frame continues nonstop */
93: #define ZCRCQ 0x6a /* CRC next, frame continuous, ZACK expected */
94: #define ZCRCW 0x6b /* CRC next, frame ends, ZACK expected */
95: #define ZRUB0 0x6c /* translate to rubout 0x7f */
96: #define ZRUB1 0x6d /* translate to rubout 0xff */
97:
98: /*
99: * frame specific data.
100: * entries are prefixed with their location in the header array.
101: */
102:
103: /*
104: * Byte positions within header array
105: */
106:
107: #define FTYPE 0 /* frame type */
108:
109: #define ZF0 4 /* First flags byte */
110: #define ZF1 3
111: #define ZF2 2
112: #define ZF3 1
113:
114: #define ZP0 1 /* Low order 8 bits of position */
115: #define ZP1 2
116: #define ZP2 3
117: #define ZP3 4 /* High order 8 bits of file position */
118:
119: /*
120: * ZRINIT frame
121: * zmodem receiver capability flags
122: */
123:
124: #define ZF0_CANFDX 0x01 /* Receiver can send and receive true full duplex */
125: #define ZF0_CANOVIO 0x02 /* receiver can receive data during disk I/O */
126: #define ZF0_CANBRK 0x04 /* receiver can send a break signal */
127: #define ZF0_CANCRY 0x08 /* Receiver can decrypt DONT USE */
128: #define ZF0_CANLZW 0x10 /* Receiver can uncompress DONT USE */
129: #define ZF0_CANFC32 0x20 /* Receiver can use 32 bit Frame Check */
130: #define ZF0_ESCCTL 0x40 /* Receiver expects ctl chars to be escaped */
131: #define ZF0_ESC8 0x80 /* Receiver expects 8th bit to be escaped */
132:
133: #define ZF1_CANVHDR 0x01 /* Variable headers OK */
134:
135: /*
136: * ZSINIT frame
137: * zmodem sender capability
138: */
139:
140: #define ZF0_TESCCTL 0x40 /* Transmitter expects ctl chars to be escaped */
141: #define ZF0_TESC8 0x80 /* Transmitter expects 8th bit to be escaped */
142:
143: #define ZATTNLEN 0x20 /* Max length of attention string */
144: #define ALTCOFF ZF1 /* Offset to alternate canit string, 0 if not used */
145:
146: /*
147: * ZFILE frame
148: */
149:
150: /*
151: * Conversion options one of these in ZF0
152: */
153:
154: #define ZF0_ZCBIN 1 /* Binary transfer - inhibit conversion */
155: #define ZF0_ZCNL 2 /* Convert NL to local end of line convention */
156: #define ZF0_ZCRESUM 3 /* Resume interrupted file transfer */
157:
158: /*
159: * Management include options, one of these ored in ZF1
160: */
161:
162: #define ZF1_ZMSKNOLOC 0x80 /* Skip file if not present at rx */
163: #define ZF1_ZMMASK 0x1f /* Mask for the choices below */
164: #define ZF1_ZMNEWL 1 /* Transfer if source newer or longer */
165: #define ZF1_ZMCRC 2 /* Transfer if different file CRC or length */
166: #define ZF1_ZMAPND 3 /* Append contents to existing file (if any) */
167: #define ZF1_ZMCLOB 4 /* Replace existing file */
168: #define ZF1_ZMNEW 5 /* Transfer if source newer */
169: #define ZF1_ZMDIFF 6 /* Transfer if dates or lengths different */
170: #define ZF1_ZMPROT 7 /* Protect destination file */
171: #define ZF1_ZMCHNG 8 /* Change filename if destination exists */
172:
173: /*
174: * Transport options, one of these in ZF2
175: */
176:
177: #define ZF2_ZTNOR 0 /* no compression */
178: #define ZF2_ZTLZW 1 /* Lempel-Ziv compression */
179: #define ZF2_ZTRLE 3 /* Run Length encoding */
180:
181: /*
182: * Extended options for ZF3, bit encoded
183: */
184:
185: #define ZF3_ZCANVHDR 0x01 /* Variable headers OK */
186: /* Receiver window size override */
187: #define ZF3_ZRWOVR 0x04 /* byte position for receive window override/256 */
188: #define ZF3_ZXSPARS 0x40 /* encoding for sparse file operations */
189:
190: /*
191: * ZCOMMAND frame
192: */
193:
194: #define ZF0_ZCACK1 0x01 /* Acknowledge, then do command */
195:
196: typedef struct {
197:
198: BYTE rxd_header[ZMAXHLEN]; /* last received header */
199: int rxd_header_len; /* last received header size */
200: ulong rxd_header_pos; /* last received header position value */
201:
202: /*
203: * receiver capability flags
204: * extracted from the ZRINIT frame as received
205: */
206:
207: BOOL can_full_duplex;
208: BOOL can_overlap_io;
209: BOOL can_break;
210: BOOL can_fcs_32;
211: BOOL want_fcs_16;
212: BOOL escape_ctrl_chars;
213: BOOL escape_8th_bit;
214:
215: /*
216: * file management options.
217: * only one should be on
218: */
219:
220: int management_newer;
221: int management_clobber;
222: int management_protect;
223:
224: /* from zmtx.c */
225:
226: BYTE tx_data_subpacket[8192];
227: BYTE rx_data_subpacket[8192]; /* zzap = 8192 */
228:
229: char current_file_name[MAX_PATH+1];
230: ulong current_file_size;
231: time_t current_file_time;
232: unsigned current_file_num;
233: unsigned total_files;
234: ulong total_bytes;
235: unsigned files_remaining;
236: unsigned bytes_remaining;
237: ulong transfer_start_pos;
238: time_t transfer_start_time;
239:
240: int receive_32bit_data;
241: int use_crc16;
242: long ack_file_pos; /* file position used in acknowledgement of correctly */
243: /* received data subpackets */
244:
245: int last_sent;
246:
247: int n_cans;
248:
249: /* Stuff added by RRS */
250:
251: /* Status */
252: BOOL cancelled;
253: BOOL local_abort;
254: BOOL file_skipped;
255: BOOL no_streaming;
256: unsigned recv_bufsize; /* Receiver specified buffer size */
257: long crc_request;
258: unsigned errors;
259: unsigned consecutive_errors;
260:
261: /* Configuration */
262: BOOL escape_telnet_iac;
263: unsigned init_timeout;
264: unsigned send_timeout;
265: unsigned recv_timeout;
266: unsigned crc_timeout;
267: unsigned max_errors;
268: unsigned block_size;
269: unsigned max_block_size;
270:
271: /* Callbacks */
272: void* cbdata;
273: int (*lputs)(void*, int level, const char* str);
274: int (*send_byte)(void*, BYTE ch, unsigned timeout);
275: int (*recv_byte)(void*, unsigned timeout);
276: void (*progress)(void*, ulong current_pos);
277: BOOL (*is_connected)(void*);
278: BOOL (*is_cancelled)(void*);
279: BOOL (*data_waiting)(void*, unsigned timeout);
280:
281: } zmodem_t;
282:
283: void zmodem_init(zmodem_t*, void* cbdata
284: ,int (*lputs)(void*, int level, const char* str)
285: ,void (*progress)(void*, ulong current_pos)
286: ,int (*send_byte)(void*, BYTE ch, unsigned timeout)
287: ,int (*recv_byte)(void*, unsigned timeout)
288: ,BOOL (*is_connected)(void*)
289: ,BOOL (*is_cancelled)(void*)
290: ,BOOL (*data_waiting)(void*, unsigned timeout)
291: );
292: char* zmodem_ver(char *buf);
293: const char* zmodem_source(void);
294: int zmodem_rx(zmodem_t* zm);
295: int zmodem_tx(zmodem_t* zm, BYTE ch);
296: int zmodem_abort_receive(zmodem_t*);
297: int zmodem_send_ack(zmodem_t*, long pos);
298: int zmodem_send_nak(zmodem_t*);
299: int zmodem_send_zskip(zmodem_t* zm);
300: int zmodem_send_zrinit(zmodem_t*);
301: int zmodem_send_pos_header(zmodem_t* zm, int type, long pos, BOOL hex);
302: int zmodem_get_zrinit(zmodem_t*);
303: int zmodem_get_zfin(zmodem_t* zm);
304: BOOL zmodem_get_crc(zmodem_t*, long length, ulong* crc);
305: void zmodem_parse_zrinit(zmodem_t*);
306: void zmodem_parse_zfile_subpacket(zmodem_t* zm);
307: int zmodem_send_zfin(zmodem_t*);
308: BOOL zmodem_send_file(zmodem_t*, char* name, FILE* fp, BOOL request_init, time_t* start, ulong* bytes_sent);
309: int zmodem_recv_files(zmodem_t* zm, const char* download_dir, ulong* bytes_received);
310: int zmodem_recv_init(zmodem_t* zm);
311: unsigned zmodem_recv_file_data(zmodem_t*, FILE*, ulong offset);
312: int zmodem_recv_file_frame(zmodem_t* zm, FILE* fp);
313: int zmodem_recv_header_and_check(zmodem_t* zm);
314: #endif
315:
316:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.