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