Release 4.1
[unix-history] / usr / src / usr.bin / tn3270 / api / api_exch.h
index 647dde4..c3d3e40 100644 (file)
+/*
+ * Copyright (c) 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *     @(#)api_exch.h  4.1 (Berkeley) %G%
+ */
+
 /*
  * This file describes the structures passed back and forth
  * between the API client and API server on a Unix-based
  * tn3270 implementation.
 /*
  * This file describes the structures passed back and forth
  * between the API client and API server on a Unix-based
  * tn3270 implementation.
+ */
+
+/*
+ * The following are the low-level opcodes exchanged between the
+ * two sides.  These are designed to allow for type, sequence number,
+ * and direction checking.
+ *
+ * We enforce conversation flow.  There are three states: CONTENTION,
+ * SEND, and RECEIVE.  Both sides start in CONTENTION.
+ * We never leave RECEIVE state without first reading a TURNAROUND
+ * opcode.  We never leave SEND state without first writing a TURNAROUND
+ * opcode.  This scheme ensures that we always have conversation flowing
+ * in a synchronized direction (or detect an application error), and that
+ * we never hang with both sides trying to read from the "wire".
+ *
+ * State       event                   action
+ *
+ * CONTENTION  read request            send TURNAROUND
+ *                                     read RTS
+ *                                     enter RECEIVE
+ * CONTENTION  write request           send RTS
+ *                                     read TURNAROUND
+ *                                     enter SEND
  *
  *
- * A command is: <command code> <sequence number> <parameter>*
+ * RECEIVE     read request            read whatever
+ * RECEIVE     write request           read TURNAROUND
  *
  *
+ * SEND                read request            send TURNAROUND
+ * SEND                write                   write whatever
  */
 
  */
 
+#define        EXCH_EXCH_COMMAND       0       /* The following is a command */
+#define        EXCH_EXCH_TURNAROUND    1       /* Your turn to send */
+#define        EXCH_EXCH_RTS           2       /* Request to send */
+#define        EXCH_EXCH_TYPE          3       /* The following is a type */
 
 
-#define        EXCH_ASSOCIATE  23      /* Connect request [client->server] */
-#define        EXCH_SEND_AUTH  44      /* Send auth (password) [server->client] */
+struct exch_exch {
+    char
+       opcode;                 /* COMMAND, TURNAROUND, or TYPE */
+    unsigned char
+       my_sequence,            /* 0-ff, initially zero */
+       your_sequence,          /* 0-ff, initially zero */
+       command_or_type;        /* Application level command or type */
+    unsigned short
+       length;                 /* The length of any following data */
+};
+
+/*
+ * The following are the command codes which the higher level protocols
+ * send and receive.
+ */
+
+#define        EXCH_CMD_ASSOCIATE      0       /* Connect [client->server] */
        /*
        /*
-        * struct storeage_desc
+        * struct storage_desc
+        * char key[]
+        */
+#define        EXCH_CMD_DISASSOCIATE   1       /* Disconnect [client->server] */
+#define        EXCH_CMD_SEND_AUTH      2       /* Send password [server->client] */
+       /*
+        * struct storage_desc
         * char prompt[]
         * char prompt[]
-        * struct storeage_desc
+        * struct storage_desc
         * char seed[]
         */
         * char seed[]
         */
-#define        EXCH_AUTH       65      /* Authorization [client->server] */
+#define        EXCH_CMD_AUTH           3       /* Authorization [client->server] */
        /*
        /*
-        * struct storeage_desc
+        * struct storage_desc
         * char authenticator[]
         */
         * char authenticator[]
         */
-#define        EXCH_ASSOCIATED 78      /* You are now connected [server->client] */
-#define        EXCH_REJECTED   93      /* Too bad [server->client] */
+#define        EXCH_CMD_ASSOCIATED     4       /* Connected [server->client] */
+#define        EXCH_CMD_REJECTED       5       /* Too bad [server->client] */
        /*
        /*
-        * struct storeage_desc
+        * struct storage_desc
         * char message[]
         */
 
         * char message[]
         */
 
-#define        EXCH_REQUEST    19      /* A request [client->server] */
+#define        EXCH_CMD_REQUEST        6       /* A request [client->server] */
        /* struct regs,
         * struct sregs,
         * struct storage_desc
         * char bytes[]
         */
        /* struct regs,
         * struct sregs,
         * struct storage_desc
         * char bytes[]
         */
-#define        EXCH_GIMME      20      /* I need client storage [server->client] */
+#define        EXCH_CMD_GIMME          7       /* Send storage [server->client] */
        /*
         * struct storage_desc
         */
        /*
         * struct storage_desc
         */
-#define        EXCH_HEREIS     49      /* Here is some storage [BOTH WAYS] */
+#define        EXCH_CMD_HEREIS         8       /* Here is storage [BOTH WAYS] */
        /*
         * struct storage_desc
         * char bytes[]
         */
        /*
         * struct storage_desc
         * char bytes[]
         */
-#define        EXCH_REPLY      87      /* End of discussion */
+#define        EXCH_CMD_REPLY          9       /* End of discussion */
        /*
         * struct regs,
         * struct sregs,
         */
 
        /*
         * struct regs,
         * struct sregs,
         */
 
-#define        EXCH_TYPE_REGS          13
-#define        EXCH_TYPE_SREGS         27
-#define        EXCH_TYPE_STORE_DESC    33
-#define        EXCH_TYPE_BYTES         67
+/*
+ * The following are typed parameters sent across the wire.
+ *
+ * This should be done much more generally, with some form of
+ * XDR or mapped conversation ability.
+ */
+
+#define        EXCH_TYPE_REGS          0
+#define        EXCH_TYPE_SREGS         1
+#define        EXCH_TYPE_STORE_DESC    2
+#define        EXCH_TYPE_BYTES         3
 
 /*
  * each parameter that comes over looks like:
 
 /*
  * each parameter that comes over looks like: