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