1#ifndef __KERMIT_H__
2#define __KERMIT_H__
3
4#define VERSION "1.7"			/* Kermit module version number */
5
6/*
7  kermit.h -- Symbol and struct definitions for embedded Kermit.
8
9  As of version 1.6 of 30 March 2011, E-Kermit is Open Source software under
10  the Revised 3-Clause BSD license which follows.  E-Kermit 1.6 is identical
11  to version 1.51 except for the new license.
12
13  Author: Frank da Cruz.
14
15  Copyright (C) 1995, 2011,
16  Trustees of Columbia University in the City of New York.
17  All rights reserved.
18
19  Redistribution and use in source and binary forms, with or without
20  modification, are permitted provided that the following conditions are met:
21
22  * Redistributions of source code must retain the above copyright notice,
23    this list of conditions and the following disclaimer.
24
25  * Redistributions in binary form must reproduce the above copyright notice,
26    this list of conditions and the following disclaimer in the documentation
27    and/or other materials provided with the distribution.
28
29  * Neither the name of Columbia University nor the names of its contributors
30    may be used to endorse or promote products derived from this software
31    without specific prior written permission.
32
33  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
34  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
37  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
38  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
39  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
40  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
41  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
43  POSSIBILITY OF SUCH DAMAGE.
44*/
45
46#ifdef COMMENT                          /* COMMENT must not be defined */
47#undef COMMENT				/* (e.g. in a platform header file) */
48#endif /* COMMENT */
49
50/*
51  Never use NULL as a pointer.  Always use 0 cast to the appropriate type,
52  for example: (UCHAR *)0.  Reason: compiler might define NULL to be an
53  integer 0, and when passed to a function that wants a pointer, might wind
54  up with junk in the left half (if pointers wider than ints).
55*/
56#ifdef NULL
57#undef NULL
58#endif /* NULL */
59
60/* Feature Selection */
61
62/* XAC compiler for Philips XAG30 microprocessor */
63/* See http://www.columbia.edu/kermit/em-apex.html */
64
65#ifdef XAC				/* XAC has tiny command line */
66#define NO_LP				/* Long packets too big for APF9 */
67#define NO_SSW
68#define NO_SCAN				/* No file system */
69#define FN_MAX  16
70#define IBUFLEN 128
71#define OBUFLEN 512
72
73#else  /* XAC */
74
75#ifdef MINSIZE
76#define NO_LP
77#define NO_AT
78#define NO_CTRLC
79#define NO_SSW
80#define NO_CRC
81#define NO_SCAN
82#endif	/* MINSIZE */
83
84#endif	/* XAC */
85
86#ifndef NO_LP
87#define F_LP                            /* Long packets */
88#endif	/* NO_LP */
89
90#ifndef NO_AT
91#define F_AT                            /* Attribute packets */
92#endif	/* NO_AT */
93
94#ifndef NO_CTRLC
95#define F_CTRLC                         /* 3 consecutive Ctrl-C's to quit */
96#endif	/* NO_CTRLC */
97
98#ifndef NO_SSW
99#define F_SSW				/* Simulated sliding windows */
100#endif	/* NO_SSW */
101
102#ifndef NO_SCAN
103#define F_SCAN				/* Scan files for text/binary */
104#endif	/* NO_SCAN */
105
106#ifndef NO_CRC				/* Type 2 and 3 block checks */
107#define F_CRC
108#endif /* NO_CRC */
109
110/*
111  F_SSW means we say (in negotiations) that we support sliding windows, but we
112  really don't.  This allows the sender to send to us in a steady stream, and
113  works just fine except that error recovery is via go-back-to-n rather than
114  selective repeat.
115*/
116
117#ifdef COMMENT                          /* None of the following ... */
118/*
119  + = It works if selected
120  - = Partially implemented but doesn't work
121  0 = Not implemented
122*/
123  #define F_TSW                         /* - True sliding windows */
124  #define F_LS                          /* 0 Locking shifts */
125  #define F_RS                          /* 0 Recovery */
126
127#endif /* COMMENT */
128
129#ifdef F_TSW				/* F_SW is defined if either */
130#ifndef F_SW				/* F_SSW or F_TSW is defined... */
131#define F_SW
132#endif /* F_SW */
133#endif /* F_TSW */
134
135#ifdef F_SSW
136#ifndef F_SW
137#define F_SW
138#endif /* F_SW */
139#endif /* F_SSW */
140
141/* Control character symbols */
142
143#define NUL  '\0'                       /* Null */
144#define SOH  001                        /* Start of header */
145#define LF   012                        /* Linefeed */
146#define CR   015                        /* Carriage Return */
147#define SO   016                        /* Shift Out */
148#define SI   017                        /* Shift In */
149#define DLE  020                        /* Datalink Escape */
150#define ESC  033                        /* Escape */
151#define XON  021                        /* XON */
152#define XOFF 023                        /* XOFF */
153#define SP   040                        /* Space */
154#define DEL  0177                       /* Delete (Rubout) */
155
156#ifndef HAVE_VERSION			/* k_data struct has version member */
157#define HAVE_VERSION			/* as of version 1.1 */
158#endif /* HAVE_VERSION */
159
160/* Main program return codes */
161
162#define SUCCESS     0
163#define FAILURE     1
164
165/* Buffer lengths (can be overridden in platform.h) */
166
167#ifndef RECVONLY
168#ifndef IBUFLEN
169#define IBUFLEN  1024			/* File input buffer size */
170#endif /* IBUFLEN */
171#endif	/* RECVONLY */
172
173#ifndef OBUFLEN
174#define OBUFLEN  1024                   /* File output buffer size */
175#endif /* OBUFLEN */
176
177#ifndef IDATALEN			/* S/I packet data max length */
178#define IDATALEN 32
179#endif /* IDATALEN */
180
181#ifndef FN_MAX
182#define FN_MAX   1024                   /* Maximum filename length */
183#endif /* FN_MAX */
184
185#define DATE_MAX   20                   /* Max length for file date */
186
187/* Protocol parameters */
188
189#ifndef P_WSLOTS
190#ifdef F_SW                             /* Window slots */
191#ifdef F_TSW				/* True window slots */
192#define P_WSLOTS    4			/* Max is 4 */
193#else
194#define P_WSLOTS   31			/* Simulated max is 31 */
195#endif /* F_TSW */
196#else
197#define P_WSLOTS    1
198#endif /* F_SW */
199#endif /* P_WSLOTS */
200
201#ifndef P_PKTLEN			/* Kermit max packet length */
202#ifdef F_LP
203#define P_PKTLEN 4096
204#else
205#define P_PKTLEN   94
206#endif /* F_LP */
207#endif /* P_PKTLEN */
208
209/* Generic On/Off values */
210
211#define OFF         0
212#define ON          1
213
214/* File Transfer Modes */
215
216#define BINARY      0
217#define TEXT        1
218
219/* Parity values */
220
221#define PAR_NONE    0
222#define PAR_SPACE   1
223#define PAR_EVEN    2
224#define PAR_ODD     3
225#define PAR_MARK    4
226
227/* Protocol parameters */
228
229#define P_S_TIMO   40                   /* Timeout to tell other Kermit  */
230#define P_R_TIMO    5                   /* Default timeout for me to use */
231#define P_RETRY    10                   /* Per-packet retramsit limit    */
232#define P_PARITY  PAR_NONE              /* Default parity        */
233#define P_R_SOH   SOH                   /* Incoming packet start */
234#define P_S_SOH   SOH                   /* Outbound packet start */
235#define P_R_EOM    CR                   /* Incoming packet end   */
236#define P_S_EOM    CR                   /* Outbound packet end   */
237
238/* Capability bits */
239
240#define CAP_LP      2                   /* Long packet capability */
241#define CAP_SW      4                   /* Sliding windows capability */
242#define CAP_AT      8                   /* Attribute packet capability */
243#define CAP_RS     16                   /* Resend capability */
244#define CAP_LS     32                   /* Locking shift capability */
245
246/* Actions */
247
248#define A_SEND      1			/* Send file(s) */
249#define A_RECV      2			/* Receive file(s) */
250
251/* Receive protocol states */
252
253#define R_ERROR    -1                   /* Fatal protocol error */
254#define R_NONE      0                   /* Protocol not running */
255#define R_WAIT      1                   /* Waiting for S packet */
256#define R_FILE      2                   /* Waiting for F or B packet */
257#define R_ATTR      3                   /* Waiting for A or D packet */
258#define R_DATA      4                   /* Waiting for D or Z packet */
259
260/* Send protocol states */
261
262#define S_ERROR    -1                   /* Fatal protocol error */
263#define S_NONE     10                   /* Protocol not running */
264#define S_INIT     11                   /* Sent S packet */
265#define S_FILE     12                   /* Sent F packet */
266#define S_ATTR     13                   /* Sent A packet */
267#define S_DATA     14                   /* Sent D packet */
268#define S_EOF      15                   /* Sent Z packet */
269#define S_EOT      16                   /* Sent B packet */
270
271/* What I'm Doing */
272
273#define W_NOTHING   0
274#define W_SEND      1
275#define W_RECV      2
276
277/* Kermit module function codes */
278
279#define K_INIT      0                   /* Initialize */
280#define K_RUN       1                   /* Run */
281#define K_STATUS    2                   /* Request status */
282#define K_CONTINUE  3                   /* Keep going */
283#define K_QUIT      4                   /* Quit immediately */
284#define K_ERROR     5                   /* Quit with error packet, msg given */
285#define K_SEND      6			/* Begin Send sequence */
286
287/* Kermit module return codes */
288
289#define X_ERROR    -1                   /* Fatal error */
290#define X_OK        0                   /* OK, no action needed */
291#define X_FILE      1                   /* Filename received */
292#define X_DATA      2                   /* File data received */
293#define X_DONE      3                   /* Done */
294#define X_STATUS    4                   /* Status report */
295
296/* Interruption codes */
297
298#define I_FILE      1			/* Cancel file */
299#define I_GROUP     2			/* Cancel group */
300
301struct packet {
302    int len;                            /* Length */
303    short seq;                          /* Sequence number */
304    char typ;                           /* Type */
305    short rtr;                          /* Retry count */
306    UCHAR * dat;                        /* Pointer to data */
307    short flg;				/* Flags */
308};
309
310struct k_data {                         /* The Kermit data structure */
311    UCHAR * version;			/* Version number of Kermit module */
312    short remote;			/* 0 = local, 1 = remote */
313    short xfermode;			/* 0 = automatic, 1 = manual */
314    short binary;                       /* 0 = text, 1 = binary */
315    short state;                        /* Kermit protocol state */
316    short what;				/* Action (send or receive) */
317    short s_first;			/* Enocode at beginning of file */
318    short s_next;			/* Encode lookahead byte */
319    short s_seq;                        /* Sequence number sent */
320    short r_seq;                        /* Sequence number received */
321    short s_type;                       /* Packet type sent */
322    short r_type;                       /* Packet type received */
323    short s_soh;                        /* Packet start sent */
324    short r_soh;                        /* Packet start received */
325    short s_eom;                        /* Packet end sent */
326    short r_eom;                        /* Packet end received */
327    int size;				/* Current size of output pkt data */
328    int osize;				/* Previous output packet data size */
329    int r_timo;                         /* Receive and send timers */
330    int s_timo;                         /* ... */
331    int r_maxlen;                       /* maximum packet length to receive */
332    int s_maxlen;                       /* maximum packet length to send */
333    short window;                       /* maximum window slots */
334    short wslots;                       /* current window slots */
335    short parity;                       /* 0 = none, nonzero = some */
336    short retry;                        /* retry limit */
337    short cancel;			/* Cancellation */
338    short ikeep;			/* Keep incompletely received files */
339    char s_ctlq;                        /* control-prefix out */
340    char r_ctlq;                        /* control-prefix in */
341    char ebq;				/* 8-bit prefix */
342    char ebqflg;			/* 8-bit prefixing negotiated */
343    char rptq;				/* Repeat-count prefix */
344    int s_rpt;				/* Current repeat count */
345    short rptflg;                       /* flag for repeat counts negotiated */
346    short bct;                          /* Block-check type 1..3 */
347    unsigned short capas;               /* Capability bits */
348#ifdef F_CRC
349    USHORT crcta[16];			/* CRC generation table A */
350    USHORT crctb[16];			/* CRC generation table B */
351#endif /* F_CRC */
352    UCHAR s_remain[6];			 /* Send data leftovers */
353    UCHAR ipktbuf[P_PKTLEN+8][P_WSLOTS]; /* Buffers for incoming packets */
354    struct packet ipktinfo[P_WSLOTS];    /* Incoming packet info */
355#ifdef COMMENT
356    UCHAR opktbuf[P_PKTLEN+8][P_WSLOTS]; /* Buffers for outbound packets */
357#else
358    UCHAR opktbuf[P_PKTLEN+8];		/* Outbound packet buffer */
359    int opktlen;			/* Outbound packet length */
360    UCHAR xdatabuf[P_PKTLEN+2];		/* Buffer for building data field */
361#endif /* COMMENT */
362    struct packet opktinfo[P_WSLOTS];	/* Outbound packet info */
363    UCHAR * xdata;			/* Pointer to data field of outpkt */
364#ifdef F_TSW
365    short r_pw[64];			/* Packet Seq.No. to window-slot map */
366    short s_pw[64];			/* Packet Seq.No. to window-slot map */
367#endif /* F_TSW */
368    UCHAR ack_s[IDATALEN];		/* Our own init parameter string */
369    UCHAR * obuf;
370    int rx_avail;			/* Comms bytes available for reading */
371    int obuflen;                        /* Length of output file buffer */
372    int obufpos;                        /* Output file buffer position */
373    UCHAR ** filelist;			/* List of files to send */
374    UCHAR * dir;			/* Directory */
375    UCHAR * filename;			/* Name of current file */
376    UCHAR * istring;			/* Pointer to string to encode from */
377    UCHAR * ostring;			/* Pointer to string to decode to */
378    int (*rxd)(struct k_data *, UCHAR *, int);   /* Comms read function */
379    int (*txd)(struct k_data *, UCHAR *, int);   /* and comms write function */
380    int (*ixd)(struct k_data *);	         /* and comms info function */
381    int (*openf)(struct k_data *,UCHAR *,int);   /* open-file function  */
382    ULONG (*finfo)(struct k_data *,UCHAR *,UCHAR *,int,short *,short);
383    int (*readf)(struct k_data *);	         /* read-file function  */
384    int (*writef)(struct k_data *,UCHAR *, int); /* write-file function */
385    int (*closef)(struct k_data *,UCHAR,int);    /* close-file function */
386    void (*dbf)(int,UCHAR *,UCHAR *,long);  /* debug function */
387    UCHAR * zinbuf;			/* Input file buffer itself */
388    int zincnt;				/* Input buffer position */
389    int zinlen;				/* Length of input file buffer */
390    UCHAR * zinptr;			/* Pointer to input file buffer */
391    int bctf;				/* Flag to force type 3 block check */
392    int dummy;
393};
394
395struct k_response {			/* Report from Kermit */
396    short status;                       /* Current status */
397    UCHAR filename[FN_MAX];             /* Name of current file */
398    UCHAR filedate[DATE_MAX];           /* Date of file */
399    long filesize;                      /* Size of file */
400    long sofar;				/* Bytes transferred so far */
401};
402
403/* Macro definitions */
404
405#define tochar(ch)  (UCHAR)((UCHAR)((UCHAR)(ch) + SP ))
406#define xunchar(ch) (UCHAR)((UCHAR)((UCHAR)(ch) - SP ))
407#define ctl(ch)     (UCHAR)((UCHAR)((UCHAR)(ch) ^ 64 ))
408
409#ifdef COMMENT
410#define tochar(ch)  (((ch) + SP ) & 0xFF ) /* Digit to character */
411#define xunchar(ch) (((ch) - SP ) & 0xFF ) /* Character to number */
412#define ctl(ch)     (((ch) ^ 64 ) & 0xFF ) /* Controllify/uncontrollify */
413#endif /* COMMENT */
414
415/* Prototypes for kermit() functions */
416
417int kermit(short, struct k_data *, short, int, char *, struct k_response *);
418UCHAR * getrslot(struct k_data *, short *);
419UCHAR * getsslot(struct k_data *, short *);
420void freerslot(struct k_data *, short);
421void freesslot(struct k_data *, short);
422
423#endif /* __KERMIT_H__ */
424