home *** CD-ROM | disk | FTP | other *** search
/ kermit.columbia.edu / kermit.columbia.edu.tar / kermit.columbia.edu / ek / tar / ek17.tar / kermit.h < prev    next >
C/C++ Source or Header  |  2011-06-06  |  16KB  |  424 lines

  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.  
  301. struct 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.  
  310. struct 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.     int (*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.  
  395. struct 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.  
  417. int kermit(short, struct k_data *, short, int, char *, struct k_response *);
  418. UCHAR * getrslot(struct k_data *, short *);
  419. UCHAR * getsslot(struct k_data *, short *);
  420. void freerslot(struct k_data *, short);
  421. void freesslot(struct k_data *, short);
  422.  
  423. #endif /* __KERMIT_H__ */
  424.