GENWiki

Premier IT Outsourcing and Support Services within the UK

User Tools

Site Tools


rfc:rfc1037

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:
  1. Reading and writing entire files
  2. Reading and writing selected portions of files
  3. Deleting and renaming files

Greenberg & Keene [Page 3] RFC 1037 NFILE - A File Access Protocol December 1987

  1. Creating links
  2. Listing, creating, and expunging directories
  3. Listing and changing the properties of files
  4. 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:
  1. The user side sends NFILE commands.
  2. The server sends command responses.
  3. The server sends "notifications" and "asynchronous errors".

See the section "NFILE Errors and Notifications", section 10.

  1. 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
  1. —————————————————————
  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
  1. ———————————————————–
    UNIX            /usr/max/life.c
    TOPS-20         ps:<max>life.bin.17
    VMS             MACD:[MAX]LIFE.FOR;3
    Symbolics LMFS  >max>life.lisp.newest
  1. ———————————————————–
 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
  1. ———————————————————–
    UNIX            /usr/max/
    TOPS-20         <max>
    VMS             MACD:[MAX]
    Symbolics LMFS  >max>hacks>
  1. ———————————————————–

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
  1. —————————————————————
  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
  1. —————————————————————
 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

  1. 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.
  1. 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.
  1. The ABORT command is issued, causing data channels to be

made unsafe.

  1. 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:
  1. 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:
  1. Are not related to any specific command
  2. Are associated with an erring data channel
  3. 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:
  1. Are not associated with an error
  2. Are sent at the server's discretion
  3. 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:
  1. The entire file system is full.
  2. The particular volume involved is full.
  3. The particular directory involved is full.
  4. 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:
  1. 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.
  1. 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.
  1. 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.
  1. 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:
  1. Lisp strings are represented as data tokens in the NFILE

character set. Only 8-bit strings can be sent <5>.

  1. 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.
  1. T is represented as BOOLEAN-TRUTH.
  1. NIL is represented as the empty token list.
  1. 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.
  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:
  1. Data is sent in the format of loose data tokens, not

contained in token lists.

  1. The keyword token EOF indicates that the end of data has

been reached.

  1. Token lists can be transmitted through the token list

data stream.

  1. No loose tokens other than data tokens or the keyword

token EOF can be sent.

  1. 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.
  1. 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.
  1. 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.
  1. The character set to be used for file transfer could be made

negotiable.

  1. The command character set could be made negotiable.

Currently there is no negotiation sequence, but one could be

         added.
  1. 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.
  1. 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.
  1. 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:
  1. A file containing characters in the NFILE character set can

be written to any NFILE server and read back intact

         (containing the same characters).
  1. 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]

/data/webs/external/dokuwiki/data/pages/rfc/rfc1037.txt · Last modified: 1987/12/17 19:07 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki