RFC1037

From RFC-Wiki
Revision as of 22:45, 22 September 2020 by Admin (talk | contribs)




Network Working Group B. Greenberg Request for Comments: 1037 S. Keene

                                                         December 1987


                   NFILE -  A File Access Protocol


STATUS OF THIS MEMO

  This document includes a specification of the NFILE file access
  protocol and its underlying levels of protocol, the Token List
  Transport Layer and Byte Stream with Mark.  The goal of this
  specification is to promote discussion of the ideas described here,
  and to encourage designers of future file protocols to take advantage
  of these ideas.  A secondary goal is to make the specification
  available to sites that might benefit from implementing NFILE.  The
  distribution of this document is unlimited.
                            TABLE OF CONTENTS
                                                                   Page
  1.  INTRODUCTION                                                    3
  2.  NFILE PROTOCOL LAYERING                                         4
  3.  OVERVIEW OF AN NFILE SESSION                                    5
  4.  NFILE CONTROL AND DATA CONNECTIONS                              6
  5.  NFILE FILE OPENING MODES                                        7
  6.  NFILE CHARACTER SET                                             9
  7.  CONVENTIONS USED IN THIS DOCUMENT                              10
      7.1  Mapping Data Types Into Token List Representation         10
      7.2  Format of NFILE Commands and Responses                    10
      7.3  Data Channel Handles and Direct File Identifiers          13
      7.4  Syntax of File and Directory Pathname Arguments           13
      7.5  Format of NFILE File Property/Value Pairs                 14
  8.  NFILE COMMANDS                                                 16
      8.1  ABORT Command                                             16
      8.2  CHANGE-PROPERTIES Command                                 16
      8.3  CLOSE Command                                             17
      8.4  COMPLETE Command                                          19
      8.5  CONTINUE Command                                          20


Greenberg & Keene [Page 1]

RFC 1037 NFILE - A File Access Protocol December 1987


      8.6  CREATE-DIRECTORY Command                                  21
      8.7  CREATE-LINK Command                                       21
      8.8  DATA-CONNECTION Command                                   22
      8.9  DELETE Command                                            23
      8.10  DIRECT-OUTPUT Command                                    23
      8.11  DIRECTORY Command                                        24
           8.11.1  NFILE DIRECTORY Data Format                       26
      8.12  DISABLE-CAPABILITIES Command                             27
      8.13  ENABLE-CAPABILITIES Command                              28
      8.14  EXPUNGE Command                                          28
      8.15  FILEPOS Command                                          29
           8.15.1  Implementation Hint for FILEPOS Command           30
      8.16  FINISH Command                                           30
      8.17  HOME-DIRECTORY Command                                   31
      8.18  LOGIN Command                                            32
      8.19  MULTIPLE-FILE-PLISTS Command                             34
      8.20  OPEN Command                                             35
           8.20.1  NFILE OPEN Optional Keyword/Value Pairs           39
           8.20.2  NFILE OPEN Response Return Values                 45
      8.21  PROPERTIES Command                                       47
      8.22  READ Command                                             49
      8.23  RENAME Command                                           50
      8.24  RESYNCHRONIZE-DATA-CHANNEL Command                       51
           8.24.1  Implementation Hints for RESYNCHRONIZE-DATA-      51
                   CHANNEL Command
      8.25  UNDATA-CONNECTION Command                                52
  9.  NFILE RESYNCHRONIZATION PROCEDURE                              53
      9.1  NFILE Control Connection Resynchronization                54
      9.2  NFILE Data Connection Resynchronization                   55
  10.  NFILE ERRORS AND NOTIFICATIONS                                58
      10.1  Notifications From the NFILE Server                      58
      10.2  NFILE Command Response Errors                            59
      10.3  NFILE Asynchronous Errors                                60
      10.4  NFILE Three-letter Error Codes                           61
  11.  TOKEN LIST TRANSPORT LAYER                                    65
      11.1  Introduction to the Token List Transport Layer           65
      11.2  Token List Stream                                        66
           11.2.1  Types of Tokens and Token Lists                   66
           11.2.2  Token List Stream Example                         68
           11.2.3  Mapping of Lisp Objects to Token List Stream      70
                   Representation
           11.2.4  Aborting and the Token List Stream                71


Greenberg & Keene [Page 2]

RFC 1037 NFILE - A File Access Protocol December 1987


      11.3  Token List Data Stream                                   72
  12.  BYTE STREAM WITH MARK                                         73
      12.1  Discussion of Byte Stream with Mark                      73
      12.2  Byte Stream with Mark Abortable States                   75
  13.  POSSIBLE FUTURE EXTENSIONS                                    77
  APPENDIX A.  NORMAL TRANSLATION MODE                               79
  APPENDIX B.  RAW TRANSLATION MODE                                  83
  APPENDIX C.  SUPER-IMAGE TRANSLATION MODE                          84
  NOTES                                                              86
                             LIST OF TABLES
  TABLE 1.    TRANSLATIONS FROM NFILE CHARACTERS TO UNIX CHARACTERS  80
  TABLE 2.    TRANSLATIONS FROM UNIX CHARACTERS TO NFILE CHARACTERS  80
  TABLE 3.    TRANSLATIONS FROM NFILE TO PDP-10 CHARACTERS           81
  TABLE 4.    TRANSLATIONS FROM PDP-10 CHARACTERS TO NFILE           82
              CHARACTERS
  TABLE 5.    SUPER-IMAGE TRANSLATION FROM NFILE TO ASCII            84
  TABLE 6.    SUPER-IMAGE TRANSLATION FROM ASCII TO NFILE            85

1. INTRODUCTION

  NFILE stands for "New File Protocol".  NFILE was originally designed
  as a replacement for an older protocol named QFILE, with the goal of
  solving robustness problems of QFILE, hence the name "New File
  Protocol".
  NFILE was designed and implemented at Symbolics by Bernard S.
  Greenberg.  Mike McMahon made important contributions, especially in
  the design and implementation of the Byte Stream with Mark and Token
  List Transport layers.  NFILE has been used successfully for file
  access between Symbolics computers since 1985.  NFILE servers have
  been written for UNIX hosts as well.  NFILE is intended for use by
  any type of file system, not just the native Symbolics file system.
  NFILE is a file access protocol that supports a large set of
  operations on files and directories on remote systems, including:
           - Reading and writing entire files
           - Reading and writing selected portions of files
           - Deleting and renaming files


Greenberg & Keene [Page 3]

RFC 1037 NFILE - A File Access Protocol December 1987


           - Creating links
           - Listing, creating, and expunging directories
           - Listing and changing the properties of files
           - Enabling and disabling access capabilities on a remote
             host
  NFILE supports file transfer of binary or character files.
  The NFILE server provides information about any errors that occur in
  the course of a command.  In addition, NFILE has a robust scheme for
  handling aborts on the user side.
  This specification defines NFILE user version 2 and server version 2.
  We do not envision NFILE as an unchanging protocol, but rather as a
  protocol that could continue to develop if additional requirements
  are identified though the process of this Request for Comments.  The
  design of NFILE makes room for various useful extensions.  Some of
  the extensions that we are considering are described later on in this
  document:  See the section "Possible Future Extensions", section 13.

2. NFILE PROTOCOL LAYERING

  NFILE is a layered file protocol.  The layers are:
            +-----------------------------------------------+
            |client program or user interface               |
            +-----------------------------------------------+
            |NFILE                                          |
            +-----------------------------------------------+
            |Token List Transport Layer                     |
            +-----------------------------------------------+
            |Byte Stream with Mark                          |
            +-----------------------------------------------+
            |reliable host-host byte transmission protocol  |
            +-----------------------------------------------+
  Byte Stream with Mark is a simple protocol that guarantees that an
  out-of-band signal can be transmitted in the case of program
  interruption.  Byte Stream with Mark is to be layered upon extant
  byte stream protocols.  An important goal of the NFILE design was
  that NFILE could be built on any byte stream.  It is currently
  implemented on TCP and Chaosnet.  See the section "Byte Stream with
  Mark", section 12.
  The Token List Transport Layer is a protocol that facilitates the
  transmission of simple structured data, such as lists.  See the
  section "Token List Transport Layer", section 11.



Greenberg & Keene [Page 4]

RFC 1037 NFILE - A File Access Protocol December 1987


  The NFILE commands and command responses are transmitted in "token
  lists".  See the section "NFILE Commands", section 8.
  This specification does not include a client program or user
  interface to the protocol.  In the Symbolics implementation, the
  normal file operations transparently invoke NFILE, when the remote
  host is known to support NFILE.  Another possible interface to NFILE
  would be through a dedicated client program that would issue NFILE
  commands in response to explicit requests by the user.

3. OVERVIEW OF AN NFILE SESSION

  An NFILE session is a dialogue between two hosts.  The host that
  initiates the NFILE session is known as the "user side", and the
  other host is the "server side".  The user side sends all NFILE
  commands.  The server receives each command, processes it, and
  responds to it, indicating the success or failure of the command.
  The user side keeps track of commands sent and command responses
  received by using "transaction identifiers" to identify each command.
  The user side generates a transaction identifier (which must be
  unique per this dialogue) for each command, and sends the transaction
  identifier to the server along with the command.  Each NFILE server
  response includes the transaction identifier of the command with
  which the response is associated.  The server is not required to
  respond to commands in the same order that the user gave them.
  The user side sends NFILE commands over a bidirectional network
  connection called the "control connection".  The server sends its
  command responses on the same control connection.  The control
  connection governing the NFILE session is established at the
  beginning of the session.  If the control connection is ever broken,
  the NFILE session is ended.
  Whereas NFILE commands and responses are transmitted on the control
  connection, file data is transferred over "data channels".  An "input
  data channel" transfers data from server to user.  An "output data
  channel" transfers data from user to server.  Each input data channel
  is associated with an output data channel; together these two
  channels comprise a "data connection".
  Often more than one NFILE activity is occurring at any given time.
  For example, several files can be open and transferring data
  simultaneously; one or more commands can be in process at the same
  time; and the server can be simultaneously transmitting directory
  lists and processing further commands.  This happens in an
  implementation in which the user side has multiple processes, and
  several processes share a single NFILE server.


Greenberg & Keene [Page 5]

RFC 1037 NFILE - A File Access Protocol December 1987


4. NFILE CONTROL AND DATA CONNECTIONS

  The user and server communicate through a single control connection
  and a set of data connections.  Data connections are established and
  disestablished by NFILE commands.  The user side sends NFILE commands
  to the server over the control connection.  The server responds to
  every user command over this control connection.  The actual file
  data is transmitted over the data connections.
  User aborts can disrupt the normal flow of data on the control
  connection and data connections.  An important aspect of any file
  protocol is the way it handles user aborts.  NFILE uses a
  resynchronization procedure to bring the affected control connection
  or data channel from an unknown, unsafe state into a known state.
  After resynchronization, the control connection or data channel can
  be reused.  See the section "NFILE Resynchronization Procedure",
  section 9.
  THE CONTROL CONNECTION
  An NFILE session is begun when the NFILE user program connects to a
  remote host and establishes a network connection.  This initial
  connection is the control conection of the dialogue.  If TCP is used
  as the underlying protocol, contact NFILE's well-known port, 59.  If
  Chaos is used, use the contact name "NFILE".
  The control connection is the vehicle used by the user to send its
  commands, and the server to send its command responses.  These types
  of communication occur over the NFILE control connection:
        - The user side sends NFILE commands.
        - The server sends command responses.
        - The server sends "notifications" and "asynchronous errors".
          See the section "NFILE Errors and Notifications", section 10.
        - During resynchronization (a special circumstance) either the
          user or server sends a mark.
  All commands, command responses, and other data flowing over the
  NFILE control connection are transmitted in the format of "top-level
  token lists".  The control connection expects never to receive "loose
  tokens"; that is, tokens not contained in token lists.






Greenberg & Keene [Page 6]

RFC 1037 NFILE - A File Access Protocol December 1987


  DATA CONNECTIONS
  Data connections are established and discarded at user request, by
  means of two NFILE commands:  DATA-CONNECTION and UNDATA-CONNECTION.
  Each data connection is associated with a specific control
  connection, which is the same control connection that caused the data
  connection to be established.
  Each data connection is composed of two "data channels".  Each data
  channel is capable of sending data in one direction.  The term "input
  channel" refers to the data channel that transmits data from the
  server to the user side; "output channel" refers to the data channel
  that transmits data from the user to the server side.  Throughout the
  NFILE documentation, the terms "input channel" and "output channel"
  are seen from the perspective of the user side.  A single data
  channel can be used for one data transfer after another.
  The format of the data transferred on the data channels is defined as
  a "token list data stream".  See the section "Token List Data
  Stream", section 11.3. When the end of data is reached, the keyword
  token EOF is sent.  Occasionally, token lists are transmitted over
  the data channels, such as asynchronous error descriptions.

5. NFILE FILE OPENING MODES

  The NFILE OPEN command opens a file for reading, writing, or "direct
  access" at the server host.  That means, in general, asking the host
  file system to access the file and obtaining a file number, pointer,
  or other quantity for subsequent rapid access to the file; this is
  called an "opening".  The term "opening" translates to a file stream
  in Symbolics terminology, a JFN in TOPS-20 terminology, and a file
  descriptor in UNIX terminology.  An opening usually keeps track of
  how many bytes have been read or written, and other bookkeeping
  information.
  NFILE supports two ways of transferring file data, "data stream mode"
  and "direct access mode".  A single mode is associated with each
  opening.  Note that an NFILE dialogue can have more than one opening,
  and thus use both modes.
  DATA STREAM MODE:
  Data stream mode of file transfer is the default mode of NFILE's OPEN
  command.  Data stream mode is appropriate when the entire file is
  transferred, either from user to server, or from server to user.
  Data stream mode is used more often than direct access mode.



Greenberg & Keene [Page 7]

RFC 1037 NFILE - A File Access Protocol December 1987


  The OPEN command includes a "handle" argument, which identifies the
  data channel to be used to transfer the data.  The handle is used in
  subsequent commands to reference this particular opening.  When a
  data stream opening is requested with the OPEN command, the file is
  opened and the data begins to flow immediately.
  The sending side transmits the entire contents of the specified file
  over the specified data channel as rapidly as the network permits.
  When the sending side reaches the end of the file, it transmits a
  special control token to signal end of file.  The receiving side
  expects an uninterrupted stream of bytes to appear immediately on its
  side of the data channel.
  The user gives the CLOSE command to terminate a data stream transfer.
  CLOSE results in closing the file.
  DIRECT ACCESS MODE:
  Direct access mode enables reading or writing data from a given
  starting point in a file through a specified number of bytes.  In
  direct access mode, data is requested and sent in individual
  transactions.  To request a direct access mode opening, the OPEN
  command is used with a DIRECT-FILE-ID argument.  (In data stream
  mode, no DIRECT-FILE-ID is supplied.)  The direct file identifier is
  used in subsequent commands to reference the direct access opening.
  When a file is opened in direct access mode, the flow of data does
  not start immediately.  Rather, the user gives either a READ command
  (to request data to flow from server to user) or a DIRECT-OUTPUT
  command (to request data to flow from user to server).  When reading,
  the READ command allows the user to specify the starting point and
  the number of bytes of data to transfer.  When writing, the FILEPOS
  command can be used to specify the starting point, before the
  DIRECT-OUTPUT command is given.  The user can give many READ and
  DIRECT-OUTPUT commands, one after another.
  The user side terminates the direct access transfer by using the
  CLOSE command.  The ABORT command can be given to terminate without
  transmitting all of the specified bytes.







Greenberg & Keene [Page 8]

RFC 1037 NFILE - A File Access Protocol December 1987


6. NFILE CHARACTER SET

  The NFILE character set <1> is an extension of standard ASCII.  NFILE
  command and response names use only the standard ASCII characters.
  However, the protocol supports the transfer of the non-ASCII
  characters in the NFILE character set; these characters might be
  stored in files, or might be used in pathnames.
  Servers on machines that do not natively use the NFILE character set
  must perform character set translations for character openings,
  depending on the requested translation mode.  No translation is
  required for binary openings.  There are three translation modes for
  character openings:  NORMAL, RAW, and SUPER-IMAGE.  Each mode
  specifies a way to translate between the server's native set and the
  NFILE character set.
  NORMAL mode is the default of the OPEN command.  The translation for
  NORMAL mode ensures that a file containing characters in the NFILE
  character set can be written to a remote host and read back intact.
  OPEN has optional keyword arguments to specify RAW or SUPER-IMAGE.
  RAW mode means to perform no translation whatsoever.  SUPER-IMAGE
  mode is intended for use by PDP-10 family machines only.  It is
  included largely as an illustration of a system-dependent extension.
  The details of each translation mode are given in Appendices:
        See the section "NORMAL Translation Mode", Appendix A.  See the
        section "RAW Translation Mode", Appendix B.  See the section
        "SUPER-IMAGE Translation Mode", Appendix C.
  The use of the NFILE character set brings up a difficulty involved
  with determining an exact position within a character file.  Some
  NFILE characters expand to more than one native character on some
  servers.  Thus, for character files, when we speak of a given
  position in a file or the length of a file, we must specify whether
  we are speaking in "NFILE units" or "server units", because the
  counting of characters is different.  This causes major problems in
  file position reckoning for character files.  Specifically, it is
  futile for a user side to carefully monitor file position during
  output by counting characters, when character translation is in
  effect.  The server's operating system interface for "position to
  point x in a file" necessarily operates in server units, but the user
  side has counted in NFILE units.  The user side cannot try to
  second-guess the translation-counting process without losing host-
  independence.  See the section "FILEPOS NFILE Command".




Greenberg & Keene [Page 9]

RFC 1037 NFILE - A File Access Protocol December 1987


7. CONVENTIONS USED IN THIS DOCUMENT

7.1 Mapping Data Types Into Token List Representation

  Throughout this NFILE specification, the data types of arguments,
  return values, asynchronous error descriptions, and notifications are
  described as being strings, integers, dates, time intervals, and so
  on.  However, each conceptual data type must be mapped into the
  appropriate token list representation for transmission.  The mapping
  of conceptual data types to token list representation is shown here:
   Conceptual Type     Token List Representation
   ----------------------------------------------------------------
   Keyword             A keyword token
   Keyword list        A token list of keyword tokens
   Integer             A numeric data token
   String              A data token containing the characters of the
                       string in the NFILE character set.
   Boolean Truth       The token known as BOOLEAN-TRUTH.
   Boolean False       The empty token list.
   Date                A numeric data token.  The date is expressed in
                       Universal Time format, which measures a time as
                       the number of seconds since January 1, 1900, at
                       midnight GMT.
   Date-or-never       Can be either a date or the empty token list,
                       representing "never".  "Never" is used for
                       values such as the time a directory was last
                       expunged, if it has never been expunged.
   Time interval       A numeric data token.  The time interval is
                       expressed in seconds.  A time interval
                       indicating "never" is represented by the empty
                       token list.

7.2 Format of NFILE Commands and Responses

  Each command description begins by giving the command format and
  response format.  Here is the beginning of the DATA-CONNECTION
  command description:


Greenberg & Keene [Page 10]

RFC 1037 NFILE - A File Access Protocol December 1987


  Command:  (DATA-CONNECTION tid new-input-handle new-output-handle)
  Response: (DATA-CONNECTION tid connection-identifier)
  The command descriptions follow these conventions:
   1. NFILE commands and responses are transmitted as top-level token
      lists.
      Top-level token lists are enclosed in parentheses in these
      command descriptions.  These parentheses are not sent literally
      across the control or data connections, but are a shorthand
      representation of special control tokens that delimit top-level
      token lists.  Specifically, TOP-LEVEL-LIST-BEGIN starts a top-
      level token list; TOP-LEVEL-LIST-END ends a top-level token list.
   2. NFILE command names are keywords.
      The command name is required in every command and command
      response.  All NFILE command names are keywords.  Keywords appear
      in the NFILE documentation as their names in uppercase.  For
      example, DATA-CONNECTION and DELETE are two command names.
   3. A unique transaction identifier (tid) identifies each command.
      The transaction identifier is a string made up by the user side
      to identify this particular transaction, which is composed of the
      command and the response associated with this command.  The
      transaction identifier is abbreviated in the command descriptions
      as tid.  Transaction identifiers are limited to fifteen
      characters in length.  The transaction identifier is required in
      every command and command response.
  OPTIONAL ARGUMENTS
  Many NFILE commands have "optional arguments".  Optional arguments
  can be supplied (with appropriate values), or left out.  If optional
  arguments are left out, their omission must be made explicit by means
  of substituting the empty token list in their place.  The only
  exception to that rule is for trailing optional arguments or return
  values, which can be omitted without including the empty token list.
  For example, the text of the DELETE command description explains that
  either a handle or a pathname must be supplied, but not both;
  therefore, one of them is an optional argument.  Here is the command
  format of DELETE:
        (DELETE tid handle pathname)


Greenberg & Keene [Page 11]

RFC 1037 NFILE - A File Access Protocol December 1987


   If you supply a handle and no pathname, the command format is:
        (DELETE tid handle)
   If you supply a pathname and no handle, the command format is:
        (DELETE tid empty-token-list pathname)
  The empty token list in the token list stream appears as a LIST-BEGIN
  followed immediately by a LIST-END.
  OPTIONAL KEYWORD/VALUE PAIRS
  Four NFILE commands have "optional keyword/value pairs".  These
  commands are: COMPLETE, LOGIN, OPEN, and READ.  Optional
  keyword/value pairs can be either included in the command or omitted
  entirely.  There is no need to substitute the empty token list for
  ommitted optional keyword tokens, unlike optional arguments.  The
  order of the option keyword/value pairs is not significant.
  If included, optional keyword/value pairs are a sequence of
  alternating keywords and values.  The values associated with the
  keywords can be keywords, lists, strings, Booleans, integers, dates,
  date-or-never's, and time intervals.  The text of each command
  description states what type of value is appropriate for each
  optional keyword.
  Optional keyword/value pairs appear in the text as the keyword only,
  in uppercase letters.  For example, here is the format of the LOGIN
  command:
  Command Format:
        (LOGIN tid user password FILE-SYSTEM USER-VERSION)
  FILE-SYSTEM and USER-VERSION are two optional keywords associated
  with the LOGIN command.  The user side can supply USER-VERSION, and
  omit FILE-SYSTEM as shown in this example:
        (LOGIN x105 tjones let-me-in USER-VERSION 2)
  As seen above, the optional keyword/value pair USER-VERSION, if
  supplied in a command, consists of the keyword USER-VERSION followed
  by the value to be used for that keyword (in this example, 2).




Greenberg & Keene [Page 12]

RFC 1037 NFILE - A File Access Protocol December 1987


7.3 Data Channel Handles and Direct File Identifiers

  Several NFILE commands require an argument that specifies an opening.
  This kind of argument is called a handle in the command description.
  It is always a string type argument.  A handle can be either a data
  channel handle or a direct file identifier, depending on the mode of
  the opening:


  Data Stream
  The handle must identify a data channel that is bound to an opening.
  Direct Access
  In general, the handle must be a direct file identifier.  A direct
  file identifier specifies a direct access opening.  It is the same as
  the value supplied in the DIRECT-FILE-ID keyword/value pair in the
  OPEN command.  It is used for all operations that identify an opening
  rather than a data channel.
  Two NFILE commands applicable to direct access openings are
  exceptions to the general rule.  The handle supplied in ABORT and
  CONTINUE cannot be a direct file identifier, but must be a data
  channel handle instead.

7.4 Syntax of File and Directory Pathname Arguments

  Some arguments and return values in the NFILE command descriptions
  represent file pathnames.  These are strings in the pathname syntax
  native to the server host.  These pathnames contain no host
  identifiers of any kind.  These pathnames must be fully defaulted, in
  the sense that they have a directory and file name (and file type, if
  the server operating system supports file types).  If appropriate, a
  device is referenced in the pathname.  If the server file system
  supports version numbers, there is always an explicit version number,
  even if that number or other specification is that system's
  representation of "newest" or "oldest".







Greenberg & Keene [Page 13]

RFC 1037 NFILE - A File Access Protocol December 1987


  Here are some examples of file pathnames, for different server hosts:
  Server Host     Example of File Pathname
  ------------------------------------------------------------
     UNIX            /usr/max/life.c
     TOPS-20         ps:<max>life.bin.17
     VMS             MACD:[MAX]LIFE.FOR;3
     Symbolics LMFS  >max>life.lisp.newest
  ------------------------------------------------------------
  The CREATE-DIRECTORY and HOME-DIRECTORY commands take a directory as
  an argument.  In NFILE commands, a directory is represented by a
  string that names the directory.  In most cases this string is in the
  syntax native to the server host.  However in some cases the native
  format is modified somewhat to clarify that the string names a
  directory, and not a file.  For example, a directory on UNIX is
  represented by "/usr/max/", not "/usr/max".
  Here are some examples of directory pathnames for different server
  hosts:
  Server Host     Example of Directory Pathname
  ------------------------------------------------------------
     UNIX            /usr/max/
     TOPS-20         <max>
     VMS             MACD:[MAX]
     Symbolics LMFS  >max>hacks>
  ------------------------------------------------------------

7.5 Format of NFILE File Property/Value Pairs

  Several NFILE commands request information regarding the properties
  of files or directories.  These commands include:  DIRECTORY,
  MULTIPLE-FILE-PLISTS, PROPERTIES, and CHANGE-PROPERTIES.  This
  section describes how file property information is conveyed over the
  token list stream.


Greenberg & Keene [Page 14]

RFC 1037 NFILE - A File Access Protocol December 1987


  File property information is usually sent in property/value pairs,
  where the property identifies the property, and the following value
  gives the value of that property for the specified file.
  Each property is denoted either by a keyword or an integer.  You can
  mix both ways of specifying properties (keyword or integer) within a
  single description.  An integer is interpreted as an index into the
  Property Index Table, an array of property keywords.  The server can
  optionally send a Property Index Table to the user during the
  execution of the LOGIN command, although it is not required.  This
  greatly reduces the length of transmissions.
  In command arguments, file properties cannot be specified with
  integers; keywords must be used to specify file properties in command
  arguments.  Integers can be used to denote file properties only in
  command responses.
  We now list the keywords associated with file properties.  This list
  is not intended to be restrictive.  If a programmer implementing
  NFILE needs a new keyword, a new keyword (not on this list) can be
  invented.  The type of value of any new keywords is by default
  string.  The keywords are sorted here by conceptual data type:
   Data type       Keywords denoting file properties
  ----------------------------------------------------------------
   Integers        BLOCK-SIZE, BYTE-SIZE, GENERATION-RETENTION-COUNT,
                   LENGTH-IN-BLOCKS, LENGTH-IN-BYTES,
                   DEFAULT-GENERATION-RETENTION-COUNT
   Dates           CREATION-DATE, MODIFICATION-DATE
   Date-or-never's REFERENCE-DATE, INCREMENTAL-DUMP-DATE,
                   COMPLETE-DUMP-DATE, DATE-LAST-EXPUNGED,
                   EXPIRATION-DATE
   Time intervals  AUTO-EXPUNGE-INTERVAL
   Keyword Lists   SETTABLE-PROPERTIES, LINK-TRANSPARENCIES,
                   DEFAULT-LINK-TRANSPARENCIES
   Boolean values  DELETED, DONT-DELETE, DONT-DUMP, DONT-REAP,
                   SUPERSEDE-PROTECT, NOT-BACKED-UP, OFFLINE,
                   TEMPORARY, CHARACTERS, DIRECTORY




Greenberg & Keene [Page 15]

RFC 1037 NFILE - A File Access Protocol December 1987


   Strings         ACCOUNT, AUTHOR, LINK-TO, PHYSICAL-VOLUME,
                   PROTECTION, VOLUME-NAME, PACK-NUMBER, READER,
                   DISK-SPACE-DESCRIPTION, and any keywords not
                   on this list
  Note that these keyword names are intended to imply the semantics of
  the properties.  For a discussion of the semantics of CREATION-DATE:
  See the section "NFILE OPEN Response Return Values", section 8.20.2.
  The "Reference Guide to Streams, Files, and I/O" in the Symbolics
  documentation set details the semantics that Symbolics associates
  with these properties.

8. NFILE COMMANDS

  It is important to understand the conventions used in each of the
  following command descriptions.  See the section "Conventions Used in
  This Document", section 7.

8.1 ABORT Command

  Command:  (ABORT tid input-handle)
  Response: (ABORT tid)
  ABORT cleanly interrupts and prematurely terminates a single direct
  access mode data transfer initiated with READ.  The required input-
  handle string argument identifies a data channel on which an input
  transfer is currently taking place; this must be a direct access
  transfer.  input-handle must identify a data channel; it cannot be a
  direct file identifier.
  Upon receiving the ABORT command, the server checks to see if a
  transfer is still active on that channel.  If so, the server
  terminates the transfer by telling the data connection logical
  process to stop transferring bytes of data.  The user side needs to
  issue this command only when there are outstanding unread bytes.
  This excludes the case of the data channel having been disestablished
  or reallocated by the user side.
  Whether or not a transfer is active on that channel, the user side
  puts the data channel into the unsafe state.  Before the data channel
  can be used again, it must be resynchronized.

8.2 CHANGE-PROPERTIES Command

  Command:  (CHANGE-PROPERTIES tid handle pathname property-pairs)
  Response: (CHANGE-PROPERTIES tid)


Greenberg & Keene [Page 16]

RFC 1037 NFILE - A File Access Protocol December 1987


  CHANGE-PROPERTIES changes one or more properties of a file.  Either a
  handle or a pathname must be given, but not both.  Whichever one is
  given must be supplied as a string.  handle identifies a data channel
  that is bound to an open file; it can be a direct file identifier.
  pathname identifies a file on the server machine.
  property-pairs is a required token list of keyword/value pairs, where
  the name of the property to be changed is the keyword, and the
  desired new property value is the value.
  The properties that can be changed are host-dependent, as are any
  restrictions on the values of those properties.  The properties that
  can be changed are the same as those returned as settable-properties,
  in the command response for the PROPERTIES command.
  The server tries to modify all the properties listed in property-
  pairs to the desired new values.  There is currently no definition
  about what should be done if the server can successfully change some
  properties but not others.
  For further information on file property keywords and associated
  values:  See the section "Format of NFILE File Property/Value Pairs",
  section 7.5.

8.3 CLOSE Command

  Command:  (CLOSE tid handle abort-p)
  Response: (CLOSE tid truename binary-p other-properties)
  CLOSE terminates a data transfer, and frees a data channel.  The
  handle must be a data channel handle for a data stream opening, or a
  direct file identifier for a direct access opening.  If a data
  channel is given, a transfer must be active on that handle.  If
  abort-p is supplied as Boolean truth, the file is close-aborted, as
  described below.
  "Closing the file" has different implications specific to each
  operating system.  It generally implies invalidation of the pointer
  or logical identifier obtained from the operating system when the
  file was "opened", and freeing of operating system and/or job
  resources associated with active file access.  For output files, it
  involves ensuring that every last bit sent by the user has been
  successfully written to disk.  The server should not send a
  successful response until all these things have completed
  successfully.



Greenberg & Keene [Page 17]

RFC 1037 NFILE - A File Access Protocol December 1987


  In either data stream or direct access mode, the user can request the
  server to close-abort the file, instead of simply closing it.  To
  close-abort a file means to close it in such a way, if possible, that
  it is as if the file had never been opened.  In the specific case of
  a file being created, it must appear as if the file had never been
  created.  This might be more difficult to implement on certain
  operating systems than others, but tricks with temporary names and
  close-time renamings by the server can usually be used to implement
  close-abort in these cases.  In the case of a file being appended to,
  close-abort means to forget the appended data.
  AN UNSUCCESSFUL CLOSE OPERATION
  For the normal CLOSE operation (not a close-abort), after writing
  every last bit sent by the user to disk, and before closing the file,
  the server checks the data channel specified by handle to see if an
  asynchronous error is outstanding on that channel.  That is, the
  server must determine whether it has sent an asynchronous error
  description to the user, to which the user has not yet responded with
  a CONTINUE command.  If so, the server is unable to close the file,
  and therefore sends a command error response indicating that an error
  is pending on the channel.  The appropriate three-letter error code
  is EPC.  See the section "NFILE Errors and Notifications", section
  10.
  A SUCCESSFUL CLOSE OPERATION
  The return values for OPEN and CLOSE are syntactically identical, but
  the values might change between the time of the file being opened and
  when it is closed.  For example, the truename return value is
  supplied after all the close-time renaming of output files is done
  and the version numbers resolved (for operating systems supporting
  version numbers).  Therefore, on some systems the truename of a file
  has one value at the time it is opened, and a different value when it
  has been closed.  For a description of the CLOSE return values:  See
  the section "NFILE OPEN Response Return Values", section 8.20.2.
  If the user gives the CLOSE command with abort-p supplied as Boolean
  truth, thus requesting a close-abort of the file, the server need not
  check whether an asynchronous error description is outstanding on the
  channel.  The server simply close-aborts the file.






Greenberg & Keene [Page 18]

RFC 1037 NFILE - A File Access Protocol December 1987


8.4 COMPLETE Command

  Command:  (COMPLETE tid string pathname DIRECTION NEW-OK DELETED)
  Response: (COMPLETE tid new-string success)
  COMPLETE performs file pathname completion.
  string is a partial filename typed by the user and pathname is the
  default name against which it is being typed.  Both string and
  pathname are required arguments, and are of type string.  The
  remaining arguments are optional keyword/value pairs.
  NEW-OK is Boolean; if followed by Boolean truth, the server should
  allow either a file that already exists, or a file that does not yet
  exist.  The default of NEW-OK is false; that is, the server does not
  consider files that do not already exist.
  DELETED is a Boolean type argument; if followed by Boolean truth, the
  server is instructed to look for files that have been deleted but not
  yet expunged, as well as non-deleted files.  The default is to ignore
  soft-deleted files.
  DIRECTION can be followed by READ, to indicate that the file is to be
  read.  If the file is to be written, DIRECTION can be followed by
  WRITE.  The default is READ.
  The filename is completed according to the files present in the host
  file system, and the expanded string new-string is returned. New-
  string is always a string containing a file name:  either the
  original string, or a new, more specific string.  The value of
  success indicates the status of the completion. The keyword value OLD
  or NEW means complete success, whereas the empty token list means
  failure.  The following values of success are possible:
  Value               Meaning
  ----------------------------------------------------------------
  OLD                 Success:  the string completed to the name of
                      a file that exists.
  NEW                 Success:  the string completed to the name of
                      a file that could be created.
  Empty token list    Failure due to one of these reasons:
                      The file is on a file system that does not


Greenberg & Keene [Page 19]

RFC 1037 NFILE - A File Access Protocol December 1987


                      support completion.  new-string is supplied as
                      the unchanged string.
                      There is no possible completion.  new-string
                      is supplied as the unchanged string.
                      There is more than one possible completion.
                      The given string is completed up to the first
                      point of ambiguity, and the result is supplied
                      as new-string.
                      A directory name was completed.  Completion
                      was not successful because additional
                      components to the right of this directory
                      remain to be specified.  The string is
                      completed through the directory name and the
                      delimiter that follows it, and the result is
                      returned in new-string.
  The semantics of COMPLETE are not documented here.  See the
  "Reference Guide to Streams, Files, and I/O" in the Symbolics
  documentation set for the recommended semantics of COMPLETE.

8.5 CONTINUE Command

  Command:  (CONTINUE tid handle)
  Response: (CONTINUE tid)
  CONTINUE resumes a data transfer that was temporarily suspended due
  to an asynchronous error.  Each asynchronous error description has an
  optional argument of RESTARTABLE, indicating whether it makes any
  sense to try to continue after this particular error occurred.
  CONTINUE tries to resume the data transfer if the error is
  potentially recoverable, according to the RESTARTABLE argument in the
  asynchronous error description.  For a discussion of asynchronous
  errors:  See the section "NFILE Errors and Notifications", section
  10.
  handle is a required string-type argument that refers to the handle
  of the data channel that received an asynchronous error.  That data
  channel could have been in use for a data stream or direct access
  transfer.  handle cannot be a direct file identifier.
  If the asynchronous error description does not contain the
  RESTARTABLE argument, and the user issues the CONTINUE command
  anyway, the server gives a command error response.



Greenberg & Keene [Page 20]

RFC 1037 NFILE - A File Access Protocol December 1987


8.6 CREATE-DIRECTORY Command

  Command:  (CREATE-DIRECTORY tid pathname property-pairs)
  Response: (CREATE-DIRECTORY tid dir-truename)
  CREATE-DIRECTORY creates a directory on the remote file system.  The
  required pathname argument is a string identifying the pathname of
  the directory to be created.  The return value dir-truename is the
  pathname of the directory that was successfully created.  Both of
  these pathnames are directory pathnames:  See the section "Syntax of
  File and Directory Pathname Arguments", section 7.4.
  property-pairs is a keyword/value list of properties that further
  define the attributes of the directory to be created.  The allowable
  keywords and associated values are operating system dependent;
  typically they indicate arguments to be given to the native primitive
  for creating directories.
  If property-pairs is supplied as the empty token list, default access
  and creation attributes apply and should be assured by the server.
  See the section "Format of NFILE File Property/Value Pairs", section
  7.5.

8.7 CREATE-LINK Command

  Command:  (CREATE-LINK tid pathname target-pathname properties)
  Response: (CREATE-LINK tid link-truename)
  CREATE-LINK creates a link on the remote file system.
  pathname is the pathname of the link to be created; target-pathname
  is the place in the file system to which the link points.  Both are
  required arguments.  The return value link-truename names the
  resulting link.
  If a server on a file system that does not support links receives the
  CREATE-LINK command, it sends a command error response.
  The arguments pathname and target-pathname, and the return value
  link-truename, are all strings in the full pathname syntax of the
  server host.  See the section "Syntax of File and Directory Pathname
  Arguments", section 7.4.
  The required properties argument is a token list of keyword/value
  pairs. These properties and their values specify certain attributes
  to be given to the link.  The allowable keywords and associated


Greenberg & Keene [Page 21]

RFC 1037 NFILE - A File Access Protocol December 1987


  values are operating system dependent; typically they indicate
  arguments to be given to the native primitive for creating links.
  If no property pairs are given in the command, the server should
  apply a reasonable default set of attributes to the link.  See the
  section "Format of NFILE File Property/Value Pairs", section 7.5.

8.8 DATA-CONNECTION Command

  Command:  (DATA-CONNECTION tid new-input-handle new-output-handle)
  Response: (DATA-CONNECTION tid connection-identifier)
  DATA-CONNECTION enablesthe user side to initiate the establishment of
  a new data connection.  The user side supplies two required string
  arguments, new-input-handle and  new-output-handle.  These arguments
  are used by subsequent commands to reference the two data channels
  that constitute the data connection now being created.  new-input-
  handle describes the server-to-user data channel, and new-output-
  handle describes the user-to-server channel.  new-input-handle and
  new-output-handle cannot refer to any data channels already in use.
  Upon receiving the DATA-CONNECTION command, the server arranges for a
  logical port (called socket or contact name on some networks) to be
  made available on the foreign host machine.  When the server has made
  that port available, it must inform the user of its identity.  The
  server relays that information in the command response, in the
  required connection-identifier, a string.  The server then listens on
  the port named by connection-identifier, and waits for the user side
  to connect to it.
  Upon receiving the success command response, the user side supplies
  the connection-identifier to the local network implementation, in
  order to connect to the specified port.  The data connection is not
  fully established until the user side connects successfully to that
  port.  This command is unusual in that the successful command
  response does not signify the completion of the command; it indicates
  only that the server has fulfilled its responsibility in the process
  of establishing a data connection.







Greenberg & Keene [Page 22]

RFC 1037 NFILE - A File Access Protocol December 1987


  The connection-identifier informs the user of the correct identity of
  the logical port that the server has provided.  NFILE expects the
  connection-identifier to be a string.  For TCP this string is the
  port number represented in decimal.  For Chaosnet, this string is the
  contact name.  The connection-identifier is used only once; in all
  subsequent NFILE commands that need to reference either of the data
  channels that constitute this data connection, the new-input-handle
  and new-output-handle are used.
  For background information:  See the section "NFILE Control and Data
  Connections", section 4.

8.9 DELETE Command

  Command:  (DELETE tid handle pathname)
  Response: (DELETE tid)
  DELETE deletes a file on the remote file system.
  Either a handle or a pathname must be supplied, but not both.  If
  given, the handle must be a data channel handle for a data stream
  opening, or a direct file identifier for a direct access opening.
  pathname is a string in the full pathname syntax of the server host.
  See the section "Syntax of File and Directory Pathname Arguments",
  section 7.4.
  With a pathname supplied, the DELETE command causes the specified
  file to be deleted.  DELETE has different results depending on the
  operating system involved.  That is, DELETE causes soft deletion on
  TOPS-20 and LMFS, and hard deletion on UNIX and Multics.  If an
  attempt is made to delete a delete-through link on a Symbolics LMFS,
  its target is deleted instead.
  If the handle argument is supplied to DELETE, the server deletes the
  open file bound to the data channel specified by handle at close
  time.  This is true in both the output and input cases.

8.10 DIRECT-OUTPUT Command

  Command:  (DIRECT-OUTPUT tid direct-handle output-handle)
  Response: (DIRECT-OUTPUT tid)
  DIRECT-OUTPUT starts and stops output data flow for a direct access
  file opening.  DIRECT-OUTPUT explicitly controls binding and
  unbinding of an output data channel to a direct access opening.



Greenberg & Keene [Page 23]

RFC 1037 NFILE - A File Access Protocol December 1987


  direct-handle is a required argument, and output-handle is optional.
  If supplied, output-handle is a request to bind an output data
  channel (indicated by output-handle) to the direct access opening
  designated by the direct-handle.  The specified output data channel
  must be free.  The server binds the data channel and begins accepting
  data from that connection and writing it to the opening.
  If the output-handle is omitted, this is a request to unbind the
  channel and terminate the active output transfer.

8.11 DIRECTORY Command

  Command:  (DIRECTORY tid input-handle pathname control-keywords
             properties)
  Response: (DIRECTORY tid)
  DIRECTORY returns a directory listing including the identities and
  attributes for logically related groups of files, directories, and
  links.  If the command is successful, a single token list containing
  the requested information is sent over the data channel specified by
  input-handle, and the data channel is then implicitly freed by both
  sides <2>.  For details on the format of the token list:  See the
  section "NFILE DIRECTORY Data Format", section 8.11.1.
  pathname specifies the files that are to be described; it is a string
  in the full pathname syntax of the server host.  See the section
  "Syntax of File and Directory Pathname Arguments", section 7.4.
  The pathname generally contains wildcard characters, in operating-
  system-specific format, describing potential file name matches.  Most
  operating systems provide a facility that accepts such a pathname and
  returns information about all files matching this pathname.  Some
  operating systems allow wildcard (potential multiple) matches in the
  directory or device portions of the pathname; other operating systems
  do not.  There is no clear contract at this time about what is
  expected of servers on systems that do not allow wildcard matches (or
  some kinds of wild card matches), when presented with a wildcard.
  properties is a token list of keywords that are the names of
  properties.  If properties is omitted or supplied as the empty token
  list, the server sends along all properties.  If any properties are
  supplied, the user is requesting the server to send only those
  properties.




Greenberg & Keene [Page 24]

RFC 1037 NFILE - A File Access Protocol December 1987


  control-keywords ARGUMENT TO DIRECTORY
  control-keywords is a token list of keywords.  The control-keywords
  affect the way the DIRECTORY command works on the server machine.
  Although some of the options below request the server to limit (by
  some filter) the data to be returned, it is never an error if the
  server returns more information than is requested.
  The following keywords are recognized:
  DELETED
  Includes soft-deleted files in the directory list.  Without this
  option, they must not be included. Such files have the DELETED
  property indicated as true" among their properties.  DELETED is
  ignored on systems that do not support soft deletion.
  DIRECTORIES-ONLY
  This option changes the semantics of DIRECTORY fairly drastically.
  Normally, the server returns information about all files,
  directories, and links whose pathnames match the supplied pathname.
  This means that for each file, directory, or link to be listed, its
  directory name must match the potentially wildcarded) directory name
  in the supplied pathname, its file name must match the file name in
  the supplied pathname, and so on.
  When DIRECTORIES-ONLY is supplied, the server is to list only
  directories, not whose pathnames match the supplied pathname, but
  whose pathnames expressed as directory pathnames match the
  (potentially wildcarded) directory portion of the supplied pathname.
  The description of the PROBE-DIRECTORY keyword that can be supplied
  as the direction argument of the OPEN command discusses this:  See
  the section "OPEN Command", section 8.20.
  It is not yet established what servers on hosts that do not support
  this type of action natively are to do when presented with
  DIRECTORIES-ONLY and a pathname with a wildcard directory component.
  FAST Speeds up the operation and data transmission by not listing any
  properties at all for the files concerned; that is, only the
  truenames are returned.





Greenberg & Keene [Page 25]

RFC 1037 NFILE - A File Access Protocol December 1987


  NO-EXTRA-INFO
  Specifies that the server is to suppress listing those properties
  that are generally more difficult or expensive to obtain.  This
  typically eliminates listing of directory-specific properties such as
  information about default generation counts and expunge dates.
  SORTED
  This causes the directory listing to be sorted.  The sorting is done
  alphabetically by directory, then by file name, then file type, then
  file version (by increasing version number).

8.11.1 NFILE DIRECTORY Data Format

  If the NFILE DIRECTORY command completes successfully, a single token
  list containing the requested directory information is sent on the
  data channel specified by the input-handle argument in the DIRECTORY
  command.  This section describes the format of that single token
  list, and gives further detail on the properties argument to
  DIRECTORY.
  The token list is a top-level token list, so it is delimited by TOP-
  LEVEL-LIST-BEGIN and TOP-LEVEL-LIST-END.  The top-level token list
  contains embedded token lists.  The first embedded token list
  contains the empty token list followed by property/value pairs
  describing property information of the file system as a whole rather
  than of a specific file.  NFILE requires one property of the file
  system to be present: DISK-SPACE-DESCRIPTION is a string describing
  the amount of free file space available on the system.  The following
  embedded token lists contain the pathname of a file, followed by
  property/value pairs describing the properties of that file.
  The following example shows the format of the top-level token list
  returned by DIRECTORY, for two files.  It is expected that the server
  return several property/value pairs for each file; the number of
  pairs returned is not constrained.  In this example, two
  property/value pairs are returned for the file system, two pairs are
  returned for the first file, and only one pair is returned for the
  second file.
            TOP-LEVEL-LIST-BEGIN
            LIST-BEGIN       - first embedded token list starts
            LIST-BEGIN       - an empty embedded token list starts
            LIST-END         - the empty embedded token list ends
            prop1 value1     - property/value pairs of file system
            prop2 value2
            LIST-END


Greenberg & Keene [Page 26]

RFC 1037 NFILE - A File Access Protocol December 1987


            LIST-BEGIN
            pathname1        - pathname of the first file
            prop1 value1     - property/value pairs of first file
            prop2 value2
            LIST-END
            LIST-BEGIN
            pathname2        - pathname of the second file
            prop1 value1     - property/value pairs of second file
            LIST-END
            TOP-LEVEL-LIST-END
  The following example is designed to illustrate the structure of the
  top-level token list by depicting TOP-LEVEL-LIST-BEGIN and TOP-
  LEVEL-LIST-END by parentheses and LIST-BEGIN and LIST-END by squarbe
  rackets.  respectively. The indentation, blank spaces, and newlines
  in the example are not part of the token list, but are used here to
  make the structure of the token list clear.
                  ([   [ ]    prop1 value1 prop2 value2]
                   [pathname1 prop1 value1 prop2 value2]
                   [pathname2 prop1 value1])
  The pathname is a string in the full pathname syntax of the server
  host.  See the section "Syntax of File and Directory Pathname
  Arguments", section 7.4.
  For further information on file property/value pairs:  See the
  section "Format of NFILE File Property/Value Pairs", section 7.5.

8.12 DISABLE-CAPABILITIES Command

  Command:  (DISABLE-CAPABILITIES tid capability)
  Response: (DISABLE-CAPABILITIES tid cap-1 success-1
                 cap-2 success-2 cap-3 success-3 ...)
  DISABLE-CAPABILITIES causes an access capability to be disabled on
  the server machine.  capability is a string naming the capability to
  be disabled.  The meaning of the capability is dependent on the
  operating system.
  The return values cap-1, cap-2, and so on, are strings specifying
  names of capabilities.  If the capability named by cap-1 was
  successfully disabled, the corresponding success-1 is supplied as
  Boolean truth; otherwise it is the empty token list.




Greenberg & Keene [Page 27]

RFC 1037 NFILE - A File Access Protocol December 1987


  Although the user can specify only one capability to disable, it is
  conceivable that the result of disabling that particular capability
  is the disabling of other, related capabilities.  That is why the
  command response can contain information on more than one capability.

8.13 ENABLE-CAPABILITIES Command

  Command:  (ENABLE-CAPABILITIES tid capability password)}
  Response: (ENABLE-CAPABILITIES tid cap-1 success-1
             cap-2 success-2 cap-3 success-3 ...)
  ENABLE-CAPABILITIES causes an access capability to be enabled on the
  server machine.  The password argument is optional, and should be
  included only if it is needed to enable this particular capability.
  Both password and capability are strings.  The meaning of the
  capability is dependent on the operating system.
  The return values cap-1, cap-2 and so on, are strings specifying
  names of capabilities.  If the capability named by cap-1 was
  successfully enabled, the corresponding success-1 is supplied as
  Boolean truth; otherwise it is the empty token list.
  Although the user can specify only one capability to enable, it is
  conceivable that the result of enabling that particular capability is
  the enabling of other, related capabilities.  That is why the command
  response can contain information on more than one capability.

8.14 EXPUNGE Command

  Command:  (EXPUNGE tid directory-pathname)
  Response: (EXPUNGE tid server-storage-units-freed)
  EXPUNGE causes the directory specified by pathname to be expunged.
  Expunging means that any files that have been soft deleted are to be
  permanently removed.
  For file systems that do not support soft deletion, the command is to
  be ignored; a success command response is sent, but no action is
  performed on the file system.  In this case, the number-of-server-
  storage-units-freed return value should be omitted.
  directory-pathname is a required string argument in the directory
  pathname format; it must refer to a directory on the server file
  system, and not to a file.  See the section "Syntax of File and
  Directory Pathname Arguments", section 7.4.



Greenberg & Keene [Page 28]

RFC 1037 NFILE - A File Access Protocol December 1987


  The return value server-storage-units-freed is an integer specifying
  how many records, blocks, or whatever unit is used to measure file
  storage on the server host system, were recovered.  This return value
  should be omitted if the server does not know how many storage units
  were freed.
  The protocol does not define whether directory-pathname is really a
  pathname as directory or a wildcard pathname of files to be expunged.
  The protocol does not define whether or not wildcards are permitted,
  or required to be supported, in the directory portion of the pathname
  (representing an implicit request to expunge many directories).

8.15 FILEPOS Command

  Command:  (FILEPOS tid handle position resync-uid)
  Response: (FILEPOS tid)
  FILEPOS sets the file access pointer to a given position, relative to
  the beginning of the file.  FILEPOS is used to indicate the position
  of the next byte of data to be transferred.
  The handle indicates the file to be affected.  handle must be a data
  channel handle for a data stream opening, or a direct file identifier
  for a direct access opening.  Both handle and position are required
  arguments.
  position is an integer indicating to which point in the file the file
  access pointer is to be reset.  position is either a byte number
  according to the current byte size being used, or characters for
  character openings.  Position zero is the beginning of the file.  If
  this is a character opening, position is measured in server units,
  not in NFILE character set units.
  If the FILEPOS command is given on an input data channel (that is, a
  data channel currently sending data from server to user), the
  affected data channel must be resynchronized after the FILEPOS is
  accomplished, in order to identify the start of the new data.  The
  resync-uid is a unique identifier associated with the
  resynchronization of the data channel; it is unique with respect to
  this dialogue.  resync-uid must be supplied if handle is an input
  handle, but it is not supplied otherwise.  For more information on
  the resynchronization procedure:  See the section "NFILE Data
  Connection Resynchronization", section 9.2.
  In the output case, the user must somehow indicate to the server, on
  the output data channel, when there is no more data.  The user side
  sends the keyword token EOF to do so.  Upon receiving that control


Greenberg & Keene [Page 29]

RFC 1037 NFILE - A File Access Protocol December 1987


  token, the server is required to position the file pointer according
  to the position given.  When the new file position is established,
  the server resumes accepting data at the new file position.
  In most cases, using the direct access mode of transfer is more
  convenient and efficient than repeated use of FILEPOS with a data
  stream opening.
  There are problems inherent in trying to set a file position of a
  character-oriented file on a foreign host, if one machine is a
  Symbolics computer and the other is not.  For example, character set
  translation must take place.  See the section "NFILE Character Set",
  section 6.  Because of these difficulties, FILEPOS might not be
  supported in the future on character files.  FILEPOS is not
  problematic for binary files.

8.15.1 Implementation Hint for FILEPOS Command

  The server processing of this command (by the control connection
  handler) must not attempt to wait for the resynchronization procedure
  to complete.  It is possible that the user could abort between
  sending the FILEPOS command and reading for the mark and
  resynchronization identifier.  That scenario could leave the sender
  of the resynchronization identifier, on the server side, blocked for
  output indefinitely.
  Only two commands received on the control connection can break the
  data channel out of the blocked state described above:  CLOSE with
  abort-p supplied as Boolean truth, and RESYNCHRONIZE-DATA-CHANNEL.
  Therefore, the control connection must not wait for the data channel
  to finish performing the resynchronization procedure.  This wait
  should instead be performed by the process managing the data channel.

8.16 FINISH Command

  Command:  (FINISH tid handle)
  Response: (FINISH tid truename binary-p other-properties)
  FINISH closes a file and reopens it immediately with the file
  position pointer saved, thus leaving it open for further I/O.  If
  possible, the implementation should do the closing and opening in an
  indivisible operation, such that no other process can get access to
  the file.




Greenberg & Keene [Page 30]

RFC 1037 NFILE - A File Access Protocol December 1987


  The arguments, results, and their meaning are identical to those of
  the CLOSE command.  See the section "CLOSE Command", section 8.3.
  FINISH requires a handle, which has the same meaning as the handle of
  the CLOSE command.
  In the output case, for both direct mode and data stream mode of
  openings, the server writes out all buffers and sets the byte count
  of the file.  The user sends the keyword token EOF on the data
  channel, to indicate that the end of data has been reached.  The
  server leaves the file in such a state that if the system or server
  crashes anytime after the FINISH command has completed, it would
  later appear as though the file had been closed by this command.
  However, the file is not left in a closed state now; it is left open
  for further I/O operations.  FINISH is a reliability feature.
  FINISH is somewhat pointless in the input case, but valid.  The
  native Symbolics file system (LMFS) implements FINISH on an output
  file by an internal operation that effectively goes through the work
  of closing but leaves the file open for appending.
  ERRORS ON FINISH
  After writing every last bit sent by the user to disk, and before
  closing the file, the server checks the data channel specified by
  handle to see if an asynchronous error is outstanding on that
  channel.  That is, the server must determine whether it has sent an
  asynchronous error to the user, to which the user has not yet
  responded with a CONTINUE command.  If so, the server is unable to
  finish the file, and it must send a command error response response,
  indicating that an error is pending on the channel.  The appropriate
  three-letter error code is EPC.  See the section "NFILE Errors and
  Notifications", section 10.

8.17 HOME-DIRECTORY Command

  Command:  (HOME-DIRECTORY tid user)
  Response: (HOME-DIRECTORY tid directory-pathname)
  HOME-DIRECTORY returns the full pathname of the home directory on the
  server machine for the given user.
  user is a string that should be recognizable as a user's login name
  on the server operating system.  directory-pathname is a string in
  the directory pathname format.  See the section "Syntax of File and
  Directory Pathname Arguments", section 7.4.



Greenberg & Keene [Page 31]

RFC 1037 NFILE - A File Access Protocol December 1987


8.18 LOGIN Command

  Command:  (LOGIN tid user password FILE-SYSTEM USER-VERSION)
  Response: (LOGIN tid keyword/value-pairs)
  LOGIN logs the given user in to the server machine, using the
  password if necessary.  Both user and password are string arguments;
  user is required, password is optional.  An omitted password is valid
  if the host allows the specified user to log in without a password.
  Depending on the operating system and server, it might be necessary
  to log in to run a program (in this case the NFILE server program) on
  the host.  LOGIN establishes a user identity that is used by the
  operating system to establish the file author and determine file
  access rights during the current session.
  The server has the option to reject with an error any command except
  LOGIN if a successful LOGIN command has not been performed.  This is
  recommended.  Many operating systems perform the login function in a
  different process and/or environment than user programs.  The portion
  of the NFILE server running in the special login environment could
  conceivably be capable only of processing the LOGIN command; this is
  the reason for having the LOGIN command in NFILE.
  FILE-SYSTEM and USER-VERSION are optional keyword/value pairs.  The
  FILE-SYSTEM keyword/value pair selects the identity of the file
  system to which all following commands in this session are to be
  directed.  This argument has meaning only if the server host machine
  has multiple file systems, and the targeted file system is other than
  the default file system that a user would get by initiating a
  dialogue with that host.  The FILE-SYSTEM argument is an arbitrary
  token list.  If the server does not recognize it, the server gives an
  appropriate command error response.
  Currently, the only use of FILE-SYSTEM is for Symbolics servers to
  select one of the front-end processor hosts instead of the LMFS,
  which is the default.  In this case, the first element in the token
  list is the keyword FEP, and the second element in the token list is
  an integer, indicating the desired FEP disk unit number.  If the
  server discovers there is no such file system, the server gives a
  command error response including the three-letter code NFS, meaning
  "no file system".  See the section "NFILE Errors and Notifications",
  section 10.





Greenberg & Keene [Page 32]

RFC 1037 NFILE - A File Access Protocol December 1987


  The user tells the server what version of NFILE it is running by
  including the optional USER-VERSION keyword/value pair.  The value
  associated with USER-VERSION can be a string, an integer, or a token
  list.  This document describes NFILE user version 2 and server
  version 2.
  Upon receiving the representation of the user version, the server can
  either adjust certain parameters to handle this particular version,
  or simply ignore the user version altogether.  Currently, the only
  released versions of NFILE are user version 2 and server version 2.
  LOGIN RETURN VALUES:  keyword/value-pairs
  The keyword/value-pairs is a token list composed of keywords followed
  by their values.  The server includes any or all of the following
  keywords and their values; they are all optional.  The following
  keywords are recognized:
  NAME
  The value associated with NAME is a string specifying the user
  identity, in the server host's terms.
  PERSONAL-NAME
  The value associated with PERSONAL-NAME is a string representing the
  user's personal name, last name first.  For example:  "McGillicuddy,
  Aloysius X.".
  HOMEDIR-PATHNAME
  The value associated with HOMEDIR-PATHNAME is a string in the
  pathname as directory format, indicating the home directory of the
  user.  See the section "Syntax of File and Directory Pathname
  Arguments", section 7.4.
  GROUP-AFFILIATION
  The value associated with GROUP-AFFILIATION is a string specifying
  the group to which the user belongs, when this concept is
  appropriate.
  SERVER-VERSION
  The value associated with SERVER-VERSION can be a string, an integer,
  or a token list.  The value is a representation of the version of the
  server is running.  Upon receiving the server version, the user can:
  adjust certain parameters to handle this particular version; accept


Greenberg & Keene [Page 33]

RFC 1037 NFILE - A File Access Protocol December 1987


  the version; or close the connection.  Currently, the only released
  versions of NFILE are user version 2 and server version 2.
  PROPERTY-INDEX-TABLE
  The value associated with PROPERTY-INDEX-TABLE is a token list of
  keywords.  This return value enables the server to inform the user
  which file properties are meaningful on its file system.  The
  keywords in PROPERTY-INDEX-TABLE can be used by the DIRECTORY command
  (a user request for information on file properties of a specified
  directory or directories).  The server can specify a certain property
  by giving an integer that is the index of that file property into the
  PROPERTY-INDEX-TABLE.  This reduces the volume of data sent during
  directory listings.  The first element in PROPERTY-INDEX-TABLE is
  indexed by the number 0.  See the section "DIRECTORY Command",
  section 8.11.

8.19 MULTIPLE-FILE-PLISTS Command

  Command:  (MULTIPLE-FILE-PLISTS tid input-handle paths
             characters properties)
  Response: (MULTIPLE-FILE-PLISTS tid)
  MULTIPLE-FILE-PLISTS returns file property information of one or more
  files.  The server sends the information in a data structure (the
  format is described later in this section) on the given input-handle.
  paths is an embedded token list composed of the pathnames in which
  the user is interested.  Each pathname in this list is a string in
  the full pathname syntax of the server host.  Unlike for the
  DIRECTORY command, wildcards are not allowed in these pathnames.  See
  the section "Syntax of File and Directory Pathname Arguments",
  section 7.4.
  characters is either Boolean truth (indicating that each file is a
  character file), the empty token list (each file is a binary file),
  or the keyword DEFAULT.  DEFAULT indicates that the server itself is
  to figure out whether a file is a character or binary file.  For more
  information on the meaning of the DEFAULT keyword:  See the section
  "OPEN Command", section 8.20.  The value of characters can influence
  some servers' idea of a file's length.
  properties is a token list of keywords indicating which properties
  the user wants returned.  The server is always free to return more
  properties than those requested in the properties argument.  If
  properties is supplied as the empty token list, the server should
  transmit all known properties on the files.



Greenberg & Keene [Page 34]

RFC 1037 NFILE - A File Access Protocol December 1987


  The server transmits as much of the requested information as possible
  on the given input-handle.  The information is contained in a top-
  level token list of elements.  Each element corresponds with a
  supplied pathname; the order of the original pathlist must be
  retained in the returned token list.  An element is an empty token
  list if the corresponding file or any of its containing directories
  does not exist.  The elements that correspond to successfully located
  files are lists composed of truename followed by any properties.
  properties are keyword/value pairs.  truename is a string in the full
  pathname syntax of the server host.
  The following example shows TOP-LEVEL-LIST-BEGIN and TOP-LEVEL-LIST-
  END as parentheses, and LIST-BEGIN and LIST-END with square brackets.
  For example, the user supplied a pathlist argument resembling:
                           [file1 file2 file3]
  The server could not locate file1 or file3, but did locate file2, and
  found the length and author of file2.  The top-level token list
  transmitted by the server is:
       ( [] [ truename-of-file2 LENGTH 381 AUTHOR williams ] [] )
  For further detail on how file properties and values are expressed:
  See the section "Format of NFILE File Property/Value Pairs", section
  7.5.

8.20 OPEN Command

  Command:  (OPEN tid handle pathname direction binary-p
               TEMPORARY RAW SUPER-IMAGE DELETED PRESERVE-DATES
               SUBMIT DIRECT-FILE-ID ESTIMATED-LENGTH BYTE-SIZE
               IF-EXISTS IF-DOES-NOT-EXIST)
  Response: (OPEN tid truename binary-p other-properties)
  OPEN opens a file for reading, writing, or direct access at the
  server host.  That means, in general, asking the host file system to
  access the file and obtaining a file number, pointer, or other
  quantity for subsequent rapid access to the file; this is called an
  "opening".  See the section "NFILE File Opening Modes", section 5.
  The OPEN command has the most complicated syntax of any NFILE
  command.  The OPEN command has required arguments, an optional
  argument, and many optional keyword/value pairs.  For details on the
  syntax of each of these parts of the OPEN command:  See the section
  "Conventions Used in This Document", section 7.


Greenberg & Keene [Page 35]

RFC 1037 NFILE - A File Access Protocol December 1987


  The following arguments are required:  pathname, direction, and
  binary-p.  handle is an optional argument, which must either be
  supplied or explicitly omitted by means of substituting in its place
  the empty token list.
  The OPEN command has many optional keyword/value pairs, which encode
  conceptual arguments to the server file system for the OPEN
  operation.  A detailed description of all the supported OPEN optional
  keywords is given below.
  The OPEN return values reflect information about the file opened,
  when the opening is successful.  In the case of a probe-type opening,
  this information is returned when the given file (or link, or
  directory) exists and is accessible, even though the file (or link,
  or directory) is not actually opened.  For detail on the OPEN return
  values: See the section "NFILE OPEN Response Return Values", section
  8.20.2.
  THE pathname OPEN ARGUMENT
  The pathname is a required argument specifying the file to be opened.
  pathname is a string in the full pathname syntax of the server host.
  See the section "Syntax of File and Directory Pathname Arguments",
  section 7.4.
  For some purposes (for example, when the OPEN argument direction is
  supplied as PROBE-DIRECTORY), only the directory specified by this
  pathname is utilized.  See the section "NFILE OPEN Optional
  Keyword/Value Pairs", section 8.20.1.
  THE handle OPEN ARGUMENT
  The handle argument of the OPEN command specifies a data channel to
  be used for the transfer.  Subsequent commands in this session use
  the same handle to specify this opening.  It is the user side's
  responsibility to ensure that handle refers to an existing and free
  data channel that does not require resynchronization before use.  A
  handle must be supplied, unless a probe-type opening is desired (that
  is, the direction is supplied as PROBE, PROBE-DIRECTORY, or PROBE-
  LINK) or a direct access opening is being requested (that is, a
  DIRECT-FILE-ID is supplied).  In those cases, the empty token list is
  supplied for handle.
  THE direction OPEN ARGUMENT
  The direction argument must be supplied as one of these keywords:
  INPUT, OUTPUT, IO, PROBE, PROBE-DIRECTORY, and PROBE-LINK.  The
  meanings of the direction keywords are as follows:


Greenberg & Keene [Page 36]

RFC 1037 NFILE - A File Access Protocol December 1987


  INPUT
     Specifies that the file is to be opened for input server-to-user
     transfer).  To request a direct access opening, supply a value for
     DIRECT-FILE-ID. If no DIRECT-FILE-ID is supplied, the opening is a
     data stream opening.
  OUTPUT
     Specifies that the file is to be opened for output user-to-server
     transfer).  To request a direct access opening, supply a value for
     DIRECT-FILE-ID. If no DIRECT-FILE-ID is supplied, the opening is a
     data stream opening.
  IO
     Specifies that interspersed input and output will be performed on
     the file.  This is only meaningful in direct access mode.  A
     DIRECT-FILE-ID must also be supplied.  See the section "NFILE OPEN
     Optional Keyword/Value Pairs", section 8.20.1.
  If direction is supplied as PROBE, PROBE-LINK, or PROBE-DIRECTORY,
  the opening is said to be a probe-type opening.  The DIRECT-FILE-ID
  option is meaningless and an error for probe-type openings.  The file
  handle must be supplied as an empty token list for probe-type
  openings.
  PROBE
     Specifies that the file is not to be opened at all, but simply
     checked for existence.  If the file does not exist or is not
     accessible, the error indications and actions are identical to
     those that would be given for an INPUT opening.  If the file does
     exist, the successful command response contains the same
     information as it would have if the file had been opened for
     INPUT.  If it is a link, the link is followed to its target.
  PROBE-LINK
     Like PROBE, with one difference.  PROBE-LINK specifies that if the
     pathname is found to refer to a link, that link is not to be
     followed, and information about the link itself is to be returned.





Greenberg & Keene [Page 37]

RFC 1037 NFILE - A File Access Protocol December 1987


  PROBE-DIRECTORY
     PROBE-DIRECTORY requests information about the directory
     designated by the pathname argument.  In the PROBE-DIRECTORY case,
     the pathname argument refers to the directory on which information
     is requested.  In all other cases, the pathname refers to a file
     to be opened.  If pathname contains a file name and file type,
     these parts of the pathname are ignored for PROBE-DIRECTORY
     openings as long as they are syntactically valid.
  THE binary-p OPEN ARGUMENT
  The value of binary-p affects the mode in which the server opens the
  file, as well as informing it whether or not character set
  translation must be performed.
  If binary-p is supplied as the empty token list, the opening is said
  to be a character opening.  The server performs character set
  translation between its native character set and the NFILE character
  set.  The data is transferred over the data connection one character
  per eight-bit byte.  See the section "NFILE Character Set", section
  6.
  If binary-p is supplied as Boolean truth, the opening is said to be a
  binary opening.  The user side supplies the byte size via the BYTE-
  SIZE option; if not supplied, the default byte size is 16 bits.  If
  byte size is less than 9, the file data is transferred byte by byte.
  If the byte size is 9 or greater, the server transfers each byte of
  the file as two eight-bit bytes, low-order first.
  binary-p can also be supplied as the keyword DEFAULT.  DEFAULT
  specifies that the server itself is to determine whether to transfer
  binary or character data.  DEFAULT is meaningful only for input
  openings; it is an error for OUTPUT, IO, or probe-type openings.  For
  file systems that maintain the innate binary or character nature of a
  file, the server simply asks the file system which case is in force
  for the file specified by pathname.
  When binary-p is supplied as DEFAULT, on file systems that do not
  maintain thisinformation, the server is required to perform a
  heuristic check for Symbolicsobject fileson the first two 16-bit
  bytes of the file.  If the file isdetermined to be aSymbolics object
  file, the server performs a BINARY openingwith BYTE-SIZE of16;
  otherwise, it performs a CHARACTER opening.




Greenberg & Keene [Page 38]

RFC 1037 NFILE - A File Access Protocol December 1987


  The details of the check are as follows: if the first 16-bit byte is
  the octal number170023 and the second 16-bit byte is any number
  between 0 and 77 octal(inclusive), the file is recognized as a
  Symbolics object file.  In any othercase, it is not.

8.20.1 NFILE OPEN Optional Keyword/Value Pairs

  The OPEN command has many optional keyword/value pairs that encode
  conceptual arguments to the file system for the OPEN operation.
  The following options are used often:
  BYTE-SIZE
     Must be followed by an integer between 1 and 16, inclusive, or the
     empty token list.  BYTE-SIZE is meaningful only for binary
     openings.  BYTE-SIZE can be ignored for probe-type openings.  It
     can be omitted entirely for character openings, but if supplied,
     must be followed by the empty token list.  If binary-p is supplied
     as DEFAULT, BYTE-SIZE can be omitted entirely, or followed by the
     empty token list.
     If a binary opening is requested and BYTE-SIZE is not supplied,
     the assumed value is 16 for output openings. For input binary
     openings, the default is the host file system's stored conception
     of the file's byte size (for those hosts that natively support
     byte size).  For file systems that do not natively support
     natively byte size, the default byte-size on binary input is 16.
     For file systems that maintain the innate byte-size of each file,
     the server should supply this number to the appropriate operating
     system interface that performs the semantics of opening the file.
     For other operating systems, a file written with a given byte size
     must produce the same bytes in the same order when read with that
     byte size.  In this case, the server or host operating system can
     choose any packing scheme that complies with this rule.
     Operating systems that do not support byte size must ensure that
     binary files written from user ends of the current protocol can be
     read back correctly.  However, the server can choose packing
     schemes that allow all bits of the server host's word to be
     accessed and concur with other packing schemes used by native host
     software.
     For example, Multics supports 36 bit words and 9 bit bytes.  A
     packing scheme appropriate for a Multics NFILE server is:



Greenberg & Keene [Page 39]

RFC 1037 NFILE - A File Access Protocol December 1987


              Byte Size                Packing Scheme
              7, 8, or 9 bits          four per 36-bit word
              10, 11, or 12 bits       three per 36-bit word
              13, 14, 15, or 16 bits   two per 36-bit word
     In the first packing scheme in the table, native Multics
     character-oriented software can access each logical byte
     sequentially.  In the last packing scheme, each Symbolics byte is
     in a halfword, easily accessible and visible in an octal
     representation.  To achieve maximum data transfer rate and access
     all bits of a Multics word, a byte size of 12 must be specified.
  DELETED
     If supplied as Boolean truth, DELETED specifies that deleted"
     files are to be treated as though they were not "deleted".
     DELETED is meaningful only for operating systems that support
     "soft deletion" and subsequent "undeletion" of files.  Other
     operating systems must ignore this option.  Normally, deleted
     files are not visible to the OPEN operation; this option makes
     them visible.
     DELETED can also be followed by the empty token list, which has
     the same effect as omitting the DELETED keyword/value pair
     entirely.  For output openings, DELETED is meaningless and an
     error if supplied.
  DIRECT-FILE-ID
     If supplied, the DIRECT-FILE-ID indicates that the opening is to
     be a direct access mode opening.  If not supplied, the opening is
     a data stream opening.  The value of DIRECT-FILE-ID is a string
     generated by the user, that has not been used as a DIRECT-FILE-ID
     in this dialogue, and does not designate any data channel.  The
     DIRECT-FILE-ID is a unique identifier for the direct access
     opening.  It is used for all operations that identify an opening
     rather than a data channel.  The DIRECT-FILE-ID is used to
     identify a direct access opening, just as a file handle is used to
     identify a data stream opening.  The PROPERTIES, CLOSE, and RENAME
     commands use the DIRECT-FILE-ID in this way.  There are only two
     NFILE commands applicable to direct access openings (ABORT and
     CONTINUE) that do not use the DIRECT-FILE-ID, but use a data
     channel handle instead.
  PRESERVE-DATES
     If supplied as Boolean truth, PRESERVE-DATES specifies that the


Greenberg & Keene [Page 40]

RFC 1037 NFILE - A File Access Protocol December 1987


     server is to attempt to prevent the operating system from updating
     the "reference date" or date-time used" of the file.  This is
     meaningful only for input openings, and is an error otherwise.
     The Symbolics operating system invokes this option for operations
     such as View File in the editor, where it wishes to assert that
     the user did not "read" the file, but just "looked at it".
     Servers on operating systems that do not support reference dates
     or users revising or suppressing update of the reference dates
     must ignore this option.
  ESTIMATED-LENGTH
     The value of ESTIMATED-LENGTH is an integer estimating the length
     of the file to be transferred. This option is meaningful and
     permitted only for output openings.  ESTIMATED-LENGTH enables the
     user end to suggest to the server's file system how long the file
     is going to be.  This can be useful for file systems that must
     preallocate files or file maps or that accrue performance benefits
     from knowing this information at nthe time the file is first
     opened.  This estimate, if supplied, is not required to be exact.
     It is ignored by servers to which it is not useful or interesting.
     The units of the estimate are characters for character openings,
     and bytes of the agreed-upon byte size for binary openings.  The
     character units should be server units, if possible, but since
     this is only an estimate, NFILE character units are acceptable.
     See the section "NFILE Character Set", section 6.
  IF-EXISTS
     Meaningful only for output openings, ignored otherwise, but not
     diagnosed as an error.  The value of IF-EXISTS is a keyword that
     specifies the action to Be taken if a file of the given name
     already exists.  The semantics of the values are derived from the
     Common Lisp specification and repeated here for completeness.  If
     the file does not already exist, the IF-EXISTS option and its
     value are ignored.
     If the user side does not give the IF-EXISTS option, The action to
     be taken if a file of the given name already exists depends on
     whether or not the file system supports file versions.  If it
     does, the default is ERROR (if an explicit version is given in the
     file pathname) or NEW-VERSION (if the version in the file pathname
     is the newest version).  For file systems not supporting versions,
     the default is SUPERSEDE.  These actions are described below.




Greenberg & Keene [Page 41]

RFC 1037 NFILE - A File Access Protocol December 1987


     IF-EXISTS provides the mechanism for overwriting or appending to
     files.  With the default setting of IF-EXISTS, new files are
     created by every output opening.
     Operating systems supporting soft deletion can take different
     actions if a "deleted" file already exists with the same name (and
     type and version, where appropriate) as a file to be created.  The
     Symbolics file system (LMFS) effectively uses SUPERSEDE, even if
     not asked to do so.  Other servers and file systems are urged to
     do similarly.  Recommended action is to not allow deleted files to
     prevent successful file creation (with specific version number)
     even if an IF-EXISTS option weaker than SUPERSEDE, RENAME, or
     RENAME-AND-DELETE is specified or implied.
     Here are the possible values and their meanings:
     ERROR
        Reports an error.
     NEW-VERSION
        Creates a new file with the same file name but with a larger
        version number.  This is the default when the version component
        of the filename is newest.  File systems without version
        numbers can implement this by effectively treating it as
        SUPERSEDE.
     RENAME
        Renames the existing file to some other name and then creates a
        new file with the specified name.  On most file systems, this
        renaming happens at the time of a successful close.
     RENAME-AND-DELETE
        Renames the existing file to some other name and then deletes
        it (but does not expunge it, on those systems that distinguish
        deletion from expunging).  Then it creates a new file with the
        specified name.  On most file systems, this renaming happens at
        the time of a successful close.
     OVERWRITE
        Output operations on the opening destructively modify the
        existing file.  New data replaces old data at the beginning of
        the file; however, the file is not truncated to length zero
        upon opening.


Greenberg & Keene [Page 42]

RFC 1037 NFILE - A File Access Protocol December 1987


     TRUNCATE
        Output operations on the opening destructively modify the
        existing file.  The file pointer is initially positioned at the
        beginning of the file; at that time, TRUNCATE truncates the
        file to length zero and frees disk storage occupied by it.
     APPEND
        Output operations on the opening destructively modify the
        existing file.  New data is placed at the current end of the
        file.
     SUPERSEDE
        Supersedes the existing file.  This means that the old file is
        removed or deleted and expunged.  The new file takes its place.
        If possible, the file system does not destroy the old file
        until the new file is closed, against the possibility that the
        file will be close-aborted.  This differs from NEW-VERSION in
        that SUPERSEDE creates a new file with the same name as the old
        one, rather than a file name with a higher version number.
        There are currently no standards on what a server can do if it
        cannot implement some of these actions.
  IF-DOES-NOT-EXIST
     Meaningful for input openings, never meaningful for probe-type
     openings, and sometimes meaningful for output openings.  IF-DOES-
     NOT-EXIST takes a value token, which specifies the action to be
     taken if the file does not already exist.  Like IF-EXISTS, it is a
     derivative of Common Lisp.  The default is as follows: If this is
     a probe-type opening or read opening, or if the IF-EXISTS option
     is specified as OVERWRITE, TRUNCATE, or APPEND, the default is
     ERROR.  Otherwise, the default is CREATE.
     These are the values for IF-DOES-NOT-EXIST:
     ERROR
        Reports an error.
     CREATE
        Creates an empty file with the specified name and then proceeds
        as if it already existed.



Greenberg & Keene [Page 43]

RFC 1037 NFILE - A File Access Protocol December 1987


  The following optional keyword/value pairs are rarely used, if ever:
  RAW
     If supplied as Boolean truth, RAW specifies that character set
     translation is not to be performed, but that characters are to be
     transferred intact, without inspection.  This option is meaningful
     only for character openings; it is an error otherwise.  It is also
     an error to supply RAW as Boolean truth for probe-type openings.
     RAW can also be followed by the empty token list, which has the
     same effect as if the RAW keyword/value pair were omitted
     entirely.  See the section "RAW Translation Mode", Appendix B.
  SUPER-IMAGE
     If supplied as Boolean truth, SUPER-IMAGE specifies that Rubout
     quoting is not to be performed.  This operation is meaningful only
     for character openings; it is an error otherwise.  It is also an
     error for probe-type openings.  SUPER-IMAGE can also be followed
     by the empty token list, which has the same effect as if the
     SUPER-IMAGE keyword/value pair were omitted entirely.
     SUPER-IMAGE mode causes the server to read or write character
     files where ASCII Rubout characters are a significant part of the
     file content, not where they are an escape for this protocol.
     However, other translations must still be performed:  See the
     section SUPER-IMAGE Translation Mode", Appendix C.
  TEMPORARY
     Used by the TOPS-20 server only.  TEMPORARY says to use GJ%TMP in
     the GTJFN.  This is useful mainly when writing files, and
     indicates that the foreign operating system is to treat the file
     as temporary.  See TOPS-20 documentation for more about the
     implications of this option.  Other servers can ignore it.  This
     option is meaningless and an error for input or probe-type
     openings.  TEMPORARY can also be followed by the empty token list,
     which has the same effect as if the TEMPORARY keyword/value pair
     were omitted entirely.
  SUBMIT
     SUBMIT is meaningful for output only.  If supplied as Boolean
     truth, SUBMIT causes the server to submit the contents of the file
     being written to the operating system as a job, after the file is
     closed.  VMS is an example of an operating system that could
     conveniently support SUBMIT.  SUBMIT can also be followed by the
     empty token list, which has the same effect as if the SUBMIT


Greenberg & Keene [Page 44]

RFC 1037 NFILE - A File Access Protocol December 1987


     keyword/value pair were omitted entirely.  Servers that do not
     implement this option should give an error response if requested
     to submit a file to the operating system.

8.20.2 NFILE OPEN Response Return Values

  The results of a successful OPEN operation are reported in the
  command response.  Here is the specification of the OPEN response
  format:
  Response Format:
     (OPEN tid truename binary-p other-properties)
  The return values for OPEN and CLOSE are syntactically identical, but
  the values can change in the time interval between open and close.
  truename is a string representing the pathname of the file in the
  full pathname syntax of the server host.  It should be determined by
  the server once it has opened the file, via some request to its
  operating system.  The request can be of the form:  "What file
  corresponds to this JFN, file number, pointer, etc.?"  If the
  operating system supports version numbers, this string always
  contains an explicit version number.  It always contains a directory
  name, a file name, and so on.
  Some operating systems might not know the truename of an output file
  until it is closed.  It is permissible not to supply an explicit
  version number in the pathname in the OPEN response in this specific
  case.  On these systems the truename when the file is opened is
  different than the truename after it has been closed.
  The return value binary-p indicates whether the opening is a binary
  or character opening.  For binary openings, binary-p is supplied as
  Boolean truth; for character openings it is the empty token list.
  other-properties is a list of keyword/value pairs.  other-properties
  must contain CREATION-DATE and LENGTH.  AUTHOR should be included if
  the server operating system has a convenient mechanism for
  determining the author of the sfile.  The other properties described
  here can be included if desired.
  AUTHOR
  The value of AUTHOR is a string representing the name of the author
  of the file.  This is some kind of user identifier, whose format is
  system-specific.  As with CREATION-DATE (see below), AUTHOR is
  supposed to represent the logical determinor of the current data


Greenberg & Keene [Page 45]

RFC 1037 NFILE - A File Access Protocol December 1987


  content of the file, not necessarily the agency that actually created
  the file.
  BYTE-SIZE
  The byte-size agreed upon via the rules described for the BYTE-SIZE
  option.  The value of BYTE-SIZE is an integer.  For details on the
  ramifications of BYTE-SIZE:  See the section "NFILE OPEN Optional
  Keyword/Value Pairs", section 8.20.1.  This parameter is only
  meaningful for BINARY openings.  However, if FILEPOS is returned in
  the other-properties list, BYTE-SIZE should also be included, even
  for character openings.
  CREATION-DATE
  The creation date of the file.  The date is expressed in Universal
  Time format, which measures a time as the number of seconds since
  January 1, 1900, at midnight GMT.  Creation date does not necessarily
  mean the time the file system created the directory entry or records
  of the file.  For systems that support modification or appending to
  files, it is usually the modification date of the file.  Creation
  date can mean the date that the bit count or byte count of the file
  was set by an application program.
  Some types of file systems support a user-settable quantity
  (CREATION-DATE) which the user can set to an arbitrary time, to
  indicate that the contents of this file were written a long time ago
  by someone else on another computer.  The default value of this
  quantity, if the user has not set it, is the time someone last
  modified the information in the file.  This quantity, in the OPEN
  response for an output file, is disregarded by the user side, but
  nevertheless must be present.
  The Symbolics computer system software uses this quantity as a unique
  identifier of file contents, for a given file name, type, and
  version, to prove that a file has not changed since it last recorded
  this quantity for a file.
  FILEPOS
  An integer giving the position of the logical file pointer, in
  characters or bytes as appropriate for the type of opening.  This is
  always zero for an input opening and for an output opening creating a
  new file.  For an output opening appending to an existing file,
  FILEPOS is the number of characters or bytes, as appropriate,
  currently in the file.  This number, for character openings, is
  measured in server units: See the section "NFILE Character Set",
  section 6.


Greenberg & Keene [Page 46]

RFC 1037 NFILE - A File Access Protocol December 1987


  LENGTH
  An integer reporting the length of the file, in characters for
  character openings and in bytes of the agreed-upon size for binary
  openings.  LENGTH should be reported as zero for output openings,
  even if appending to an existing file.  The server usually only knows
  the length for a character opening in server units; thus, it reports
  length in server units.

8.21 PROPERTIES Command

  Command:  (PROPERTIES tid handle pathname control-keywords
  properties)
  Response: (PROPERTIES tid property-element settable-properties)
  PROPERTIES requests the property information about one file.  The
  file is identified by the pathname argument or the handle argument,
  but not both.  If pathname is supplied, it is a string in the full
  pathname syntax of the server host.  See the section "Syntax of File
  and Directory Pathname Arguments", section 7.4.
  If handle is supplied, its value is a string identifying an opening,
  which implicitly identifies a file.  For direct access mode openings,
  handle must be a direct file identifier.
  control-keywords is reserved in the current design.  However, it is a
  required argument, and must be supplied as the empty token list.  Its
  presence in the NFILE specification allows for future expansion.  In
  the future the value of control-keywords might affect the listing
  mode.
  properties is a token list of keywords indicating the properties the
  user wants returned.  (In command arguments, properties cannot be
  specified with integers, such as indices into the Property Index
  Table).  For a list of keywords associated with file properties:  See
  the section "Format of NFILE File Property/Value Pairs", section 7.5.
  The server is always free to return more properties than those
  requested in the properties argument.  If properties is supplied as
  the empty token list, the server transmits all known properties of
  the file.





Greenberg & Keene [Page 47]

RFC 1037 NFILE - A File Access Protocol December 1987


  PROPERTIES COMMAND RESPONSE
  The server returns the property information for the given file in the
  command response.  The PROPERTIES command does not use any data
  channels.  If the specified file does not exist or is not accessible,
  the server signals an error and includes an appropriate three-letter
  error code in the command error response.  See the section "NFILE
  Errors and Notifications", section 10.
  The return value property-element is a token list.  The first element
  in that token list is the pathname of the file, in the full pathname
  syntax of the server host.  The following elements of the property-
  element token list are property/value pairs.  The server is expected
  to return several property/value pairs; the number of pairs is not
  constrained.  For further details on file properties and their
  associated values:  See the section "Format of NFILE File
  Property/Value Pairs", section 7.5.
  The return value settable-properties is a token list of keywords.
  The number of keywords is not constrained.  (Note that integers
  cannot be used in settable-properties to indicate the file property;
  keywords are to be used instead.)  Each keyword supplied in
  settable-properties identifies a property considered settable by the
  server.  The server is implicitly guaranteeing a mechanism for
  changing the properties reported as settable.  The user can change
  any of the settable properties for this file by using the CHANGE-
  PROPERTIES command.  See the section "CHANGE-PROPERTIES Command",
  section 8.2.
  The following example shows the format of the PROPERTIES command
  response.  Remember that the number of property/value pairs and
  keywords is not constrained; this example has two property/value
  pairs and three settable-properties keywords returned:










Greenberg & Keene [Page 48]

