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