diff options
Diffstat (limited to 'kermit.h')
-rw-r--r-- | kermit.h | 423 |
1 files changed, 423 insertions, 0 deletions
diff --git a/kermit.h b/kermit.h new file mode 100644 index 0000000..acfd99c --- /dev/null +++ b/kermit.h @@ -0,0 +1,423 @@ +#ifndef __KERMIT_H__ +#define __KERMIT_H__ + +#define VERSION "1.7" /* Kermit module version number */ + +/* + kermit.h -- Symbol and struct definitions for embedded Kermit. + + As of version 1.6 of 30 March 2011, E-Kermit is Open Source software under + the Revised 3-Clause BSD license which follows. E-Kermit 1.6 is identical + to version 1.51 except for the new license. + + Author: Frank da Cruz. + + Copyright (C) 1995, 2011, + Trustees of Columbia University in the City of New York. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Columbia University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef COMMENT /* COMMENT must not be defined */ +#undef COMMENT /* (e.g. in a platform header file) */ +#endif /* COMMENT */ + +/* + Never use NULL as a pointer. Always use 0 cast to the appropriate type, + for example: (UCHAR *)0. Reason: compiler might define NULL to be an + integer 0, and when passed to a function that wants a pointer, might wind + up with junk in the left half (if pointers wider than ints). +*/ +#ifdef NULL +#undef NULL +#endif /* NULL */ + +/* Feature Selection */ + +/* XAC compiler for Philips XAG30 microprocessor */ +/* See http://www.columbia.edu/kermit/em-apex.html */ + +#ifdef XAC /* XAC has tiny command line */ +#define NO_LP /* Long packets too big for APF9 */ +#define NO_SSW +#define NO_SCAN /* No file system */ +#define FN_MAX 16 +#define IBUFLEN 128 +#define OBUFLEN 512 + +#else /* XAC */ + +#ifdef MINSIZE +#define NO_LP +#define NO_AT +#define NO_CTRLC +#define NO_SSW +#define NO_CRC +#define NO_SCAN +#endif /* MINSIZE */ + +#endif /* XAC */ + +#ifndef NO_LP +#define F_LP /* Long packets */ +#endif /* NO_LP */ + +#ifndef NO_AT +#define F_AT /* Attribute packets */ +#endif /* NO_AT */ + +#ifndef NO_CTRLC +#define F_CTRLC /* 3 consecutive Ctrl-C's to quit */ +#endif /* NO_CTRLC */ + +#ifndef NO_SSW +#define F_SSW /* Simulated sliding windows */ +#endif /* NO_SSW */ + +#ifndef NO_SCAN +#define F_SCAN /* Scan files for text/binary */ +#endif /* NO_SCAN */ + +#ifndef NO_CRC /* Type 2 and 3 block checks */ +#define F_CRC +#endif /* NO_CRC */ + +/* + F_SSW means we say (in negotiations) that we support sliding windows, but we + really don't. This allows the sender to send to us in a steady stream, and + works just fine except that error recovery is via go-back-to-n rather than + selective repeat. +*/ + +#ifdef COMMENT /* None of the following ... */ +/* + + = It works if selected + - = Partially implemented but doesn't work + 0 = Not implemented +*/ + #define F_TSW /* - True sliding windows */ + #define F_LS /* 0 Locking shifts */ + #define F_RS /* 0 Recovery */ + +#endif /* COMMENT */ + +#ifdef F_TSW /* F_SW is defined if either */ +#ifndef F_SW /* F_SSW or F_TSW is defined... */ +#define F_SW +#endif /* F_SW */ +#endif /* F_TSW */ + +#ifdef F_SSW +#ifndef F_SW +#define F_SW +#endif /* F_SW */ +#endif /* F_SSW */ + +/* Control character symbols */ + +#define NUL '\0' /* Null */ +#define SOH 001 /* Start of header */ +#define LF 012 /* Linefeed */ +#define CR 015 /* Carriage Return */ +#define SO 016 /* Shift Out */ +#define SI 017 /* Shift In */ +#define DLE 020 /* Datalink Escape */ +#define ESC 033 /* Escape */ +#define XON 021 /* XON */ +#define XOFF 023 /* XOFF */ +#define SP 040 /* Space */ +#define DEL 0177 /* Delete (Rubout) */ + +#ifndef HAVE_VERSION /* k_data struct has version member */ +#define HAVE_VERSION /* as of version 1.1 */ +#endif /* HAVE_VERSION */ + +/* Main program return codes */ + +#define SUCCESS 0 +#define FAILURE 1 + +/* Buffer lengths (can be overridden in platform.h) */ + +#ifndef RECVONLY +#ifndef IBUFLEN +#define IBUFLEN 1024 /* File input buffer size */ +#endif /* IBUFLEN */ +#endif /* RECVONLY */ + +#ifndef OBUFLEN +#define OBUFLEN 1024 /* File output buffer size */ +#endif /* OBUFLEN */ + +#ifndef IDATALEN /* S/I packet data max length */ +#define IDATALEN 32 +#endif /* IDATALEN */ + +#ifndef FN_MAX +#define FN_MAX 1024 /* Maximum filename length */ +#endif /* FN_MAX */ + +#define DATE_MAX 20 /* Max length for file date */ + +/* Protocol parameters */ + +#ifndef P_WSLOTS +#ifdef F_SW /* Window slots */ +#ifdef F_TSW /* True window slots */ +#define P_WSLOTS 4 /* Max is 4 */ +#else +#define P_WSLOTS 31 /* Simulated max is 31 */ +#endif /* F_TSW */ +#else +#define P_WSLOTS 1 +#endif /* F_SW */ +#endif /* P_WSLOTS */ + +#ifndef P_PKTLEN /* Kermit max packet length */ +#ifdef F_LP +#define P_PKTLEN 4096 +#else +#define P_PKTLEN 94 +#endif /* F_LP */ +#endif /* P_PKTLEN */ + +/* Generic On/Off values */ + +#define OFF 0 +#define ON 1 + +/* File Transfer Modes */ + +#define BINARY 0 +#define TEXT 1 + +/* Parity values */ + +#define PAR_NONE 0 +#define PAR_SPACE 1 +#define PAR_EVEN 2 +#define PAR_ODD 3 +#define PAR_MARK 4 + +/* Protocol parameters */ + +#define P_S_TIMO 40 /* Timeout to tell other Kermit */ +#define P_R_TIMO 5 /* Default timeout for me to use */ +#define P_RETRY 10 /* Per-packet retramsit limit */ +#define P_PARITY PAR_NONE /* Default parity */ +#define P_R_SOH SOH /* Incoming packet start */ +#define P_S_SOH SOH /* Outbound packet start */ +#define P_R_EOM CR /* Incoming packet end */ +#define P_S_EOM CR /* Outbound packet end */ + +/* Capability bits */ + +#define CAP_LP 2 /* Long packet capability */ +#define CAP_SW 4 /* Sliding windows capability */ +#define CAP_AT 8 /* Attribute packet capability */ +#define CAP_RS 16 /* Resend capability */ +#define CAP_LS 32 /* Locking shift capability */ + +/* Actions */ + +#define A_SEND 1 /* Send file(s) */ +#define A_RECV 2 /* Receive file(s) */ + +/* Receive protocol states */ + +#define R_ERROR -1 /* Fatal protocol error */ +#define R_NONE 0 /* Protocol not running */ +#define R_WAIT 1 /* Waiting for S packet */ +#define R_FILE 2 /* Waiting for F or B packet */ +#define R_ATTR 3 /* Waiting for A or D packet */ +#define R_DATA 4 /* Waiting for D or Z packet */ + +/* Send protocol states */ + +#define S_ERROR -1 /* Fatal protocol error */ +#define S_NONE 10 /* Protocol not running */ +#define S_INIT 11 /* Sent S packet */ +#define S_FILE 12 /* Sent F packet */ +#define S_ATTR 13 /* Sent A packet */ +#define S_DATA 14 /* Sent D packet */ +#define S_EOF 15 /* Sent Z packet */ +#define S_EOT 16 /* Sent B packet */ + +/* What I'm Doing */ + +#define W_NOTHING 0 +#define W_SEND 1 +#define W_RECV 2 + +/* Kermit module function codes */ + +#define K_INIT 0 /* Initialize */ +#define K_RUN 1 /* Run */ +#define K_STATUS 2 /* Request status */ +#define K_CONTINUE 3 /* Keep going */ +#define K_QUIT 4 /* Quit immediately */ +#define K_ERROR 5 /* Quit with error packet, msg given */ +#define K_SEND 6 /* Begin Send sequence */ + +/* Kermit module return codes */ + +#define X_ERROR -1 /* Fatal error */ +#define X_OK 0 /* OK, no action needed */ +#define X_FILE 1 /* Filename received */ +#define X_DATA 2 /* File data received */ +#define X_DONE 3 /* Done */ +#define X_STATUS 4 /* Status report */ + +/* Interruption codes */ + +#define I_FILE 1 /* Cancel file */ +#define I_GROUP 2 /* Cancel group */ + +struct packet { + int len; /* Length */ + short seq; /* Sequence number */ + char typ; /* Type */ + short rtr; /* Retry count */ + UCHAR * dat; /* Pointer to data */ + short flg; /* Flags */ +}; + +struct k_data { /* The Kermit data structure */ + UCHAR * version; /* Version number of Kermit module */ + short remote; /* 0 = local, 1 = remote */ + short xfermode; /* 0 = automatic, 1 = manual */ + short binary; /* 0 = text, 1 = binary */ + short state; /* Kermit protocol state */ + short what; /* Action (send or receive) */ + short s_first; /* Enocode at beginning of file */ + short s_next; /* Encode lookahead byte */ + short s_seq; /* Sequence number sent */ + short r_seq; /* Sequence number received */ + short s_type; /* Packet type sent */ + short r_type; /* Packet type received */ + short s_soh; /* Packet start sent */ + short r_soh; /* Packet start received */ + short s_eom; /* Packet end sent */ + short r_eom; /* Packet end received */ + int size; /* Current size of output pkt data */ + int osize; /* Previous output packet data size */ + int r_timo; /* Receive and send timers */ + int s_timo; /* ... */ + int r_maxlen; /* maximum packet length to receive */ + int s_maxlen; /* maximum packet length to send */ + short window; /* maximum window slots */ + short wslots; /* current window slots */ + short parity; /* 0 = none, nonzero = some */ + short retry; /* retry limit */ + short cancel; /* Cancellation */ + short ikeep; /* Keep incompletely received files */ + char s_ctlq; /* control-prefix out */ + char r_ctlq; /* control-prefix in */ + char ebq; /* 8-bit prefix */ + char ebqflg; /* 8-bit prefixing negotiated */ + char rptq; /* Repeat-count prefix */ + int s_rpt; /* Current repeat count */ + short rptflg; /* flag for repeat counts negotiated */ + short bct; /* Block-check type 1..3 */ + unsigned short capas; /* Capability bits */ +#ifdef F_CRC + USHORT crcta[16]; /* CRC generation table A */ + USHORT crctb[16]; /* CRC generation table B */ +#endif /* F_CRC */ + UCHAR s_remain[6]; /* Send data leftovers */ + UCHAR ipktbuf[P_PKTLEN+8][P_WSLOTS]; /* Buffers for incoming packets */ + struct packet ipktinfo[P_WSLOTS]; /* Incoming packet info */ +#ifdef COMMENT + UCHAR opktbuf[P_PKTLEN+8][P_WSLOTS]; /* Buffers for outbound packets */ +#else + UCHAR opktbuf[P_PKTLEN+8]; /* Outbound packet buffer */ + int opktlen; /* Outbound packet length */ + UCHAR xdatabuf[P_PKTLEN+2]; /* Buffer for building data field */ +#endif /* COMMENT */ + struct packet opktinfo[P_WSLOTS]; /* Outbound packet info */ + UCHAR * xdata; /* Pointer to data field of outpkt */ +#ifdef F_TSW + short r_pw[64]; /* Packet Seq.No. to window-slot map */ + short s_pw[64]; /* Packet Seq.No. to window-slot map */ +#endif /* F_TSW */ + UCHAR ack_s[IDATALEN]; /* Our own init parameter string */ + UCHAR * obuf; + int rx_avail; /* Comms bytes available for reading */ + int obuflen; /* Length of output file buffer */ + int obufpos; /* Output file buffer position */ + UCHAR ** filelist; /* List of files to send */ + UCHAR * dir; /* Directory */ + UCHAR * filename; /* Name of current file */ + UCHAR * istring; /* Pointer to string to encode from */ + UCHAR * ostring; /* Pointer to string to decode to */ + int (*rxd)(struct k_data *, UCHAR *, int); /* Comms read function */ + int (*txd)(struct k_data *, UCHAR *, int); /* and comms write function */ + int (*ixd)(struct k_data *); /* and comms info function */ + int (*openf)(struct k_data *,UCHAR *,int); /* open-file function */ + ULONG (*finfo)(struct k_data *,UCHAR *,UCHAR *,int,short *,short); + int (*readf)(struct k_data *); /* read-file function */ + int (*writef)(struct k_data *,UCHAR *, int); /* write-file function */ + int (*closef)(struct k_data *,UCHAR,int); /* close-file function */ + int (*dbf)(int,UCHAR *,UCHAR *,long); /* debug function */ + UCHAR * zinbuf; /* Input file buffer itself */ + int zincnt; /* Input buffer position */ + int zinlen; /* Length of input file buffer */ + UCHAR * zinptr; /* Pointer to input file buffer */ + int bctf; /* Flag to force type 3 block check */ + int dummy; +}; + +struct k_response { /* Report from Kermit */ + short status; /* Current status */ + UCHAR filename[FN_MAX]; /* Name of current file */ + UCHAR filedate[DATE_MAX]; /* Date of file */ + long filesize; /* Size of file */ + long sofar; /* Bytes transferred so far */ +}; + +/* Macro definitions */ + +#define tochar(ch) (UCHAR)((UCHAR)((UCHAR)(ch) + SP )) +#define xunchar(ch) (UCHAR)((UCHAR)((UCHAR)(ch) - SP )) +#define ctl(ch) (UCHAR)((UCHAR)((UCHAR)(ch) ^ 64 )) + +#ifdef COMMENT +#define tochar(ch) (((ch) + SP ) & 0xFF ) /* Digit to character */ +#define xunchar(ch) (((ch) - SP ) & 0xFF ) /* Character to number */ +#define ctl(ch) (((ch) ^ 64 ) & 0xFF ) /* Controllify/uncontrollify */ +#endif /* COMMENT */ + +/* Prototypes for kermit() functions */ + +int kermit(short, struct k_data *, short, int, char *, struct k_response *); +UCHAR * getrslot(struct k_data *, short *); +UCHAR * getsslot(struct k_data *, short *); +void freerslot(struct k_data *, short); +void freesslot(struct k_data *, short); + +#endif /* __KERMIT_H__ */ |