home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / citadel / ctdl338b.zip / NETHACK3.MAN < prev    next >
Text File  |  1990-07-07  |  74KB  |  1,783 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.                                 NETHACK3 MANUAL
  17.  
  18.                                Citadel-86: V3.32
  19.  
  20.                               Copyright 1989, 1990
  21.  
  22.                                   by Hue, Jr.
  23.  
  24.                              C-86 Test System Sysop
  25.  
  26.                                     90Jul01
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.                          Table of Contents
  72.  
  73.      I. Introduction . . . . . . . . . . . . . . . . . . . . . . .  2
  74.         I.1 History  . . . . . . . . . . . . . . . . . . . . . . .  2
  75.         I.2 Purpose  . . . . . . . . . . . . . . . . . . . . . . .  2
  76.      II. Overview  . . . . . . . . . . . . . . . . . . . . . . . .  3
  77.      III. Information Transfer Layer . . . . . . . . . . . . . . .  3
  78.         III.1 Call Stabilization . . . . . . . . . . . . . . . . .  4
  79.         III.2 Transfer Medium  . . . . . . . . . . . . . . . . . .  5
  80.      IV. Application Layer . . . . . . . . . . . . . . . . . . . .  6
  81.         IV.1 Overview  . . . . . . . . . . . . . . . . . . . . . .  7
  82.         IV.2 ID & Name . . . . . . . . . . . . . . . . . . . . . .  7
  83.         IV.3 Facility Requests . . . . . . . . . . . . . . . . . .  8
  84.         IV.4 Message & File Transfer . . . . . . . . . . . . . . .  9
  85.         IV.5 Network Session Control Facilities  . . . . . . . . .  9
  86.            IV.5.a Hangup command . . . . . . . . . . . . . . . . .  9
  87.            IV.5.b Error Code Support . . . . . . . . . . . . . . . 10
  88.            IV.5.c Role Reversal  . . . . . . . . . . . . . . . . . 10
  89.            IV.6 Data Transfer Facilities . . . . . . . . . . . . . 10
  90.            IV.6.a Normal Mail  . . . . . . . . . . . . . . . . . . 10
  91.            IV.6.b Room File Requests . . . . . . . . . . . . . . . 10
  92.            IV.6.c Ambiguous Room File Requests . . . . . . . . . . 11
  93.            IV.6.d Ambiguous Room File Requests With Approval . . . 11
  94.            IV.6.e Network Room . . . . . . . . . . . . . . . . . . 12
  95.            IV.6.f Check Mail . . . . . . . . . . . . . . . . . . . 12
  96.            IV.6.g Send File  . . . . . . . . . . . . . . . . . . . 13
  97.            IV.6.h Alternate Room Sharing . . . . . . . . . . . . . 13
  98.            IV.6.i Message Compaction . . . . . . . . . . . . . . . 13
  99.            IV.6.j Route Mail . . . . . . . . . . . . . . . . . . . 14
  100.         IV.7 ITL Alternate Realities . . . . . . . . . . . . . . . 14
  101.         IV.8 Security  . . . . . . . . . . . . . . . . . . . . . . 15
  102.            IV.8.a System Net Password  . . . . . . . . . . . . . . 15
  103.         IV.9 Other Reserved Facility Byte Values . . . . . . . . . 15
  104.         IV.10 Facilities -- Short List . . . . . . . . . . . . . . 16
  105.      V. Minimal Compatability Requirements . . . . . . . . . . . . 16
  106.      VI. Anytime Netting . . . . . . . . . . . . . . . . . . . . . 16
  107.      VII. Message Transfer Format  . . . . . . . . . . . . . . . . 17
  108.           VII.1 Field types  . . . . . . . . . . . . . . . . . . . 17
  109.             VII.1.a Displayable fields . . . . . . . . . . . . . . 18
  110.             VII.1.b Non-Displayable fields . . . . . . . . . . . . 19
  111.             VII.1.c Special Fields . . . . . . . . . . . . . . . . 19
  112.             VII.1.d Developer's Fields Assignments . . . . . . . . 20
  113.           VII.2 Special Fields becoming Standard Fields  . . . . . 20
  114.           VII.3 Other Additions to the Standard Fields . . . . . . 21
  115.           VII.4 Identifier Summary . . . . . . . . . . . . . . . . 21
  116.           VII.5 An Example . . . . . . . . . . . . . . . . . . . . 22
  117.      Appendix A.  Examples!  . . . . . . . . . . . . . . . . . . . 22
  118.        A.1 Call Stabilization  . . . . . . . . . . . . . . . . . . 22
  119.        A.2 ID & Name . . . . . . . . . . . . . . . . . . . . . . . 23
  120.        A.3 Normal Mail . . . . . . . . . . . . . . . . . . . . . . 23
  121.        A.4 Ambiguous Room File Requests  . . . . . . . . . . . . . 24
  122.        A.5 Network Room  . . . . . . . . . . . . . . . . . . . . . 24
  123.        A.6 Check Mail  . . . . . . . . . . . . . . . . . . . . . . 25
  124.        A.7 Send File . . . . . . . . . . . . . . . . . . . . . . . 25
  125.        A.8 Alternate Room Sharing  . . . . . . . . . . . . . . . . 25
  126.      Appendix B. BBS Software compatible with C86Net . . . . . . . 26
  127.      Appendix C. Main C86Net . . . . . . . . . . . . . . . . . . . 26
  128.  
  129.  
  130.                                     -1-
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.      I. Introduction
  138.         This document attempts to detail, in a haphazard manner, the network
  139.      known as C86Net.  C86Net is a BBS network protocol currently used by
  140.      Citadel-86 (for Z100s and PClones), NeoCitadel (PClones), STadel (Atari
  141.      STs), Amiga Citadel-68K (Amigas), Novucivitas, Asgard-86, and others.
  142.  
  143.      I.1 History
  144.         The original motivations for C86Net were two-fold: to provide an
  145.      interesting project exploring a topic the author had never studied
  146.      before, and to (ultimately) allow the sysops of Citadel-86s in the Twin
  147.      Cities area of Minnesota (aka Minneapolis/St. Paul) to communicate with
  148.      each other without having to call each other's boards; the number of
  149.      Citadels in the area was beginning to escalate, making it impossible
  150.      for gainfully employed sysops to talk conveniently.
  151.  
  152.         The first version of C86Net came into being in June of 1985, and is
  153.      better left unmentioned.  After learning from his mistakes and discussing
  154.      the entire project with John Stanley, a second version was attempted and
  155.      installed in all local Citadel-86s.  This, too, was a ghastly mistake,
  156.      but enough lessons were learned so the third version of C86Net could
  157.      be constructed in an expandable fashion allowing easy backward
  158.      compatability as the network facilities were expanded.  The installation
  159.      of the second and third versions mandated this ability: updating an
  160.      entire set of systems simultaneously is a nightmarish situation.
  161.  
  162.         The history of C86Net since then has consisted of two events: the
  163.      addition of new facilities as new needs were identified, and the
  164.      integration of non-Citadel-86 systems to C86Net networks.
  165.  
  166.         The exact chronology of adding facilities is not going to be detailed
  167.      here; it would be both tedious and useless.  However, the astute reader
  168.      will note several anomolies and redundancies in the facilities.  Be
  169.      advised this is what happens when the author is programming for both
  170.      learning and fun; another term is "programming by accretion."
  171.  
  172.         The first non-Citadel-86 system to join a C86Net was NeoCitadel, by
  173.      Hue, Sr., which started by supporting Net Mail.  Then a valiant, notable
  174.      effort was made by Lum the Mad, author of Lumadel, a very good Citadel
  175.      clone for the Apple II series of computers.  His networker, written in
  176.      Apple Basic, actually managed to communicate during several manual tests
  177.      with a Citadel-86.  However, an automated networker was never completed,
  178.      and Lumadel languished after Lum bought an IBM clone.
  179.  
  180.         Some Other BBS software compatible with C86Net includes Amiga
  181.      Citadel-68K as ported by Stallion aka Jay Johnson, and STadel as ported by 
  182.      David Parsons, both ports of Citadel-86, as well as Asgard-86 by Gary
  183.      Meadows and Novucivitas by Brent Barrett, both of Sacramento, CA, and
  184.      Fortress, a port of STadel, by Chris Camacho of Atlanta, GA.  This is not
  185.      a complete list.  See Appendix B for more detail.
  186.  
  187.  
  188.      I.2 Purpose
  189.         The purpose of this document is to detail C86Net at the byte level.
  190.      We will only talk about how the protocol should react to each condition.
  191.      We are not going to discuss what each facility "should" be used for,
  192.      although suggestions may be advanced, and most should be fairly obvious.
  193.  
  194.  
  195.  
  196.                                     -2-
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.         If you only have a headache when you're done reading this, count
  204.      yourself lucky.  The author will probably know what a year's worth of PMS
  205.      is like.
  206.  
  207.      II. Overview
  208.         Just about any networking textbook will tell you most networks
  209.      can be divided into some set of layers (an example, the ISO Standard, is
  210.      fairly well explained in Computer Networks by Tannenbaum), and the
  211.      Citadel-86 Networking protocol is not an exception, in concept.  (NOTE:
  212.      no attempt is going to be made to use network terminology currently in
  213.      use by network experts.  Instead, the terminology I'll use will be what
  214.      I think best describes the subject matter.  As such, this document's
  215.      terminology may change from revision to revision as people discuss and
  216.      argue with me about it.)  Familiarity with such a textbook (or, better
  217.      yet, a real network implementation) is certainly suggested (unless you
  218.      have masochistic tendencies, like I did).
  219.  
  220.         The protocol seems to break down into just two layers.  The first can
  221.      be termed the "information transfer" layer, or the "link" layer; the
  222.      second can be described as the "application" layer.
  223.  
  224.                             ---------------------
  225.                             | Application Layer | -  -  -  -  -  -  -  -  -
  226.                             ---------------------
  227.                                      |  |\                      Another _____\
  228.              This node              \|  |                         node       /
  229.                            ------------------------
  230.                            | Information Transfer |  _  _  _  _  _  _  _  _
  231.                            |        Layer         |
  232.                            ------------------------
  233.  
  234.         The purpose of the Information Transfer Layer is to ensure (to the
  235.      extent possible) all information be conveyed from and to this system's
  236.      Application Layer from another system's Application Layer actually
  237.      succeeds in transmission.
  238.  
  239.         The purpose of the Application Layer is to accomplish useful work
  240.      during a networking session with another node.
  241.  
  242.         It should be apparent that the Application Layer is dependent on the
  243.      Information Transfer Layer.  Despite this dependency, most of this
  244.      document is dedicated to the Application Layer and its facilities,
  245.      since the Information Transfer Layer is very simple (not necessarily a
  246.      good sign).
  247.  
  248.         Whenever the acronym "ITL" is used, assume it means Information
  249.      Transfer Layer; similarly, the "AL" refers to the Application Layer.
  250.  
  251.      III. Information Transfer Layer
  252.         As mentioned, the ITL's purpose is to provide a stable communications
  253.      medium.
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.                                     -3-
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.         The keyword here is "stable".  In order to achieve this, several goals
  270.      must be accomplished during any given networking session in order for
  271.      overall success to be achieved, and these can be broken into two parts.
  272.  
  273.         The first part is called "Call Stabilization."  This part of the ITL
  274.      has the goal of establishing stabilization.  The section on Call
  275.      Stabilization will detail some of the problems associated with
  276.      Call Stabilization.
  277.  
  278.         The second part is the provision of a transfer medium.  In this
  279.      section, it is best to remember that looking at C86Net from a layer
  280.      viewpoint does not mean C86Net was built as a reflection of some
  281.      layer model.  This should lessen confusion.
  282.  
  283.      III.1 Call Stabilization
  284.         The purpose of this process is to establish quickly and efficiently
  285.      that the caller is another system on the net wishing to engage in a
  286.      networking session.  The design of call stabilization was driven by whim,
  287.      a wish for efficiency, and experience with earlier versions of C86Net.
  288.  
  289.         The problems consist of, first, users calling in during networking.
  290.      Call Stabilization is designed to stave off the fumblings of an honest
  291.      user who simply doesn't realize the networker is in effect by
  292.      forcing a "recognition code" to be given that would be difficult for a
  293.      casual user to generate.
  294.  
  295.         The second (and last) problem comes from the machines the network
  296.      was originally implemented on, which are Z-100s and IBMs using MS-DOS.
  297.      During the last few years the marketplace has literally been bombarded by
  298.      modems capable of multiple baud rates (300, 1200, 2400, and now 9600
  299.      looms on the scene), and can signal to the host system what the connect
  300.      baud rate is.
  301.  
  302.         The modems can typically have two methods of signaling the connect
  303.      baud rate: by sending a unique text string to the host at the serial port
  304.      baud rate, and via signals on the RS232 interface.
  305.  
  306.         Unfortunately, within my experience the use of the text strings for
  307.      divining baud rate is not completely reliable; and, ridiculously, both
  308.      IBM and Zenith completely neglected to make available the RS232 signals
  309.      on their serial ports that would have allowed the programmer to discover
  310.      the connect baud rate, with the exception of some internal modems on the
  311.      IBM.
  312.  
  313.         Therefore, Call Stabilization must allow some way for effective baud
  314.      rate connect detection to occur.  The Call Stabilization technique
  315.      currently in use does not seem to be too bad in achieving the objectives.
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.                                     -4-
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.         Here is the process (sort of) graphically, right after carrier detect:
  336.  
  337.                Caller                |                     Receiver
  338.                ------                |                     --------
  339.                            Systems detect carrier
  340.       Wait for full second           |                Wait for full second
  341.       Send following 3 bytes:        |                Begin waiting for the
  342.                7                     |                following three bytes:
  343.                13                    |                        7
  344.                69                    |                        13
  345.       and wait 4 seconds.            |                        69
  346.       If have not received a         |                 After the 4 second
  347.       correct response (see          |                 response wait, the
  348.       Receiver column), then         |                 Receiver can switch
  349.       resend the above 3 bytes.      |                 bauds if necessary.
  350.       This looping process should    |                 If get the above 3
  351.       only be repeated 20 times.     |                 bytes, then respond
  352.       If, on the 20th try, still     |                 instantly with:
  353.       have not received a correct    |                        ~7
  354.       response, HANGUP.              |                        ~13
  355.       If have received a correct     |                        ~69
  356.       response, send an ACK.         |                 and then wait for an
  357.                                      |                 ACK. This should end
  358.                                                        Call Stabilization.
  359.  
  360.         So, essentially, the caller waits a second, and then sends a 3 byte
  361.      sequence to the receiver.  When the receiver receives those 3 bytes
  362.      successfully, it replies with the logical negation of those 3 bytes.  The
  363.      caller then sends an ACK back, indicating the call is stabilized.
  364.      If the protocol fails 20 times, then the caller hangs up, assuming
  365.      something was wrong.
  366.  
  367.         The 7-13-69 sequence only has significance in that a casual user
  368.      probably won't generate it accidentally.
  369.  
  370.      III.2 Transfer Medium
  371.         The purpose of this part of the ITL is to provide a stable means of
  372.      transporting information to and from the other half of the networking
  373.      session.
  374.  
  375.         Take it as a caveat that this is neither "clean" or "elegant" by
  376.      any stretch of the imagination.  Just take a deep breath and start
  377.      reading (particularly if you're a networking professional!).  Also, this
  378.      is going to be difficult, seeing as I have troubles explaining it
  379.      coherently myself.  However, considering the fact that adding new
  380.      facilities to the Applications Layer has been simple as of late, I must
  381.      assume SOMETHING is being done right here.
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.                                     -5-
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.         The Transfer Medium takes some stream of information and attempts to
  402.      transfer it to another system.  As such, it is under strategic control of
  403.      the Application Layer in terms of when to start and when to stop; another
  404.      way to explain it is the Application Layer will tell it to start
  405.      sending some stream of data, will tell it to stop sending, will tell it
  406.      to receive information from the other system, etc.  Details of when to
  407.      send, when to receive, etc., are contained in the sections on the
  408.      Application Layer, and will not be treated further in this section.
  409.  
  410.         One of the responsibilities of the Transfer Medium is to place no
  411.      interpretation on the data stream; the Transfer Medium only takes the
  412.      data and sends it to the other system's Transfer Medium, or receives the
  413.      data and sends it "up" to the Application Layer of the host system.  The
  414.      Application Layers involved make decisions as to what is to be done with
  415.      the data.
  416.  
  417.         So, what is the structure of the ITL Transfer Medium?  Currently,
  418.      the systems have four choices.  First, there is Ward Christiansen's
  419.      XMODEM protocol, which is the default and is always used during the
  420.      initial phases of a network session (and is, therefore, the required
  421.      transfer medium).  Citadel-86 usually uses XMODEM-checksum for transfers,
  422.      but XMODEM-CRC should function just as well, although due to the
  423.      handshaking overhead, the network may suffer performance degradation
  424.      when conversing with systems not supporting XMODEM-CRC.
  425.  
  426.         The other three transfer medium choices are YMODEM (single mode),
  427.      WXMODEM, and ZMODEM.  Activation of the alternatives is covered in Section
  428.      IV.7.
  429.  
  430.         At the risk of confusing the readers, let's hop ahead and state
  431.      the AL uses the ITL to transfer Facility Requests to and from nodes,
  432.      sending each Facility Request when needed.  Each Request is, or should
  433.      be, treated by the ITL as a separate file.  Therefore, the ITL should
  434.      send, or receive, each Request as a new file (where it stores it is an
  435.      implementation detail), with a new block 1, etc.  We'll try to provide
  436.      details at the end of this document.
  437.  
  438.  
  439.      IV. Application Layer
  440.         The Application Layer (AL), via the ITL, manages all of the work
  441.      to take place during a network session.
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.                                     -6-
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.      IV.1 Overview
  469.         The following diagram graphically demonstrates the flow of control
  470.      during a C86Net network session.  Assume, of course, this is a
  471.      minimal diagram. The references to the ITL are provided for completeness'
  472.      sake and context.
  473.  
  474.        -----------------
  475.        |     CALL      |                ITL Territory
  476.        | STABILIZATION |       _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
  477.        -----------------      /
  478.                |             /          AL Territory
  479.        _ _ _ _ | _ _ _ _ _ _/
  480.                |                RECEIVER TELLS CALLER CAN'T HANDLE COMMAND
  481.                |                    ____________________<___________
  482.                |                    |                              |
  483.        ----------------     ----------------     ------------      ^
  484.        | CALLER SENDS |_>___| CALLER SENDS |___>_| RECEIVER |___>__|
  485.        | ID & NAME    |     |   COMMAND    |     | RESPONDS |      |
  486.        ----------------     ----------------     ------------     \|/
  487.                                    |                               |
  488.                                    |                               |
  489.                                    |                        --------------
  490.                                    |                        |  RECEIVER  |
  491.                                    |                        |  TELLS     |
  492.                                    ^                        |  CALLER    |
  493.                                    |                        | CAN HANDLE |
  494.                                    |                        |   COMMAND  |
  495.                                    |                        --------------
  496.                                    |                               |
  497.                                    |                               |
  498.                                    |  UNLESS COMMAND IS    ----------------
  499.                                    _____________<__________| DO SPECIFIED |
  500.                                          'HANGUP'          | ACTION       |
  501.                                                            ----------------
  502.  
  503.         Call Stabilization has already been covered (III.1), so we shan't
  504.      speak of it further.  The diagram can be summarized as: caller identifies
  505.      itself, and then begins sending a sequence of Facility Requests.  Each
  506.      Request is dealt with by the receiver as received, and implies some set
  507.      of actions both systems are aware of.  Each Request's actions are
  508.      detailed in this document.
  509.  
  510.      IV.2 ID & Name
  511.         After receiving the ACK indicating end of Call Stabilization, the
  512.      calling system must identify itself to the receiver.  The caller sends,
  513.      in this order, nodeId & nodeName to the Transfer Medium, telling it to
  514.      send them to the receiver.
  515.  
  516.         nodeId, nodeName: Are normal null-terminated C strings.
  517.  
  518.         Neither the nodeId nor nodeName may exceed 20 bytes in length
  519.      (including the null byte terminating each string); therefore, the total
  520.      bytes of significant data the AL must deal with should not exceed 40.
  521.      This also implies the ITL should not send more than a sector
  522.      (128 bytes) worth of data.
  523.  
  524.  
  525.  
  526.                                     -7-
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.         So, for example, let's say a system using the nodeName "Buffalo"
  534.      and with a nodeId of "US 612 477 0927" calls some other system. After
  535.      the WC session was over, the receiver's buffer or temporary file would
  536.      look like this
  537.  
  538.           Id            name
  539.      US 612 477 0927<0>Buffalo<0> <-balance of the sector is trash->
  540.  
  541.      IV.3 Facility Requests
  542.         After the caller identifies itself, the two systems go into a loop.
  543.      Each loop starts with the Caller sending a Facility Request.  A Facility
  544.      Request at the AL layer consists of at least one byte, which contains a
  545.      code indicating the Facility requested, and up to four optional
  546.      parameters which are used to convey other data required for the Facility.
  547.      Each of these parameters are normal C null-terminated strings, and none
  548.      may exceed more than 20 bytes in length, including the ending null byte;
  549.      they may be smaller if the entire 20 bytes is not needed.  The last of
  550.      the optional parameters, be there 0 or 4 of them, is always followed by a
  551.      0 byte.  A Facility Request not requiring any parameters would look like
  552.      this at the Application Layer:
  553.  
  554.        <facility-byte><0>
  555.  
  556.      and a Facility Request needing two parameters would look like this:
  557.  
  558.        <facility-byte><string1><string2><0>
  559.  
  560.         At the ITL level, the Facility Request byte comes first, followed by
  561.      each parameter; the rest of the sector is trash.
  562.  
  563.         The receiver, on receipt of the facility request, must decide if it
  564.      can execute the facility requested by the caller.  If so, the receiver
  565.      just sends back one byte, called GOOD, and then the network session
  566.      proceeds along the lines implied by the facility.  If the receiver cannot
  567.      execute the facility requested, it sends back a byte called BAD followed
  568.      by a null-terminated string < 126 characters which explains why the
  569.      facility cannot be executed.
  570.  
  571.        <Good>
  572.  
  573.        <Bad><error string>
  574.  
  575.         The actual values of GOOD and BAD are
  576.  
  577.       BAD:  0
  578.       GOOD: 1
  579.  
  580.         Section IV.5 through IV.9 detail all facilities currently supported by
  581.      Citadel-86 in C86Net, plus some proposed facilities.
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.                                     -8-
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.      IV.4 Message & File Transfer
  600.         When "transfer of messages" is mentioned below, we mean a series of 0
  601.      or more messages are to be sent from one system to the other.  When the
  602.      number of messages is 0, then it is not necessary to do more than start
  603.      and stop the ITL, which should be interpreted by the system receiving the
  604.      0 messages to mean 0 messages were received.
  605.  
  606.         When one or more messages are being sent, each should be in the format
  607.      detailed in Section VII.
  608.  
  609.         When more than one message is being sent, there should be no separator
  610.      between messages, due to the format messages are sent in.  Because
  611.      of the current character of the ITL, networking leaves us with
  612.      last sectors of which zero or more bytes will be trash.  Therefore, when
  613.      transferring messages, the balance of the last sector which has no meaning
  614.      can either be ^Z filled (vis a vis XMODEM rules) or space-filled.
  615.  
  616.         A file transfer implies one or more files are being sent.  There
  617.      is no data transformations applied to files at the AL layer, i.e., they
  618.      are sent (conceptually) byte by byte to the ITL for transfer.  The ITL,
  619.      being what it is, does not currently perform any transformations.  In the
  620.      future it may, but the ITL has the responsibility of ensuring
  621.      transformations inserted by the ITL are taken out before termination of
  622.      the ITL.
  623.  
  624.         Really, this may sound bad, but it's very easy.  "Clean up after
  625.      yourself."
  626.  
  627.      IV.5 Network Session Control Facilities
  628.         These facilities are used to control the overall behavior of a network
  629.      session.
  630.  
  631.      IV.5.a Hangup command
  632.         This facility is a simple 1-byte command telling the receiver to
  633.      hang up.  Unfortunately, the behavior of the receiver for this facility
  634.      depends on the state of the network session.  If this facility is used
  635.      while Role Reversal is active, then it signals the end of the Role
  636.      Reversal facility, and the receiver should send back a GOOD byte (see
  637.      Section IV.5.c).
  638.  
  639.         If this Facility is requested when the session is not indulging in
  640.      a Role Reversal, then the receiver does NOT send back either a GOOD or
  641.      BAD byte.  Instead, it just hangs up (i.e., terminates the Network
  642.      session).
  643.  
  644.         The value of the Hangup byte is 0.
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.                                     -9-
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.      IV.5.b Error Code Support
  666.         This Request asks the receiver if his system can transmit Error Code
  667.      responses to Requests. This Request must be exercised and accepted as
  668.      GOOD before the receiver can use the Error Code response instead of the
  669.      BAD response when reporting his ability to support a particular facility
  670.      requested.
  671.  
  672.         The value of the Error Code Support byte is 200.
  673.  
  674.         Citadel-86 does not currently support this facility.
  675.  
  676.      IV.5.c Role Reversal
  677.         In order to make networking more efficient in nets using room
  678.      sharing concepts, it has become a necessity to allow "role reversal"
  679.      during the networking period.  The term "role reversal" means during
  680.      the period of a call, two systems, supposing they are adequately
  681.      equipped, may exchange their roles of "caller" and "receiver", and then
  682.      continue to network, with the real receiver now becoming the "caller",
  683.      and vice versa.  All services should be supported under role reversal.
  684.  
  685.          When role reversal is agreed upon by the two systems (this is defined
  686.      to be the point at which the receiver has replied GOOD to the caller),
  687.      the two systems now switch roles.  The caller, who has now become the
  688.      receiver, now starts waiting for the first facility request from the
  689.      receiver, who has now become the caller.
  690.  
  691.         The caller and receiver should, of course, be aware of who is who;
  692.      this is why the stage of CALLER SENDS NAME & ID is skipped during role
  693.      reversal.
  694.  
  695.         The end of role reversal is signaled by the original receiver (now the
  696.      caller) by sending the HANGUP command.  The original caller (now the
  697.      receiver) acknowledges this (reply GOOD), and at this point, the two
  698.      again reverse roles. Note that the HANGUP command has been modified in
  699.      this one contextual instance to act differently from its normal behavior.
  700.  
  701.         The value of the Role Reveral byte is 201.
  702.  
  703.      IV.6 Data Transfer Facilities
  704.         These facilities support transfer of various sorts of data between
  705.      nodes.
  706.  
  707.      IV.6.a Normal Mail
  708.         This facility is a parameterless facility which is designed to allow
  709.      transfer of Mail> from the transmitter to the receiver.  If the receiver
  710.      signals it can receive Mail>, then the transmitter should begin
  711.      transmitting all Mail messages destined for the receiver via the ITL.
  712.  
  713.         The value of the Normal Mail byte is 1.
  714.  
  715.      IV.6.b Room File Requests
  716.         This facility is used to request one file from the receiver.  It has
  717.      two parameters, the name of the room the file is located in
  718.      (parameter 1), and the name of the file to be transferred (parameter 2).
  719.  
  720.  
  721.  
  722.  
  723.  
  724.                                     -10-
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.         If the receiver is willing to transfer the specified file to the
  732.      transmitter, it should send back a GOOD byte, and then tell the ITL to
  733.      send the file to the transmitter, which should be ready to receive the
  734.      file.
  735.  
  736.         If the receiver will not or can not satisfy the request, then it should
  737.      return a BAD byte.  The reasons for not satisfying this request are, of
  738.      course, implementation dependent, but they can include such reasons as
  739.      non-existence of room, non-existence of file, sheer peevishness, etc.
  740.  
  741.         This facility is an anachronism, retained for backward compatability.
  742.      The facility Ambiguous Room File Requests is a better choice.
  743.  
  744.         The value of the Room File Request byte is 2.
  745.  
  746.      IV.6.c Ambiguous Room File Requests
  747.         This facility is an expansion of IV.6.b, and very similar to it.  It,
  748.      too, has two parameters, the first the name of the room and the second
  749.      the name of the file requested.  However, the second parameter can safely
  750.      be used to specify an ambiguous set of files if the user so chooses.
  751.  
  752.         If the receiver consents to send the requested files to the
  753.      transmitter, then it should send back a GOOD byte.  At this point, the
  754.      procedure diverges from used in IV.6.b.  For each file to be sent to
  755.      the transmitter by the receiver, it first sends via the ITL two strings
  756.      (null-terminated), which, in order, are the name of the file, and the
  757.      size of the file in 128 byte sectors.  If the file SEX.ED was 12877 bytes
  758.      long, the receiver would send
  759.  
  760.                     SEX.ED<0>101<0>
  761.  
  762.         These two strings constitute in themselves a separate transfer; in ITL
  763.      terms this means a separate XMODEM transfer, as if we were sending a
  764.      single file just ahead of the real file.
  765.  
  766.         The transmitter does nothing but receive these pairs for each file
  767.      it will receive.  When the receiver has no more files to send satisfying
  768.      the request for files, it sends one more of the pre-file headers,
  769.      in which the length of the file name is 0.  This indicates the end of this
  770.      facility.
  771.  
  772.         The value of the Ambiguous Room File Request byte is 3.
  773.  
  774.  
  775.      IV.6.d Ambiguous Room File Requests With Approval
  776.         This is a non-implemented facility, which is not yet completely
  777.      defined.
  778.         The value of the Ambiguous Room File Request With Approval byte is 4.
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.                                     -11-
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.      IV.6.e Network Room
  798.         This facility is used to send 0 or more messages from one system to
  799.      another for a specified room.  The room these messages are coming
  800.      from is the sole parameter of this facility. If the receiver is willing
  801.      to accept the messages for delivery to the room on the receiver's system,
  802.      it replies GOOD to the caller, and then begins data transfer of the
  803.      messages in the same manner as it would for Mail transfer.  It it does
  804.      not wish to accept the messages (for whatever reason) from the caller, it
  805.      then replies BAD.
  806.  
  807.         The value of the Network Room byte is 5.
  808.  
  809.      IV.6.f Check Mail
  810.         The Normal Mail facility does not contain any provisions for checking
  811.      to see if Mail messages can be delivered to the designated recipients.
  812.      This command provides that facility.  If the receiver chooses to accept
  813.      this command, it should send a GOOD byte, and then cycle through the Mail
  814.      messages already received from the caller.  For each undeliverable message
  815.      the receiver should send back a byte and three strings which describe the
  816.      reason the Mail message cannot be delivered.  The three strings, in the
  817.      order they should be sent, should contain the following information:
  818.  
  819.              String 1: Author of the Mail> message.
  820.              String 2: Recipient of the Mail> message.
  821.              String 3: Error "context."  This field should contain a message
  822.                        describing (in English) something useful about the
  823.                        error.  Citadel-86 currently fills this with the date
  824.                        and time of the message, suitable for sending to the
  825.                        author of the failed message.
  826.  
  827.         All three of these strings must be present.  Any or all of the three,
  828.      however, may be of 0 length.  None may exceed 20 characters in length
  829.      (including the 0 byte).
  830.  
  831.         The values of the byte are:
  832.  
  833.       NO_RECIPIENT    1  -- This reason indicates there is no such
  834.                             recipient on the Receiver system. Note the
  835.                             second string following this reason byte normally
  836.                             contains the name of the unknown recipient.
  837.       BAD_FORM        2  -- This reason indicates there was no "To" field
  838.                             in the message.  Usually is a symptom of
  839.                             programming error.
  840.       UNKNOWN         99 -- Something really* odd happened.  The context
  841.                             string (#3) should perhaps contain the number (on
  842.                             the Caller system) of the message, so it may
  843.                             be investigated later.
  844.  
  845.         After all of the negative acknowledgements of Mail> have been sent
  846.      back, the receiver sends one more byte, which is called the NO_ERROR
  847.      byte. It indicates there are no more errors to be sent to the
  848.      transmitter.  If there were no bad Mail messages in the first place, then
  849.      the only real data the receiver would return to the transmitter
  850.      would be the NO_ERROR byte.  The value of the NO_ERROR byte is 0.
  851.  
  852.  
  853.  
  854.  
  855.  
  856.                                     -12-
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.         All negative acknowledgements, plus the NO_ERROR byte, are sent as a
  864.      single stream of data, not as separate ITL transfers!
  865.  
  866.         The value of the Check Mail byte is 6.
  867.  
  868.      IV.6.g Send File
  869.         This facility allows the sysop to send a file to another system.
  870.      There are three parameters associated with this request: The name of the
  871.      file the sender wishes to send to the receiver, and the size of the
  872.      file, first in terms of sectors (CP/M compatibility, if ever any CP/M
  873.      Citadels wish to join the net), and then in just bytes. (Remember, these
  874.      are really just ASCII strings.)
  875.  
  876.         The file is sent only upon positive acknowledgement of this request.
  877.      However, it should not be assumed a negative response implies
  878.      the facility is not supported.  Since the size of the file is sent along
  879.      with the request, the receiver may decline to receive the file due to
  880.      space considerations, but could receive a smaller file.
  881.  
  882.         The value of the Send File byte is 7.
  883.  
  884.      IV.6.h Alternate Room Sharing
  885.         This facility was motivated by the LD room sharing network, due to the
  886.      fact that a system willing to absorb the expense of sharing rooms
  887.      at LD may not be willing to support the additional costs occurring
  888.      from the role reversal command (for instance, very large files being sent
  889.      or requested by the receiving system).
  890.  
  891.         This facility solves the above problem.  Succinctly, it notifies the
  892.      receiving system the caller wishes to share the specified room.  Upon
  893.      receiving a positive acknowledgement, the caller proceeds to send all
  894.      net messages destined for the receiver.  When finished, the
  895.      receiver sends all net messages destined for the caller for the specified
  896.      room.  This is most commonly used for C86Net routing.
  897.  
  898.         Usually, messages from systems other than the two involved in the
  899.      network session will be passed to other systems using this Facility.
  900.  
  901.         The value of the Alternate Room Sharing byte is 8.
  902.  
  903.      IV.6.i Message Compaction
  904.         This facility allows an optional compaction of all messages transferred
  905.      during a network session, whether it be Mail, room sharing, or whatnot,
  906.      no matter which direction is selected.  Such compaction serves to shorten
  907.      network sessions.  When this facility is used and the receiver agrees to
  908.      it, all further message transfers will be compacted using the agreed upon
  909.      method.
  910.  
  911.         This facility has a single parameter, which is used to indicate which
  912.      type of compaction is to be used.  More efficient methods can therefore
  913.      be added easily.
  914.  
  915.         The only currently valid parameter value is:
  916.  
  917.         "0" -- Compact messages using C-86 proprietary method.
  918.  
  919.  
  920.  
  921.  
  922.                                     -13-
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.         The "0" compaction method is a low-efficiency method, more for testing
  930.      than for actual use.  It only achieves 20-30% compaction in limited
  931.      testing.  New methods will be added as whim takes us.
  932.  
  933.         The value of the Message Compaction byte is 10.
  934.  
  935.      IV.6.j Route Mail
  936.         C86Net RouteMail is triggered using this Facility Request.  C86Net
  937.      RouteMail functions by passing Mail on from a Source system (the system
  938.      which generates a piece of Mail meant for another system to which the
  939.      system is not directly connected) to the Target system (the ultimate
  940.      target of said Mail) by asking each system in turn to send the Mail
  941.      meant for the Target.  Included in this "request" is an optional "domain"
  942.      designator" which can be used by intervening systems as a hint as to
  943.      where the mail should be routed in order to reach its ultimate destination.
  944.      How each intervening system wishes to route the Mail onwards is up to the
  945.      system, whether it be via an implementor's extension or using C86Net
  946.      RouteMail.  Citadel-86 systems, if they do not connect directly with a
  947.      given system, only know what system to ask to pass the Mail onwards, based
  948.      on the domain designation (if present) or the node id.
  949.  
  950.         This Request currently has three parameters.  The first parameter
  951.      of this Request is the Node ID of the system for which the Mail is
  952.      meant (which can be just " " if it's not known), the second parameter is
  953.      the Name of the system, and the third parameter is the domain of the
  954.      target system.  Usually, the Node Id should be used for identifying the
  955.      target system, since the name of any system is not guaranteed to be the
  956.      same across all systems' nodelists, but if the domain is provided then it
  957.      can be used as a mechanism for getting the mail to a domain "server", and
  958.      then the server should be able to make a positive ID on the system and
  959.      deliver the Mail.  If the receiving system can, or thinks it can, transfer
  960.      the Mail to the target system, it should reply GOOD.  The sender should
  961.      then transfer the Mail to the receiver.  If the receiver can not in good
  962.      conscience accept the Mail for delivery, it should reply BAD.
  963.  
  964.         Note it is perfectly valid to not only encounter several Route
  965.      Mail requests during a network session, but to even receive more than
  966.      one with identical parameters during a network session.
  967.  
  968.         The value of the Route Mail byte is 9.
  969.  
  970.      IV.7 ITL Alternate Realities
  971.         These facilities are used to attempt to change transfer medium types
  972.      (communication protocols).  When two systems begin a Network Session,
  973.      they should communicate via XMODEM.  However, while XMODEM is fairly
  974.      reliable, it is a touch slow.  Therefore, it may be worthwhile for
  975.      the two systems to attempt to switch from XMODEM to another protocol.
  976.  
  977.         At this point we should point out this command does not fit
  978.      neatly into the ITL/AL layering.  Formally, this command should be
  979.      confined to the ITL layer, without the AL layer knowing anything about
  980.      it.  However, it has been decided this Facility Request will be
  981.      transmitted and received just like any other Facility Request, thus
  982.      impacting the AL.
  983.  
  984.  
  985.  
  986.  
  987.  
  988.                                     -14-
  989.  
  990.  
  991.  
  992.  
  993.  
  994.  
  995.         Alright, enough of the nitpicking.  This Facility Request has
  996.      one parameter connected with it, and it indicates which protocol the
  997.      transmitter wishes to switch to for ITL transfers.  Whether or not
  998.      the receiver can use this protocol, neither system should switch
  999.      to the new protocol until the receiver has acknowledged the Facility
  1000.      Request, whether it be negatively or positively.  This allows one
  1001.      system to request a protocol the receiver does not support without
  1002.      mass confusion arising.
  1003.  
  1004.         The four currently valid parameter values are:
  1005.  
  1006.         "0" -- Indicates a request for XMODEM.  (Superfluous.)
  1007.         "1" -- Indicates a request for YMODEM.
  1008.         "2" -- Indicates a request for WXMODEM.
  1009.         "3" -- Indicates a request for ZMODEM.  (not supported in C86.)
  1010.  
  1011.         As indicated, the parameter values are really ASCII strings, not
  1012.      binary data.
  1013.  
  1014.         The value used for changing ITL transfer mediums is 100.
  1015.  
  1016.      IV.8 Security
  1017.         These facilities address security concerns on the network.
  1018.  
  1019.      IV.8.a System Net Password
  1020.         This facility provides a rough security system by allowing a string
  1021.      designated to be a password to be sent by the caller to the receiver.
  1022.      The protocol itself does not designate what a bad (or good) password
  1023.      should mean to the receiving system; this is up to the implementors.  As
  1024.      an example, the implementor of Citadel-86 has made the following
  1025.      decisions (this is [or should be] detailed in NETWORK3.MAN):
  1026.  
  1027.       o If there is no password listed for this system, and none is sent, or a
  1028.         zero-length password is sent, then the caller is assumed to be
  1029.         validated, and all commands will be whole-heartedly executed.
  1030.       o If the caller sends a password matching (non case-sensitive) with
  1031.         the password the receiver has recorded for the caller, then the
  1032.         caller is validated and all commands will be executed.
  1033.       o If the caller sends an invalid password, then the receiver will do
  1034.         nothing useful during role reversal, and will not respond positively
  1035.         to role reversal requests.
  1036.  
  1037.         Technically, this command is very simple.  The caller sends the
  1038.      command byte to the receiver, and the first parameter of the command byte
  1039.      contains the password (<= 20 including terminating NULL).  The receiver
  1040.      ALWAYS responds positively, whether or not the password matches.
  1041.  
  1042.         The value of the System Net Password byte is 202.
  1043.  
  1044.      IV.9 Other Reserved Facility Byte Values.
  1045.         Byte values 11 - 13 are reserved for STadel routing.
  1046.  
  1047.         Before using any other byte values, please try to coordinate with
  1048.      whomever else is implementing C86Net.
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.                                     -15-
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.      IV.10 Facilities -- Short List
  1063.             Name    |     Byte Value  |   Description
  1064.             ----    |     ----------  |   -----------
  1065.      Hangup         |         0       |   End a network session or role
  1066.                     |                 |           reversal.
  1067.      Error Code     |       200       |   Alternate error reporting (not
  1068.                     |                 |           implemented on Citadel-86).
  1069.      Role Reversal  |       201       |   Role reveral.
  1070.      Normal Mail    |         1       |   Send Mail.
  1071.      File Request   |         2       |   Request a File.
  1072.      Ambiguous FR   |         3       |   Ambiguous File Request.
  1073.      AFR w/ approval|         4       |   Ambiguous File Request With Approval
  1074.                     |                 |           (not implemented).
  1075.      Network Room   |         5       |   Send messages from room to system.
  1076.      Check Mail     |         6       |   Check Mail previously sent.
  1077.      Send File      |         7       |   Send File to system.
  1078.      Alt Room Net   |         8       |   Share room alternate system (routing).
  1079.      Route Mail     |         9       |   Mail Routing
  1080.      Message        |        10       |   Compact all messages during network
  1081.          Compaction |                 |   session
  1082.      ITL change     |       100       |   Change ITL communication protocol.
  1083.      System pwd     |       202       |   System password.
  1084.      STadel         |       11-13     |   STadel
  1085.         reserved
  1086.  
  1087.      V. Minimal Compatability Requirements
  1088.         In order for a system to be compatible with C86Net at a minimal level,
  1089.      it must satisfy requirements at the ITL and AL levels.
  1090.  
  1091.         At the ITL level, it must be able to call stabilize and use the XMODEM
  1092.      style of transfer for all facilities supported at the AL level.  This
  1093.      includes the SYSTEM ID following call stabilization.
  1094.  
  1095.         At the AL level, technically the minimum facility support you
  1096.      need is only the Hangup facility (Section IV.5.a).  However, that's
  1097.      hardly useful, so a practical minimum would be the Hangup and Mail
  1098.      commands.
  1099.  
  1100.      VI. Anytime Netting
  1101.         While this document was originally written to only address the behavior
  1102.      of two C86Net-compatible systems during a network session, it seems
  1103.      some brief mention of "anytime netting" might be appropriate in this
  1104.      document.
  1105.  
  1106.         When C86Net was first implemented in Citadel-86, one of the design
  1107.      decisions made was systems would communicate at a set time during
  1108.      the nighttime hours in order to exchange messages and other data.
  1109.  
  1110.         This, as it turns out, was a very simplistic decision, and when the
  1111.      idea of "events" was introduced by David Parsons, they were immediately
  1112.      seized upon as a way to allow multiple net sessions during a day.  This
  1113.      greatly expanded the flexibility of the network.
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.                                     -16-
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.         However, since most systems did not wish to take up daytime (i.e.,
  1128.      "prime time") hours with static net sessions, delays in delivery of net
  1129.      messages to other systems were still large, and with the network reaching
  1130.      international proportions, forcing messages to traverse several
  1131.      backbones to reach all systems, propagation delays were becoming
  1132.      irritating.
  1133.  
  1134.         At that point, several groups indicated a great deal of interest in
  1135.      "anytime netting", and several people implemented it.  After some
  1136.      unfortunately boneheaded delay, Citadel-86 has implemented it.
  1137.  
  1138.         While the method of deciding when a net session is to be held between
  1139.      systems is not part of the definition of C86Net, it would appear
  1140.      anytime-netting is handy enough to be worth a short note.  Basically, to
  1141.      handle anytime-netting, a C86Net compatible system must be able to accept
  1142.      a C86Net call during anytime of the day or night, and may optionally be
  1143.      able to call out during the day to other selected C86Net systems.
  1144.      Apparently (and this is rather tentative), the best method of detecting
  1145.      a C86Net call is to scan the input for a binary 7 (the first byte of
  1146.      stabilization) when a call is detected by a system.  If a 7 is detected,
  1147.      then the receiving system should stop output at once (if it has some form
  1148.      of autobaud) and switch to network mode.
  1149.  
  1150.  
  1151.      VII. Message Transfer Format
  1152.         A C86Net message (like the original Citadel message format) consists
  1153.      of a collection of C strings (ASCII text followed by a null byte).  Each
  1154.      of these strings is the value of some part of the message; precisely which
  1155.      part is identified by the first byte of the string, and this byte is known
  1156.      as the field identifier for this string.
  1157.  
  1158.         Fields may come in any order, except the Message field text is the
  1159.      last field of the message, and must always be present.  Most other fields
  1160.      of a message do not have to be present, but it is recommended that as
  1161.      many as are practical be filled in, particularly the date, time, system
  1162.      origin, and message number fields, since these may be used for 'vortex'
  1163.      control.
  1164.  
  1165.         Any data following the null byte of the message field is considered
  1166.      to be either garbage or part of the next message, if more than one message
  1167.      has been sent.
  1168.  
  1169.      VII.1 Field types
  1170.         The fields of a C86Net message seem to fall into three categories,
  1171.      displayable, non-displayable, and special.  Fields which are 'displayable'
  1172.      are generally fields of interest to the user, such as the author of the
  1173.      message, the text of the message, etc.
  1174.  
  1175.         Fields which are 'non-displayable' usually contain information useful
  1176.      for housekeeping on the net.
  1177.  
  1178.         The following sections cover all three types of fields in detail,
  1179.      including suggested formats for data.
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.                                     -17-
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.      VII.1.a Displayable fields
  1194.         As noted, these fields usually contain data of interest to the human
  1195.      readers.  Each field is treated separately.  Normally there should only
  1196.      be one instance of each field in a message; exceptions will be noted.
  1197.  
  1198.         Message Author: Field identifier 'A' identifies an author field.  This
  1199.      field may be no more than 128 bytes (including the trailing null byte), and
  1200.      should contain the name of the author of the message.
  1201.  
  1202.         Message Date: Field identifier 'D' identifies a date field.  This
  1203.      field, limited to 20 bytes, should contain only the date when the message
  1204.      was entered.  Current standard format is yymmmdd, such as "89Jan01".
  1205.      Note that by adhering to this format, and others like it, individual
  1206.      software packages may more easily customize message headers when
  1207.      displaying messages from foreign systems, and allow the foreign systems
  1208.      to do likewise.
  1209.  
  1210.         Message Time: Field identifier 'C' identifies a time field.  This
  1211.      field, limited to 20 bytes, should contain only the time the message was
  1212.      entered.  Current standard format is hh:mm <am | pm>, such as "12:44 pm".
  1213.  
  1214.         System Origin: Field identifier 'N' identifies a system origin field.
  1215.      This field, limited to 20 bytes, should contain the name (human readable)
  1216.      of the system this message originated on.  It is NOT recommended this
  1217.      field be used for housekeeping purposes!
  1218.  
  1219.         System Domain: Field identifier 'X' identifies the home domain of
  1220.      the system.  This field should only be filled in if domains are actually
  1221.      implemented in your software, since other systems on the net will use
  1222.      a combination of domain and system name to reply to net Mail.
  1223.  
  1224.         Message Recipient: Field identifier 'T' identifies a To field.
  1225.      This field, limited to 128 bytes, should contain the name of the recipient
  1226.      of this mail message.  Non-mail messages may contain 'T'o fields, too,
  1227.      but delivery of such messages should not be expected (see Facility Request
  1228.      1, above).  Normally, this field is used to deliver network mail to users,
  1229.      but see the 'w' field, below.
  1230.  
  1231.         Other Recipients: Field identifier 'W' identifies an Other Recipient
  1232.      ("Who else?") field.  This field, limited to 61 bytes, identifies a
  1233.      recipient of Mail other than the primary recipient.  It is not, however,
  1234.      a field which should be used for Mail delivery by recipient systems; it
  1235.      is transmitted purely for cosmetic reasons.  See the 'w' field, below.
  1236.      There may be more than one Other Recipient field in a message.
  1237.  
  1238.         OtherNet Address: Field Identifier 'P' identifies an "OtherNet
  1239.      Address".  This is a free form string which is used to form addresses
  1240.      of use to other networks, such as USENET, FidoNet, etc.  This is filled
  1241.      in by users sending Mail to systems on other nets, and can also contain
  1242.      "return address" information for messages coming in from other Nets.
  1243.  
  1244.         Message Text: Field identifier 'M' identifies a message text field.
  1245.      This field is currently limited to 7499 bytes, but this is an artificial
  1246.      limit and should be done away with someday.  This text should be in
  1247.      normal Citadel format, except all Carriage Returns should become
  1248.      Line Feeds during transmissions (for obscure historical reasons).
  1249.  
  1250.  
  1251.  
  1252.                                     -18-
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.      VII.1.b Non-Displayable fields
  1259.         System ID: Field identifier 'O' identifies a system id field.  The
  1260.      system id field, limited to 20 bytes, identifies a system at program
  1261.      level.  This field should be used for any housekeeping purposes which
  1262.      involve identifying other systems.  The current format of the data of
  1263.      this field is traditional Citadel system id, e.g., "US 612 431 1107",
  1264.      since this is a relatively static value for most systems -- far more
  1265.      static than the 'N' field has turned out to be.
  1266.  
  1267.         Room ID: Field identifier 'R' identifies a room name field.  This
  1268.      field, limited to 20 bytes, is the name of the 'room' in which this
  1269.      message originated.  Some systems may find this field cramped ...
  1270.  
  1271.         Message ID: Field identifier 'S' identifies a message id field.  This
  1272.      field, limited to 20 bytes, contains the message number assigned to this
  1273.      message by the originating system.  NOTE: the format of this data is
  1274.      special.  It is "<high 16 bits><space><low 16 bits>", where the first
  1275.      number is the high 16 bits of the message id in decimal, and the second
  1276.      number is the low 16 bits of the message id in decimal.  For example,
  1277.      if a message had id 4099, it would appear in the 'S' field as "0 4099".
  1278.      This special format is retained for possible backward compatability with
  1279.      CP/M versions of Citadel ... which are still in use and threatening to
  1280.      network, believe it or not!
  1281.  
  1282.         Recipient Override: Field identifier 'w' (different from 'W', above)
  1283.      identifies a Recipient Override field.  'w' fields, of which there may
  1284.      be multiple instances in a message, should appear only in net Mail
  1285.      messages.  When they are present in a message, they OVERRIDE the 'T'o
  1286.      field of the message; that is, the message of which they are part of
  1287.      should be delivered to the person named in each 'w' field, and the person
  1288.      named in the 'T'o field should be ignored insofar as Mail delivery goes.
  1289.      For example, if a message was received during Facility Request 1 which
  1290.      had 3 'w' fields within it, with values of "Jocko", "Moo Cow", and
  1291.      "Jack the Snipper", then the message should be placed in the Mail of
  1292.      those three users, and not to whomever was named in the 'T'o field.
  1293.      'w' fields may be up to 45 bytes long (although only 20 bytes really
  1294.      makes sense).  'w' fields are creatures of the net; there should be no
  1295.      reason to save them in your message base.
  1296.  
  1297.         Target System: Field identifier 't' identifies a Target System.  This
  1298.      field, limited to 20 bytes at the moment, if present will contain the
  1299.      name of the system this piece of Mail is targeted for.  This field is
  1300.      purely a creature of the net and should not need to be saved in message
  1301.      bases, but only in temporary files.  At the moment, Citadel-86 is using
  1302.      this field for internal purposes only, involving OtherNet integration.
  1303.      Other software need not expect this field in Mail messages.
  1304.  
  1305.      VII.1.c Special Fields
  1306.         There are two sorts of special fields.  The first are those reserved
  1307.      for STadel use by David Parsons, and those field identifiers are 'Z',
  1308.      'J', 'I', and '#'.
  1309.  
  1310.         The second type of special field are those identifiers reserved for
  1311.      other C86Net developers.  As the net has grown, become more popular, and
  1312.      endured childish squabbles as poor programming practices and large egos
  1313.      clashed, Mark Metson, developer of the Knotwork software, noted the lack
  1314.  
  1315.  
  1316.  
  1317.  
  1318.                                     -19-
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.      of communication and devised a scheme to allow further development of
  1326.      C86Net to proceed while protecting developers from each other.  His
  1327.      modified proposal has been incorporated into C86Net, and it essentially
  1328.      consists of assigning to each 'major' developer a field identifier which
  1329.      they may use for their own work.  All other developers are asked not to
  1330.      use these identifiers for their own purposes.
  1331.  
  1332.         At first it may seem a single identifier is rather inadequate,
  1333.      but actually it need not be.  Since the developer is assigned the field
  1334.      identifier for their exclusive use, they may use it as they like, so
  1335.      long as they remember it must be treated just like any other field
  1336.      identifier in that a NULL byte still constitutes an "End of Field" mark.
  1337.      The first idea which comes to mind is to use the second byte of the field
  1338.      as a "SubField Identifier", for the developer's own purposes.  There may
  1339.      be other ways of using it, as well.  In any case, it should be apparent
  1340.      the exclusive use of a single identifier should be more than
  1341.      adequate for a developer's needs.
  1342.  
  1343.         There is no requirement for one developer to carry or save another
  1344.      developer's fields on the network.
  1345.  
  1346.      VII.1.d Developer's Fields Assignments
  1347.         In keeping with the Citadel tradition of using ASCII for field
  1348.      identifiers, the following assignments have been made to known developers
  1349.      who are involved, or thought to be involved, with the net.  If you are
  1350.      not listed here and wish to be, please contact Hue, Jr. or his successors
  1351.      for an assignment.  (For those confused by flawed documentation distributed
  1352.      by K2NE, K2NE never has been and never will be Hue, Jr.'s successor in
  1353.      this matter.)
  1354.  
  1355.       Identifier        Assigned to             Software
  1356.       ----------        -----------             --------
  1357.          '0'            David Parsons           STadel
  1358.          '1'            Jay Johnson             Amiga Citadel-68k
  1359.          '2'            Hue, Sr.                NeoCitadel
  1360.          '3'            farokh irani            Citadel-286
  1361.          '4'            Gary Meadows/BKB        Asgard-86
  1362.          '5'            Mark Metson             Knotwork
  1363.          '6'            K2NE                    K2NE
  1364.          '7'            elim & Mr. Neutron      <fnord>adel
  1365.          '8'            cmc                     Fortress
  1366.  
  1367.         Mark Metson's scheme, at least at this point, appears to constitute a
  1368.      very good way to avoid clashes in field identifiers in the future.
  1369.      Therefore, developers are asked not to trample outside their assigned
  1370.      identifiers without coordinating with other C86Net developers.  Citadel-86
  1371.      remains the primary C86Net developer so long as Hue, Jr. continues to
  1372.      program.
  1373.  
  1374.      VII.2 Special Fields becoming Standard Fields
  1375.         The fields detailed above, with the exception of the "developers'
  1376.      fields", constitute a 'standard' collection of fields.  Not all standard
  1377.      fields need be supported by a system, of course.
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.                                     -20-
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.         A field devised by a developer may eventually become a standard field
  1391.      if it displays a wide enough appeal amongst the developers.  Unilateral
  1392.      grabbing of fields is frowned upon deeply with the advent of developers'
  1393.      fields.  The transformation from a developer's special field to a standard
  1394.      field will no doubt require negotiation, biting of fingernails, etc. etc.
  1395.      Due to the anarchic nature of the net, there can be no "final arbiter" on
  1396.      matters such as these; instead, developers are asked to behave in a
  1397.      responsible and respectful manner.  The actual procedures for adding a
  1398.      developer's field (and thus functionality) to the standard set will be
  1399.      developed when, and if!, needed.
  1400.  
  1401.      VII.3 Other Additions to the Standard Fields
  1402.         Hue, Jr. of Citadel-86 reserves the right to add new fields to the
  1403.      standard set at any time.  Since Mark Metson's scheme should protect
  1404.      all developers from each other, this should not disrupt any other
  1405.      developer who follows the rules.
  1406.  
  1407.      VII.4 Identifier Summary
  1408.  
  1409.       Identifier        Data                                 Max Length
  1410.       ----------        ----                                 ----------
  1411.       'A'          Author of current message.                128
  1412.       'C'          Time message was written.                 20
  1413.       'D'          Date on which message was written.        20
  1414.       'J'          STadel reserved
  1415.       'I'          STadel reserved
  1416.       'M'          Message text, all CRs changed to Line     7499, should not
  1417.                     Feeds.                                         be limited,
  1418.                                                                    though.
  1419.       'N'          Name of system which message was          20
  1420.                     written on.
  1421.       'O'          ID of system which message was written    20
  1422.                     on (i.e., "US 612 470-9635").
  1423.       'P'          OtherNet address                          128
  1424.       'Q'          C-86 reserved (inadvertently forgotten)
  1425.       'R'          Room which message was originally         20
  1426.                     written in.
  1427.       'S'          Message ID on source system, in old       20
  1428.                     CP/M Citadel 8-bit style (i.e., 32 bit
  1429.                     number split into two 16 bitters.  See
  1430.                     below in the example).
  1431.       'T'          Recipient of message (normally for        128
  1432.                     private Mail).
  1433.       'W'          Secondary recipient field.                45
  1434.       'X'          Domain of system originating message      20
  1435.       'Z'          STadel reserved
  1436.       't'          Target System identifier (OtherNet)       20
  1437.       'w'          Recipient override field.
  1438.  
  1439.       'Z'          STadel reserved                           ??
  1440.       'J'             "      "
  1441.       'I'             "      "
  1442.       '#'             "      "
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.                                     -21-
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.       '0'          David Parsons identifier field           variable
  1458.       '1'          Jay Johnson identifier field
  1459.       '2'          Hue, Sr. identifier field
  1460.       '3'          farokh irani identifier field
  1461.       '4'          Gary Meadows/BKB identifier field
  1462.       '5'          Mark Metson identifier field
  1463.       '6'          K2NE identifier field
  1464.       '7'          elim/Mr. Neutron identifier field
  1465.       '8'          cmc (Fortress) identifier field
  1466.       
  1467.         In the above table, the MAX LENGTHS include the NULL byte.
  1468.  
  1469.      VII.5 An example
  1470.         So, a message on Test System (nodeId US 612 470 9635, nodeName 'C86
  1471.      Test System', domain 'MN') in room CitaNews) that looks like this:
  1472.  
  1473.         86Feb01 @ 10:01 from John Flash @ C-86 Test System _ MN
  1474.         This is a test.
  1475.  
  1476.       with a message ID of 5644 might look like this during transmission on
  1477.       the net:
  1478.  
  1479.       D86Feb01<0>C10:01<0>S0 5644<0>NC-86 Test System<0>OUS 612 470
  1480.       9635<0>AJohn Flash<0>RCitaNews<0>XMN<0>MThis is a test.<LF><0>
  1481.  
  1482.         Clear as mud, right?
  1483.  
  1484.      Appendix A.  Examples!
  1485.         The following are examples for selected facilities, in order to
  1486.      illuminate what may be otherwise very bewildering examples.  Not all
  1487.      of the facilities are covered.
  1488.  
  1489.         Many of the facilities will show examples at two levels:  a high level
  1490.      displaying the "file" flow used, and a low level view examining the
  1491.      contents of certain data and control packets.  Throughout the examples,
  1492.      the term "file" means an XMODEM session is completed, starting with block
  1493.      #1 and ending with block N and an EOT.  This may be an actual file being
  1494.      transferred, as will happen with File Requests, or it may mean a series
  1495.      of messages being transmitted, which may or may not be stored as a file,
  1496.      depending on the implementation, or it may refer to control information
  1497.      (such as a Facility Request), which again could be stored as a file on
  1498.      disk, or stored in a temporary RAM buffer.
  1499.  
  1500.         The abbreviation FR stands for Facility Request below.  In all cases
  1501.      below, unless otherwise noted, it assumes all Facility Requests are
  1502.      positively acknowledged.
  1503.  
  1504.      A.1 Call Stabilization
  1505.         The following illustrates a call in which the first attempt at call
  1506.      stabilization fails because the receiver, a 300/1200 system which cannot
  1507.      directly detect the baud of the caller, started looking at 300 baud, while
  1508.      the caller is at 1200.
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.                                     -22-
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.           CALLER                    RECEIVER
  1524.                <The systems connect!>
  1525.         <7><13>69> -->              receives garbage, switches to 1200 after
  1526.                                     4 seconds
  1527.          Times out at 4
  1528.          seconds
  1529.         <7><13>69> -->              Receives sequence
  1530.          Gets confirmation     <--  <~7><~13><~69>
  1531.           <ACK> -->                 Receives ACK
  1532.  
  1533.              CALL STABILIZATION COMPLETED
  1534.  
  1535.      A.2. ID & Name
  1536.         From a high level, caller identification flow control is very simple.
  1537.  
  1538.         CALLER           RECEIVER
  1539.              == <file> ==>
  1540.  
  1541.         The length of file in this case should never exceed a single XMODEM
  1542.      sector.  The contents should look like this:
  1543.  
  1544.          <C-string: nodeId><C-string: node name><trash>
  1545.  
  1546.         Suppose the node name of a system was Dandelion Wine, and the node id
  1547.      was US 612 732 4419.  Then the ID & Name "file" would contain
  1548.  
  1549.          US 612 732 4419<0>Dandelion Wine<0><irrelevant trash>
  1550.  
  1551.      A.3. Normal Mail
  1552.         At a high level, here is the sequence of file transfers.
  1553.  
  1554.            CALLER           RECEIVER
  1555.          == file: FR == >
  1556.                       <== file: GOOD ==
  1557.          == file: Mail> messages == >
  1558.  
  1559.         At a low level, the file: FR should only have a length of one sector
  1560.      (as should all FRs), containing:
  1561.  
  1562.         <1><0><126 bytes of irrelevant trash>
  1563.  
  1564.         The file: GOOD should contain the following:
  1565.  
  1566.         <1><127 bytes of trash>
  1567.  
  1568.         This is all a GOOD reply should ever contain, so we shall not
  1569.      explain it again.  Refer to Appendix A for an explanation of the
  1570.      appearance of file: Mail> messages.
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.                                     -23-
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.      A.4. Ambiguous Room File Requests
  1591.         Here is the high level view of this facility:
  1592.  
  1593.            CALLER           RECEIVER
  1594.          == file: FR == >
  1595.                       <== file: GOOD ==
  1596.                       <== file: File #1 header ==
  1597.                       <== file: File #1 ==
  1598.                             ...
  1599.                       <== file: File #n header ==
  1600.                       <== file: File #n ==
  1601.                       <== file: File header with empty string ==
  1602.  
  1603.         For a low level examination, let's assume the Caller asked for
  1604.      *.doc in a room called Whatever>.   The file: FR would then contain
  1605.  
  1606.         <3>Whatever<0>*.doc<0><0><irrelevant trash>
  1607.  
  1608.         Now let's suppose the RECEIVER has decided the files SEX.DOC
  1609.      and GARBAGE.DOC match with *.doc in Whatever>, with sizes of 100,909 and
  1610.      32,555 bytes. File #1 header would contain
  1611.  
  1612.         SEX.DOC<0>789<0><irrelevant trash>
  1613.  
  1614.      while File #1 itself would be the contents of SEX.DOC.  File #2 header
  1615.      would contain
  1616.  
  1617.         GARBAGE.DOC<0>255<0><irrelevant trash>
  1618.  
  1619.      while File #2 would be the contents of GARBAGE.DOC.  File #3 header,
  1620.      since no more files need to be sent, would contain
  1621.  
  1622.         <0><irrelevant trash>
  1623.  
  1624.      and that would constitute the end of this Facility.
  1625.  
  1626.      A.5 Network Room
  1627.         From a high level viewpoint, this Facility looks like this:
  1628.  
  1629.            CALLER           RECEIVER
  1630.          == file: FR == >
  1631.                       <== file: GOOD ==
  1632.          == file: messages == >
  1633.  
  1634.         The contents of the FR for a room named Philosophy would be
  1635.  
  1636.          <5>Philosophy<0><0><irrelevant trash>
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.                                     -24-
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.  
  1655.      A.6 Check Mail
  1656.         From a high level viewpoint, this Facility looks like this:
  1657.  
  1658.            CALLER           RECEIVER
  1659.          == file: FR ==>
  1660.                       <== file: GOOD ==
  1661.                       <== file: acknowledgements ==
  1662.  
  1663.         The content of the FR would simply be
  1664.  
  1665.            <6><0><irrelevant trash>
  1666.  
  1667.         Let's look at the example that all the Mail messages transferred
  1668.      earlier could be delivered.  The content of file: acknowledgements
  1669.      would then be
  1670.  
  1671.             <0><irrelevant trash>
  1672.  
  1673.      which would result in a single sector being returned to the transmitter.
  1674.      Now let's suppose two Mail messages could not be delivered.  One was
  1675.      addressed to Curly, while the other was addressed to Moe, both from
  1676.      Mikey.  Then the file: acknowledgements would contain
  1677.  
  1678.        <1>Mikey<0>Moe<0>87Oct08 @ 4:04<0><1>Mikey<0>Curly<0>87Oct07
  1679.        @ 23:13<0><0><irrelevant trash>
  1680.  
  1681.      A.7 Send File
  1682.  
  1683.         From a high level viewpoint, this Facility looks like this:
  1684.  
  1685.            CALLER           RECEIVER
  1686.          == file: FR ==>
  1687.                       <== file: GOOD ==
  1688.          == file: file ==>
  1689.  
  1690.         The contents of the FR for a file named GURGLE.NOT, size 13,934 bytes,
  1691.      would be
  1692.  
  1693.           <7>GURGLE.NOT<0>109<0>13934<0><0><irrelevant trash>
  1694.  
  1695.      A.8 Alternate Room Sharing
  1696.         From a high level viewpoint, this Facility looks like this:
  1697.  
  1698.            CALLER           RECEIVER
  1699.          == file: FR ==>
  1700.                       <== file: GOOD ==
  1701.          == file: messages ==>
  1702.                       <== file: messages ==
  1703.  
  1704.         For a room named Horse Trading, the FR would look like
  1705.  
  1706.           <8>Horse Trading<0><0><irrelevant trash>
  1707.  
  1708.         The file: messages would be the messages to be sent from the
  1709.      transmitter to the receiver, first, and then from the receiver to the
  1710.      transmitter.
  1711.  
  1712.  
  1713.  
  1714.                                     -25-
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.  
  1721.      Appendix B.  BBS Software compatible with C86Net
  1722.         The following BBS packages are known to be at least minimally
  1723.      compatible with C86Net.  Consult their documentation to find out how
  1724.      many facilities each supports.
  1725.  
  1726.       Name                 Home base           Number           Baud rates
  1727.       ----                 ---------           ------           ----------
  1728.       Citadel-86           C-86 Test System    (612) 470-9635   3/9600 (HST)
  1729.       NeoCitadel           Free Lunch          (612) 431-1107   3/12/24
  1730.       STadel               No longer supported per se.
  1731.       Amiga Citadel-68k    Images              (612) 884-7951   3/12/24
  1732.       Asgard-86            Hotel               (916) 927-7680   3/12/24
  1733.       Novucivitas          Novu                (916) ???-????   ????
  1734.       <fnord>adel          Secret Service      (???) ???-????   300/1200/2400
  1735.       Fortress             Overmind            (???) ???-????   300/1200/2400
  1736.       Citadel-86e          Electronic New York (???) ???-????   ????
  1737.       K2NE                 Jersey Devil        (???) ???-????   ????
  1738.  
  1739.      Appendix C. Main C86Net
  1740.         Most of the homebase systems listed in Appendix B participate in
  1741.      what may best be termed the main C86Net, to which all systems are invited
  1742.      to participate in.
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.                                    -26-
  1781.  
  1782.  
  1783.