home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / ek / eksw / src / kermit.h-linux < prev    next >
Text File  |  2020-01-01  |  15KB  |  364 lines

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