RFC 1037 NFILE - A File Access Protocol December 1987


            TOP-LEVEL-LIST-BEGIN
            PROPERTIES         - name of the command
            tid                - transaction identifier
            LIST-BEGIN
            pathname of file
            prop1 value1       - file's property/value pairs
            prop2 value2
            LIST-END
            LIST-BEGIN
            keyword-1          - file's settable properties
            keyword-2
            keyword-3
            LIST-END
            TOP-LEVEL-LIST-END
  The following example is designed to better show the structure of the
  top-level token list by depicting TOP-LEVEL-LIST-BEGIN and TOP-
  LEVEL-LIST-END by parentheses and LIST-BEGIN and LIST-END by square
  brackets.  The indentation and newlines in the example are not part
  of the token list, but are used here to make the structure of the
  token list clear.
            (PROPERTIES tid [ pathname prop1 value1 prop2 value2 ...]
                            [ keyword1 keyword2 keyword3 ... ]

8.22 READ Command

  Command: (READ tid direct-file-id input-handle count FILEPOS)
  Response: (READ tid)
  READ requests input data flow for direct access openings.  The
  direct-file-id is the same as the DIRECT-FILE-ID argument that was
  given when opening the file; it designates the opening from which the
  characters or bytes are to be transferred.  The input-handle
  specifies which data channel should be used for the transfer of data
  from server to user.  The data channel should have been already
  established, cannot have been disestablished, and must not currently
  be in use.
  count is an integer specifying how many bytes (or NFILE characters,
  as appropriate) to read.  count can be supplied as the empty token
  list, meaning read to the end of the file.  If the user specifies the
  empty token list or a count greater than the number of bytes
  remaining in the file, the server sends the keyword EOF to mark the
  end of the file.



Greenberg & Keene [Page 49]

RFC 1037 NFILE - A File Access Protocol December 1987


  FILEPOS is an optional keyword/value pair.  If the keyword FILEPOS is
  supplied, it must be followed by an integer.  Before data is
  transferred, the opening is positioned to the point specified by the
  value of FILEPOS.  The position of the point is measured in server
  units for character openings; for binary openings it is measured in
  binary bytes.  See the section "FILEPOS NFILE Command".
  Upon receiving the READ command, the server binds the data channel to
  the opening and immediately begins transferring data.  The server
  stops when all data has been transferred.  After the server sends the
  last requested byte, it unbinds the data channel, freeing it for
  other use.  When the user side has processed the last byte, the user
  side assumes that the data channel can now be reused for another data
  transfer.

8.23 RENAME Command

  Command:  (RENAME tid handle pathname to-pathname)
  Response: (RENAME tid from-pathname to-pathname)
  RENAME requests the server to give a file a new name.  This is
  NFILE's interface to the system's native rename operation, with all
  of its system-specific semantics and constraints.
  Either a handle or a pathname (but not both) specifies the file that
  is to receive a new name.  The argument to-pathname designates that
  new name.  The return value from-pathname gives the full original
  name of the file, and to-pathname gives the full new name of the
  file.  For systems that support version numbers, the return values
  can differ in version number from the values of the arguments given
  to RENAME.
  The arguments pathname and to-pathname and the return values from-
  pathname and to-pathname are strings in the full pathname syntax of
  the server host.  See the section "Syntax of File and Directory
  Pathname Arguments", section 7.4.
  If the file to be renamed is specified by a pathname, the file should
  be renamed immediately.  If the file is specified by handle, it is
  acceptable to wait until close-time to rename the file.
  Some operating systems can rename only within a directory.
  Nevertheless, the to-pathname of the RENAME must be fully specified;
  the server on these systems must check for and reject an attempted
  cross-directory rename.



Greenberg & Keene [Page 50]

RFC 1037 NFILE - A File Access Protocol December 1987


8.24 RESYNCHRONIZE-DATA-CHANNEL Command

  The command and response format for this command varies, depending on
  whether the handle argument indicates an input or output data
  channel.
  For an Input Handle:
  Command:  (RESYNCHRONIZE-DATA-CHANNEL tid handle)
  Response: (RESYNCHRONIZE-DATA-CHANNEL tid identifier)
  For an Output Handle:
  Command:  (RESYNCHRONIZE-DATA-CHANNEL tid handle identifier)
  Response: (RESYNCHRONIZE-DATA-CHANNEL tid)
  RESYNCHRONIZE-DATA-CHANNEL begins a prescribed procedure between user
  and server over the unsafe data channel specified by handle.  The
  resynchronization procedure clears the data channel of any unwanted
  data, and restores the data channel to a safe state, ready to
  transfer data again.
  All arguments to RESYNCHRONIZE-DATA-CHANNEL are required.
  For a detailed description of how the user and server coordinate the
  resynchronization of data channels:  See the section "NFILE Data
  Connection Resynchronization", section 9.2.

8.24.1 Implementation Hints for RESYNCHRONIZE-DATA-CHANNEL Command

  In general, both the user and server should should be implemented
  with the knowledge that a transmission can be aborted.  That is, the
  receiving side must be careful not to act upon a transmission (that
  is, to perform any action or side effect) until the transmission has
  been successfully received in entirety.  This protects the user
  program from the possibility that an abort can occur after a
  transmission has been partially sent.







Greenberg & Keene [Page 51]

RFC 1037 NFILE - A File Access Protocol December 1987


  RESYNCHRONIZING AN OUTPUT DATA CHANNEL
  The server will probably want to dispatch the looping and reading to
  the logical data process.  Looping reading for the resynchronization
  identifier in the control connection handler is not a viable option.
  If the user side fails to send the resynchronization identifier (for
  example, due to a user abort) the control connection handler can
  never be broken out of this loop.
  Should the user side send the control connection handler command
  first, or send the marks and identifiers first?
  Sending the marks first is problematic, because the data channel at
  the other end might not be reading them (for it has not yet been so
  instructed by the control connection handler).  The user might then
  become blocked for output, thus prohibiting sending of the
  RESYNCHRONIZE-DATA-CHANNEL command.
  On the other hand, sending the control connection handler command
  first requires that the user side can send the marks and identifiers
  between sending the control connection handler command and receiving
  a response for it.  The response will never come until the marks and
  identifiers have been successfully received.  The user implementation
  must allow for this one case of a command where a subroutine that
  "sends a command and waits for a response" is inapplicable.
  RESYNCHRONIZING AN INPUT DATA CHANNEL
  The server control process should dispatch the data process to send
  the mark, and not wait, lest the data process become blocked for
  output due to a user abort.  The control process must go back to its
  command loop, to possibly receive a command that might break the data
  process out of that block.

8.25 UNDATA-CONNECTION Command

  Command:  (UNDATA-CONNECTION tid input-handle output-handle)
  Response: (UNDATA-CONNECTION tid)
  UNDATA-CONNECTION explicitly disestablishes a data connection from
  the user side.  The user side has the option of disestablishing data
  connections at its discretion.  There is no place in the protocol
  where disestablishment of data connections is required, other than at
  the end of the session, where it is implicit.




Greenberg & Keene [Page 52]

RFC 1037 NFILE - A File Access Protocol December 1987


  The data connection to be disestablished is the one designated by the
  input-handle and output-handle arguments.  These two handles must
  refer to the same data connection.
  It is not permitted to explicitly disestablish a data connection
  either of whose channels is active.  If the session is terminated by
  the breaking of the control connection, all file handles become
  meaningless, and the server must close all data connections known to
  it and close-abort all files opened on behalf of the user during the
  dialogue.
  In the Symbolics implementation, the user side disestablishes data
  connections that have not been used for a long time, such as twenty
  minutes or so.
  For more information about data connections:  See the section "NFILE
  Control and Data Connections", section 4.

9. NFILE RESYNCHRONIZATION PROCEDURE

  Ordinarily, the user side sends NFILE commands to the server side
  over the control connection; the server side responds to every user
  command, and file data is transmitted over the data channels.  This
  section describes a resynchronization procedure that takes place when
  something disturbs the usual course of events.
  First, if the server side aborts while sending or receiving data,
  nothing can be done to salvage the connection between the two hosts.
  The control connection and any data channels associated with this
  connection are broken.  This happens rarely, if at all.
  It is not unusual for the user side to abort file operations, either
  commands or data transfer.  On a Symbolics computer, the user can do
  this by pressing CONTROL-ABORT.  An important aspect of any file
  protocol is the way it handles the situation when the user side
  aborts file operations.
  An NFILE user side reacts to user side aborts by immediately marking
  the connection unsafe.  When a control connection is unsafe, it must
  be resynchronized before it can be used again.  Data channels can
  also be marked unsafe, and must also be resynchronized before further
  use.  The resynchronization process rids the connection (whether
  control or data connection) of bytes of data that are now unwanted,
  and thus cleans up the channel so it can be used again.
  The resynchronization procedure is somewhat complex, but it fulfills
  a genuine need.  For those interested, a brief design discussion is
  included as note <3>.


Greenberg & Keene [Page 53]

RFC 1037 NFILE - A File Access Protocol December 1987


9.1 NFILE Control Connection Resynchronization

  NFILE requires any unsafe control connection to undergo a
  resynchronization procedure before further use.  Therefore, the
  resynchronization does not necessarily occur immediately after the
  control connection is marked unsafe.  The user side initiates the
  control connection resynchronization when another operation on the
  control connection is attempted.
  A "mark" is defined in the context of Byte Stream with Mark:  See the
  section "Discussion of Byte Stream with Mark", section 12.1.
  USER SIDE STEPS:  CONTROL CONNECTION RESYNCHRONIZATION
      1. The user side sends a mark over the control connection to
         the server.
      2. The user side sends the ASCII characters USER-RESYNC-DUMMY
         (as a data token) to the server.
      3. The user side sends a second mark to the server.
      4. The user side declares the control connection safe (at the
         token list level).
      5. The user side generates and sends a unique data token to
         the server.
      6. The user side then waits, expecting to detect a mark
         followed by the unique data token.  The user side reads and
         discards all tokens and marks until the desired match is
         found.
  Once the user side detects the mark and unique data token, the
  control connection has been fully resynchronized, and can be used
  again.


  SERVER SIDE STEPS:  CONTROL CONNECTION RESYNCHRONIZATION
       1. The server side detects a mark.  The server is thus alerted
          that the control connection is unsafe, and that
          resynchronization is in progress.
       2. The server continues to read data coming from the user side
          until it detects the second mark, and the token following
          it.



Greenberg & Keene [Page 54]

RFC 1037 NFILE - A File Access Protocol December 1987


       3. The server checks to see if the token following the mark is
          USER-RESYNC-DUMMY.  This rare situation occurs if the user
          aborts during the course of the resynchronization itself.
          If so, the server side discards the USER-RESYNC-DUMMY
          token.  The control connection is still unsafe, and the
          user side restarts the resynchronization procedure; the
          server side therefore begins at Step 2 again.
       4. If the token following the mark is not USER-RESYNC-DUMMY
          (this is the expected circumstance), the server should have
          received a single data token that is the unique data token
          generated by the user side.
              a. The server sends a mark to the user side.
              b. The server declares the control connection safe (at
                 the token list level).
              c. The server sends the unique data token to the user
                 side.
       5. If the server detects something following the mark that was
          neither USER-RESYNC-DUMMY nor a single data token, a
          protocol error has occurred.

9.2 NFILE Data Connection Resynchronization

  The NFILE data channel resynchronization procedure is similar to the
  NFILE control connection resynchronization.  Both procedures are
  based on a mark signalling the unsafe condition, then a second mark
  followed by a unique identifier.  One important difference between
  the two procedures is the circumstances in which they occur.  Control
  connections are put into unsafe states only when the user aborts
  during control connection I/O operations.  Data channels are made
  unsafe by a larger set of circumstances:









Greenberg & Keene [Page 55]

RFC 1037 NFILE - A File Access Protocol December 1987


      - User aborts occur during the file protocol operations that
        assign and deassign data channels.  This is the most common
        cause of data channels becoming unsafe.
      - A server receives a CLOSE command (with abort-p supplied as
        Boolean truth) specifying an open file that has not finished
        transmitting data.  That is, file reading is aborted.
      - The ABORT command is issued, causing data channels to be
        made unsafe.
      - The FILEPOS command is issued, causing the input data
        channel to become unsafe.
  The resynchronization clears the data channel of unwanted data from
  aborted operations and puts the data channel in a known state.  The
  data channel resynchronization procedure is invoked when the user
  side gives the RESYNCHRONIZE-DATA-CHANNEL command over the control
  connection.
  The following policies can be used to improve response time, but are
  not required by the NFILE protocol:  The user side can initiate
  resynchronization only if it needs the data channel, having first
  tried to use a free data channel that does not require
  resynchronization.  Also, the user side can periodically
  resynchronize all unsafe data channels.
  In giving the RESYNCHRONIZE-DATA-CHANNEL command, the user side
  indicates which data channel should be resynchronized.  Data channels
  are unidirectional, which means that depending on the direction
  (either input or output) of the data channel, either the user side or
  the server side sends the resynchronization data.  This is another
  difference from the resynchronization of the control connection, in
  which the resynchronization data is always sent by the user side.
  The resynchronization steps for input data channels are different
  than the steps for output data channels.








Greenberg & Keene [Page 56]

RFC 1037 NFILE - A File Access Protocol December 1987


  INPUT DATA CHANNEL RESYNCHRONIZATION
     1. The user side gives the RESYNCHRONIZE-DATA-CHANNEL command
        on the control connection, with only one argument, the
        handle of the data channel to be resynchronized.
     2. The server side of the data channel generates a unique
        identifier, and sends that data token in its regular
        command response to the user side.
     3. The server side sends a mark over the data channel.
     4. The server side sends the unique identifier token over the
        data channel.
     5. The user side reads until it detects a mark followed by the
        unique identifier token.  The resynchronization is then
        complete.  The data channel is no longer in an unsafe
        state.
  OUTPUT DATA CHANNEL RESYNCHRONIZATION
     1. The user side gives the RESYNCHRONIZE-DATA-CHANNEL command
        on the control connection, with two arguments: the handle
        of the data channel to be resynchronized, and a unique
        identifier that it has just generated.
     2. The user side of the data channel sends a mark.
     3. The user side of the data channel sends a dummy identifier
        token.  The dummy identifier can be any token that the
        server could not interpret as being the unique identifier.
        One suggestion is the data token DUMMY-IDENTIFIER.
     4. The server side of the data channel was alerted by the
        RESYNCHRONIZE-DATA-CHANNEL command that resynchronization
        is in progress.  The server side now reads the data,
        seeking the first mark.
     5. The server side reads and discards the first mark and the
        dummy identifier.
     6. The user side sends a second mark.
     7. The user side sends the unique identifier.
     8. The server side recognizes the mark and the unique
        identifier that follows, and the resynchronization is


Greenberg & Keene [Page 57]

RFC 1037 NFILE - A File Access Protocol December 1987


        complete.  The data channel is no longer in the unsafe
        state.

10. NFILE ERRORS AND NOTIFICATIONS

  NFILE recognizes two types of errors:  command response errors and
  asynchronous errors.  In addition to errors, NFILE supports
  notifications.
  Command response errors:
      - Signify an error that prevented the successful completion of
        the command; when such an error occurs, a command response
        error is sent instead of a normal command response.
      - Occur frequently in normal operations
  Asynchronous errors:
      - Are not related to any specific command
      - Are associated with an erring data channel
      - Typically indicate a problem in the transfer, such as
        running out of disk space or allocation, or an unreadable
        disk record
      - Occur rarely in normal operations
  Notifications:
      - Are not associated with an error
      - Are sent at the server's discretion
      - Provide general information, such as a warning that the
        system is going down

10.1 Notifications From the NFILE Server

  The NFILE server can send asynchronous notifications to the user side
  over the control connection.  The text of the notification contains
  information of interest to the person using NFILE, such as a warning
  that the server's operating system will be going down soon.
  Notifications can come from the server side at any time that the
  server is not sending something else.
  The format of NFILE notifications is:
            (NOTIFICATION "" text)
  The empty string "" takes the place of a transaction identifier.
  Notifications are initiated by the server, and are not associated
  with any transaction originated by the user side.n


Greenberg & Keene [Page 58]

RFC 1037 NFILE - A File Access Protocol December 1987


10.2 NFILE Command Response Errors

  When an error prevents the successful completion of an NFILE command,
  a command response error is sent instead of the normal command
  response.  A normal command response indicates success; a command
  response error indicates failure of the command.
  NFILE command response errors are sent from the server to the user
  across the control connection as top-level token lists, in this
  format:
            (ERROR tid three-letter-code error-vars message)
  ERROR is a keyword.  The tid is the transaction identifier of the
  command that encountered this error.  The arguments three-letter-
  code, error-vars, and message are all required.
  The three-letter-code provides the information on what kind of an
  error was encountered.  For a table of the three-letter codes and
  their meanings:  See the section "NFILE Three-letter Error Codes",
  section 10.4.
  message is a string that is displayed to the human user of the
  protocol.
  error-vars is a keyword/value list.  The three possible keywords are:
  PATHNAME, OPERATION, and NEW-PATHNAME.  Before transmitting an error,
  the server looks at the type of error to see if it can easily
  determine the value of any of the keywords.  If so, the server
  includes the keyword/value pair in its error.  If not, the
  keyword/value pair is omitted.  The value associated with OPERATION
  is the keyword naming the NFILE command that failed.  The values
  associated with PATHNAME and NEW-PATHNAME are strings in the full
  pathname syntax of the server host.
  For example, suppose the server on a file system with hierarchical
  directories could not access a file because its containing directory
  did not exist.  The command error response would use the PATHNAME
  keyword to indicate the first directory level that did not exist,
  instead of the full pathname which was supplied as the command
  argument.  This gives the user side valuable information that it
  otherwise would not have known.





Greenberg & Keene [Page 59]

RFC 1037 NFILE - A File Access Protocol December 1987


10.3 NFILE Asynchronous Errors

  When a data channel process, in either direction, encounters an error
  condition, the server sends an asynchronous error description. An
  asynchronous error description consists of a top-level token list.
  Typically, asynchronous errors indicate error conditions in the
  transfer, such as running out of disk space or allocation, or a
  unreadable disk record.
  The format of asynchronous error descriptions is:
        (ASYNC-ERROR handle three-letter-code error-vars message)
  ASYNC-ERROR is a keyword.  The handle argument identifies the erring
  data channel.  The arguments three-letter-code, error-vars, and
  message are all required.  Their meanings are the same as in NFILE
  command error responses: See the section "NFILE Command Response
  Errors", section 10.2.
  When the server detects an asynchronous error on an input data
  channel, the server sends an asynchronous error description on that
  data channel itself.  When an asynchronous error occurs on an output
  data channel, the asynchronous error description is sent on the
  control connection.
  Some asynchronous errors are restartable.  In this context,
  restartable means it makes sense to try to resume the operation.  One
  example of a restartable error is an attempt to write a file to a
  file system that is out of room.  The server side indicates whether
  an asynchronous error is restartable by prepending the keyword
  RESTARTABLE and the associated value Boolean truth to the error-vars
  list.  To proceed from a restartable error, the user side sends a
  CONTINUE command over the control connection.
  On any asynchronous error, either input or output, the data channel
  on the server side enters an "asynchronous error outstanding" state.
  The server can exit that state in one of two ways:  by receiving a
  CONTINUE command or a CLOSE command with the abort-p argument
  supplied as Boolean truth.
  On a normal CLOSE (not a close-abort), the server side checks the
  channel it was requested to close.  If an asynchronous error
  description has been sent on the data channel, but not yet processed
  by CONTINUE, the server side does not close the channel, but sends a
  command error response.  The same thing happens on a FINISH command
  received on a channel that has an asynchronous error pending.  In
  both cases, the three-letter code included in the command error
  response is EPC, for Error Pending on Channel.


Greenberg & Keene [Page 60]

RFC 1037 NFILE - A File Access Protocol December 1987


10.4 NFILE Three-letter Error Codes

  Usually the server's operating system provides some description of an
  error that occurs.  NFILE has a mechanism for conveying that
  information to the user side.  Upon detecting an error, the NFILE
  server should characterize the error by choosing the three-letter
  code that best describes the error.  The three-letter code is an
  argument in both the command response error and asynchronous error
  messages from the server to the user.
  Each of the NFILE three-letter codes represents some system error.
  The set of codes enables all operating systems to use one error-
  reporting mechanism.  Some operating systems will never encounter
  certain of the error conditions.
  Some errors fit logically into two error codes.  For example, suppose
  the server could not delete a file because the file was not found.
  This error could be considered either CDF (Cannot Delete File) or FNF
  (File Not Found).  In this case, File Not Found gives more specific
  and valuable information than Cannot Delete File.  Since the protocol
  does not allow more than one error code to be reported when an error
  occurs, the server must choose the most appropriate error code, given
  the information available to it from the operating system.
  This is the set of three-letter codes:
    ACC   Access error.  This indicates a protection-violation error.
    ATD   Incorrect access to directory.  A directory could not be
          accessed because the user's access rights to it did not
          permit this type of access.
    ATF   Incorrect access to file.  A file could not be accessed
          because the user's access rights to it did not permit this
          type of access.
    BUG   File system bug.  This includes all protocol violations
          detected by the server, as well as by the host file system.
    CCD   Cannot create directory.  An error occurred in attempting to
          create a directory.
    CDF   Cannot delete file.  The file system reported that it cannot
          delete a file.
    CCL   Cannot create link.  An error occurred in attempting to
          create a link.



Greenberg & Keene [Page 61]

RFC 1037 NFILE - A File Access Protocol December 1987


    CIR   Circular link.  An operation was attempted on a pathname that
          designates a link that eventually links back to itself.
    CRF   Cannot rename file.  An error occurred in attempting to
          rename a file.
    CSP   Cannot set property.  An error occurred in attempting to
          change the properties of a file.  This could mean that you
          tried to set a property that only the file system is allowed
          to set, or a property that is not defined on this type of
          file system.
    DAE   Directory already exists.  A directory could not be created
          because a directory or file of this name already exists.
    DAT   Data error.  The file system contains unreadable data.  This
          could mean data errors detected by hardware or inconsistent
          data inside the file system.
    DEV   Device not found.  The device of the file was not found or
          does not exist.
    DND   "Do Not Delete" flag set.  An attempt was made to delete a
          file that is marked by a "Do Not Delete" flag.
    DNE   Directory not empty.  An invalid deletion of a nonempty
          directory was attempted.
    DNF   Directory not found.  The directory was not found or does not
          exist.  This refers specifically to the containing directory;
          if you are trying to access a directory, and the actual
          directory you are trying to access is not found, FNF (for
          File Not Found) should be indicated instead.
    EPC   Error pending on channel.  The server cannot close the
          channel in attempting to close or finish the channel.
    FAE   File already exists.  The file could not be created because a
          file or directory of this name already exists.
    FNF   File not found.  The file was not found in the containing
          directory.  The TOPS-20 and TENEX "no such file type" and "no
          such file version" errors should also report this condition.
    FOO   File open for output.  Opening a file that was already opened
          for output was attempted.
    FOR   Filepos out of range.  Setting the file pointer past the


Greenberg & Keene [Page 62]

RFC 1037 NFILE - A File Access Protocol December 1987


          end-of-file position or to a negative position was attempted.
    FTB   File too big.  File is larger than the maximum file size
          supported by the file system.
    HNA    Host not available The file server or file system is
          intentionally denying service to user.  This does not mean
          that the network connection failed; it means that the file
          system is explicitly not available.
    IBS    Invalid byte size.  The value of the "byte size" option was
          not valid.
    ICO   Inconsistent options.  Some of the options given in this
          operation are inconsistent with others.
    IOD   Invalid operation for directory.  The specified operation is
          invalid for directories, and the given pathname specifies a
          directory, in directory pathname as file format.
    IOL   Invalid operation for link.  The specified operation is
          invalid for links, and this pathname is the name of a link.
    IP?   Invalid password.  The specified password was invalid.
    IPS   Invalid pathname syntax.  This includes all invalid pathname
          syntax errors.
    IPV   Invalid property value.  The new value provided for the
          property is invalid.
    IWC   Invalid wildcard.  The pathname is not a valid wildcard
          pathname.
    LCK   File locked.  The file is locked.  It cannot be accessed,
          possibly because it is in use by some other process.
    LIP   Login problems.  A problem was encountered while trying to
          log in to the file system.
    MSC   Miscellaneous problems.
    NAV   Not available.  The file or device exists but is not
          available.  Typically, the disk pack is not mounted on a
          drive, the drive is broken, or the like.  Operator
          intervention is probably required to fix the problem, but
          retrying the operation is likely to succeed after the problem
          is solved.


Greenberg & Keene [Page 63]

RFC 1037 NFILE - A File Access Protocol December 1987


    NER   Not enough resources.  For example, a system limit on the
          number of open files or network connections has been reached.
    NET   Network problem.  The file server had some sort of trouble
          trying to create a new data connection, or perform some other
          network operation, and was unable to do so.
    NFS   No file system.  The file system was not available.  For
          example, this host does not have any file systems, or this
          host's file system cannot be initialized or accessed for some
          reason, or the file system simply does not exist.
    NLI   Not logged in.  A file operation was attempted before logging
          in.  Normally the file system interface always logs in before
          doing any operation, but this problem can occur in certain
          unusual cases in which logging in has been aborted.


    NMR   No more room.  The file system is out of room.  This can mean
          any of several things:
                     - The entire file system is full.
                     - The particular volume involved is full.
                     - The particular directory involved is full.
                     - The user's allocated quota has been exceeded.
    RAD   Rename across directories.  The devices or directories of the
          initial and target pathnames are not the same, but on this
          file system they are required to be.
    REF   Rename to existing file.  The target name of a rename
          operation is the name of a file that already exists.
    UKC   Unknown operation. An unsupported file system operation was
          attempted, or an unsupported command was attempted.
    UKP   Unknown property.  The property is unknown.
    UNK   Unknown user.  The specified user name is unknown to this
          host.
    UUO   Unimplemented option.  An option to a command is not
          implemented.
    WKF   Wrong kind of file.  This includes errors in which an invalid
          operation for a file, directory, or link was attempted.
    WNA   Wildcard not allowed.


Greenberg & Keene [Page 64]

RFC 1037 NFILE - A File Access Protocol December 1987


11. TOKEN LIST TRANSPORT LAYER

  PURPOSE:  The Token List Transport Layer is a protocol that
  facilitates the transmission of simple structured data, such as
  lists.

11.1 Introduction to the Token List Transport Layer

  The Token List Transport Layer is a general-purpose protocol.  The
  Token List Transport Layer sends "tokens" through its underlying
  stream.  Each token usually represents a simple quantity, such as a
  string or integer.
  Tokens can be organized into "token lists".  Special tokens are
  provided to denote the starting and ending point of lists.  The token
  list transport layer differentiates between "top-level token lists",
  which are not contained in other lists, and "embedded token lists",
  which are contained in other lists.  Using lists makes it convenient
  to send structured records, such as commands and command responses of
  the client protocol.  The top-level token lists provide robustness.
  The Token List Transport Layer is a general term that includes two
  separate but related subjects:  the "token list stream" and the
  "token list data stream".  The token list stream is commonly used for
  applications that can easily organize the information to be
  transmitted into tokens and lists.  The token list data stream is
  more appropriate for transmitting a large volume of data that cannot
  easily be structured into tokens and lists, such as file data, which
  is simply a sequence of characters or bytes.
  The following table illustrates the main differences between token
  list streams and token list data streams:
                    Token List Data Stream      Token List Stream
                    ----------------------      -----------------
    Built on:     token list stream           Byte Stream with Mark
    Transmits:    stream data                 tokens, token lists
    Example
    of use:       NFILE data channels         NFILE control
                                              connection





Greenberg & Keene [Page 65]

RFC 1037 NFILE - A File Access Protocol December 1987


  NFILE uses the the Token List Transport Layer, and provides an
  excellent example of its usefulness.  The NFILE commands and command
  responses are sent over the control connection in a token list
  stream.  File data is sent across each data channel in a token list
  data stream.

11.2 Token List Stream

11.2.1 Types of Tokens and Token Lists

  All numbers in the token list documentation are represented in
  decimal notation.  Bytes are 8 bits long.
  TYPES OF TOKENS
  Tokens are of the following types:
           1. Atomic tokens.
              Atomic tokens are of the following subtypes:
             - Data tokens.  A data token consists of a sequence of
               bytes with an effectively infinite maximum length.  In
               some contexts a data token represents a string; in
               other contexts, a data token is other arbitrary data.
               Each data token is preceded in the token list stream
               by a representation of its length in bytes.
               Data tokens that are under 200 bytes long are preceded
               by one byte containing their length in bytes.  That
               is, a data token of 34 bytes is preceded by one byte
               of value 34.
               Data tokens 200 bytes or over are preceded by the byte
               known as PUNCTUATION-LONG, of value 201.  After the
               201 comes a four-byte-long number (least significant
               byte first) containing the length of the data token
               that follows.
             - Numeric tokens.  A sequence of bytes that represent
               and encode a nonnegative binary integer.  The largest
               valid integer is 2^63 - 1.
               Numeric tokens are either short integers (less than
               256) or long integers (greater than or equal to 256).
               Short integers are preceded by the byte known as
               PUNCTUATION-SHORT-INTEGER, of value 206.


Greenberg & Keene [Page 66]

RFC 1037 NFILE - A File Access Protocol December 1987


               Long integers are begun by PUNCTUATION-LONG-INTEGER,
               of value 207.  One byte follows, containing the length
               (in bytes) of the long integer.  The integer itself is
               next, least significant byte first.
             - Keyword tokens.  A sequence of bytes that represent
               and encode a named identifier of the implemented
               protocol.  Keyword tokens are used by the client
               protocol to convey a name; the only significance of a
               keyword token is in its name.
               Each keyword is preceded by the byte known as
               PUNCTUATION-KEYWORD, of value 208.  The data token
               following PUNCTUATION-KEYWORD represents the name of
               the keyword as a string.  The characters are in
               upper-case standard ASCII.
             - Boolean truth.  A special token that represents the
               Boolean truth value.  This token is known as
               BOOLEAN-TRUTH, of value 209 <4>.
  2. Control tokens.
  The token list stream supports four control tokens to delimit token
  lists, and one padding token.
              TOP-LEVEL-LIST-BEGIN  202   This control token
                                          appears at the start of
                                          each top-level token list.
              TOP-LEVEL-LIST-END    203   This control token
                                          appears at the end of
                                          each top-level token list.
              LIST-BEGIN            204   This control token
                                          appears at the start of
                                          each embedded token list.
              LIST-END              205   This control token
                                          appears at the end of
                                          each embedded token list.
              PUNCTUATION-PAD       200   This padding token should
                                          be ignored by the token
                                          list stream.  It can be
                                          sent to fill buffers.




Greenberg & Keene [Page 67]

RFC 1037 NFILE - A File Access Protocol December 1987


  TOKEN LISTS
  A token list consists of a sequence of atomic tokens or token lists.
  Token lists are begun and ended by control tokens that delimit the
  token lists.  There are three types of token lists:
        1. Top-level token lists.
           Top-level token lists begin with TOP-LEVEL-LIST-BEGIN and
           end with TOP-LEVEL-LIST-END.  Top-level token lists are not
           contained in other lists.
        2. Embedded token lists.
           These token lists occur inside other token lists.  They
           begin with LIST-BEGIN and end with LIST-END.
        3. The empty token list.
           This is a special example of the embedded token list.  In
           some contexts, the empty token list represents Boolean
           falsity.  An embedded empty token list is composed of a
           LIST-BEGIN followed immediately by a LIST-END.  A top-level
           empty token list is composed of TOP-LEVEL-LIST-BEGIN
           followed immediately by TOP-LEVEL-LIST-END.

11.2.2 Token List Stream Example

  This section contains an example of some data that can appear on a
  token list stream.  The example is a top-level token list encoding an
  NFILE DELETE command.
  The DELETE command is composed of the following pieces:  a TOP-
  LEVEL-LIST-BEGIN, the keyword DELETE, a data token containing the
  transaction identifier, a LIST-BEGIN, a LIST-END, a data token
  containing a pathname of a file to be deleted, and a TOP-LEVEL-LIST-
  END.  This example uses t105 as the transaction identifier, and
  /usr/max/temp as the pathname.
  All numbers in this section are expressed in decimal notation.
  The pieces of the command are displayed here in order:
           1. TOP-LEVEL-LIST-BEGIN
           2. The keyword token whose name is DELETE
           3. The data token containing the characters:  t105
           4. LIST-BEGIN
           5. LIST-END


Greenberg & Keene [Page 68]

RFC 1037 NFILE - A File Access Protocol December 1987


           6. The data token containing the characters:  /usr/max/temp
           7. TOP-LEVEL-LIST-END
  Now, let's translate each piece of the command into the bytes that
  are transmitted through the token list stream.
       1. TOP-LEVEL-LIST-BEGIN
          202     represents TOP-LEVEL-LIST-BEGIN
       2. The keyword token whose name is DELETE.
          A keyword token is introduced by PUNCTUATION-KEYWORD, which
          is represented in the token list stream as the byte 208.
          A data token follows, containing the string "DELETE".  A
          data token under 200 bytes long is introduced by one byte
          containing its length in bytes.  The length of this data
          token is 6 bytes.
          The data token continues with the standard ASCII character
          set representation of each character in the string DELETE:
              208     represents PUNCTUATION-KEYWORD
              006     represents the length of this data token
              068     represents "D"
              069     represents "E"
              076     represents "L"
              069     represents "E"
              084     represents "T"
              069     represents "E"
       3. The data token containing the characters:  t105
          This data token is begun by its length in bytes (4), and
          continues with the NFILE character set representation of
          each character in the string:
              004     represents the length of this data token
              116     represents "t"
              049     represents "1"
              048     represents "0"
              053     represents "5"
       4. LIST-BEGIN
              204     represents LIST-BEGIN



Greenberg & Keene [Page 69]

RFC 1037 NFILE - A File Access Protocol December 1987


       5. LIST-END
              205     represents LIST-END
       6. The data token containing the characters:  /usr/max/temp
              013     represents length of this data token
              047     represents "/"
              117     represents "u"
              115     represents "s"
              114     represents "r"
              047     represents "/"
              109     represents "m"
              097     represents "a"
              120     represents "x"
              047     represents "/"
              116     represents "t"
              101     represents "e"
              109     represents "m"
              112     represents "p"
       7. TOP-LEVEL-LIST-END
              203     represents TOP-LEVEL-LIST-END

11.2.3 Mapping of Lisp Objects to Token List Stream Representation

  The Symbolics interface to the token list stream sends Lisp objects
  through the underlying Byte Stream with Mark and produces Lisp
  objects on the other end.  Not all Lisp objects can be sent in this
  way.  For example, compound objects other than lists are not handled.
  An appropriate analogy is the sending and reconstruction of list
  structure via printed representation.  These are the types of objects
  that can be sent, and their representations:
       - Lisp strings are represented as data tokens in the NFILE
         character set.  Only 8-bit strings can be sent <5>.
       - Keyword symbols are represented as keyword tokens.  Although
         identifiable and reconstructable as keyword symbols, only
         their names are sent.  Any properties, bindings, and the
         like are not sent.
       - T is represented as BOOLEAN-TRUTH.
       - NIL is represented as the empty token list.
       - Lists are represented as token lists.  Circular lists cannot


Greenberg & Keene [Page 70]

RFC 1037 NFILE - A File Access Protocol December 1987


         be sent.  See the footnote related to the ambiguity between
         NIL and the empty list:  See the section "Types of Tokens
         and Token Lists", section 11.2.1.
       - Integers are represented as numeric tokens.  Only
         nonnegative integers less than 2^63 can be sent.

11.2.4 Aborting and the Token List Stream

  A token list stream accrues the benefits of the abort management
  policy of the Byte Stream with Mark on which it is built.  In order
  to fully realize this benefit, some simple rules must be obeyed by
  any implementation of the token list stream.
  The term "transmission" means either an atomic token or a complete
  top-level token list. A transmission starts with the control token
  TOP-LEVEL-BEGIN and ends with TOP-LEVEL-END.  The top-level token
  list can contain embedded token lists.
  The interface that writes to the token list stream must be capable of
  writing the representation of entire transmissions.  When this
  interface is called, it must effectively lock the token list stream,
  and exclude access by other processes until the entire transmission
  has been encoded and sent.
  If the sending is aborted while the stream is locked, the stream
  enters an "unsafe" state.  Trying to send data while the stream is
  unsafe signals an error.  The application and the token list stream
  must send a mark to cause resynchronization, and allow the token list
  stream to be used again.  When the reading side encounters this mark,
  it resynchronizes itself according to whatever client protocol is in
  use.
  Similarly, the interface that reads from the token list stream must
  be capable of reading entire transmissions.  When this interface is
  called, it must lock the stream, excluding access by other processes
  until the entire transmission has been read.
  If the reading is aborted while the stream is locked, the stream
  enters an unsafe state.  The only exit from this unsafe state is by
  means of receiving a mark.  When the stream is unsafe, the only valid
  operation that can be performed upon it is "read and discard all
  tokens until a mark is encountered; read and discard that mark;
  declare the stream safe again".




Greenberg & Keene [Page 71]

RFC 1037 NFILE - A File Access Protocol December 1987


  Depending on the client protocol, the receipt of a mark might cause
  the reading side to read for further marks.  NFILE implements the
  resynchronization of token list streams, and serves as a useful
  example: See the section "NFILE Control Connection
  Resynchronization", section 9.1.
  The Symbolics implementation provides the two mark-handling
  primitives in this way:


     1. Send token (or list) preceded by a mark.  When the stream
        is in the unsafe state (on the output side), this is the
        only permitted output operation (other than closing).
     2. Read through to a mark and read the token (or list)
        following the mark.  When the stream is in the unsafe state
        (on the input side), this is the only permitted input
        operation (other than closing).

11.3 Token List Data Stream

  The token list data stream is a facility to transmit stream data
  through a token list stream.  The token list data stream imposes the
  following protocol on the data transmitted:
           - Data is sent in the format of loose data tokens, not
             contained in token lists.
           - The keyword token EOF indicates that the end of data has
             been reached.
           - Token lists can be transmitted through the token list
             data stream.
           - No loose tokens other than data tokens or the keyword
             token EOF can be sent.
           - Boundaries between data tokens are not signification.
             The data is considered to be a continuous stream, with
             the possible exception of marks.
  The token list data stream is most appropriate for sending file data.
  It is expected (but not required) that its typical mode of use is to
  send a large number of data tokens, with an occasional token list.
  The design intent was that token lists would be used by the
  application program to indicate exceptional situations.
  Data tokens, the keyword token EOF, and token lists are defined in


Greenberg & Keene [Page 72]

RFC 1037 NFILE - A File Access Protocol December 1987


  the token list stream documentation:  See the section "Types of
  Tokens and Token Lists", section 11.2.1.
  The NFILE file protocol provides a good example of the use of token
  list data streams.  NFILE sends file data through token list data
  streams; each NFILE data channel is a token list data stream.  Errors
  such as disk errors during the reading of a file are conveyed as
  token lists through the token list data stream.

12. BYTE STREAM WITH MARK

  PURPOSE:  Byte Stream with Mark is a simple layer of protocol that
  guarantees that an out-of-band signal can be transmitted in the case
  of program interruption.  Byte Stream with Mark is designed to
  provide end-to-end stream consistency in the face of user program
  aborts.

12.1 Discussion of Byte Stream with Mark

  INTRODUCTION
  Byte Stream with Mark is a reliable, bidirectional byte stream with
  one out-of-band (but not out-of-sequence) signal called a "mark".
  The design of Byte Stream with Mark ensures that the mark is always
  recognizable on the receiving end.  The Byte Stream with Mark is
  built on an underlying stream, which must support the transmission of
  8-bit bytes.  Byte Stream with Mark has been implemented to run on
  TCP and Chaos.  Marks are implemented differently on the two
  protocols.
  Marks are used to resynchronize the stream when something has
  occurred to interrupt normal operations.  For example, an application
  layer sending data over the Byte Stream with Mark can abort in the
  middle of sending that data.  Recovery is handled by sending a mark.
  In the context of this document, "aborting" is defined as follows:
  Aborting the current execution of a program means to halt that
  execution and to abandon it, never to complete it.  The data
  representing the state of the execution are irrevocably discarded.
  EXAMPLE OF USE
  Byte Stream with Mark is the layer of protocol underlying NFILE.
  NFILE uses the marks implemented in Byte Stream with Mark to
  resynchronize control connections or data channels whose
  synchronization has been lost.  For a description of NFILE's use of
  marks to resynchronize streams:  See the section "NFILE
  Resynchronization Procedure", section 9.


Greenberg & Keene [Page 73]

RFC 1037 NFILE - A File Access Protocol December 1987


  BYTE STREAM WITH MARK ON CHAOSNET
  A mark is recognized on Chaosnet by a packet bearing the opcode 201
  (octal).  There is no data in a mark packet, so the data portion of
  the packet is ignored.  Byte Stream with Mark transmits all data in
  packets bearing opcode 200 (octal).
  If Byte Stream with Mark is implemented on another (non-Chaos) stream
  that supports opcode-bearing packets, the recommended implementation
  is the reservation of an opcode for the mark.
  BYTE STREAM WITH MARK ON TCP:  RECORD MODE
  The purpose of Byte Stream with Mark is to guarantee that marks can
  always be unambiguously identified.  Therefore, for TCP (and for any
  transport layer that does not implement packets natively) a simple
  record stream is imposed on the stream.  The record boundaries serve
  only to distinguish where a mark can occur.  A record consists of a
  two-byte byte count, most significant byte first, followed by that
  many bytes of data.  A byte count of zero is recognized as a mark.
  Both the sending side and the receiving side must rigorously maintain
  the integrity of the record boundaries.  A writer to the stream must
  never output a byte count without that number of data bytes
  following.  Similarly, a reader of the stream, after reading a byte
  count, has effectively contracted to read that many bytes from the
  encapsulated stream, regardless of whether those bytes are requested
  by the application layer.
  MAINTAINING RECORD INTEGRITY
  This subsection deals with maintaining record integrity on non-Chaos
  networks.  Since Chaos implements packets natively, no special care
  is required to maintain record integrity on the Chaos network.
  The design discussed here guarantees record integrity; the underlying
  stream must guarantee data integrity.
  The basic design of Byte Stream with Mark on TCP (and other transport
  layers that do not implement packets natively) is to preserve record
  integrity by putting clearly demarcated, byte-counted records in the
  natural records of the encapsulated stream.  Therefore, when the
  outer stream requests a buffer's worth of file data from the
  encapsulated stream, it expects to receive a buffer containing one
  entire, ntegral, record of that stream, complete with byte count.
  Because of diverse network implementations on different operating
  systems, the software that implements the encapsulated stream might


Greenberg & Keene [Page 74]

RFC 1037 NFILE - A File Access Protocol December 1987


  not be able to provide integral record buffers to the Byte Stream
  with Mark implementation.  For example, the writing stream could have
  written records that are much longer than available buffers on the
  receiving system.  In this case, a request to read from the
  encapsulated stream returns some buffer or some amount of data
  representing less than an entire Byte Stream with Mark record.  The
  input subroutine of the Byte Stream with Mark implementation must
  therefore return a region of this (smaller) buffer, representing less
  than the full Byte Stream with Mark record.  Nevertheless, the Byte
  Stream with Mark must extract the count of the full Byte Stream with
  Mark record from the first such buffer of each Byte Stream with Mark
  record, and maintain and update this count as succeeding component
  buffers are read.
  In this case, if the program reading from the Byte Stream with Mark
  aborts while reading data, the implementation of Byte Stream with
  Mark must continue to read through the remaining buffers of the Byte
  Stream with Mark record that has been subdivided in this fashion.
  The user side program will have determined that an abort has
  occurred, and will request the Byte Stream with Mark to read up to
  and through the next mark.  The Byte Stream with Mark will have
  processed a fractional record, and must discard the remaining buffers
  of the record now being read.

12.2 Byte Stream with Mark Abortable States

  Byte Stream with Mark is designed to provide end-to-end stream
  consistency in the face of user program aborts.  This section
  describes user program aborts, and how Byte Stream with Mark handles
  them.  In the context of this document, "aborting" is defined as
  follows:  Aborting the current execution of a program means to halt
  that execution and to abandon it, never to complete it.  The data
  representing the state of the execution are irrevocably discarded.
  USER PROGRAM ABORTS AND I/O STREAMS
  Aborting the execution of the code that manipulates I/O streams, in
  general, poses significant problems.  Given that a stream is a static
  data object, and is intended to be used over and over again, aborting
  the execution of any routine manipulating a stream can leave it in an
  inconsistent, unusable state.
  Many operating systems solve this problem by manipulating a large
  subset of streams within the confines of the supervisor or executive
  program, which is not vulnerable to aborts, short of system or
  network failure.  Nevertheless, the need still exists to implement
  streams outside of the boundaries of the supervisor.  Furthermore,


Greenberg & Keene [Page 75]

RFC 1037 NFILE - A File Access Protocol December 1987


  the Symbolics computer environment has no supervisor or executive
  program, and is thus vulnerable to aborts everywhere.
  BYTE STREAM WITH MARK HANDLING OF USER PROGRAM ABORTS
  Byte Stream with Mark is designed to be nearly impervious to the
  aborting of programs using it.  Its design is based on careful
  analysis of all possible states of the stream, and of the effect of
  aborts of the programs using the stream in each of these states.
  This section provides that analysis.
  A "transmission" is a collection of user data sent by the application
  level through the Byte Stream with Mark whose end is well-defined,
  once its start has been recognized.  For instance, the token list
  stream, when using Byte Stream with Mark, sends token lists.  When a
  TOP-LEVEL-LIST-BEGIN has been sent, the containing transmission is
  not considered complete until the corresponding TOP-LEVEL-LIST-END is
  read.  See the section "Token List Transport Layer", section 11.
  The following cases are possible states of the stream when an abort
  occurs:
        1. Abort occurs when the user program is not manipulating the
           stream.
           This case presents no problem.
        2. Abort occurs after a transmission has been partially sent,
           at a packet or record boundary.
           This implies that the datum that would indicate the
           successful complete sending of that transmission has been
           not yet been sent.
           The Byte Stream with Mark state is consistent, but the
           application level state is not.  The application level must
           determine that the execution of the code composing and
           sending its transmission was, in fact, aborted, and
           initiate resynchronization via marks.
           The receiving side must be careful not to act upon a
           transmission (that is, to perform any action or side
           effect) until the transmission has been successfully
           received in entirety.  This protects the user program from
           the possibility that an abort can occur after a
           transmission has been partially sent.



Greenberg & Keene [Page 76]

RFC 1037 NFILE - A File Access Protocol December 1987


        3. Abort occurs during the sending or receiving of a record.
           This is the most vulnerable state of the mechanism.  This
           case does not occur on packet-oriented media; it is
           subsumed by the next case.
           This case is handled by minimizing the extent of this
           window, and killing the connection when and if the
           situation is detected.  Depending on the operating system
           involved, this window could be minimized by using
           interrupt-disabling mechanisms, auxiliary processes or
           tasks, or some other technique.
           For buffered streams, input and output waiting can be done
           in consistent states, thus minimizing the amount of time
           manipulating the actual encapsulated stream.  For
           unbuffered streams, a lot of time can be spent in this
           window.  It is expected that unbuffered streams will be
           exceedingly uncommon.  Nevertheless, the implementation of
           Byte Stream with Mark must detect this case.
        4. Abort occurs during the sending or receiving of fundamental
           units of the lowest-level underlying stream (packets,
           buffers, or bytes).
           This case is usually handled by inhibiting interrupts, or
           other forms of masking, in the code implementing the
           encapsulated stream, since no waiting is possible at
           unexpected times.

13. POSSIBLE FUTURE EXTENSIONS

  NFILE was designed to be extended as the needs of its clients grow,
  or as new clients with different needs appear.  Currently it meets
  the needs of the Symbolics Genera 7.0 operating system, although its
  design is intentionally general.  If users of other operating systems
  identify new features that would be useful, they could be added to
  NFILE.  This section illustrates some areas areas where the design of
  NFILE intentionally accommodates extensions.
        - The NFILE protocol encodes commands and responses as text,
          rather than using prearranged numbers.  This means that new
          commands and responses can be added without having to obtain
          a new number from a central registry.
        - The Token List Transport Layer provides a general substrate
          for the value-transmission portion of network protocols.  In
          fact, it has been used at Symbolics for other protocols


Greenberg & Keene [Page 77]

RFC 1037 NFILE - A File Access Protocol December 1987


          besides NFILE.  The Token List Transport Layer could
          conveniently be extended to support transmission of other
          types of values besides those it currently supports.
        - The character set to be used for file transfer could be made
          negotiable.
        - The command character set could be made negotiable.
          Currently there is no negotiation sequence, but one could be
          added.
        - Greater support for more complex file organizations could be
          added, such as record files, databases, and so on.  This
          could be an extension to the direct access mode facility.
        - Currently, the LOGIN command allows the user side to inform
          the server which version of NFILE it is running.  This
          feature is included in NFILE so that a server can continue
          to support older versions of the protocol even after new,
          extended versions have been implemented.  However, the
          specification is currently somewhat vague as to how the
          server can make use of the version.
        - NFILE is not restricted to using TCP or Chaos as its
          underlying protocol.  NFILE can be built on any byte stream
          protocol that supports reliable transmission of 8-bit bytes
          and multiple connections.
  In addition to the possible future extensions, we would like to
  mention a known limitation of NFILE.
  Currently NFILE requires multiple connections for a single session.
  That is, the control connection must be separate from the data
  connections.  If NFILE is to be used over a telephone, this
  requirement poses an inconvenient restriction.  It is possible to
  implement a multiplexing scheme as a level between NFILE and the
  communication medium.








Greenberg & Keene [Page 78]

RFC 1037 NFILE - A File Access Protocol December 1987


                               APPENDIX A
                         NORMAL TRANSLATION MODE


  NORMAL translation mode guarantees the following:
        - A file containing characters in the NFILE character set can
          be written to any NFILE server and read back intact
          (containing the same characters).
        - A file written by NFILE should not appear as "foreign" to a
          server operating system unless the file contains NFILE's
          extended characters.  That is, a server file that uses only
          the subset of the NFILE character set limited to standard
          ASCII characters (the 95 printing characters, and the native
          representation of return, linefeed, page, backspace, rubout,
          and tab) can be read and written, with the result being the
          same data in NFILE characters as exists in server
          characters.
  In this section, all numbers designating values of character codes
  are to be interpreted in octal.  The notation "x in c1..c2" means
  "for all character codes x such that c1 <= x <= c2."
  The NFILE character set is an extension of standard ASCII.  The 95
  ASCII printing characters have the same numerical codes in the NFILE
  character set.  Five ASCII non-printing characters have counterparts
  in the NFILE character set, as shown in the following table.  The
  NFILE character set includes a single Return character, rather than
  the carriage-return line-feed sequence typically used in ASCII.  The
  NFILE character set does not include the ASCII control characters,
  other than the five shown in the following table, but does include
  some additional printing and formatting characters that have no
  counterparts in ASCII.
                            NFILE     Standard ASCII
        Rubout:             207       177
        Backspace:          210       10
        Tab:                211       11
        Linefeed:           212       12
        Page:               214       14
  Note that the NFILE Return character is of code 215.  This character
  includes "going to the next line".  This is a notable difference from
  the convention used in PDP-10 ASCII in which lines are ended by a
  pair of characters, "carriage return" and "line feed".



Greenberg & Keene [Page 79]

RFC 1037 NFILE - A File Access Protocol December 1987


  NORMAL TRANSLATION TO UNIX SERVERS
  The translation given in this table is appropriate for use by UNIX
  servers, or other servers that use 8-bit bytes to store ASCII
  characters.  Machines with 8-bit bytes usually place the extra NFILE
  characters in the top half of their character set.
      TABLE 1.   TRANSLATIONS FROM NFILE CHARACTERS TO UNIX CHARACTERS


           NFILE character       UNIX character
           x in 000..007         x
           x in 010..015         x + 200
           x in 016..176         x
           177                   377
           x in 200..207         x
           x in 210..211         x - 200
           212                   015
           x in 213..214         x - 200
           215                   012
           x in 216..376         x
           377                   177
      TABLE 2.   TRANSLATIONS FROM UNIX CHARACTERS TO NFILE CHARACTERS


           UNIX character        NFILE character
           x in 000..007         x
           x in 010..011         x + 200
           012                   215
           x in 013..014         x + 200
           015                   212
           x in 016..176         x
           177                   377
           x in 200..207         x
           x in 210..215         x - 200
           x in 216..376         x
           377                   177
  NORMAL TRANSLATION TO PDP-10 FAMILY SERVERS
  The translation given in this table is appropriate for use by PDP-10
  family servers, or other servers that use 7-bit bytes to store ASCII
  characters.  On the PDP-10 the sequence CRLF, 015 012, represents a
  new line.



Greenberg & Keene [Page 80]

RFC 1037 NFILE - A File Access Protocol December 1987


  The mechanism for this translation on machines with 7-bit bytes is to
  use the RUBOUT character (octal code 177) as an escape character.
        TABLE 3.   TRANSLATIONS FROM NFILE TO PDP-10 CHARACTERS


           NFILE character       PDP-10 character(s)
           x in 000..007         x
           x in 010..012         177 x
           013                   013
           x in 014..015         177 x
           x in 016..176         x
           177                   177 177
           x in 200..207         177 x - 200
           x in 210..212         x - 200
           213                   177 013
           214                   014
           215                   015 012
           x in 216..376         177 x - 200
           377                   no corresponding code
  These tables might seem confusing at first, but there are some
  general rules about it that should make it clearer.  First, NFILE
  characters in the range 000..177 are generally represented as
  themselves, and x in 200..377 is generally represented as 177
  followed by x - 200.  That is, 177 is used to quote the second 200
  NFILE characters.  It was deemed that 177 is a more useful and common
  character than 377, so 177 177 means 177, and there is no way to
  describe 377 with PDP-10 ASCII characters.  In the NFILE character
  set, the formatting control characters appear offset up by 200 with
  respect to standard ASCII.  This explains why the preferred mode of
  expressing 210 (backspace) is 010, and 010 turns into 177 010.  The
  same reasoning applies to 211 (Tab), 212 (Linefeed), 214 (Formfeed),
  and 215 (Return).
  More special care is needed for the Return character, which is the
  mapping of the system-dependent representation of "the start of a new
  line".  The NFILE Return (215) is equivalent to 015 012 (CRLF) in
  some ASCII systems.  In the NFILE character set there is no
  representation






Greenberg & Keene [Page 81]

RFC 1037 NFILE - A File Access Protocol December 1987


    TABLE 4.   TRANSLATIONS FROM PDP-10 CHARACTERS TO NFILE CHARACTERS


           PDP-10 character      NFILE character
           x in 000..007         x
           x in 010..012         x + 200
           013                   013
           014                   214
           015 012               215
           015 not-012           115
           x in 016..176         x
           177 x in 000..007     x + 200
           177 x in 010..012     x
           177 013               213
           177 x in 014..015     x
           177 x in 016..176     x + 200
           177 177               177
  of a carriage that doesn't go to a new line, so if there is one in a
  server file, it must be translated to something else.  When
  converting ASCII characters to NFILE characters, an 015 followed by
  an 012 therefore turns into a 215.  A stray CR is arbitrarily
  translated into a single M (115).














Greenberg & Keene [Page 82]

RFC 1037 NFILE - A File Access Protocol December 1987


                               APPENDIX B
                          RAW TRANSLATION MODE


  RAW mode means no translation should be performed.  In RAW mode the
  server operating system should treat the file as a character file and
  use the same data formatting that would be appropriate for a
  character file, but transfer the actual binary values of the
  character codes.






















Greenberg & Keene [Page 83]

RFC 1037 NFILE - A File Access Protocol December 1987


                               APPENDIX C
                      SUPER-IMAGE TRANSLATION MODE


  SUPER-IMAGE mode is intended for use by PDP-10 family machines only.
  It is included largely as an illustration of a system-dependent
  extension.  A server machine that has 8-bit bytes should treat
  SUPER-IMAGE mode the same as NORMAL mode.
  In this section, all numbers designating values of character codes
  are to be interpreted in octal.  The notation "x in c1..c2" means
  "for all character codes x such that c1 <= x <= c2."
  SUPER-IMAGE mode suppresses the use of the 177 character as an escape
  character.  Character translation should be done as in NORMAL mode,
  with one exception.  When a two-character sequence beginning with 177
  is detected, the 177 should not be output at all.
  In this section, all numbers designating values of character codes
  are to be interpreted in octal.  SUPER-IMAGE mode is intended for use
  by PDP-10 machines only.
  SUPER-IMAGE suppresses the use of Rubout for quoting.  That is, for
  each entry beginning with a 177 in the PDP-10 character column in the
  NORMAL translation table, the NFILE character has the 177 removed.
        TABLE 5.   SUPER-IMAGE TRANSLATION FROM NFILE TO ASCII


           NFILE character   PDP-10 character(s)


           x in 000..177     x
           x in 200..214     <x - 200>
           215               015 012
           x in 216..376     <x - 200>
           377               no corresponding code








Greenberg & Keene [Page 84]

RFC 1037 NFILE - A File Access Protocol December 1987


        TABLE 6.   SUPER-IMAGE TRANSLATION FROM ASCII TO NFILE


           PDP-10 character  NFILE character


           x in 000..007     x
           x in 010..012     x + 200
           013               013
           014               214
           015 012           215
           015 not-012       115
           x in <016..176>   x
           177               177



















Greenberg & Keene [Page 85]

RFC 1037 NFILE - A File Access Protocol December 1987


                                  NOTES
  1. NFILE's requirement for using the NFILE character set is
     recognized as a drawback for non-Symbolics machines.  A useful
     extension to NFILE would be a provision to make the character set
     negotiable.
  2. Implementation note:  Care must be taken that the freeing is done
     before the control connection is allowed to process another
     command, or else the control connection may find the data channel
     to be falsely indicated as being in use.
  3. The Symbolics operating system has the policy that whenever the
     user side is waiting for the server side, a user abort can occur.
     This user side waiting can occur in any context, such awaiting a
     response, waiting in the middle of reading network input, or
     waiting in the middle of transmitting network output.  Thus there
     are no "hung" states.
  4. Note that the Token List Transport Layer supplies a special token
     to indicate Boolean truth, but no corresponding token to indicate
     Boolean falsity.  NFILE uses an empty token list to indicate
     Boolean falsity.  The historical reason for this asymmetry is the
     inability of the Lisp language to differentiate between the empty
     list and NIL, which is traditionally used to mean Boolean falsity.
     If the flexibility of both a Boolean falsity and an empty token
     list were allowed, it would create problems for an operating
     system that cannot distinguish between the two.  This aspect of
     the protocol is recognized as a concession to the Lisp language.
     The unfortunate effect is to disallow operating systems to
     distinguish between Boolean falsity and an empty list.
  5. No so-called "fat strings" can be sent.










Greenberg & Keene [Page 86]