mirror of
https://github.com/PDP-10/its.git
synced 2026-02-28 17:29:10 +00:00
4819 lines
188 KiB
Plaintext
Executable File
4819 lines
188 KiB
Plaintext
Executable File
|
||
|
||
|
||
|
||
|
||
|
||
Network Working Group B. Greenberg
|
||
Request for Comments: 1037 S. Keene
|
||
December 1987
|
||
|
||
|
||
NFILE - A File Access Protocol
|
||
|
||
|
||
STATUS OF THIS MEMO
|
||
|
||
This document includes a specification of the NFILE file access
|
||
protocol and its underlying levels of protocol, the Token List
|
||
Transport Layer and Byte Stream with Mark. The goal of this
|
||
specification is to promote discussion of the ideas described here,
|
||
and to encourage designers of future file protocols to take advantage
|
||
of these ideas. A secondary goal is to make the specification
|
||
available to sites that might benefit from implementing NFILE. The
|
||
distribution of this document is unlimited.
|
||
|
||
TABLE OF CONTENTS
|
||
Page
|
||
1. INTRODUCTION 3
|
||
|
||
2. NFILE PROTOCOL LAYERING 4
|
||
|
||
3. OVERVIEW OF AN NFILE SESSION 5
|
||
|
||
4. NFILE CONTROL AND DATA CONNECTIONS 6
|
||
|
||
5. NFILE FILE OPENING MODES 7
|
||
|
||
6. NFILE CHARACTER SET 9
|
||
|
||
7. CONVENTIONS USED IN THIS DOCUMENT 10
|
||
|
||
7.1 Mapping Data Types Into Token List Representation 10
|
||
7.2 Format of NFILE Commands and Responses 10
|
||
7.3 Data Channel Handles and Direct File Identifiers 13
|
||
7.4 Syntax of File and Directory Pathname Arguments 13
|
||
7.5 Format of NFILE File Property/Value Pairs 14
|
||
|
||
8. NFILE COMMANDS 16
|
||
|
||
8.1 ABORT Command 16
|
||
8.2 CHANGE-PROPERTIES Command 16
|
||
8.3 CLOSE Command 17
|
||
8.4 COMPLETE Command 19
|
||
8.5 CONTINUE Command 20
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 1]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
8.6 CREATE-DIRECTORY Command 21
|
||
8.7 CREATE-LINK Command 21
|
||
8.8 DATA-CONNECTION Command 22
|
||
8.9 DELETE Command 23
|
||
8.10 DIRECT-OUTPUT Command 23
|
||
8.11 DIRECTORY Command 24
|
||
8.11.1 NFILE DIRECTORY Data Format 26
|
||
8.12 DISABLE-CAPABILITIES Command 27
|
||
8.13 ENABLE-CAPABILITIES Command 28
|
||
8.14 EXPUNGE Command 28
|
||
8.15 FILEPOS Command 29
|
||
8.15.1 Implementation Hint for FILEPOS Command 30
|
||
8.16 FINISH Command 30
|
||
8.17 HOME-DIRECTORY Command 31
|
||
8.18 LOGIN Command 32
|
||
8.19 MULTIPLE-FILE-PLISTS Command 34
|
||
8.20 OPEN Command 35
|
||
8.20.1 NFILE OPEN Optional Keyword/Value Pairs 39
|
||
8.20.2 NFILE OPEN Response Return Values 45
|
||
8.21 PROPERTIES Command 47
|
||
8.22 READ Command 49
|
||
8.23 RENAME Command 50
|
||
8.24 RESYNCHRONIZE-DATA-CHANNEL Command 51
|
||
8.24.1 Implementation Hints for RESYNCHRONIZE-DATA- 51
|
||
CHANNEL Command
|
||
8.25 UNDATA-CONNECTION Command 52
|
||
|
||
9. NFILE RESYNCHRONIZATION PROCEDURE 53
|
||
|
||
9.1 NFILE Control Connection Resynchronization 54
|
||
9.2 NFILE Data Connection Resynchronization 55
|
||
|
||
10. NFILE ERRORS AND NOTIFICATIONS 58
|
||
|
||
10.1 Notifications From the NFILE Server 58
|
||
10.2 NFILE Command Response Errors 59
|
||
10.3 NFILE Asynchronous Errors 60
|
||
10.4 NFILE Three-letter Error Codes 61
|
||
|
||
11. TOKEN LIST TRANSPORT LAYER 65
|
||
|
||
11.1 Introduction to the Token List Transport Layer 65
|
||
11.2 Token List Stream 66
|
||
11.2.1 Types of Tokens and Token Lists 66
|
||
11.2.2 Token List Stream Example 68
|
||
11.2.3 Mapping of Lisp Objects to Token List Stream 70
|
||
Representation
|
||
11.2.4 Aborting and the Token List Stream 71
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 2]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
11.3 Token List Data Stream 72
|
||
|
||
12. BYTE STREAM WITH MARK 73
|
||
|
||
12.1 Discussion of Byte Stream with Mark 73
|
||
12.2 Byte Stream with Mark Abortable States 75
|
||
|
||
13. POSSIBLE FUTURE EXTENSIONS 77
|
||
|
||
APPENDIX A. NORMAL TRANSLATION MODE 79
|
||
|
||
APPENDIX B. RAW TRANSLATION MODE 83
|
||
|
||
APPENDIX C. SUPER-IMAGE TRANSLATION MODE 84
|
||
|
||
NOTES 86
|
||
|
||
LIST OF TABLES
|
||
|
||
TABLE 1. TRANSLATIONS FROM NFILE CHARACTERS TO UNIX CHARACTERS 80
|
||
TABLE 2. TRANSLATIONS FROM UNIX CHARACTERS TO NFILE CHARACTERS 80
|
||
TABLE 3. TRANSLATIONS FROM NFILE TO PDP-10 CHARACTERS 81
|
||
TABLE 4. TRANSLATIONS FROM PDP-10 CHARACTERS TO NFILE 82
|
||
CHARACTERS
|
||
TABLE 5. SUPER-IMAGE TRANSLATION FROM NFILE TO ASCII 84
|
||
TABLE 6. SUPER-IMAGE TRANSLATION FROM ASCII TO NFILE 85
|
||
|
||
1. INTRODUCTION
|
||
|
||
NFILE stands for "New File Protocol". NFILE was originally designed
|
||
as a replacement for an older protocol named QFILE, with the goal of
|
||
solving robustness problems of QFILE, hence the name "New File
|
||
Protocol".
|
||
|
||
NFILE was designed and implemented at Symbolics by Bernard S.
|
||
Greenberg. Mike McMahon made important contributions, especially in
|
||
the design and implementation of the Byte Stream with Mark and Token
|
||
List Transport layers. NFILE has been used successfully for file
|
||
access between Symbolics computers since 1985. NFILE servers have
|
||
been written for UNIX hosts as well. NFILE is intended for use by
|
||
any type of file system, not just the native Symbolics file system.
|
||
|
||
NFILE is a file access protocol that supports a large set of
|
||
operations on files and directories on remote systems, including:
|
||
|
||
- Reading and writing entire files
|
||
- Reading and writing selected portions of files
|
||
- Deleting and renaming files
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 3]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
- Creating links
|
||
- Listing, creating, and expunging directories
|
||
- Listing and changing the properties of files
|
||
- Enabling and disabling access capabilities on a remote
|
||
host
|
||
|
||
NFILE supports file transfer of binary or character files.
|
||
|
||
The NFILE server provides information about any errors that occur in
|
||
the course of a command. In addition, NFILE has a robust scheme for
|
||
handling aborts on the user side.
|
||
|
||
This specification defines NFILE user version 2 and server version 2.
|
||
We do not envision NFILE as an unchanging protocol, but rather as a
|
||
protocol that could continue to develop if additional requirements
|
||
are identified though the process of this Request for Comments. The
|
||
design of NFILE makes room for various useful extensions. Some of
|
||
the extensions that we are considering are described later on in this
|
||
document: See the section "Possible Future Extensions", section 13.
|
||
|
||
2. NFILE PROTOCOL LAYERING
|
||
|
||
NFILE is a layered file protocol. The layers are:
|
||
|
||
+-----------------------------------------------+
|
||
|client program or user interface |
|
||
+-----------------------------------------------+
|
||
|NFILE |
|
||
+-----------------------------------------------+
|
||
|Token List Transport Layer |
|
||
+-----------------------------------------------+
|
||
|Byte Stream with Mark |
|
||
+-----------------------------------------------+
|
||
|reliable host-host byte transmission protocol |
|
||
+-----------------------------------------------+
|
||
|
||
Byte Stream with Mark is a simple protocol that guarantees that an
|
||
out-of-band signal can be transmitted in the case of program
|
||
interruption. Byte Stream with Mark is to be layered upon extant
|
||
byte stream protocols. An important goal of the NFILE design was
|
||
that NFILE could be built on any byte stream. It is currently
|
||
implemented on TCP and Chaosnet. See the section "Byte Stream with
|
||
Mark", section 12.
|
||
|
||
The Token List Transport Layer is a protocol that facilitates the
|
||
transmission of simple structured data, such as lists. See the
|
||
section "Token List Transport Layer", section 11.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 4]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The NFILE commands and command responses are transmitted in "token
|
||
lists". See the section "NFILE Commands", section 8.
|
||
|
||
This specification does not include a client program or user
|
||
interface to the protocol. In the Symbolics implementation, the
|
||
normal file operations transparently invoke NFILE, when the remote
|
||
host is known to support NFILE. Another possible interface to NFILE
|
||
would be through a dedicated client program that would issue NFILE
|
||
commands in response to explicit requests by the user.
|
||
|
||
3. OVERVIEW OF AN NFILE SESSION
|
||
|
||
An NFILE session is a dialogue between two hosts. The host that
|
||
initiates the NFILE session is known as the "user side", and the
|
||
other host is the "server side". The user side sends all NFILE
|
||
commands. The server receives each command, processes it, and
|
||
responds to it, indicating the success or failure of the command.
|
||
|
||
The user side keeps track of commands sent and command responses
|
||
received by using "transaction identifiers" to identify each command.
|
||
The user side generates a transaction identifier (which must be
|
||
unique per this dialogue) for each command, and sends the transaction
|
||
identifier to the server along with the command. Each NFILE server
|
||
response includes the transaction identifier of the command with
|
||
which the response is associated. The server is not required to
|
||
respond to commands in the same order that the user gave them.
|
||
|
||
The user side sends NFILE commands over a bidirectional network
|
||
connection called the "control connection". The server sends its
|
||
command responses on the same control connection. The control
|
||
connection governing the NFILE session is established at the
|
||
beginning of the session. If the control connection is ever broken,
|
||
the NFILE session is ended.
|
||
|
||
Whereas NFILE commands and responses are transmitted on the control
|
||
connection, file data is transferred over "data channels". An "input
|
||
data channel" transfers data from server to user. An "output data
|
||
channel" transfers data from user to server. Each input data channel
|
||
is associated with an output data channel; together these two
|
||
channels comprise a "data connection".
|
||
|
||
Often more than one NFILE activity is occurring at any given time.
|
||
For example, several files can be open and transferring data
|
||
simultaneously; one or more commands can be in process at the same
|
||
time; and the server can be simultaneously transmitting directory
|
||
lists and processing further commands. This happens in an
|
||
implementation in which the user side has multiple processes, and
|
||
several processes share a single NFILE server.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 5]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
4. NFILE CONTROL AND DATA CONNECTIONS
|
||
|
||
The user and server communicate through a single control connection
|
||
and a set of data connections. Data connections are established and
|
||
disestablished by NFILE commands. The user side sends NFILE commands
|
||
to the server over the control connection. The server responds to
|
||
every user command over this control connection. The actual file
|
||
data is transmitted over the data connections.
|
||
|
||
User aborts can disrupt the normal flow of data on the control
|
||
connection and data connections. An important aspect of any file
|
||
protocol is the way it handles user aborts. NFILE uses a
|
||
resynchronization procedure to bring the affected control connection
|
||
or data channel from an unknown, unsafe state into a known state.
|
||
After resynchronization, the control connection or data channel can
|
||
be reused. See the section "NFILE Resynchronization Procedure",
|
||
section 9.
|
||
|
||
THE CONTROL CONNECTION
|
||
|
||
An NFILE session is begun when the NFILE user program connects to a
|
||
remote host and establishes a network connection. This initial
|
||
connection is the control conection of the dialogue. If TCP is used
|
||
as the underlying protocol, contact NFILE's well-known port, 59. If
|
||
Chaos is used, use the contact name "NFILE".
|
||
|
||
The control connection is the vehicle used by the user to send its
|
||
commands, and the server to send its command responses. These types
|
||
of communication occur over the NFILE control connection:
|
||
|
||
- The user side sends NFILE commands.
|
||
- The server sends command responses.
|
||
- The server sends "notifications" and "asynchronous errors".
|
||
See the section "NFILE Errors and Notifications", section 10.
|
||
- During resynchronization (a special circumstance) either the
|
||
user or server sends a mark.
|
||
|
||
All commands, command responses, and other data flowing over the
|
||
NFILE control connection are transmitted in the format of "top-level
|
||
token lists". The control connection expects never to receive "loose
|
||
tokens"; that is, tokens not contained in token lists.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 6]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
DATA CONNECTIONS
|
||
|
||
Data connections are established and discarded at user request, by
|
||
means of two NFILE commands: DATA-CONNECTION and UNDATA-CONNECTION.
|
||
Each data connection is associated with a specific control
|
||
connection, which is the same control connection that caused the data
|
||
connection to be established.
|
||
|
||
Each data connection is composed of two "data channels". Each data
|
||
channel is capable of sending data in one direction. The term "input
|
||
channel" refers to the data channel that transmits data from the
|
||
server to the user side; "output channel" refers to the data channel
|
||
that transmits data from the user to the server side. Throughout the
|
||
NFILE documentation, the terms "input channel" and "output channel"
|
||
are seen from the perspective of the user side. A single data
|
||
channel can be used for one data transfer after another.
|
||
|
||
The format of the data transferred on the data channels is defined as
|
||
a "token list data stream". See the section "Token List Data
|
||
Stream", section 11.3. When the end of data is reached, the keyword
|
||
token EOF is sent. Occasionally, token lists are transmitted over
|
||
the data channels, such as asynchronous error descriptions.
|
||
|
||
5. NFILE FILE OPENING MODES
|
||
|
||
The NFILE OPEN command opens a file for reading, writing, or "direct
|
||
access" at the server host. That means, in general, asking the host
|
||
file system to access the file and obtaining a file number, pointer,
|
||
or other quantity for subsequent rapid access to the file; this is
|
||
called an "opening". The term "opening" translates to a file stream
|
||
in Symbolics terminology, a JFN in TOPS-20 terminology, and a file
|
||
descriptor in UNIX terminology. An opening usually keeps track of
|
||
how many bytes have been read or written, and other bookkeeping
|
||
information.
|
||
|
||
NFILE supports two ways of transferring file data, "data stream mode"
|
||
and "direct access mode". A single mode is associated with each
|
||
opening. Note that an NFILE dialogue can have more than one opening,
|
||
and thus use both modes.
|
||
|
||
DATA STREAM MODE:
|
||
|
||
Data stream mode of file transfer is the default mode of NFILE's OPEN
|
||
command. Data stream mode is appropriate when the entire file is
|
||
transferred, either from user to server, or from server to user.
|
||
Data stream mode is used more often than direct access mode.
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 7]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The OPEN command includes a "handle" argument, which identifies the
|
||
data channel to be used to transfer the data. The handle is used in
|
||
subsequent commands to reference this particular opening. When a
|
||
data stream opening is requested with the OPEN command, the file is
|
||
opened and the data begins to flow immediately.
|
||
|
||
The sending side transmits the entire contents of the specified file
|
||
over the specified data channel as rapidly as the network permits.
|
||
When the sending side reaches the end of the file, it transmits a
|
||
special control token to signal end of file. The receiving side
|
||
expects an uninterrupted stream of bytes to appear immediately on its
|
||
side of the data channel.
|
||
|
||
The user gives the CLOSE command to terminate a data stream transfer.
|
||
CLOSE results in closing the file.
|
||
|
||
DIRECT ACCESS MODE:
|
||
|
||
Direct access mode enables reading or writing data from a given
|
||
starting point in a file through a specified number of bytes. In
|
||
direct access mode, data is requested and sent in individual
|
||
transactions. To request a direct access mode opening, the OPEN
|
||
command is used with a DIRECT-FILE-ID argument. (In data stream
|
||
mode, no DIRECT-FILE-ID is supplied.) The direct file identifier is
|
||
used in subsequent commands to reference the direct access opening.
|
||
|
||
When a file is opened in direct access mode, the flow of data does
|
||
not start immediately. Rather, the user gives either a READ command
|
||
(to request data to flow from server to user) or a DIRECT-OUTPUT
|
||
command (to request data to flow from user to server). When reading,
|
||
the READ command allows the user to specify the starting point and
|
||
the number of bytes of data to transfer. When writing, the FILEPOS
|
||
command can be used to specify the starting point, before the
|
||
DIRECT-OUTPUT command is given. The user can give many READ and
|
||
DIRECT-OUTPUT commands, one after another.
|
||
|
||
The user side terminates the direct access transfer by using the
|
||
CLOSE command. The ABORT command can be given to terminate without
|
||
transmitting all of the specified bytes.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 8]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
6. NFILE CHARACTER SET
|
||
|
||
The NFILE character set <1> is an extension of standard ASCII. NFILE
|
||
command and response names use only the standard ASCII characters.
|
||
However, the protocol supports the transfer of the non-ASCII
|
||
characters in the NFILE character set; these characters might be
|
||
stored in files, or might be used in pathnames.
|
||
|
||
Servers on machines that do not natively use the NFILE character set
|
||
must perform character set translations for character openings,
|
||
depending on the requested translation mode. No translation is
|
||
required for binary openings. There are three translation modes for
|
||
character openings: NORMAL, RAW, and SUPER-IMAGE. Each mode
|
||
specifies a way to translate between the server's native set and the
|
||
NFILE character set.
|
||
|
||
NORMAL mode is the default of the OPEN command. The translation for
|
||
NORMAL mode ensures that a file containing characters in the NFILE
|
||
character set can be written to a remote host and read back intact.
|
||
OPEN has optional keyword arguments to specify RAW or SUPER-IMAGE.
|
||
RAW mode means to perform no translation whatsoever. SUPER-IMAGE
|
||
mode is intended for use by PDP-10 family machines only. It is
|
||
included largely as an illustration of a system-dependent extension.
|
||
|
||
The details of each translation mode are given in Appendices:
|
||
|
||
See the section "NORMAL Translation Mode", Appendix A. See the
|
||
section "RAW Translation Mode", Appendix B. See the section
|
||
"SUPER-IMAGE Translation Mode", Appendix C.
|
||
|
||
The use of the NFILE character set brings up a difficulty involved
|
||
with determining an exact position within a character file. Some
|
||
NFILE characters expand to more than one native character on some
|
||
servers. Thus, for character files, when we speak of a given
|
||
position in a file or the length of a file, we must specify whether
|
||
we are speaking in "NFILE units" or "server units", because the
|
||
counting of characters is different. This causes major problems in
|
||
file position reckoning for character files. Specifically, it is
|
||
futile for a user side to carefully monitor file position during
|
||
output by counting characters, when character translation is in
|
||
effect. The server's operating system interface for "position to
|
||
point x in a file" necessarily operates in server units, but the user
|
||
side has counted in NFILE units. The user side cannot try to
|
||
second-guess the translation-counting process without losing host-
|
||
independence. See the section "FILEPOS NFILE Command".
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 9]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
7. CONVENTIONS USED IN THIS DOCUMENT
|
||
|
||
7.1 Mapping Data Types Into Token List Representation
|
||
|
||
Throughout this NFILE specification, the data types of arguments,
|
||
return values, asynchronous error descriptions, and notifications are
|
||
described as being strings, integers, dates, time intervals, and so
|
||
on. However, each conceptual data type must be mapped into the
|
||
appropriate token list representation for transmission. The mapping
|
||
of conceptual data types to token list representation is shown here:
|
||
|
||
Conceptual Type Token List Representation
|
||
|
||
----------------------------------------------------------------
|
||
|
||
Keyword A keyword token
|
||
|
||
Keyword list A token list of keyword tokens
|
||
|
||
Integer A numeric data token
|
||
|
||
String A data token containing the characters of the
|
||
string in the NFILE character set.
|
||
|
||
Boolean Truth The token known as BOOLEAN-TRUTH.
|
||
|
||
Boolean False The empty token list.
|
||
|
||
Date A numeric data token. The date is expressed in
|
||
Universal Time format, which measures a time as
|
||
the number of seconds since January 1, 1900, at
|
||
midnight GMT.
|
||
|
||
Date-or-never Can be either a date or the empty token list,
|
||
representing "never". "Never" is used for
|
||
values such as the time a directory was last
|
||
expunged, if it has never been expunged.
|
||
|
||
Time interval A numeric data token. The time interval is
|
||
expressed in seconds. A time interval
|
||
indicating "never" is represented by the empty
|
||
token list.
|
||
|
||
7.2 Format of NFILE Commands and Responses
|
||
|
||
Each command description begins by giving the command format and
|
||
response format. Here is the beginning of the DATA-CONNECTION
|
||
command description:
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 10]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Command: (DATA-CONNECTION tid new-input-handle new-output-handle)
|
||
|
||
Response: (DATA-CONNECTION tid connection-identifier)
|
||
|
||
The command descriptions follow these conventions:
|
||
|
||
1. NFILE commands and responses are transmitted as top-level token
|
||
lists.
|
||
|
||
Top-level token lists are enclosed in parentheses in these
|
||
command descriptions. These parentheses are not sent literally
|
||
across the control or data connections, but are a shorthand
|
||
representation of special control tokens that delimit top-level
|
||
token lists. Specifically, TOP-LEVEL-LIST-BEGIN starts a top-
|
||
level token list; TOP-LEVEL-LIST-END ends a top-level token list.
|
||
|
||
2. NFILE command names are keywords.
|
||
|
||
The command name is required in every command and command
|
||
response. All NFILE command names are keywords. Keywords appear
|
||
in the NFILE documentation as their names in uppercase. For
|
||
example, DATA-CONNECTION and DELETE are two command names.
|
||
|
||
3. A unique transaction identifier (tid) identifies each command.
|
||
|
||
The transaction identifier is a string made up by the user side
|
||
to identify this particular transaction, which is composed of the
|
||
command and the response associated with this command. The
|
||
transaction identifier is abbreviated in the command descriptions
|
||
as tid. Transaction identifiers are limited to fifteen
|
||
characters in length. The transaction identifier is required in
|
||
every command and command response.
|
||
|
||
OPTIONAL ARGUMENTS
|
||
|
||
Many NFILE commands have "optional arguments". Optional arguments
|
||
can be supplied (with appropriate values), or left out. If optional
|
||
arguments are left out, their omission must be made explicit by means
|
||
of substituting the empty token list in their place. The only
|
||
exception to that rule is for trailing optional arguments or return
|
||
values, which can be omitted without including the empty token list.
|
||
|
||
For example, the text of the DELETE command description explains that
|
||
either a handle or a pathname must be supplied, but not both;
|
||
therefore, one of them is an optional argument. Here is the command
|
||
format of DELETE:
|
||
|
||
(DELETE tid handle pathname)
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 11]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
If you supply a handle and no pathname, the command format is:
|
||
|
||
(DELETE tid handle)
|
||
|
||
If you supply a pathname and no handle, the command format is:
|
||
|
||
(DELETE tid empty-token-list pathname)
|
||
|
||
The empty token list in the token list stream appears as a LIST-BEGIN
|
||
followed immediately by a LIST-END.
|
||
|
||
OPTIONAL KEYWORD/VALUE PAIRS
|
||
|
||
Four NFILE commands have "optional keyword/value pairs". These
|
||
commands are: COMPLETE, LOGIN, OPEN, and READ. Optional
|
||
keyword/value pairs can be either included in the command or omitted
|
||
entirely. There is no need to substitute the empty token list for
|
||
ommitted optional keyword tokens, unlike optional arguments. The
|
||
order of the option keyword/value pairs is not significant.
|
||
|
||
If included, optional keyword/value pairs are a sequence of
|
||
alternating keywords and values. The values associated with the
|
||
keywords can be keywords, lists, strings, Booleans, integers, dates,
|
||
date-or-never's, and time intervals. The text of each command
|
||
description states what type of value is appropriate for each
|
||
optional keyword.
|
||
|
||
Optional keyword/value pairs appear in the text as the keyword only,
|
||
in uppercase letters. For example, here is the format of the LOGIN
|
||
command:
|
||
|
||
Command Format:
|
||
|
||
(LOGIN tid user password FILE-SYSTEM USER-VERSION)
|
||
|
||
FILE-SYSTEM and USER-VERSION are two optional keywords associated
|
||
with the LOGIN command. The user side can supply USER-VERSION, and
|
||
omit FILE-SYSTEM as shown in this example:
|
||
|
||
(LOGIN x105 tjones let-me-in USER-VERSION 2)
|
||
|
||
As seen above, the optional keyword/value pair USER-VERSION, if
|
||
supplied in a command, consists of the keyword USER-VERSION followed
|
||
by the value to be used for that keyword (in this example, 2).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 12]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
7.3 Data Channel Handles and Direct File Identifiers
|
||
|
||
Several NFILE commands require an argument that specifies an opening.
|
||
This kind of argument is called a handle in the command description.
|
||
It is always a string type argument. A handle can be either a data
|
||
channel handle or a direct file identifier, depending on the mode of
|
||
the opening:
|
||
|
||
|
||
Data Stream
|
||
|
||
The handle must identify a data channel that is bound to an opening.
|
||
|
||
Direct Access
|
||
|
||
In general, the handle must be a direct file identifier. A direct
|
||
file identifier specifies a direct access opening. It is the same as
|
||
the value supplied in the DIRECT-FILE-ID keyword/value pair in the
|
||
OPEN command. It is used for all operations that identify an opening
|
||
rather than a data channel.
|
||
|
||
Two NFILE commands applicable to direct access openings are
|
||
exceptions to the general rule. The handle supplied in ABORT and
|
||
CONTINUE cannot be a direct file identifier, but must be a data
|
||
channel handle instead.
|
||
|
||
7.4 Syntax of File and Directory Pathname Arguments
|
||
|
||
Some arguments and return values in the NFILE command descriptions
|
||
represent file pathnames. These are strings in the pathname syntax
|
||
native to the server host. These pathnames contain no host
|
||
identifiers of any kind. These pathnames must be fully defaulted, in
|
||
the sense that they have a directory and file name (and file type, if
|
||
the server operating system supports file types). If appropriate, a
|
||
device is referenced in the pathname. If the server file system
|
||
supports version numbers, there is always an explicit version number,
|
||
even if that number or other specification is that system's
|
||
representation of "newest" or "oldest".
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 13]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Here are some examples of file pathnames, for different server hosts:
|
||
|
||
Server Host Example of File Pathname
|
||
|
||
------------------------------------------------------------
|
||
|
||
UNIX /usr/max/life.c
|
||
|
||
TOPS-20 ps:<max>life.bin.17
|
||
|
||
VMS MACD:[MAX]LIFE.FOR;3
|
||
|
||
Symbolics LMFS >max>life.lisp.newest
|
||
|
||
------------------------------------------------------------
|
||
|
||
The CREATE-DIRECTORY and HOME-DIRECTORY commands take a directory as
|
||
an argument. In NFILE commands, a directory is represented by a
|
||
string that names the directory. In most cases this string is in the
|
||
syntax native to the server host. However in some cases the native
|
||
format is modified somewhat to clarify that the string names a
|
||
directory, and not a file. For example, a directory on UNIX is
|
||
represented by "/usr/max/", not "/usr/max".
|
||
|
||
Here are some examples of directory pathnames for different server
|
||
hosts:
|
||
|
||
Server Host Example of Directory Pathname
|
||
|
||
------------------------------------------------------------
|
||
|
||
UNIX /usr/max/
|
||
|
||
TOPS-20 <max>
|
||
|
||
VMS MACD:[MAX]
|
||
|
||
Symbolics LMFS >max>hacks>
|
||
|
||
------------------------------------------------------------
|
||
|
||
7.5 Format of NFILE File Property/Value Pairs
|
||
|
||
Several NFILE commands request information regarding the properties
|
||
of files or directories. These commands include: DIRECTORY,
|
||
MULTIPLE-FILE-PLISTS, PROPERTIES, and CHANGE-PROPERTIES. This
|
||
section describes how file property information is conveyed over the
|
||
token list stream.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 14]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
File property information is usually sent in property/value pairs,
|
||
where the property identifies the property, and the following value
|
||
gives the value of that property for the specified file.
|
||
|
||
Each property is denoted either by a keyword or an integer. You can
|
||
mix both ways of specifying properties (keyword or integer) within a
|
||
single description. An integer is interpreted as an index into the
|
||
Property Index Table, an array of property keywords. The server can
|
||
optionally send a Property Index Table to the user during the
|
||
execution of the LOGIN command, although it is not required. This
|
||
greatly reduces the length of transmissions.
|
||
|
||
In command arguments, file properties cannot be specified with
|
||
integers; keywords must be used to specify file properties in command
|
||
arguments. Integers can be used to denote file properties only in
|
||
command responses.
|
||
|
||
We now list the keywords associated with file properties. This list
|
||
is not intended to be restrictive. If a programmer implementing
|
||
NFILE needs a new keyword, a new keyword (not on this list) can be
|
||
invented. The type of value of any new keywords is by default
|
||
string. The keywords are sorted here by conceptual data type:
|
||
|
||
Data type Keywords denoting file properties
|
||
|
||
----------------------------------------------------------------
|
||
|
||
Integers BLOCK-SIZE, BYTE-SIZE, GENERATION-RETENTION-COUNT,
|
||
LENGTH-IN-BLOCKS, LENGTH-IN-BYTES,
|
||
DEFAULT-GENERATION-RETENTION-COUNT
|
||
|
||
Dates CREATION-DATE, MODIFICATION-DATE
|
||
|
||
Date-or-never's REFERENCE-DATE, INCREMENTAL-DUMP-DATE,
|
||
COMPLETE-DUMP-DATE, DATE-LAST-EXPUNGED,
|
||
EXPIRATION-DATE
|
||
|
||
Time intervals AUTO-EXPUNGE-INTERVAL
|
||
|
||
Keyword Lists SETTABLE-PROPERTIES, LINK-TRANSPARENCIES,
|
||
DEFAULT-LINK-TRANSPARENCIES
|
||
|
||
Boolean values DELETED, DONT-DELETE, DONT-DUMP, DONT-REAP,
|
||
SUPERSEDE-PROTECT, NOT-BACKED-UP, OFFLINE,
|
||
TEMPORARY, CHARACTERS, DIRECTORY
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 15]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Strings ACCOUNT, AUTHOR, LINK-TO, PHYSICAL-VOLUME,
|
||
PROTECTION, VOLUME-NAME, PACK-NUMBER, READER,
|
||
DISK-SPACE-DESCRIPTION, and any keywords not
|
||
on this list
|
||
|
||
Note that these keyword names are intended to imply the semantics of
|
||
the properties. For a discussion of the semantics of CREATION-DATE:
|
||
See the section "NFILE OPEN Response Return Values", section 8.20.2.
|
||
The "Reference Guide to Streams, Files, and I/O" in the Symbolics
|
||
documentation set details the semantics that Symbolics associates
|
||
with these properties.
|
||
|
||
8. NFILE COMMANDS
|
||
|
||
It is important to understand the conventions used in each of the
|
||
following command descriptions. See the section "Conventions Used in
|
||
This Document", section 7.
|
||
|
||
8.1 ABORT Command
|
||
|
||
Command: (ABORT tid input-handle)
|
||
|
||
Response: (ABORT tid)
|
||
|
||
ABORT cleanly interrupts and prematurely terminates a single direct
|
||
access mode data transfer initiated with READ. The required input-
|
||
handle string argument identifies a data channel on which an input
|
||
transfer is currently taking place; this must be a direct access
|
||
transfer. input-handle must identify a data channel; it cannot be a
|
||
direct file identifier.
|
||
|
||
Upon receiving the ABORT command, the server checks to see if a
|
||
transfer is still active on that channel. If so, the server
|
||
terminates the transfer by telling the data connection logical
|
||
process to stop transferring bytes of data. The user side needs to
|
||
issue this command only when there are outstanding unread bytes.
|
||
This excludes the case of the data channel having been disestablished
|
||
or reallocated by the user side.
|
||
|
||
Whether or not a transfer is active on that channel, the user side
|
||
puts the data channel into the unsafe state. Before the data channel
|
||
can be used again, it must be resynchronized.
|
||
|
||
8.2 CHANGE-PROPERTIES Command
|
||
|
||
Command: (CHANGE-PROPERTIES tid handle pathname property-pairs)
|
||
|
||
Response: (CHANGE-PROPERTIES tid)
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 16]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
CHANGE-PROPERTIES changes one or more properties of a file. Either a
|
||
handle or a pathname must be given, but not both. Whichever one is
|
||
given must be supplied as a string. handle identifies a data channel
|
||
that is bound to an open file; it can be a direct file identifier.
|
||
pathname identifies a file on the server machine.
|
||
|
||
property-pairs is a required token list of keyword/value pairs, where
|
||
the name of the property to be changed is the keyword, and the
|
||
desired new property value is the value.
|
||
|
||
The properties that can be changed are host-dependent, as are any
|
||
restrictions on the values of those properties. The properties that
|
||
can be changed are the same as those returned as settable-properties,
|
||
in the command response for the PROPERTIES command.
|
||
|
||
The server tries to modify all the properties listed in property-
|
||
pairs to the desired new values. There is currently no definition
|
||
about what should be done if the server can successfully change some
|
||
properties but not others.
|
||
|
||
For further information on file property keywords and associated
|
||
values: See the section "Format of NFILE File Property/Value Pairs",
|
||
section 7.5.
|
||
|
||
8.3 CLOSE Command
|
||
|
||
Command: (CLOSE tid handle abort-p)
|
||
|
||
Response: (CLOSE tid truename binary-p other-properties)
|
||
|
||
CLOSE terminates a data transfer, and frees a data channel. The
|
||
handle must be a data channel handle for a data stream opening, or a
|
||
direct file identifier for a direct access opening. If a data
|
||
channel is given, a transfer must be active on that handle. If
|
||
abort-p is supplied as Boolean truth, the file is close-aborted, as
|
||
described below.
|
||
|
||
"Closing the file" has different implications specific to each
|
||
operating system. It generally implies invalidation of the pointer
|
||
or logical identifier obtained from the operating system when the
|
||
file was "opened", and freeing of operating system and/or job
|
||
resources associated with active file access. For output files, it
|
||
involves ensuring that every last bit sent by the user has been
|
||
successfully written to disk. The server should not send a
|
||
successful response until all these things have completed
|
||
successfully.
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 17]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
In either data stream or direct access mode, the user can request the
|
||
server to close-abort the file, instead of simply closing it. To
|
||
close-abort a file means to close it in such a way, if possible, that
|
||
it is as if the file had never been opened. In the specific case of
|
||
a file being created, it must appear as if the file had never been
|
||
created. This might be more difficult to implement on certain
|
||
operating systems than others, but tricks with temporary names and
|
||
close-time renamings by the server can usually be used to implement
|
||
close-abort in these cases. In the case of a file being appended to,
|
||
close-abort means to forget the appended data.
|
||
|
||
AN UNSUCCESSFUL CLOSE OPERATION
|
||
|
||
For the normal CLOSE operation (not a close-abort), after writing
|
||
every last bit sent by the user to disk, and before closing the file,
|
||
the server checks the data channel specified by handle to see if an
|
||
asynchronous error is outstanding on that channel. That is, the
|
||
server must determine whether it has sent an asynchronous error
|
||
description to the user, to which the user has not yet responded with
|
||
a CONTINUE command. If so, the server is unable to close the file,
|
||
and therefore sends a command error response indicating that an error
|
||
is pending on the channel. The appropriate three-letter error code
|
||
is EPC. See the section "NFILE Errors and Notifications", section
|
||
10.
|
||
|
||
A SUCCESSFUL CLOSE OPERATION
|
||
|
||
The return values for OPEN and CLOSE are syntactically identical, but
|
||
the values might change between the time of the file being opened and
|
||
when it is closed. For example, the truename return value is
|
||
supplied after all the close-time renaming of output files is done
|
||
and the version numbers resolved (for operating systems supporting
|
||
version numbers). Therefore, on some systems the truename of a file
|
||
has one value at the time it is opened, and a different value when it
|
||
has been closed. For a description of the CLOSE return values: See
|
||
the section "NFILE OPEN Response Return Values", section 8.20.2.
|
||
|
||
If the user gives the CLOSE command with abort-p supplied as Boolean
|
||
truth, thus requesting a close-abort of the file, the server need not
|
||
check whether an asynchronous error description is outstanding on the
|
||
channel. The server simply close-aborts the file.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 18]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
8.4 COMPLETE Command
|
||
|
||
Command: (COMPLETE tid string pathname DIRECTION NEW-OK DELETED)
|
||
|
||
Response: (COMPLETE tid new-string success)
|
||
|
||
COMPLETE performs file pathname completion.
|
||
|
||
string is a partial filename typed by the user and pathname is the
|
||
default name against which it is being typed. Both string and
|
||
pathname are required arguments, and are of type string. The
|
||
remaining arguments are optional keyword/value pairs.
|
||
|
||
NEW-OK is Boolean; if followed by Boolean truth, the server should
|
||
allow either a file that already exists, or a file that does not yet
|
||
exist. The default of NEW-OK is false; that is, the server does not
|
||
consider files that do not already exist.
|
||
|
||
DELETED is a Boolean type argument; if followed by Boolean truth, the
|
||
server is instructed to look for files that have been deleted but not
|
||
yet expunged, as well as non-deleted files. The default is to ignore
|
||
soft-deleted files.
|
||
|
||
DIRECTION can be followed by READ, to indicate that the file is to be
|
||
read. If the file is to be written, DIRECTION can be followed by
|
||
WRITE. The default is READ.
|
||
|
||
The filename is completed according to the files present in the host
|
||
file system, and the expanded string new-string is returned. New-
|
||
string is always a string containing a file name: either the
|
||
original string, or a new, more specific string. The value of
|
||
success indicates the status of the completion. The keyword value OLD
|
||
or NEW means complete success, whereas the empty token list means
|
||
failure. The following values of success are possible:
|
||
|
||
Value Meaning
|
||
|
||
----------------------------------------------------------------
|
||
|
||
OLD Success: the string completed to the name of
|
||
a file that exists.
|
||
|
||
NEW Success: the string completed to the name of
|
||
a file that could be created.
|
||
|
||
Empty token list Failure due to one of these reasons:
|
||
|
||
The file is on a file system that does not
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 19]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
support completion. new-string is supplied as
|
||
the unchanged string.
|
||
|
||
There is no possible completion. new-string
|
||
is supplied as the unchanged string.
|
||
|
||
There is more than one possible completion.
|
||
The given string is completed up to the first
|
||
point of ambiguity, and the result is supplied
|
||
as new-string.
|
||
|
||
A directory name was completed. Completion
|
||
was not successful because additional
|
||
components to the right of this directory
|
||
remain to be specified. The string is
|
||
completed through the directory name and the
|
||
delimiter that follows it, and the result is
|
||
returned in new-string.
|
||
|
||
The semantics of COMPLETE are not documented here. See the
|
||
"Reference Guide to Streams, Files, and I/O" in the Symbolics
|
||
documentation set for the recommended semantics of COMPLETE.
|
||
|
||
8.5 CONTINUE Command
|
||
|
||
Command: (CONTINUE tid handle)
|
||
|
||
Response: (CONTINUE tid)
|
||
|
||
CONTINUE resumes a data transfer that was temporarily suspended due
|
||
to an asynchronous error. Each asynchronous error description has an
|
||
optional argument of RESTARTABLE, indicating whether it makes any
|
||
sense to try to continue after this particular error occurred.
|
||
CONTINUE tries to resume the data transfer if the error is
|
||
potentially recoverable, according to the RESTARTABLE argument in the
|
||
asynchronous error description. For a discussion of asynchronous
|
||
errors: See the section "NFILE Errors and Notifications", section
|
||
10.
|
||
|
||
handle is a required string-type argument that refers to the handle
|
||
of the data channel that received an asynchronous error. That data
|
||
channel could have been in use for a data stream or direct access
|
||
transfer. handle cannot be a direct file identifier.
|
||
|
||
If the asynchronous error description does not contain the
|
||
RESTARTABLE argument, and the user issues the CONTINUE command
|
||
anyway, the server gives a command error response.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 20]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
8.6 CREATE-DIRECTORY Command
|
||
|
||
Command: (CREATE-DIRECTORY tid pathname property-pairs)
|
||
|
||
Response: (CREATE-DIRECTORY tid dir-truename)
|
||
|
||
CREATE-DIRECTORY creates a directory on the remote file system. The
|
||
required pathname argument is a string identifying the pathname of
|
||
the directory to be created. The return value dir-truename is the
|
||
pathname of the directory that was successfully created. Both of
|
||
these pathnames are directory pathnames: See the section "Syntax of
|
||
File and Directory Pathname Arguments", section 7.4.
|
||
|
||
property-pairs is a keyword/value list of properties that further
|
||
define the attributes of the directory to be created. The allowable
|
||
keywords and associated values are operating system dependent;
|
||
typically they indicate arguments to be given to the native primitive
|
||
for creating directories.
|
||
|
||
If property-pairs is supplied as the empty token list, default access
|
||
and creation attributes apply and should be assured by the server.
|
||
See the section "Format of NFILE File Property/Value Pairs", section
|
||
7.5.
|
||
|
||
8.7 CREATE-LINK Command
|
||
|
||
Command: (CREATE-LINK tid pathname target-pathname properties)
|
||
|
||
Response: (CREATE-LINK tid link-truename)
|
||
|
||
CREATE-LINK creates a link on the remote file system.
|
||
|
||
pathname is the pathname of the link to be created; target-pathname
|
||
is the place in the file system to which the link points. Both are
|
||
required arguments. The return value link-truename names the
|
||
resulting link.
|
||
|
||
If a server on a file system that does not support links receives the
|
||
CREATE-LINK command, it sends a command error response.
|
||
|
||
The arguments pathname and target-pathname, and the return value
|
||
link-truename, are all strings in the full pathname syntax of the
|
||
server host. See the section "Syntax of File and Directory Pathname
|
||
Arguments", section 7.4.
|
||
|
||
The required properties argument is a token list of keyword/value
|
||
pairs. These properties and their values specify certain attributes
|
||
to be given to the link. The allowable keywords and associated
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 21]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
values are operating system dependent; typically they indicate
|
||
arguments to be given to the native primitive for creating links.
|
||
|
||
If no property pairs are given in the command, the server should
|
||
apply a reasonable default set of attributes to the link. See the
|
||
section "Format of NFILE File Property/Value Pairs", section 7.5.
|
||
|
||
8.8 DATA-CONNECTION Command
|
||
|
||
Command: (DATA-CONNECTION tid new-input-handle new-output-handle)
|
||
|
||
Response: (DATA-CONNECTION tid connection-identifier)
|
||
|
||
DATA-CONNECTION enablesthe user side to initiate the establishment of
|
||
a new data connection. The user side supplies two required string
|
||
arguments, new-input-handle and new-output-handle. These arguments
|
||
are used by subsequent commands to reference the two data channels
|
||
that constitute the data connection now being created. new-input-
|
||
handle describes the server-to-user data channel, and new-output-
|
||
handle describes the user-to-server channel. new-input-handle and
|
||
new-output-handle cannot refer to any data channels already in use.
|
||
|
||
Upon receiving the DATA-CONNECTION command, the server arranges for a
|
||
logical port (called socket or contact name on some networks) to be
|
||
made available on the foreign host machine. When the server has made
|
||
that port available, it must inform the user of its identity. The
|
||
server relays that information in the command response, in the
|
||
required connection-identifier, a string. The server then listens on
|
||
the port named by connection-identifier, and waits for the user side
|
||
to connect to it.
|
||
|
||
Upon receiving the success command response, the user side supplies
|
||
the connection-identifier to the local network implementation, in
|
||
order to connect to the specified port. The data connection is not
|
||
fully established until the user side connects successfully to that
|
||
port. This command is unusual in that the successful command
|
||
response does not signify the completion of the command; it indicates
|
||
only that the server has fulfilled its responsibility in the process
|
||
of establishing a data connection.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 22]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The connection-identifier informs the user of the correct identity of
|
||
the logical port that the server has provided. NFILE expects the
|
||
connection-identifier to be a string. For TCP this string is the
|
||
port number represented in decimal. For Chaosnet, this string is the
|
||
contact name. The connection-identifier is used only once; in all
|
||
subsequent NFILE commands that need to reference either of the data
|
||
channels that constitute this data connection, the new-input-handle
|
||
and new-output-handle are used.
|
||
|
||
For background information: See the section "NFILE Control and Data
|
||
Connections", section 4.
|
||
|
||
8.9 DELETE Command
|
||
|
||
Command: (DELETE tid handle pathname)
|
||
|
||
Response: (DELETE tid)
|
||
|
||
DELETE deletes a file on the remote file system.
|
||
|
||
Either a handle or a pathname must be supplied, but not both. If
|
||
given, the handle must be a data channel handle for a data stream
|
||
opening, or a direct file identifier for a direct access opening.
|
||
pathname is a string in the full pathname syntax of the server host.
|
||
See the section "Syntax of File and Directory Pathname Arguments",
|
||
section 7.4.
|
||
|
||
With a pathname supplied, the DELETE command causes the specified
|
||
file to be deleted. DELETE has different results depending on the
|
||
operating system involved. That is, DELETE causes soft deletion on
|
||
TOPS-20 and LMFS, and hard deletion on UNIX and Multics. If an
|
||
attempt is made to delete a delete-through link on a Symbolics LMFS,
|
||
its target is deleted instead.
|
||
|
||
If the handle argument is supplied to DELETE, the server deletes the
|
||
open file bound to the data channel specified by handle at close
|
||
time. This is true in both the output and input cases.
|
||
|
||
8.10 DIRECT-OUTPUT Command
|
||
|
||
Command: (DIRECT-OUTPUT tid direct-handle output-handle)
|
||
|
||
Response: (DIRECT-OUTPUT tid)
|
||
|
||
DIRECT-OUTPUT starts and stops output data flow for a direct access
|
||
file opening. DIRECT-OUTPUT explicitly controls binding and
|
||
unbinding of an output data channel to a direct access opening.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 23]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
direct-handle is a required argument, and output-handle is optional.
|
||
|
||
If supplied, output-handle is a request to bind an output data
|
||
channel (indicated by output-handle) to the direct access opening
|
||
designated by the direct-handle. The specified output data channel
|
||
must be free. The server binds the data channel and begins accepting
|
||
data from that connection and writing it to the opening.
|
||
|
||
If the output-handle is omitted, this is a request to unbind the
|
||
channel and terminate the active output transfer.
|
||
|
||
8.11 DIRECTORY Command
|
||
|
||
Command: (DIRECTORY tid input-handle pathname control-keywords
|
||
properties)
|
||
|
||
Response: (DIRECTORY tid)
|
||
|
||
DIRECTORY returns a directory listing including the identities and
|
||
attributes for logically related groups of files, directories, and
|
||
links. If the command is successful, a single token list containing
|
||
the requested information is sent over the data channel specified by
|
||
input-handle, and the data channel is then implicitly freed by both
|
||
sides <2>. For details on the format of the token list: See the
|
||
section "NFILE DIRECTORY Data Format", section 8.11.1.
|
||
|
||
pathname specifies the files that are to be described; it is a string
|
||
in the full pathname syntax of the server host. See the section
|
||
"Syntax of File and Directory Pathname Arguments", section 7.4.
|
||
|
||
The pathname generally contains wildcard characters, in operating-
|
||
system-specific format, describing potential file name matches. Most
|
||
operating systems provide a facility that accepts such a pathname and
|
||
returns information about all files matching this pathname. Some
|
||
operating systems allow wildcard (potential multiple) matches in the
|
||
directory or device portions of the pathname; other operating systems
|
||
do not. There is no clear contract at this time about what is
|
||
expected of servers on systems that do not allow wildcard matches (or
|
||
some kinds of wild card matches), when presented with a wildcard.
|
||
|
||
properties is a token list of keywords that are the names of
|
||
properties. If properties is omitted or supplied as the empty token
|
||
list, the server sends along all properties. If any properties are
|
||
supplied, the user is requesting the server to send only those
|
||
properties.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 24]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
control-keywords ARGUMENT TO DIRECTORY
|
||
|
||
control-keywords is a token list of keywords. The control-keywords
|
||
affect the way the DIRECTORY command works on the server machine.
|
||
Although some of the options below request the server to limit (by
|
||
some filter) the data to be returned, it is never an error if the
|
||
server returns more information than is requested.
|
||
|
||
The following keywords are recognized:
|
||
|
||
DELETED
|
||
|
||
Includes soft-deleted files in the directory list. Without this
|
||
option, they must not be included. Such files have the DELETED
|
||
property indicated as true" among their properties. DELETED is
|
||
ignored on systems that do not support soft deletion.
|
||
|
||
DIRECTORIES-ONLY
|
||
|
||
This option changes the semantics of DIRECTORY fairly drastically.
|
||
Normally, the server returns information about all files,
|
||
directories, and links whose pathnames match the supplied pathname.
|
||
This means that for each file, directory, or link to be listed, its
|
||
directory name must match the potentially wildcarded) directory name
|
||
in the supplied pathname, its file name must match the file name in
|
||
the supplied pathname, and so on.
|
||
|
||
When DIRECTORIES-ONLY is supplied, the server is to list only
|
||
directories, not whose pathnames match the supplied pathname, but
|
||
whose pathnames expressed as directory pathnames match the
|
||
(potentially wildcarded) directory portion of the supplied pathname.
|
||
The description of the PROBE-DIRECTORY keyword that can be supplied
|
||
as the direction argument of the OPEN command discusses this: See
|
||
the section "OPEN Command", section 8.20.
|
||
|
||
It is not yet established what servers on hosts that do not support
|
||
this type of action natively are to do when presented with
|
||
DIRECTORIES-ONLY and a pathname with a wildcard directory component.
|
||
|
||
FAST Speeds up the operation and data transmission by not listing any
|
||
properties at all for the files concerned; that is, only the
|
||
truenames are returned.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 25]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
NO-EXTRA-INFO
|
||
|
||
Specifies that the server is to suppress listing those properties
|
||
that are generally more difficult or expensive to obtain. This
|
||
typically eliminates listing of directory-specific properties such as
|
||
information about default generation counts and expunge dates.
|
||
|
||
SORTED
|
||
|
||
This causes the directory listing to be sorted. The sorting is done
|
||
alphabetically by directory, then by file name, then file type, then
|
||
file version (by increasing version number).
|
||
|
||
8.11.1 NFILE DIRECTORY Data Format
|
||
|
||
If the NFILE DIRECTORY command completes successfully, a single token
|
||
list containing the requested directory information is sent on the
|
||
data channel specified by the input-handle argument in the DIRECTORY
|
||
command. This section describes the format of that single token
|
||
list, and gives further detail on the properties argument to
|
||
DIRECTORY.
|
||
|
||
The token list is a top-level token list, so it is delimited by TOP-
|
||
LEVEL-LIST-BEGIN and TOP-LEVEL-LIST-END. The top-level token list
|
||
contains embedded token lists. The first embedded token list
|
||
contains the empty token list followed by property/value pairs
|
||
describing property information of the file system as a whole rather
|
||
than of a specific file. NFILE requires one property of the file
|
||
system to be present: DISK-SPACE-DESCRIPTION is a string describing
|
||
the amount of free file space available on the system. The following
|
||
embedded token lists contain the pathname of a file, followed by
|
||
property/value pairs describing the properties of that file.
|
||
|
||
The following example shows the format of the top-level token list
|
||
returned by DIRECTORY, for two files. It is expected that the server
|
||
return several property/value pairs for each file; the number of
|
||
pairs returned is not constrained. In this example, two
|
||
property/value pairs are returned for the file system, two pairs are
|
||
returned for the first file, and only one pair is returned for the
|
||
second file.
|
||
|
||
TOP-LEVEL-LIST-BEGIN
|
||
LIST-BEGIN - first embedded token list starts
|
||
LIST-BEGIN - an empty embedded token list starts
|
||
LIST-END - the empty embedded token list ends
|
||
prop1 value1 - property/value pairs of file system
|
||
prop2 value2
|
||
LIST-END
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 26]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
LIST-BEGIN
|
||
pathname1 - pathname of the first file
|
||
prop1 value1 - property/value pairs of first file
|
||
prop2 value2
|
||
LIST-END
|
||
LIST-BEGIN
|
||
pathname2 - pathname of the second file
|
||
prop1 value1 - property/value pairs of second file
|
||
LIST-END
|
||
TOP-LEVEL-LIST-END
|
||
|
||
The following example is designed to illustrate the structure of the
|
||
top-level token list by depicting TOP-LEVEL-LIST-BEGIN and TOP-
|
||
LEVEL-LIST-END by parentheses and LIST-BEGIN and LIST-END by squarbe
|
||
rackets. respectively. The indentation, blank spaces, and newlines
|
||
in the example are not part of the token list, but are used here to
|
||
make the structure of the token list clear.
|
||
|
||
([ [ ] prop1 value1 prop2 value2]
|
||
[pathname1 prop1 value1 prop2 value2]
|
||
[pathname2 prop1 value1])
|
||
|
||
The pathname is a string in the full pathname syntax of the server
|
||
host. See the section "Syntax of File and Directory Pathname
|
||
Arguments", section 7.4.
|
||
|
||
For further information on file property/value pairs: See the
|
||
section "Format of NFILE File Property/Value Pairs", section 7.5.
|
||
|
||
8.12 DISABLE-CAPABILITIES Command
|
||
|
||
Command: (DISABLE-CAPABILITIES tid capability)
|
||
|
||
Response: (DISABLE-CAPABILITIES tid cap-1 success-1
|
||
cap-2 success-2 cap-3 success-3 ...)
|
||
|
||
DISABLE-CAPABILITIES causes an access capability to be disabled on
|
||
the server machine. capability is a string naming the capability to
|
||
be disabled. The meaning of the capability is dependent on the
|
||
operating system.
|
||
|
||
The return values cap-1, cap-2, and so on, are strings specifying
|
||
names of capabilities. If the capability named by cap-1 was
|
||
successfully disabled, the corresponding success-1 is supplied as
|
||
Boolean truth; otherwise it is the empty token list.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 27]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Although the user can specify only one capability to disable, it is
|
||
conceivable that the result of disabling that particular capability
|
||
is the disabling of other, related capabilities. That is why the
|
||
command response can contain information on more than one capability.
|
||
|
||
8.13 ENABLE-CAPABILITIES Command
|
||
|
||
Command: (ENABLE-CAPABILITIES tid capability password)}
|
||
|
||
Response: (ENABLE-CAPABILITIES tid cap-1 success-1
|
||
cap-2 success-2 cap-3 success-3 ...)
|
||
|
||
ENABLE-CAPABILITIES causes an access capability to be enabled on the
|
||
server machine. The password argument is optional, and should be
|
||
included only if it is needed to enable this particular capability.
|
||
Both password and capability are strings. The meaning of the
|
||
capability is dependent on the operating system.
|
||
|
||
The return values cap-1, cap-2 and so on, are strings specifying
|
||
names of capabilities. If the capability named by cap-1 was
|
||
successfully enabled, the corresponding success-1 is supplied as
|
||
Boolean truth; otherwise it is the empty token list.
|
||
|
||
Although the user can specify only one capability to enable, it is
|
||
conceivable that the result of enabling that particular capability is
|
||
the enabling of other, related capabilities. That is why the command
|
||
response can contain information on more than one capability.
|
||
|
||
8.14 EXPUNGE Command
|
||
|
||
Command: (EXPUNGE tid directory-pathname)
|
||
|
||
Response: (EXPUNGE tid server-storage-units-freed)
|
||
|
||
EXPUNGE causes the directory specified by pathname to be expunged.
|
||
Expunging means that any files that have been soft deleted are to be
|
||
permanently removed.
|
||
|
||
For file systems that do not support soft deletion, the command is to
|
||
be ignored; a success command response is sent, but no action is
|
||
performed on the file system. In this case, the number-of-server-
|
||
storage-units-freed return value should be omitted.
|
||
|
||
directory-pathname is a required string argument in the directory
|
||
pathname format; it must refer to a directory on the server file
|
||
system, and not to a file. See the section "Syntax of File and
|
||
Directory Pathname Arguments", section 7.4.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 28]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The return value server-storage-units-freed is an integer specifying
|
||
how many records, blocks, or whatever unit is used to measure file
|
||
storage on the server host system, were recovered. This return value
|
||
should be omitted if the server does not know how many storage units
|
||
were freed.
|
||
|
||
The protocol does not define whether directory-pathname is really a
|
||
pathname as directory or a wildcard pathname of files to be expunged.
|
||
The protocol does not define whether or not wildcards are permitted,
|
||
or required to be supported, in the directory portion of the pathname
|
||
(representing an implicit request to expunge many directories).
|
||
|
||
8.15 FILEPOS Command
|
||
|
||
Command: (FILEPOS tid handle position resync-uid)
|
||
|
||
Response: (FILEPOS tid)
|
||
|
||
FILEPOS sets the file access pointer to a given position, relative to
|
||
the beginning of the file. FILEPOS is used to indicate the position
|
||
of the next byte of data to be transferred.
|
||
|
||
The handle indicates the file to be affected. handle must be a data
|
||
channel handle for a data stream opening, or a direct file identifier
|
||
for a direct access opening. Both handle and position are required
|
||
arguments.
|
||
|
||
position is an integer indicating to which point in the file the file
|
||
access pointer is to be reset. position is either a byte number
|
||
according to the current byte size being used, or characters for
|
||
character openings. Position zero is the beginning of the file. If
|
||
this is a character opening, position is measured in server units,
|
||
not in NFILE character set units.
|
||
|
||
If the FILEPOS command is given on an input data channel (that is, a
|
||
data channel currently sending data from server to user), the
|
||
affected data channel must be resynchronized after the FILEPOS is
|
||
accomplished, in order to identify the start of the new data. The
|
||
resync-uid is a unique identifier associated with the
|
||
resynchronization of the data channel; it is unique with respect to
|
||
this dialogue. resync-uid must be supplied if handle is an input
|
||
handle, but it is not supplied otherwise. For more information on
|
||
the resynchronization procedure: See the section "NFILE Data
|
||
Connection Resynchronization", section 9.2.
|
||
|
||
In the output case, the user must somehow indicate to the server, on
|
||
the output data channel, when there is no more data. The user side
|
||
sends the keyword token EOF to do so. Upon receiving that control
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 29]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
token, the server is required to position the file pointer according
|
||
to the position given. When the new file position is established,
|
||
the server resumes accepting data at the new file position.
|
||
|
||
In most cases, using the direct access mode of transfer is more
|
||
convenient and efficient than repeated use of FILEPOS with a data
|
||
stream opening.
|
||
|
||
There are problems inherent in trying to set a file position of a
|
||
character-oriented file on a foreign host, if one machine is a
|
||
Symbolics computer and the other is not. For example, character set
|
||
translation must take place. See the section "NFILE Character Set",
|
||
section 6. Because of these difficulties, FILEPOS might not be
|
||
supported in the future on character files. FILEPOS is not
|
||
problematic for binary files.
|
||
|
||
8.15.1 Implementation Hint for FILEPOS Command
|
||
|
||
The server processing of this command (by the control connection
|
||
handler) must not attempt to wait for the resynchronization procedure
|
||
to complete. It is possible that the user could abort between
|
||
sending the FILEPOS command and reading for the mark and
|
||
resynchronization identifier. That scenario could leave the sender
|
||
of the resynchronization identifier, on the server side, blocked for
|
||
output indefinitely.
|
||
|
||
Only two commands received on the control connection can break the
|
||
data channel out of the blocked state described above: CLOSE with
|
||
abort-p supplied as Boolean truth, and RESYNCHRONIZE-DATA-CHANNEL.
|
||
Therefore, the control connection must not wait for the data channel
|
||
to finish performing the resynchronization procedure. This wait
|
||
should instead be performed by the process managing the data channel.
|
||
|
||
8.16 FINISH Command
|
||
|
||
Command: (FINISH tid handle)
|
||
|
||
Response: (FINISH tid truename binary-p other-properties)
|
||
|
||
FINISH closes a file and reopens it immediately with the file
|
||
position pointer saved, thus leaving it open for further I/O. If
|
||
possible, the implementation should do the closing and opening in an
|
||
indivisible operation, such that no other process can get access to
|
||
the file.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 30]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The arguments, results, and their meaning are identical to those of
|
||
the CLOSE command. See the section "CLOSE Command", section 8.3.
|
||
FINISH requires a handle, which has the same meaning as the handle of
|
||
the CLOSE command.
|
||
|
||
In the output case, for both direct mode and data stream mode of
|
||
openings, the server writes out all buffers and sets the byte count
|
||
of the file. The user sends the keyword token EOF on the data
|
||
channel, to indicate that the end of data has been reached. The
|
||
server leaves the file in such a state that if the system or server
|
||
crashes anytime after the FINISH command has completed, it would
|
||
later appear as though the file had been closed by this command.
|
||
However, the file is not left in a closed state now; it is left open
|
||
for further I/O operations. FINISH is a reliability feature.
|
||
|
||
FINISH is somewhat pointless in the input case, but valid. The
|
||
native Symbolics file system (LMFS) implements FINISH on an output
|
||
file by an internal operation that effectively goes through the work
|
||
of closing but leaves the file open for appending.
|
||
|
||
ERRORS ON FINISH
|
||
|
||
After writing every last bit sent by the user to disk, and before
|
||
closing the file, the server checks the data channel specified by
|
||
handle to see if an asynchronous error is outstanding on that
|
||
channel. That is, the server must determine whether it has sent an
|
||
asynchronous error to the user, to which the user has not yet
|
||
responded with a CONTINUE command. If so, the server is unable to
|
||
finish the file, and it must send a command error response response,
|
||
indicating that an error is pending on the channel. The appropriate
|
||
three-letter error code is EPC. See the section "NFILE Errors and
|
||
Notifications", section 10.
|
||
|
||
8.17 HOME-DIRECTORY Command
|
||
|
||
Command: (HOME-DIRECTORY tid user)
|
||
|
||
Response: (HOME-DIRECTORY tid directory-pathname)
|
||
|
||
HOME-DIRECTORY returns the full pathname of the home directory on the
|
||
server machine for the given user.
|
||
|
||
user is a string that should be recognizable as a user's login name
|
||
on the server operating system. directory-pathname is a string in
|
||
the directory pathname format. See the section "Syntax of File and
|
||
Directory Pathname Arguments", section 7.4.
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 31]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
8.18 LOGIN Command
|
||
|
||
Command: (LOGIN tid user password FILE-SYSTEM USER-VERSION)
|
||
|
||
Response: (LOGIN tid keyword/value-pairs)
|
||
|
||
LOGIN logs the given user in to the server machine, using the
|
||
password if necessary. Both user and password are string arguments;
|
||
user is required, password is optional. An omitted password is valid
|
||
if the host allows the specified user to log in without a password.
|
||
Depending on the operating system and server, it might be necessary
|
||
to log in to run a program (in this case the NFILE server program) on
|
||
the host. LOGIN establishes a user identity that is used by the
|
||
operating system to establish the file author and determine file
|
||
access rights during the current session.
|
||
|
||
The server has the option to reject with an error any command except
|
||
LOGIN if a successful LOGIN command has not been performed. This is
|
||
recommended. Many operating systems perform the login function in a
|
||
different process and/or environment than user programs. The portion
|
||
of the NFILE server running in the special login environment could
|
||
conceivably be capable only of processing the LOGIN command; this is
|
||
the reason for having the LOGIN command in NFILE.
|
||
|
||
FILE-SYSTEM and USER-VERSION are optional keyword/value pairs. The
|
||
FILE-SYSTEM keyword/value pair selects the identity of the file
|
||
system to which all following commands in this session are to be
|
||
directed. This argument has meaning only if the server host machine
|
||
has multiple file systems, and the targeted file system is other than
|
||
the default file system that a user would get by initiating a
|
||
dialogue with that host. The FILE-SYSTEM argument is an arbitrary
|
||
token list. If the server does not recognize it, the server gives an
|
||
appropriate command error response.
|
||
|
||
Currently, the only use of FILE-SYSTEM is for Symbolics servers to
|
||
select one of the front-end processor hosts instead of the LMFS,
|
||
which is the default. In this case, the first element in the token
|
||
list is the keyword FEP, and the second element in the token list is
|
||
an integer, indicating the desired FEP disk unit number. If the
|
||
server discovers there is no such file system, the server gives a
|
||
command error response including the three-letter code NFS, meaning
|
||
"no file system". See the section "NFILE Errors and Notifications",
|
||
section 10.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 32]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The user tells the server what version of NFILE it is running by
|
||
including the optional USER-VERSION keyword/value pair. The value
|
||
associated with USER-VERSION can be a string, an integer, or a token
|
||
list. This document describes NFILE user version 2 and server
|
||
version 2.
|
||
|
||
Upon receiving the representation of the user version, the server can
|
||
either adjust certain parameters to handle this particular version,
|
||
or simply ignore the user version altogether. Currently, the only
|
||
released versions of NFILE are user version 2 and server version 2.
|
||
|
||
LOGIN RETURN VALUES: keyword/value-pairs
|
||
|
||
The keyword/value-pairs is a token list composed of keywords followed
|
||
by their values. The server includes any or all of the following
|
||
keywords and their values; they are all optional. The following
|
||
keywords are recognized:
|
||
|
||
NAME
|
||
|
||
The value associated with NAME is a string specifying the user
|
||
identity, in the server host's terms.
|
||
|
||
PERSONAL-NAME
|
||
|
||
The value associated with PERSONAL-NAME is a string representing the
|
||
user's personal name, last name first. For example: "McGillicuddy,
|
||
Aloysius X.".
|
||
|
||
HOMEDIR-PATHNAME
|
||
|
||
The value associated with HOMEDIR-PATHNAME is a string in the
|
||
pathname as directory format, indicating the home directory of the
|
||
user. See the section "Syntax of File and Directory Pathname
|
||
Arguments", section 7.4.
|
||
|
||
GROUP-AFFILIATION
|
||
|
||
The value associated with GROUP-AFFILIATION is a string specifying
|
||
the group to which the user belongs, when this concept is
|
||
appropriate.
|
||
|
||
SERVER-VERSION
|
||
|
||
The value associated with SERVER-VERSION can be a string, an integer,
|
||
or a token list. The value is a representation of the version of the
|
||
server is running. Upon receiving the server version, the user can:
|
||
adjust certain parameters to handle this particular version; accept
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 33]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
the version; or close the connection. Currently, the only released
|
||
versions of NFILE are user version 2 and server version 2.
|
||
|
||
PROPERTY-INDEX-TABLE
|
||
|
||
The value associated with PROPERTY-INDEX-TABLE is a token list of
|
||
keywords. This return value enables the server to inform the user
|
||
which file properties are meaningful on its file system. The
|
||
keywords in PROPERTY-INDEX-TABLE can be used by the DIRECTORY command
|
||
(a user request for information on file properties of a specified
|
||
directory or directories). The server can specify a certain property
|
||
by giving an integer that is the index of that file property into the
|
||
PROPERTY-INDEX-TABLE. This reduces the volume of data sent during
|
||
directory listings. The first element in PROPERTY-INDEX-TABLE is
|
||
indexed by the number 0. See the section "DIRECTORY Command",
|
||
section 8.11.
|
||
|
||
8.19 MULTIPLE-FILE-PLISTS Command
|
||
|
||
Command: (MULTIPLE-FILE-PLISTS tid input-handle paths
|
||
characters properties)
|
||
|
||
Response: (MULTIPLE-FILE-PLISTS tid)
|
||
|
||
MULTIPLE-FILE-PLISTS returns file property information of one or more
|
||
files. The server sends the information in a data structure (the
|
||
format is described later in this section) on the given input-handle.
|
||
paths is an embedded token list composed of the pathnames in which
|
||
the user is interested. Each pathname in this list is a string in
|
||
the full pathname syntax of the server host. Unlike for the
|
||
DIRECTORY command, wildcards are not allowed in these pathnames. See
|
||
the section "Syntax of File and Directory Pathname Arguments",
|
||
section 7.4.
|
||
|
||
characters is either Boolean truth (indicating that each file is a
|
||
character file), the empty token list (each file is a binary file),
|
||
or the keyword DEFAULT. DEFAULT indicates that the server itself is
|
||
to figure out whether a file is a character or binary file. For more
|
||
information on the meaning of the DEFAULT keyword: See the section
|
||
"OPEN Command", section 8.20. The value of characters can influence
|
||
some servers' idea of a file's length.
|
||
|
||
properties is a token list of keywords indicating which properties
|
||
the user wants returned. The server is always free to return more
|
||
properties than those requested in the properties argument. If
|
||
properties is supplied as the empty token list, the server should
|
||
transmit all known properties on the files.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 34]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The server transmits as much of the requested information as possible
|
||
on the given input-handle. The information is contained in a top-
|
||
level token list of elements. Each element corresponds with a
|
||
supplied pathname; the order of the original pathlist must be
|
||
retained in the returned token list. An element is an empty token
|
||
list if the corresponding file or any of its containing directories
|
||
does not exist. The elements that correspond to successfully located
|
||
files are lists composed of truename followed by any properties.
|
||
properties are keyword/value pairs. truename is a string in the full
|
||
pathname syntax of the server host.
|
||
|
||
The following example shows TOP-LEVEL-LIST-BEGIN and TOP-LEVEL-LIST-
|
||
END as parentheses, and LIST-BEGIN and LIST-END with square brackets.
|
||
|
||
For example, the user supplied a pathlist argument resembling:
|
||
|
||
[file1 file2 file3]
|
||
|
||
The server could not locate file1 or file3, but did locate file2, and
|
||
found the length and author of file2. The top-level token list
|
||
transmitted by the server is:
|
||
|
||
( [] [ truename-of-file2 LENGTH 381 AUTHOR williams ] [] )
|
||
|
||
For further detail on how file properties and values are expressed:
|
||
See the section "Format of NFILE File Property/Value Pairs", section
|
||
7.5.
|
||
|
||
8.20 OPEN Command
|
||
|
||
Command: (OPEN tid handle pathname direction binary-p
|
||
TEMPORARY RAW SUPER-IMAGE DELETED PRESERVE-DATES
|
||
SUBMIT DIRECT-FILE-ID ESTIMATED-LENGTH BYTE-SIZE
|
||
IF-EXISTS IF-DOES-NOT-EXIST)
|
||
|
||
Response: (OPEN tid truename binary-p other-properties)
|
||
|
||
OPEN opens a file for reading, writing, or direct access at the
|
||
server host. That means, in general, asking the host file system to
|
||
access the file and obtaining a file number, pointer, or other
|
||
quantity for subsequent rapid access to the file; this is called an
|
||
"opening". See the section "NFILE File Opening Modes", section 5.
|
||
|
||
The OPEN command has the most complicated syntax of any NFILE
|
||
command. The OPEN command has required arguments, an optional
|
||
argument, and many optional keyword/value pairs. For details on the
|
||
syntax of each of these parts of the OPEN command: See the section
|
||
"Conventions Used in This Document", section 7.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 35]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The following arguments are required: pathname, direction, and
|
||
binary-p. handle is an optional argument, which must either be
|
||
supplied or explicitly omitted by means of substituting in its place
|
||
the empty token list.
|
||
|
||
The OPEN command has many optional keyword/value pairs, which encode
|
||
conceptual arguments to the server file system for the OPEN
|
||
operation. A detailed description of all the supported OPEN optional
|
||
keywords is given below.
|
||
|
||
The OPEN return values reflect information about the file opened,
|
||
when the opening is successful. In the case of a probe-type opening,
|
||
this information is returned when the given file (or link, or
|
||
directory) exists and is accessible, even though the file (or link,
|
||
or directory) is not actually opened. For detail on the OPEN return
|
||
values: See the section "NFILE OPEN Response Return Values", section
|
||
8.20.2.
|
||
|
||
THE pathname OPEN ARGUMENT
|
||
|
||
The pathname is a required argument specifying the file to be opened.
|
||
pathname is a string in the full pathname syntax of the server host.
|
||
See the section "Syntax of File and Directory Pathname Arguments",
|
||
section 7.4.
|
||
|
||
For some purposes (for example, when the OPEN argument direction is
|
||
supplied as PROBE-DIRECTORY), only the directory specified by this
|
||
pathname is utilized. See the section "NFILE OPEN Optional
|
||
Keyword/Value Pairs", section 8.20.1.
|
||
|
||
THE handle OPEN ARGUMENT
|
||
|
||
The handle argument of the OPEN command specifies a data channel to
|
||
be used for the transfer. Subsequent commands in this session use
|
||
the same handle to specify this opening. It is the user side's
|
||
responsibility to ensure that handle refers to an existing and free
|
||
data channel that does not require resynchronization before use. A
|
||
handle must be supplied, unless a probe-type opening is desired (that
|
||
is, the direction is supplied as PROBE, PROBE-DIRECTORY, or PROBE-
|
||
LINK) or a direct access opening is being requested (that is, a
|
||
DIRECT-FILE-ID is supplied). In those cases, the empty token list is
|
||
supplied for handle.
|
||
|
||
THE direction OPEN ARGUMENT
|
||
|
||
The direction argument must be supplied as one of these keywords:
|
||
INPUT, OUTPUT, IO, PROBE, PROBE-DIRECTORY, and PROBE-LINK. The
|
||
meanings of the direction keywords are as follows:
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 36]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
INPUT
|
||
|
||
Specifies that the file is to be opened for input server-to-user
|
||
transfer). To request a direct access opening, supply a value for
|
||
DIRECT-FILE-ID. If no DIRECT-FILE-ID is supplied, the opening is a
|
||
data stream opening.
|
||
|
||
OUTPUT
|
||
|
||
Specifies that the file is to be opened for output user-to-server
|
||
transfer). To request a direct access opening, supply a value for
|
||
DIRECT-FILE-ID. If no DIRECT-FILE-ID is supplied, the opening is a
|
||
data stream opening.
|
||
|
||
IO
|
||
|
||
Specifies that interspersed input and output will be performed on
|
||
the file. This is only meaningful in direct access mode. A
|
||
DIRECT-FILE-ID must also be supplied. See the section "NFILE OPEN
|
||
Optional Keyword/Value Pairs", section 8.20.1.
|
||
|
||
If direction is supplied as PROBE, PROBE-LINK, or PROBE-DIRECTORY,
|
||
the opening is said to be a probe-type opening. The DIRECT-FILE-ID
|
||
option is meaningless and an error for probe-type openings. The file
|
||
handle must be supplied as an empty token list for probe-type
|
||
openings.
|
||
|
||
PROBE
|
||
|
||
Specifies that the file is not to be opened at all, but simply
|
||
checked for existence. If the file does not exist or is not
|
||
accessible, the error indications and actions are identical to
|
||
those that would be given for an INPUT opening. If the file does
|
||
exist, the successful command response contains the same
|
||
information as it would have if the file had been opened for
|
||
INPUT. If it is a link, the link is followed to its target.
|
||
|
||
PROBE-LINK
|
||
|
||
Like PROBE, with one difference. PROBE-LINK specifies that if the
|
||
pathname is found to refer to a link, that link is not to be
|
||
followed, and information about the link itself is to be returned.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 37]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
PROBE-DIRECTORY
|
||
|
||
PROBE-DIRECTORY requests information about the directory
|
||
designated by the pathname argument. In the PROBE-DIRECTORY case,
|
||
the pathname argument refers to the directory on which information
|
||
is requested. In all other cases, the pathname refers to a file
|
||
to be opened. If pathname contains a file name and file type,
|
||
these parts of the pathname are ignored for PROBE-DIRECTORY
|
||
openings as long as they are syntactically valid.
|
||
|
||
THE binary-p OPEN ARGUMENT
|
||
|
||
The value of binary-p affects the mode in which the server opens the
|
||
file, as well as informing it whether or not character set
|
||
translation must be performed.
|
||
|
||
If binary-p is supplied as the empty token list, the opening is said
|
||
to be a character opening. The server performs character set
|
||
translation between its native character set and the NFILE character
|
||
set. The data is transferred over the data connection one character
|
||
per eight-bit byte. See the section "NFILE Character Set", section
|
||
6.
|
||
|
||
If binary-p is supplied as Boolean truth, the opening is said to be a
|
||
binary opening. The user side supplies the byte size via the BYTE-
|
||
SIZE option; if not supplied, the default byte size is 16 bits. If
|
||
byte size is less than 9, the file data is transferred byte by byte.
|
||
If the byte size is 9 or greater, the server transfers each byte of
|
||
the file as two eight-bit bytes, low-order first.
|
||
|
||
binary-p can also be supplied as the keyword DEFAULT. DEFAULT
|
||
specifies that the server itself is to determine whether to transfer
|
||
binary or character data. DEFAULT is meaningful only for input
|
||
openings; it is an error for OUTPUT, IO, or probe-type openings. For
|
||
file systems that maintain the innate binary or character nature of a
|
||
file, the server simply asks the file system which case is in force
|
||
for the file specified by pathname.
|
||
|
||
When binary-p is supplied as DEFAULT, on file systems that do not
|
||
maintain thisinformation, the server is required to perform a
|
||
heuristic check for Symbolicsobject fileson the first two 16-bit
|
||
bytes of the file. If the file isdetermined to be aSymbolics object
|
||
file, the server performs a BINARY openingwith BYTE-SIZE of16;
|
||
otherwise, it performs a CHARACTER opening.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 38]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The details of the check are as follows: if the first 16-bit byte is
|
||
the octal number170023 and the second 16-bit byte is any number
|
||
between 0 and 77 octal(inclusive), the file is recognized as a
|
||
Symbolics object file. In any othercase, it is not.
|
||
|
||
8.20.1 NFILE OPEN Optional Keyword/Value Pairs
|
||
|
||
The OPEN command has many optional keyword/value pairs that encode
|
||
conceptual arguments to the file system for the OPEN operation.
|
||
|
||
The following options are used often:
|
||
|
||
BYTE-SIZE
|
||
|
||
Must be followed by an integer between 1 and 16, inclusive, or the
|
||
empty token list. BYTE-SIZE is meaningful only for binary
|
||
openings. BYTE-SIZE can be ignored for probe-type openings. It
|
||
can be omitted entirely for character openings, but if supplied,
|
||
must be followed by the empty token list. If binary-p is supplied
|
||
as DEFAULT, BYTE-SIZE can be omitted entirely, or followed by the
|
||
empty token list.
|
||
|
||
If a binary opening is requested and BYTE-SIZE is not supplied,
|
||
the assumed value is 16 for output openings. For input binary
|
||
openings, the default is the host file system's stored conception
|
||
of the file's byte size (for those hosts that natively support
|
||
byte size). For file systems that do not natively support
|
||
natively byte size, the default byte-size on binary input is 16.
|
||
|
||
For file systems that maintain the innate byte-size of each file,
|
||
the server should supply this number to the appropriate operating
|
||
system interface that performs the semantics of opening the file.
|
||
For other operating systems, a file written with a given byte size
|
||
must produce the same bytes in the same order when read with that
|
||
byte size. In this case, the server or host operating system can
|
||
choose any packing scheme that complies with this rule.
|
||
|
||
Operating systems that do not support byte size must ensure that
|
||
binary files written from user ends of the current protocol can be
|
||
read back correctly. However, the server can choose packing
|
||
schemes that allow all bits of the server host's word to be
|
||
accessed and concur with other packing schemes used by native host
|
||
software.
|
||
|
||
For example, Multics supports 36 bit words and 9 bit bytes. A
|
||
packing scheme appropriate for a Multics NFILE server is:
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 39]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Byte Size Packing Scheme
|
||
|
||
7, 8, or 9 bits four per 36-bit word
|
||
10, 11, or 12 bits three per 36-bit word
|
||
13, 14, 15, or 16 bits two per 36-bit word
|
||
|
||
In the first packing scheme in the table, native Multics
|
||
character-oriented software can access each logical byte
|
||
sequentially. In the last packing scheme, each Symbolics byte is
|
||
in a halfword, easily accessible and visible in an octal
|
||
representation. To achieve maximum data transfer rate and access
|
||
all bits of a Multics word, a byte size of 12 must be specified.
|
||
|
||
DELETED
|
||
|
||
If supplied as Boolean truth, DELETED specifies that deleted"
|
||
files are to be treated as though they were not "deleted".
|
||
DELETED is meaningful only for operating systems that support
|
||
"soft deletion" and subsequent "undeletion" of files. Other
|
||
operating systems must ignore this option. Normally, deleted
|
||
files are not visible to the OPEN operation; this option makes
|
||
them visible.
|
||
|
||
DELETED can also be followed by the empty token list, which has
|
||
the same effect as omitting the DELETED keyword/value pair
|
||
entirely. For output openings, DELETED is meaningless and an
|
||
error if supplied.
|
||
|
||
DIRECT-FILE-ID
|
||
|
||
If supplied, the DIRECT-FILE-ID indicates that the opening is to
|
||
be a direct access mode opening. If not supplied, the opening is
|
||
a data stream opening. The value of DIRECT-FILE-ID is a string
|
||
generated by the user, that has not been used as a DIRECT-FILE-ID
|
||
in this dialogue, and does not designate any data channel. The
|
||
DIRECT-FILE-ID is a unique identifier for the direct access
|
||
opening. It is used for all operations that identify an opening
|
||
rather than a data channel. The DIRECT-FILE-ID is used to
|
||
identify a direct access opening, just as a file handle is used to
|
||
identify a data stream opening. The PROPERTIES, CLOSE, and RENAME
|
||
commands use the DIRECT-FILE-ID in this way. There are only two
|
||
NFILE commands applicable to direct access openings (ABORT and
|
||
CONTINUE) that do not use the DIRECT-FILE-ID, but use a data
|
||
channel handle instead.
|
||
|
||
PRESERVE-DATES
|
||
|
||
If supplied as Boolean truth, PRESERVE-DATES specifies that the
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 40]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
server is to attempt to prevent the operating system from updating
|
||
the "reference date" or date-time used" of the file. This is
|
||
meaningful only for input openings, and is an error otherwise.
|
||
|
||
The Symbolics operating system invokes this option for operations
|
||
such as View File in the editor, where it wishes to assert that
|
||
the user did not "read" the file, but just "looked at it".
|
||
Servers on operating systems that do not support reference dates
|
||
or users revising or suppressing update of the reference dates
|
||
must ignore this option.
|
||
|
||
ESTIMATED-LENGTH
|
||
|
||
The value of ESTIMATED-LENGTH is an integer estimating the length
|
||
of the file to be transferred. This option is meaningful and
|
||
permitted only for output openings. ESTIMATED-LENGTH enables the
|
||
user end to suggest to the server's file system how long the file
|
||
is going to be. This can be useful for file systems that must
|
||
preallocate files or file maps or that accrue performance benefits
|
||
from knowing this information at nthe time the file is first
|
||
opened. This estimate, if supplied, is not required to be exact.
|
||
It is ignored by servers to which it is not useful or interesting.
|
||
The units of the estimate are characters for character openings,
|
||
and bytes of the agreed-upon byte size for binary openings. The
|
||
character units should be server units, if possible, but since
|
||
this is only an estimate, NFILE character units are acceptable.
|
||
See the section "NFILE Character Set", section 6.
|
||
|
||
IF-EXISTS
|
||
|
||
Meaningful only for output openings, ignored otherwise, but not
|
||
diagnosed as an error. The value of IF-EXISTS is a keyword that
|
||
specifies the action to Be taken if a file of the given name
|
||
already exists. The semantics of the values are derived from the
|
||
Common Lisp specification and repeated here for completeness. If
|
||
the file does not already exist, the IF-EXISTS option and its
|
||
value are ignored.
|
||
|
||
If the user side does not give the IF-EXISTS option, The action to
|
||
be taken if a file of the given name already exists depends on
|
||
whether or not the file system supports file versions. If it
|
||
does, the default is ERROR (if an explicit version is given in the
|
||
file pathname) or NEW-VERSION (if the version in the file pathname
|
||
is the newest version). For file systems not supporting versions,
|
||
the default is SUPERSEDE. These actions are described below.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 41]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
IF-EXISTS provides the mechanism for overwriting or appending to
|
||
files. With the default setting of IF-EXISTS, new files are
|
||
created by every output opening.
|
||
|
||
Operating systems supporting soft deletion can take different
|
||
actions if a "deleted" file already exists with the same name (and
|
||
type and version, where appropriate) as a file to be created. The
|
||
Symbolics file system (LMFS) effectively uses SUPERSEDE, even if
|
||
not asked to do so. Other servers and file systems are urged to
|
||
do similarly. Recommended action is to not allow deleted files to
|
||
prevent successful file creation (with specific version number)
|
||
even if an IF-EXISTS option weaker than SUPERSEDE, RENAME, or
|
||
RENAME-AND-DELETE is specified or implied.
|
||
|
||
Here are the possible values and their meanings:
|
||
|
||
ERROR
|
||
|
||
Reports an error.
|
||
|
||
NEW-VERSION
|
||
|
||
Creates a new file with the same file name but with a larger
|
||
version number. This is the default when the version component
|
||
of the filename is newest. File systems without version
|
||
numbers can implement this by effectively treating it as
|
||
SUPERSEDE.
|
||
|
||
RENAME
|
||
|
||
Renames the existing file to some other name and then creates a
|
||
new file with the specified name. On most file systems, this
|
||
renaming happens at the time of a successful close.
|
||
|
||
RENAME-AND-DELETE
|
||
|
||
Renames the existing file to some other name and then deletes
|
||
it (but does not expunge it, on those systems that distinguish
|
||
deletion from expunging). Then it creates a new file with the
|
||
specified name. On most file systems, this renaming happens at
|
||
the time of a successful close.
|
||
|
||
OVERWRITE
|
||
|
||
Output operations on the opening destructively modify the
|
||
existing file. New data replaces old data at the beginning of
|
||
the file; however, the file is not truncated to length zero
|
||
upon opening.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 42]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
TRUNCATE
|
||
|
||
Output operations on the opening destructively modify the
|
||
existing file. The file pointer is initially positioned at the
|
||
beginning of the file; at that time, TRUNCATE truncates the
|
||
file to length zero and frees disk storage occupied by it.
|
||
|
||
APPEND
|
||
|
||
Output operations on the opening destructively modify the
|
||
existing file. New data is placed at the current end of the
|
||
file.
|
||
|
||
SUPERSEDE
|
||
|
||
Supersedes the existing file. This means that the old file is
|
||
removed or deleted and expunged. The new file takes its place.
|
||
If possible, the file system does not destroy the old file
|
||
until the new file is closed, against the possibility that the
|
||
file will be close-aborted. This differs from NEW-VERSION in
|
||
that SUPERSEDE creates a new file with the same name as the old
|
||
one, rather than a file name with a higher version number.
|
||
|
||
There are currently no standards on what a server can do if it
|
||
cannot implement some of these actions.
|
||
|
||
IF-DOES-NOT-EXIST
|
||
|
||
Meaningful for input openings, never meaningful for probe-type
|
||
openings, and sometimes meaningful for output openings. IF-DOES-
|
||
NOT-EXIST takes a value token, which specifies the action to be
|
||
taken if the file does not already exist. Like IF-EXISTS, it is a
|
||
derivative of Common Lisp. The default is as follows: If this is
|
||
a probe-type opening or read opening, or if the IF-EXISTS option
|
||
is specified as OVERWRITE, TRUNCATE, or APPEND, the default is
|
||
ERROR. Otherwise, the default is CREATE.
|
||
|
||
These are the values for IF-DOES-NOT-EXIST:
|
||
|
||
ERROR
|
||
|
||
Reports an error.
|
||
|
||
CREATE
|
||
|
||
Creates an empty file with the specified name and then proceeds
|
||
as if it already existed.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 43]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The following optional keyword/value pairs are rarely used, if ever:
|
||
|
||
RAW
|
||
|
||
If supplied as Boolean truth, RAW specifies that character set
|
||
translation is not to be performed, but that characters are to be
|
||
transferred intact, without inspection. This option is meaningful
|
||
only for character openings; it is an error otherwise. It is also
|
||
an error to supply RAW as Boolean truth for probe-type openings.
|
||
RAW can also be followed by the empty token list, which has the
|
||
same effect as if the RAW keyword/value pair were omitted
|
||
entirely. See the section "RAW Translation Mode", Appendix B.
|
||
|
||
SUPER-IMAGE
|
||
|
||
If supplied as Boolean truth, SUPER-IMAGE specifies that Rubout
|
||
quoting is not to be performed. This operation is meaningful only
|
||
for character openings; it is an error otherwise. It is also an
|
||
error for probe-type openings. SUPER-IMAGE can also be followed
|
||
by the empty token list, which has the same effect as if the
|
||
SUPER-IMAGE keyword/value pair were omitted entirely.
|
||
|
||
SUPER-IMAGE mode causes the server to read or write character
|
||
files where ASCII Rubout characters are a significant part of the
|
||
file content, not where they are an escape for this protocol.
|
||
However, other translations must still be performed: See the
|
||
section SUPER-IMAGE Translation Mode", Appendix C.
|
||
|
||
TEMPORARY
|
||
|
||
Used by the TOPS-20 server only. TEMPORARY says to use GJ%TMP in
|
||
the GTJFN. This is useful mainly when writing files, and
|
||
indicates that the foreign operating system is to treat the file
|
||
as temporary. See TOPS-20 documentation for more about the
|
||
implications of this option. Other servers can ignore it. This
|
||
option is meaningless and an error for input or probe-type
|
||
openings. TEMPORARY can also be followed by the empty token list,
|
||
which has the same effect as if the TEMPORARY keyword/value pair
|
||
were omitted entirely.
|
||
|
||
SUBMIT
|
||
|
||
SUBMIT is meaningful for output only. If supplied as Boolean
|
||
truth, SUBMIT causes the server to submit the contents of the file
|
||
being written to the operating system as a job, after the file is
|
||
closed. VMS is an example of an operating system that could
|
||
conveniently support SUBMIT. SUBMIT can also be followed by the
|
||
empty token list, which has the same effect as if the SUBMIT
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 44]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
keyword/value pair were omitted entirely. Servers that do not
|
||
implement this option should give an error response if requested
|
||
to submit a file to the operating system.
|
||
|
||
8.20.2 NFILE OPEN Response Return Values
|
||
|
||
The results of a successful OPEN operation are reported in the
|
||
command response. Here is the specification of the OPEN response
|
||
format:
|
||
|
||
Response Format:
|
||
|
||
(OPEN tid truename binary-p other-properties)
|
||
|
||
The return values for OPEN and CLOSE are syntactically identical, but
|
||
the values can change in the time interval between open and close.
|
||
|
||
truename is a string representing the pathname of the file in the
|
||
full pathname syntax of the server host. It should be determined by
|
||
the server once it has opened the file, via some request to its
|
||
operating system. The request can be of the form: "What file
|
||
corresponds to this JFN, file number, pointer, etc.?" If the
|
||
operating system supports version numbers, this string always
|
||
contains an explicit version number. It always contains a directory
|
||
name, a file name, and so on.
|
||
|
||
Some operating systems might not know the truename of an output file
|
||
until it is closed. It is permissible not to supply an explicit
|
||
version number in the pathname in the OPEN response in this specific
|
||
case. On these systems the truename when the file is opened is
|
||
different than the truename after it has been closed.
|
||
|
||
The return value binary-p indicates whether the opening is a binary
|
||
or character opening. For binary openings, binary-p is supplied as
|
||
Boolean truth; for character openings it is the empty token list.
|
||
|
||
other-properties is a list of keyword/value pairs. other-properties
|
||
must contain CREATION-DATE and LENGTH. AUTHOR should be included if
|
||
the server operating system has a convenient mechanism for
|
||
determining the author of the sfile. The other properties described
|
||
here can be included if desired.
|
||
|
||
AUTHOR
|
||
|
||
The value of AUTHOR is a string representing the name of the author
|
||
of the file. This is some kind of user identifier, whose format is
|
||
system-specific. As with CREATION-DATE (see below), AUTHOR is
|
||
supposed to represent the logical determinor of the current data
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 45]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
content of the file, not necessarily the agency that actually created
|
||
the file.
|
||
|
||
BYTE-SIZE
|
||
|
||
The byte-size agreed upon via the rules described for the BYTE-SIZE
|
||
option. The value of BYTE-SIZE is an integer. For details on the
|
||
ramifications of BYTE-SIZE: See the section "NFILE OPEN Optional
|
||
Keyword/Value Pairs", section 8.20.1. This parameter is only
|
||
meaningful for BINARY openings. However, if FILEPOS is returned in
|
||
the other-properties list, BYTE-SIZE should also be included, even
|
||
for character openings.
|
||
|
||
CREATION-DATE
|
||
|
||
The creation date of the file. The date is expressed in Universal
|
||
Time format, which measures a time as the number of seconds since
|
||
January 1, 1900, at midnight GMT. Creation date does not necessarily
|
||
mean the time the file system created the directory entry or records
|
||
of the file. For systems that support modification or appending to
|
||
files, it is usually the modification date of the file. Creation
|
||
date can mean the date that the bit count or byte count of the file
|
||
was set by an application program.
|
||
|
||
Some types of file systems support a user-settable quantity
|
||
(CREATION-DATE) which the user can set to an arbitrary time, to
|
||
indicate that the contents of this file were written a long time ago
|
||
by someone else on another computer. The default value of this
|
||
quantity, if the user has not set it, is the time someone last
|
||
modified the information in the file. This quantity, in the OPEN
|
||
response for an output file, is disregarded by the user side, but
|
||
nevertheless must be present.
|
||
|
||
The Symbolics computer system software uses this quantity as a unique
|
||
identifier of file contents, for a given file name, type, and
|
||
version, to prove that a file has not changed since it last recorded
|
||
this quantity for a file.
|
||
|
||
FILEPOS
|
||
|
||
An integer giving the position of the logical file pointer, in
|
||
characters or bytes as appropriate for the type of opening. This is
|
||
always zero for an input opening and for an output opening creating a
|
||
new file. For an output opening appending to an existing file,
|
||
FILEPOS is the number of characters or bytes, as appropriate,
|
||
currently in the file. This number, for character openings, is
|
||
measured in server units: See the section "NFILE Character Set",
|
||
section 6.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 46]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
LENGTH
|
||
|
||
An integer reporting the length of the file, in characters for
|
||
character openings and in bytes of the agreed-upon size for binary
|
||
openings. LENGTH should be reported as zero for output openings,
|
||
even if appending to an existing file. The server usually only knows
|
||
the length for a character opening in server units; thus, it reports
|
||
length in server units.
|
||
|
||
8.21 PROPERTIES Command
|
||
|
||
Command: (PROPERTIES tid handle pathname control-keywords
|
||
properties)
|
||
|
||
Response: (PROPERTIES tid property-element settable-properties)
|
||
|
||
PROPERTIES requests the property information about one file. The
|
||
file is identified by the pathname argument or the handle argument,
|
||
but not both. If pathname is supplied, it is a string in the full
|
||
pathname syntax of the server host. See the section "Syntax of File
|
||
and Directory Pathname Arguments", section 7.4.
|
||
|
||
If handle is supplied, its value is a string identifying an opening,
|
||
which implicitly identifies a file. For direct access mode openings,
|
||
handle must be a direct file identifier.
|
||
|
||
control-keywords is reserved in the current design. However, it is a
|
||
required argument, and must be supplied as the empty token list. Its
|
||
presence in the NFILE specification allows for future expansion. In
|
||
the future the value of control-keywords might affect the listing
|
||
mode.
|
||
|
||
properties is a token list of keywords indicating the properties the
|
||
user wants returned. (In command arguments, properties cannot be
|
||
specified with integers, such as indices into the Property Index
|
||
Table). For a list of keywords associated with file properties: See
|
||
the section "Format of NFILE File Property/Value Pairs", section 7.5.
|
||
|
||
The server is always free to return more properties than those
|
||
requested in the properties argument. If properties is supplied as
|
||
the empty token list, the server transmits all known properties of
|
||
the file.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 47]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
PROPERTIES COMMAND RESPONSE
|
||
|
||
The server returns the property information for the given file in the
|
||
command response. The PROPERTIES command does not use any data
|
||
channels. If the specified file does not exist or is not accessible,
|
||
the server signals an error and includes an appropriate three-letter
|
||
error code in the command error response. See the section "NFILE
|
||
Errors and Notifications", section 10.
|
||
|
||
The return value property-element is a token list. The first element
|
||
in that token list is the pathname of the file, in the full pathname
|
||
syntax of the server host. The following elements of the property-
|
||
element token list are property/value pairs. The server is expected
|
||
to return several property/value pairs; the number of pairs is not
|
||
constrained. For further details on file properties and their
|
||
associated values: See the section "Format of NFILE File
|
||
Property/Value Pairs", section 7.5.
|
||
|
||
The return value settable-properties is a token list of keywords.
|
||
The number of keywords is not constrained. (Note that integers
|
||
cannot be used in settable-properties to indicate the file property;
|
||
keywords are to be used instead.) Each keyword supplied in
|
||
settable-properties identifies a property considered settable by the
|
||
server. The server is implicitly guaranteeing a mechanism for
|
||
changing the properties reported as settable. The user can change
|
||
any of the settable properties for this file by using the CHANGE-
|
||
PROPERTIES command. See the section "CHANGE-PROPERTIES Command",
|
||
section 8.2.
|
||
|
||
The following example shows the format of the PROPERTIES command
|
||
response. Remember that the number of property/value pairs and
|
||
keywords is not constrained; this example has two property/value
|
||
pairs and three settable-properties keywords returned:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 48]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
TOP-LEVEL-LIST-BEGIN
|
||
PROPERTIES - name of the command
|
||
tid - transaction identifier
|
||
LIST-BEGIN
|
||
pathname of file
|
||
prop1 value1 - file's property/value pairs
|
||
prop2 value2
|
||
LIST-END
|
||
LIST-BEGIN
|
||
keyword-1 - file's settable properties
|
||
keyword-2
|
||
keyword-3
|
||
LIST-END
|
||
TOP-LEVEL-LIST-END
|
||
|
||
The following example is designed to better show the structure of the
|
||
top-level token list by depicting TOP-LEVEL-LIST-BEGIN and TOP-
|
||
LEVEL-LIST-END by parentheses and LIST-BEGIN and LIST-END by square
|
||
brackets. The indentation and newlines in the example are not part
|
||
of the token list, but are used here to make the structure of the
|
||
token list clear.
|
||
|
||
(PROPERTIES tid [ pathname prop1 value1 prop2 value2 ...]
|
||
[ keyword1 keyword2 keyword3 ... ]
|
||
|
||
8.22 READ Command
|
||
|
||
Command: (READ tid direct-file-id input-handle count FILEPOS)
|
||
|
||
Response: (READ tid)
|
||
|
||
READ requests input data flow for direct access openings. The
|
||
direct-file-id is the same as the DIRECT-FILE-ID argument that was
|
||
given when opening the file; it designates the opening from which the
|
||
characters or bytes are to be transferred. The input-handle
|
||
specifies which data channel should be used for the transfer of data
|
||
from server to user. The data channel should have been already
|
||
established, cannot have been disestablished, and must not currently
|
||
be in use.
|
||
|
||
count is an integer specifying how many bytes (or NFILE characters,
|
||
as appropriate) to read. count can be supplied as the empty token
|
||
list, meaning read to the end of the file. If the user specifies the
|
||
empty token list or a count greater than the number of bytes
|
||
remaining in the file, the server sends the keyword EOF to mark the
|
||
end of the file.
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 49]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
FILEPOS is an optional keyword/value pair. If the keyword FILEPOS is
|
||
supplied, it must be followed by an integer. Before data is
|
||
transferred, the opening is positioned to the point specified by the
|
||
value of FILEPOS. The position of the point is measured in server
|
||
units for character openings; for binary openings it is measured in
|
||
binary bytes. See the section "FILEPOS NFILE Command".
|
||
|
||
Upon receiving the READ command, the server binds the data channel to
|
||
the opening and immediately begins transferring data. The server
|
||
stops when all data has been transferred. After the server sends the
|
||
last requested byte, it unbinds the data channel, freeing it for
|
||
other use. When the user side has processed the last byte, the user
|
||
side assumes that the data channel can now be reused for another data
|
||
transfer.
|
||
|
||
8.23 RENAME Command
|
||
|
||
Command: (RENAME tid handle pathname to-pathname)
|
||
|
||
Response: (RENAME tid from-pathname to-pathname)
|
||
|
||
RENAME requests the server to give a file a new name. This is
|
||
NFILE's interface to the system's native rename operation, with all
|
||
of its system-specific semantics and constraints.
|
||
|
||
Either a handle or a pathname (but not both) specifies the file that
|
||
is to receive a new name. The argument to-pathname designates that
|
||
new name. The return value from-pathname gives the full original
|
||
name of the file, and to-pathname gives the full new name of the
|
||
file. For systems that support version numbers, the return values
|
||
can differ in version number from the values of the arguments given
|
||
to RENAME.
|
||
|
||
The arguments pathname and to-pathname and the return values from-
|
||
pathname and to-pathname are strings in the full pathname syntax of
|
||
the server host. See the section "Syntax of File and Directory
|
||
Pathname Arguments", section 7.4.
|
||
|
||
If the file to be renamed is specified by a pathname, the file should
|
||
be renamed immediately. If the file is specified by handle, it is
|
||
acceptable to wait until close-time to rename the file.
|
||
|
||
Some operating systems can rename only within a directory.
|
||
Nevertheless, the to-pathname of the RENAME must be fully specified;
|
||
the server on these systems must check for and reject an attempted
|
||
cross-directory rename.
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 50]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
8.24 RESYNCHRONIZE-DATA-CHANNEL Command
|
||
|
||
The command and response format for this command varies, depending on
|
||
whether the handle argument indicates an input or output data
|
||
channel.
|
||
|
||
For an Input Handle:
|
||
|
||
Command: (RESYNCHRONIZE-DATA-CHANNEL tid handle)
|
||
|
||
Response: (RESYNCHRONIZE-DATA-CHANNEL tid identifier)
|
||
|
||
For an Output Handle:
|
||
|
||
Command: (RESYNCHRONIZE-DATA-CHANNEL tid handle identifier)
|
||
|
||
Response: (RESYNCHRONIZE-DATA-CHANNEL tid)
|
||
|
||
RESYNCHRONIZE-DATA-CHANNEL begins a prescribed procedure between user
|
||
and server over the unsafe data channel specified by handle. The
|
||
resynchronization procedure clears the data channel of any unwanted
|
||
data, and restores the data channel to a safe state, ready to
|
||
transfer data again.
|
||
|
||
All arguments to RESYNCHRONIZE-DATA-CHANNEL are required.
|
||
|
||
For a detailed description of how the user and server coordinate the
|
||
resynchronization of data channels: See the section "NFILE Data
|
||
Connection Resynchronization", section 9.2.
|
||
|
||
8.24.1 Implementation Hints for RESYNCHRONIZE-DATA-CHANNEL Command
|
||
|
||
In general, both the user and server should should be implemented
|
||
with the knowledge that a transmission can be aborted. That is, the
|
||
receiving side must be careful not to act upon a transmission (that
|
||
is, to perform any action or side effect) until the transmission has
|
||
been successfully received in entirety. This protects the user
|
||
program from the possibility that an abort can occur after a
|
||
transmission has been partially sent.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 51]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
RESYNCHRONIZING AN OUTPUT DATA CHANNEL
|
||
|
||
The server will probably want to dispatch the looping and reading to
|
||
the logical data process. Looping reading for the resynchronization
|
||
identifier in the control connection handler is not a viable option.
|
||
If the user side fails to send the resynchronization identifier (for
|
||
example, due to a user abort) the control connection handler can
|
||
never be broken out of this loop.
|
||
|
||
Should the user side send the control connection handler command
|
||
first, or send the marks and identifiers first?
|
||
|
||
Sending the marks first is problematic, because the data channel at
|
||
the other end might not be reading them (for it has not yet been so
|
||
instructed by the control connection handler). The user might then
|
||
become blocked for output, thus prohibiting sending of the
|
||
RESYNCHRONIZE-DATA-CHANNEL command.
|
||
|
||
On the other hand, sending the control connection handler command
|
||
first requires that the user side can send the marks and identifiers
|
||
between sending the control connection handler command and receiving
|
||
a response for it. The response will never come until the marks and
|
||
identifiers have been successfully received. The user implementation
|
||
must allow for this one case of a command where a subroutine that
|
||
"sends a command and waits for a response" is inapplicable.
|
||
|
||
RESYNCHRONIZING AN INPUT DATA CHANNEL
|
||
|
||
The server control process should dispatch the data process to send
|
||
the mark, and not wait, lest the data process become blocked for
|
||
output due to a user abort. The control process must go back to its
|
||
command loop, to possibly receive a command that might break the data
|
||
process out of that block.
|
||
|
||
8.25 UNDATA-CONNECTION Command
|
||
|
||
Command: (UNDATA-CONNECTION tid input-handle output-handle)
|
||
|
||
Response: (UNDATA-CONNECTION tid)
|
||
|
||
UNDATA-CONNECTION explicitly disestablishes a data connection from
|
||
the user side. The user side has the option of disestablishing data
|
||
connections at its discretion. There is no place in the protocol
|
||
where disestablishment of data connections is required, other than at
|
||
the end of the session, where it is implicit.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 52]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The data connection to be disestablished is the one designated by the
|
||
input-handle and output-handle arguments. These two handles must
|
||
refer to the same data connection.
|
||
|
||
It is not permitted to explicitly disestablish a data connection
|
||
either of whose channels is active. If the session is terminated by
|
||
the breaking of the control connection, all file handles become
|
||
meaningless, and the server must close all data connections known to
|
||
it and close-abort all files opened on behalf of the user during the
|
||
dialogue.
|
||
|
||
In the Symbolics implementation, the user side disestablishes data
|
||
connections that have not been used for a long time, such as twenty
|
||
minutes or so.
|
||
|
||
For more information about data connections: See the section "NFILE
|
||
Control and Data Connections", section 4.
|
||
|
||
9. NFILE RESYNCHRONIZATION PROCEDURE
|
||
|
||
Ordinarily, the user side sends NFILE commands to the server side
|
||
over the control connection; the server side responds to every user
|
||
command, and file data is transmitted over the data channels. This
|
||
section describes a resynchronization procedure that takes place when
|
||
something disturbs the usual course of events.
|
||
|
||
First, if the server side aborts while sending or receiving data,
|
||
nothing can be done to salvage the connection between the two hosts.
|
||
The control connection and any data channels associated with this
|
||
connection are broken. This happens rarely, if at all.
|
||
|
||
It is not unusual for the user side to abort file operations, either
|
||
commands or data transfer. On a Symbolics computer, the user can do
|
||
this by pressing CONTROL-ABORT. An important aspect of any file
|
||
protocol is the way it handles the situation when the user side
|
||
aborts file operations.
|
||
|
||
An NFILE user side reacts to user side aborts by immediately marking
|
||
the connection unsafe. When a control connection is unsafe, it must
|
||
be resynchronized before it can be used again. Data channels can
|
||
also be marked unsafe, and must also be resynchronized before further
|
||
use. The resynchronization process rids the connection (whether
|
||
control or data connection) of bytes of data that are now unwanted,
|
||
and thus cleans up the channel so it can be used again.
|
||
|
||
The resynchronization procedure is somewhat complex, but it fulfills
|
||
a genuine need. For those interested, a brief design discussion is
|
||
included as note <3>.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 53]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
9.1 NFILE Control Connection Resynchronization
|
||
|
||
NFILE requires any unsafe control connection to undergo a
|
||
resynchronization procedure before further use. Therefore, the
|
||
resynchronization does not necessarily occur immediately after the
|
||
control connection is marked unsafe. The user side initiates the
|
||
control connection resynchronization when another operation on the
|
||
control connection is attempted.
|
||
|
||
A "mark" is defined in the context of Byte Stream with Mark: See the
|
||
section "Discussion of Byte Stream with Mark", section 12.1.
|
||
|
||
USER SIDE STEPS: CONTROL CONNECTION RESYNCHRONIZATION
|
||
|
||
1. The user side sends a mark over the control connection to
|
||
the server.
|
||
|
||
2. The user side sends the ASCII characters USER-RESYNC-DUMMY
|
||
(as a data token) to the server.
|
||
|
||
3. The user side sends a second mark to the server.
|
||
|
||
4. The user side declares the control connection safe (at the
|
||
token list level).
|
||
|
||
5. The user side generates and sends a unique data token to
|
||
the server.
|
||
|
||
6. The user side then waits, expecting to detect a mark
|
||
followed by the unique data token. The user side reads and
|
||
discards all tokens and marks until the desired match is
|
||
found.
|
||
|
||
Once the user side detects the mark and unique data token, the
|
||
control connection has been fully resynchronized, and can be used
|
||
again.
|
||
|
||
|
||
SERVER SIDE STEPS: CONTROL CONNECTION RESYNCHRONIZATION
|
||
|
||
1. The server side detects a mark. The server is thus alerted
|
||
that the control connection is unsafe, and that
|
||
resynchronization is in progress.
|
||
|
||
2. The server continues to read data coming from the user side
|
||
until it detects the second mark, and the token following
|
||
it.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 54]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
3. The server checks to see if the token following the mark is
|
||
USER-RESYNC-DUMMY. This rare situation occurs if the user
|
||
aborts during the course of the resynchronization itself.
|
||
If so, the server side discards the USER-RESYNC-DUMMY
|
||
token. The control connection is still unsafe, and the
|
||
user side restarts the resynchronization procedure; the
|
||
server side therefore begins at Step 2 again.
|
||
|
||
4. If the token following the mark is not USER-RESYNC-DUMMY
|
||
(this is the expected circumstance), the server should have
|
||
received a single data token that is the unique data token
|
||
generated by the user side.
|
||
|
||
a. The server sends a mark to the user side.
|
||
|
||
b. The server declares the control connection safe (at
|
||
the token list level).
|
||
|
||
c. The server sends the unique data token to the user
|
||
side.
|
||
|
||
5. If the server detects something following the mark that was
|
||
neither USER-RESYNC-DUMMY nor a single data token, a
|
||
protocol error has occurred.
|
||
|
||
9.2 NFILE Data Connection Resynchronization
|
||
|
||
The NFILE data channel resynchronization procedure is similar to the
|
||
NFILE control connection resynchronization. Both procedures are
|
||
based on a mark signalling the unsafe condition, then a second mark
|
||
followed by a unique identifier. One important difference between
|
||
the two procedures is the circumstances in which they occur. Control
|
||
connections are put into unsafe states only when the user aborts
|
||
during control connection I/O operations. Data channels are made
|
||
unsafe by a larger set of circumstances:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 55]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
- User aborts occur during the file protocol operations that
|
||
assign and deassign data channels. This is the most common
|
||
cause of data channels becoming unsafe.
|
||
|
||
- A server receives a CLOSE command (with abort-p supplied as
|
||
Boolean truth) specifying an open file that has not finished
|
||
transmitting data. That is, file reading is aborted.
|
||
|
||
- The ABORT command is issued, causing data channels to be
|
||
made unsafe.
|
||
|
||
- The FILEPOS command is issued, causing the input data
|
||
channel to become unsafe.
|
||
|
||
The resynchronization clears the data channel of unwanted data from
|
||
aborted operations and puts the data channel in a known state. The
|
||
data channel resynchronization procedure is invoked when the user
|
||
side gives the RESYNCHRONIZE-DATA-CHANNEL command over the control
|
||
connection.
|
||
|
||
The following policies can be used to improve response time, but are
|
||
not required by the NFILE protocol: The user side can initiate
|
||
resynchronization only if it needs the data channel, having first
|
||
tried to use a free data channel that does not require
|
||
resynchronization. Also, the user side can periodically
|
||
resynchronize all unsafe data channels.
|
||
|
||
In giving the RESYNCHRONIZE-DATA-CHANNEL command, the user side
|
||
indicates which data channel should be resynchronized. Data channels
|
||
are unidirectional, which means that depending on the direction
|
||
(either input or output) of the data channel, either the user side or
|
||
the server side sends the resynchronization data. This is another
|
||
difference from the resynchronization of the control connection, in
|
||
which the resynchronization data is always sent by the user side.
|
||
The resynchronization steps for input data channels are different
|
||
than the steps for output data channels.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 56]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
INPUT DATA CHANNEL RESYNCHRONIZATION
|
||
|
||
1. The user side gives the RESYNCHRONIZE-DATA-CHANNEL command
|
||
on the control connection, with only one argument, the
|
||
handle of the data channel to be resynchronized.
|
||
|
||
2. The server side of the data channel generates a unique
|
||
identifier, and sends that data token in its regular
|
||
command response to the user side.
|
||
|
||
3. The server side sends a mark over the data channel.
|
||
|
||
4. The server side sends the unique identifier token over the
|
||
data channel.
|
||
|
||
5. The user side reads until it detects a mark followed by the
|
||
unique identifier token. The resynchronization is then
|
||
complete. The data channel is no longer in an unsafe
|
||
state.
|
||
|
||
OUTPUT DATA CHANNEL RESYNCHRONIZATION
|
||
|
||
1. The user side gives the RESYNCHRONIZE-DATA-CHANNEL command
|
||
on the control connection, with two arguments: the handle
|
||
of the data channel to be resynchronized, and a unique
|
||
identifier that it has just generated.
|
||
|
||
2. The user side of the data channel sends a mark.
|
||
|
||
3. The user side of the data channel sends a dummy identifier
|
||
token. The dummy identifier can be any token that the
|
||
server could not interpret as being the unique identifier.
|
||
One suggestion is the data token DUMMY-IDENTIFIER.
|
||
|
||
4. The server side of the data channel was alerted by the
|
||
RESYNCHRONIZE-DATA-CHANNEL command that resynchronization
|
||
is in progress. The server side now reads the data,
|
||
seeking the first mark.
|
||
|
||
5. The server side reads and discards the first mark and the
|
||
dummy identifier.
|
||
|
||
6. The user side sends a second mark.
|
||
|
||
7. The user side sends the unique identifier.
|
||
|
||
8. The server side recognizes the mark and the unique
|
||
identifier that follows, and the resynchronization is
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 57]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
complete. The data channel is no longer in the unsafe
|
||
state.
|
||
|
||
10. NFILE ERRORS AND NOTIFICATIONS
|
||
|
||
NFILE recognizes two types of errors: command response errors and
|
||
asynchronous errors. In addition to errors, NFILE supports
|
||
notifications.
|
||
|
||
Command response errors:
|
||
|
||
- Signify an error that prevented the successful completion of
|
||
the command; when such an error occurs, a command response
|
||
error is sent instead of a normal command response.
|
||
- Occur frequently in normal operations
|
||
|
||
Asynchronous errors:
|
||
|
||
- Are not related to any specific command
|
||
- Are associated with an erring data channel
|
||
- Typically indicate a problem in the transfer, such as
|
||
running out of disk space or allocation, or an unreadable
|
||
disk record
|
||
- Occur rarely in normal operations
|
||
|
||
Notifications:
|
||
|
||
- Are not associated with an error
|
||
- Are sent at the server's discretion
|
||
- Provide general information, such as a warning that the
|
||
system is going down
|
||
|
||
10.1 Notifications From the NFILE Server
|
||
|
||
The NFILE server can send asynchronous notifications to the user side
|
||
over the control connection. The text of the notification contains
|
||
information of interest to the person using NFILE, such as a warning
|
||
that the server's operating system will be going down soon.
|
||
Notifications can come from the server side at any time that the
|
||
server is not sending something else.
|
||
|
||
The format of NFILE notifications is:
|
||
|
||
(NOTIFICATION "" text)
|
||
|
||
The empty string "" takes the place of a transaction identifier.
|
||
Notifications are initiated by the server, and are not associated
|
||
with any transaction originated by the user side.n
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 58]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
10.2 NFILE Command Response Errors
|
||
|
||
When an error prevents the successful completion of an NFILE command,
|
||
a command response error is sent instead of the normal command
|
||
response. A normal command response indicates success; a command
|
||
response error indicates failure of the command.
|
||
|
||
NFILE command response errors are sent from the server to the user
|
||
across the control connection as top-level token lists, in this
|
||
format:
|
||
|
||
(ERROR tid three-letter-code error-vars message)
|
||
|
||
ERROR is a keyword. The tid is the transaction identifier of the
|
||
command that encountered this error. The arguments three-letter-
|
||
code, error-vars, and message are all required.
|
||
|
||
The three-letter-code provides the information on what kind of an
|
||
error was encountered. For a table of the three-letter codes and
|
||
their meanings: See the section "NFILE Three-letter Error Codes",
|
||
section 10.4.
|
||
|
||
message is a string that is displayed to the human user of the
|
||
protocol.
|
||
|
||
error-vars is a keyword/value list. The three possible keywords are:
|
||
PATHNAME, OPERATION, and NEW-PATHNAME. Before transmitting an error,
|
||
the server looks at the type of error to see if it can easily
|
||
determine the value of any of the keywords. If so, the server
|
||
includes the keyword/value pair in its error. If not, the
|
||
keyword/value pair is omitted. The value associated with OPERATION
|
||
is the keyword naming the NFILE command that failed. The values
|
||
associated with PATHNAME and NEW-PATHNAME are strings in the full
|
||
pathname syntax of the server host.
|
||
|
||
For example, suppose the server on a file system with hierarchical
|
||
directories could not access a file because its containing directory
|
||
did not exist. The command error response would use the PATHNAME
|
||
keyword to indicate the first directory level that did not exist,
|
||
instead of the full pathname which was supplied as the command
|
||
argument. This gives the user side valuable information that it
|
||
otherwise would not have known.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 59]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
10.3 NFILE Asynchronous Errors
|
||
|
||
When a data channel process, in either direction, encounters an error
|
||
condition, the server sends an asynchronous error description. An
|
||
asynchronous error description consists of a top-level token list.
|
||
Typically, asynchronous errors indicate error conditions in the
|
||
transfer, such as running out of disk space or allocation, or a
|
||
unreadable disk record.
|
||
|
||
The format of asynchronous error descriptions is:
|
||
|
||
(ASYNC-ERROR handle three-letter-code error-vars message)
|
||
|
||
ASYNC-ERROR is a keyword. The handle argument identifies the erring
|
||
data channel. The arguments three-letter-code, error-vars, and
|
||
message are all required. Their meanings are the same as in NFILE
|
||
command error responses: See the section "NFILE Command Response
|
||
Errors", section 10.2.
|
||
|
||
When the server detects an asynchronous error on an input data
|
||
channel, the server sends an asynchronous error description on that
|
||
data channel itself. When an asynchronous error occurs on an output
|
||
data channel, the asynchronous error description is sent on the
|
||
control connection.
|
||
|
||
Some asynchronous errors are restartable. In this context,
|
||
restartable means it makes sense to try to resume the operation. One
|
||
example of a restartable error is an attempt to write a file to a
|
||
file system that is out of room. The server side indicates whether
|
||
an asynchronous error is restartable by prepending the keyword
|
||
RESTARTABLE and the associated value Boolean truth to the error-vars
|
||
list. To proceed from a restartable error, the user side sends a
|
||
CONTINUE command over the control connection.
|
||
|
||
On any asynchronous error, either input or output, the data channel
|
||
on the server side enters an "asynchronous error outstanding" state.
|
||
The server can exit that state in one of two ways: by receiving a
|
||
CONTINUE command or a CLOSE command with the abort-p argument
|
||
supplied as Boolean truth.
|
||
|
||
On a normal CLOSE (not a close-abort), the server side checks the
|
||
channel it was requested to close. If an asynchronous error
|
||
description has been sent on the data channel, but not yet processed
|
||
by CONTINUE, the server side does not close the channel, but sends a
|
||
command error response. The same thing happens on a FINISH command
|
||
received on a channel that has an asynchronous error pending. In
|
||
both cases, the three-letter code included in the command error
|
||
response is EPC, for Error Pending on Channel.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 60]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
10.4 NFILE Three-letter Error Codes
|
||
|
||
Usually the server's operating system provides some description of an
|
||
error that occurs. NFILE has a mechanism for conveying that
|
||
information to the user side. Upon detecting an error, the NFILE
|
||
server should characterize the error by choosing the three-letter
|
||
code that best describes the error. The three-letter code is an
|
||
argument in both the command response error and asynchronous error
|
||
messages from the server to the user.
|
||
|
||
Each of the NFILE three-letter codes represents some system error.
|
||
The set of codes enables all operating systems to use one error-
|
||
reporting mechanism. Some operating systems will never encounter
|
||
certain of the error conditions.
|
||
|
||
Some errors fit logically into two error codes. For example, suppose
|
||
the server could not delete a file because the file was not found.
|
||
This error could be considered either CDF (Cannot Delete File) or FNF
|
||
(File Not Found). In this case, File Not Found gives more specific
|
||
and valuable information than Cannot Delete File. Since the protocol
|
||
does not allow more than one error code to be reported when an error
|
||
occurs, the server must choose the most appropriate error code, given
|
||
the information available to it from the operating system.
|
||
|
||
This is the set of three-letter codes:
|
||
|
||
ACC Access error. This indicates a protection-violation error.
|
||
|
||
ATD Incorrect access to directory. A directory could not be
|
||
accessed because the user's access rights to it did not
|
||
permit this type of access.
|
||
|
||
ATF Incorrect access to file. A file could not be accessed
|
||
because the user's access rights to it did not permit this
|
||
type of access.
|
||
|
||
BUG File system bug. This includes all protocol violations
|
||
detected by the server, as well as by the host file system.
|
||
|
||
CCD Cannot create directory. An error occurred in attempting to
|
||
create a directory.
|
||
|
||
CDF Cannot delete file. The file system reported that it cannot
|
||
delete a file.
|
||
|
||
CCL Cannot create link. An error occurred in attempting to
|
||
create a link.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 61]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
CIR Circular link. An operation was attempted on a pathname that
|
||
designates a link that eventually links back to itself.
|
||
|
||
CRF Cannot rename file. An error occurred in attempting to
|
||
rename a file.
|
||
|
||
CSP Cannot set property. An error occurred in attempting to
|
||
change the properties of a file. This could mean that you
|
||
tried to set a property that only the file system is allowed
|
||
to set, or a property that is not defined on this type of
|
||
file system.
|
||
|
||
DAE Directory already exists. A directory could not be created
|
||
because a directory or file of this name already exists.
|
||
|
||
DAT Data error. The file system contains unreadable data. This
|
||
could mean data errors detected by hardware or inconsistent
|
||
data inside the file system.
|
||
|
||
DEV Device not found. The device of the file was not found or
|
||
does not exist.
|
||
|
||
DND "Do Not Delete" flag set. An attempt was made to delete a
|
||
file that is marked by a "Do Not Delete" flag.
|
||
|
||
DNE Directory not empty. An invalid deletion of a nonempty
|
||
directory was attempted.
|
||
|
||
DNF Directory not found. The directory was not found or does not
|
||
exist. This refers specifically to the containing directory;
|
||
if you are trying to access a directory, and the actual
|
||
directory you are trying to access is not found, FNF (for
|
||
File Not Found) should be indicated instead.
|
||
|
||
EPC Error pending on channel. The server cannot close the
|
||
channel in attempting to close or finish the channel.
|
||
|
||
FAE File already exists. The file could not be created because a
|
||
file or directory of this name already exists.
|
||
|
||
FNF File not found. The file was not found in the containing
|
||
directory. The TOPS-20 and TENEX "no such file type" and "no
|
||
such file version" errors should also report this condition.
|
||
|
||
FOO File open for output. Opening a file that was already opened
|
||
for output was attempted.
|
||
|
||
FOR Filepos out of range. Setting the file pointer past the
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 62]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
end-of-file position or to a negative position was attempted.
|
||
|
||
FTB File too big. File is larger than the maximum file size
|
||
supported by the file system.
|
||
|
||
HNA Host not available The file server or file system is
|
||
intentionally denying service to user. This does not mean
|
||
that the network connection failed; it means that the file
|
||
system is explicitly not available.
|
||
|
||
IBS Invalid byte size. The value of the "byte size" option was
|
||
not valid.
|
||
|
||
ICO Inconsistent options. Some of the options given in this
|
||
operation are inconsistent with others.
|
||
|
||
IOD Invalid operation for directory. The specified operation is
|
||
invalid for directories, and the given pathname specifies a
|
||
directory, in directory pathname as file format.
|
||
|
||
IOL Invalid operation for link. The specified operation is
|
||
invalid for links, and this pathname is the name of a link.
|
||
|
||
IP? Invalid password. The specified password was invalid.
|
||
|
||
IPS Invalid pathname syntax. This includes all invalid pathname
|
||
syntax errors.
|
||
|
||
IPV Invalid property value. The new value provided for the
|
||
property is invalid.
|
||
|
||
IWC Invalid wildcard. The pathname is not a valid wildcard
|
||
pathname.
|
||
|
||
LCK File locked. The file is locked. It cannot be accessed,
|
||
possibly because it is in use by some other process.
|
||
|
||
LIP Login problems. A problem was encountered while trying to
|
||
log in to the file system.
|
||
|
||
MSC Miscellaneous problems.
|
||
|
||
NAV Not available. The file or device exists but is not
|
||
available. Typically, the disk pack is not mounted on a
|
||
drive, the drive is broken, or the like. Operator
|
||
intervention is probably required to fix the problem, but
|
||
retrying the operation is likely to succeed after the problem
|
||
is solved.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 63]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
NER Not enough resources. For example, a system limit on the
|
||
number of open files or network connections has been reached.
|
||
|
||
NET Network problem. The file server had some sort of trouble
|
||
trying to create a new data connection, or perform some other
|
||
network operation, and was unable to do so.
|
||
|
||
NFS No file system. The file system was not available. For
|
||
example, this host does not have any file systems, or this
|
||
host's file system cannot be initialized or accessed for some
|
||
reason, or the file system simply does not exist.
|
||
|
||
NLI Not logged in. A file operation was attempted before logging
|
||
in. Normally the file system interface always logs in before
|
||
doing any operation, but this problem can occur in certain
|
||
unusual cases in which logging in has been aborted.
|
||
|
||
|
||
NMR No more room. The file system is out of room. This can mean
|
||
any of several things:
|
||
|
||
- The entire file system is full.
|
||
- The particular volume involved is full.
|
||
- The particular directory involved is full.
|
||
- The user's allocated quota has been exceeded.
|
||
|
||
RAD Rename across directories. The devices or directories of the
|
||
initial and target pathnames are not the same, but on this
|
||
file system they are required to be.
|
||
|
||
REF Rename to existing file. The target name of a rename
|
||
operation is the name of a file that already exists.
|
||
|
||
UKC Unknown operation. An unsupported file system operation was
|
||
attempted, or an unsupported command was attempted.
|
||
|
||
UKP Unknown property. The property is unknown.
|
||
|
||
UNK Unknown user. The specified user name is unknown to this
|
||
host.
|
||
|
||
UUO Unimplemented option. An option to a command is not
|
||
implemented.
|
||
|
||
WKF Wrong kind of file. This includes errors in which an invalid
|
||
operation for a file, directory, or link was attempted.
|
||
|
||
WNA Wildcard not allowed.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 64]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
11. TOKEN LIST TRANSPORT LAYER
|
||
|
||
PURPOSE: The Token List Transport Layer is a protocol that
|
||
facilitates the transmission of simple structured data, such as
|
||
lists.
|
||
|
||
11.1 Introduction to the Token List Transport Layer
|
||
|
||
The Token List Transport Layer is a general-purpose protocol. The
|
||
Token List Transport Layer sends "tokens" through its underlying
|
||
stream. Each token usually represents a simple quantity, such as a
|
||
string or integer.
|
||
|
||
Tokens can be organized into "token lists". Special tokens are
|
||
provided to denote the starting and ending point of lists. The token
|
||
list transport layer differentiates between "top-level token lists",
|
||
which are not contained in other lists, and "embedded token lists",
|
||
which are contained in other lists. Using lists makes it convenient
|
||
to send structured records, such as commands and command responses of
|
||
the client protocol. The top-level token lists provide robustness.
|
||
|
||
The Token List Transport Layer is a general term that includes two
|
||
separate but related subjects: the "token list stream" and the
|
||
"token list data stream". The token list stream is commonly used for
|
||
applications that can easily organize the information to be
|
||
transmitted into tokens and lists. The token list data stream is
|
||
more appropriate for transmitting a large volume of data that cannot
|
||
easily be structured into tokens and lists, such as file data, which
|
||
is simply a sequence of characters or bytes.
|
||
|
||
The following table illustrates the main differences between token
|
||
list streams and token list data streams:
|
||
|
||
Token List Data Stream Token List Stream
|
||
---------------------- -----------------
|
||
|
||
Built on: token list stream Byte Stream with Mark
|
||
|
||
Transmits: stream data tokens, token lists
|
||
|
||
Example
|
||
of use: NFILE data channels NFILE control
|
||
connection
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 65]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
NFILE uses the the Token List Transport Layer, and provides an
|
||
excellent example of its usefulness. The NFILE commands and command
|
||
responses are sent over the control connection in a token list
|
||
stream. File data is sent across each data channel in a token list
|
||
data stream.
|
||
|
||
11.2 Token List Stream
|
||
|
||
11.2.1 Types of Tokens and Token Lists
|
||
|
||
All numbers in the token list documentation are represented in
|
||
decimal notation. Bytes are 8 bits long.
|
||
|
||
TYPES OF TOKENS
|
||
|
||
Tokens are of the following types:
|
||
|
||
1. Atomic tokens.
|
||
|
||
Atomic tokens are of the following subtypes:
|
||
|
||
- Data tokens. A data token consists of a sequence of
|
||
bytes with an effectively infinite maximum length. In
|
||
some contexts a data token represents a string; in
|
||
other contexts, a data token is other arbitrary data.
|
||
|
||
Each data token is preceded in the token list stream
|
||
by a representation of its length in bytes.
|
||
|
||
Data tokens that are under 200 bytes long are preceded
|
||
by one byte containing their length in bytes. That
|
||
is, a data token of 34 bytes is preceded by one byte
|
||
of value 34.
|
||
|
||
Data tokens 200 bytes or over are preceded by the byte
|
||
known as PUNCTUATION-LONG, of value 201. After the
|
||
201 comes a four-byte-long number (least significant
|
||
byte first) containing the length of the data token
|
||
that follows.
|
||
|
||
- Numeric tokens. A sequence of bytes that represent
|
||
and encode a nonnegative binary integer. The largest
|
||
valid integer is 2^63 - 1.
|
||
|
||
Numeric tokens are either short integers (less than
|
||
256) or long integers (greater than or equal to 256).
|
||
Short integers are preceded by the byte known as
|
||
PUNCTUATION-SHORT-INTEGER, of value 206.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 66]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Long integers are begun by PUNCTUATION-LONG-INTEGER,
|
||
of value 207. One byte follows, containing the length
|
||
(in bytes) of the long integer. The integer itself is
|
||
next, least significant byte first.
|
||
|
||
- Keyword tokens. A sequence of bytes that represent
|
||
and encode a named identifier of the implemented
|
||
protocol. Keyword tokens are used by the client
|
||
protocol to convey a name; the only significance of a
|
||
keyword token is in its name.
|
||
|
||
Each keyword is preceded by the byte known as
|
||
PUNCTUATION-KEYWORD, of value 208. The data token
|
||
following PUNCTUATION-KEYWORD represents the name of
|
||
the keyword as a string. The characters are in
|
||
upper-case standard ASCII.
|
||
|
||
- Boolean truth. A special token that represents the
|
||
Boolean truth value. This token is known as
|
||
BOOLEAN-TRUTH, of value 209 <4>.
|
||
|
||
2. Control tokens.
|
||
|
||
The token list stream supports four control tokens to delimit token
|
||
lists, and one padding token.
|
||
|
||
TOP-LEVEL-LIST-BEGIN 202 This control token
|
||
appears at the start of
|
||
each top-level token list.
|
||
|
||
TOP-LEVEL-LIST-END 203 This control token
|
||
appears at the end of
|
||
each top-level token list.
|
||
LIST-BEGIN 204 This control token
|
||
appears at the start of
|
||
each embedded token list.
|
||
|
||
LIST-END 205 This control token
|
||
appears at the end of
|
||
each embedded token list.
|
||
|
||
PUNCTUATION-PAD 200 This padding token should
|
||
be ignored by the token
|
||
list stream. It can be
|
||
sent to fill buffers.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 67]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
TOKEN LISTS
|
||
|
||
A token list consists of a sequence of atomic tokens or token lists.
|
||
Token lists are begun and ended by control tokens that delimit the
|
||
token lists. There are three types of token lists:
|
||
|
||
1. Top-level token lists.
|
||
|
||
Top-level token lists begin with TOP-LEVEL-LIST-BEGIN and
|
||
end with TOP-LEVEL-LIST-END. Top-level token lists are not
|
||
contained in other lists.
|
||
|
||
2. Embedded token lists.
|
||
|
||
These token lists occur inside other token lists. They
|
||
begin with LIST-BEGIN and end with LIST-END.
|
||
|
||
3. The empty token list.
|
||
|
||
This is a special example of the embedded token list. In
|
||
some contexts, the empty token list represents Boolean
|
||
falsity. An embedded empty token list is composed of a
|
||
LIST-BEGIN followed immediately by a LIST-END. A top-level
|
||
empty token list is composed of TOP-LEVEL-LIST-BEGIN
|
||
followed immediately by TOP-LEVEL-LIST-END.
|
||
|
||
11.2.2 Token List Stream Example
|
||
|
||
This section contains an example of some data that can appear on a
|
||
token list stream. The example is a top-level token list encoding an
|
||
NFILE DELETE command.
|
||
|
||
The DELETE command is composed of the following pieces: a TOP-
|
||
LEVEL-LIST-BEGIN, the keyword DELETE, a data token containing the
|
||
transaction identifier, a LIST-BEGIN, a LIST-END, a data token
|
||
containing a pathname of a file to be deleted, and a TOP-LEVEL-LIST-
|
||
END. This example uses t105 as the transaction identifier, and
|
||
/usr/max/temp as the pathname.
|
||
|
||
All numbers in this section are expressed in decimal notation.
|
||
|
||
The pieces of the command are displayed here in order:
|
||
|
||
1. TOP-LEVEL-LIST-BEGIN
|
||
2. The keyword token whose name is DELETE
|
||
3. The data token containing the characters: t105
|
||
4. LIST-BEGIN
|
||
5. LIST-END
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 68]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
6. The data token containing the characters: /usr/max/temp
|
||
7. TOP-LEVEL-LIST-END
|
||
|
||
Now, let's translate each piece of the command into the bytes that
|
||
are transmitted through the token list stream.
|
||
|
||
1. TOP-LEVEL-LIST-BEGIN
|
||
|
||
202 represents TOP-LEVEL-LIST-BEGIN
|
||
|
||
2. The keyword token whose name is DELETE.
|
||
|
||
A keyword token is introduced by PUNCTUATION-KEYWORD, which
|
||
is represented in the token list stream as the byte 208.
|
||
|
||
A data token follows, containing the string "DELETE". A
|
||
data token under 200 bytes long is introduced by one byte
|
||
containing its length in bytes. The length of this data
|
||
token is 6 bytes.
|
||
|
||
The data token continues with the standard ASCII character
|
||
set representation of each character in the string DELETE:
|
||
|
||
208 represents PUNCTUATION-KEYWORD
|
||
006 represents the length of this data token
|
||
068 represents "D"
|
||
069 represents "E"
|
||
076 represents "L"
|
||
069 represents "E"
|
||
084 represents "T"
|
||
069 represents "E"
|
||
|
||
3. The data token containing the characters: t105
|
||
|
||
This data token is begun by its length in bytes (4), and
|
||
continues with the NFILE character set representation of
|
||
each character in the string:
|
||
|
||
004 represents the length of this data token
|
||
116 represents "t"
|
||
049 represents "1"
|
||
048 represents "0"
|
||
053 represents "5"
|
||
|
||
4. LIST-BEGIN
|
||
|
||
204 represents LIST-BEGIN
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 69]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
5. LIST-END
|
||
|
||
205 represents LIST-END
|
||
|
||
6. The data token containing the characters: /usr/max/temp
|
||
|
||
013 represents length of this data token
|
||
047 represents "/"
|
||
117 represents "u"
|
||
115 represents "s"
|
||
114 represents "r"
|
||
047 represents "/"
|
||
109 represents "m"
|
||
097 represents "a"
|
||
120 represents "x"
|
||
047 represents "/"
|
||
116 represents "t"
|
||
101 represents "e"
|
||
109 represents "m"
|
||
112 represents "p"
|
||
|
||
7. TOP-LEVEL-LIST-END
|
||
|
||
203 represents TOP-LEVEL-LIST-END
|
||
|
||
11.2.3 Mapping of Lisp Objects to Token List Stream Representation
|
||
|
||
The Symbolics interface to the token list stream sends Lisp objects
|
||
through the underlying Byte Stream with Mark and produces Lisp
|
||
objects on the other end. Not all Lisp objects can be sent in this
|
||
way. For example, compound objects other than lists are not handled.
|
||
An appropriate analogy is the sending and reconstruction of list
|
||
structure via printed representation. These are the types of objects
|
||
that can be sent, and their representations:
|
||
|
||
- Lisp strings are represented as data tokens in the NFILE
|
||
character set. Only 8-bit strings can be sent <5>.
|
||
|
||
- Keyword symbols are represented as keyword tokens. Although
|
||
identifiable and reconstructable as keyword symbols, only
|
||
their names are sent. Any properties, bindings, and the
|
||
like are not sent.
|
||
|
||
- T is represented as BOOLEAN-TRUTH.
|
||
|
||
- NIL is represented as the empty token list.
|
||
|
||
- Lists are represented as token lists. Circular lists cannot
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 70]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
be sent. See the footnote related to the ambiguity between
|
||
|
||
NIL and the empty list: See the section "Types of Tokens
|
||
and Token Lists", section 11.2.1.
|
||
|
||
- Integers are represented as numeric tokens. Only
|
||
nonnegative integers less than 2^63 can be sent.
|
||
|
||
11.2.4 Aborting and the Token List Stream
|
||
|
||
A token list stream accrues the benefits of the abort management
|
||
policy of the Byte Stream with Mark on which it is built. In order
|
||
to fully realize this benefit, some simple rules must be obeyed by
|
||
any implementation of the token list stream.
|
||
|
||
The term "transmission" means either an atomic token or a complete
|
||
top-level token list. A transmission starts with the control token
|
||
TOP-LEVEL-BEGIN and ends with TOP-LEVEL-END. The top-level token
|
||
list can contain embedded token lists.
|
||
|
||
The interface that writes to the token list stream must be capable of
|
||
writing the representation of entire transmissions. When this
|
||
interface is called, it must effectively lock the token list stream,
|
||
and exclude access by other processes until the entire transmission
|
||
has been encoded and sent.
|
||
|
||
If the sending is aborted while the stream is locked, the stream
|
||
enters an "unsafe" state. Trying to send data while the stream is
|
||
unsafe signals an error. The application and the token list stream
|
||
must send a mark to cause resynchronization, and allow the token list
|
||
stream to be used again. When the reading side encounters this mark,
|
||
it resynchronizes itself according to whatever client protocol is in
|
||
use.
|
||
|
||
Similarly, the interface that reads from the token list stream must
|
||
be capable of reading entire transmissions. When this interface is
|
||
called, it must lock the stream, excluding access by other processes
|
||
until the entire transmission has been read.
|
||
|
||
If the reading is aborted while the stream is locked, the stream
|
||
enters an unsafe state. The only exit from this unsafe state is by
|
||
means of receiving a mark. When the stream is unsafe, the only valid
|
||
operation that can be performed upon it is "read and discard all
|
||
tokens until a mark is encountered; read and discard that mark;
|
||
declare the stream safe again".
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 71]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
Depending on the client protocol, the receipt of a mark might cause
|
||
the reading side to read for further marks. NFILE implements the
|
||
resynchronization of token list streams, and serves as a useful
|
||
example: See the section "NFILE Control Connection
|
||
Resynchronization", section 9.1.
|
||
|
||
The Symbolics implementation provides the two mark-handling
|
||
primitives in this way:
|
||
|
||
|
||
1. Send token (or list) preceded by a mark. When the stream
|
||
is in the unsafe state (on the output side), this is the
|
||
only permitted output operation (other than closing).
|
||
|
||
2. Read through to a mark and read the token (or list)
|
||
following the mark. When the stream is in the unsafe state
|
||
(on the input side), this is the only permitted input
|
||
operation (other than closing).
|
||
|
||
11.3 Token List Data Stream
|
||
|
||
The token list data stream is a facility to transmit stream data
|
||
through a token list stream. The token list data stream imposes the
|
||
following protocol on the data transmitted:
|
||
|
||
- Data is sent in the format of loose data tokens, not
|
||
contained in token lists.
|
||
|
||
- The keyword token EOF indicates that the end of data has
|
||
been reached.
|
||
|
||
- Token lists can be transmitted through the token list
|
||
data stream.
|
||
|
||
- No loose tokens other than data tokens or the keyword
|
||
token EOF can be sent.
|
||
|
||
- Boundaries between data tokens are not signification.
|
||
The data is considered to be a continuous stream, with
|
||
the possible exception of marks.
|
||
|
||
The token list data stream is most appropriate for sending file data.
|
||
It is expected (but not required) that its typical mode of use is to
|
||
send a large number of data tokens, with an occasional token list.
|
||
The design intent was that token lists would be used by the
|
||
application program to indicate exceptional situations.
|
||
|
||
Data tokens, the keyword token EOF, and token lists are defined in
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 72]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
the token list stream documentation: See the section "Types of
|
||
Tokens and Token Lists", section 11.2.1.
|
||
|
||
The NFILE file protocol provides a good example of the use of token
|
||
list data streams. NFILE sends file data through token list data
|
||
streams; each NFILE data channel is a token list data stream. Errors
|
||
such as disk errors during the reading of a file are conveyed as
|
||
token lists through the token list data stream.
|
||
|
||
12. BYTE STREAM WITH MARK
|
||
|
||
PURPOSE: Byte Stream with Mark is a simple layer of protocol that
|
||
guarantees that an out-of-band signal can be transmitted in the case
|
||
of program interruption. Byte Stream with Mark is designed to
|
||
provide end-to-end stream consistency in the face of user program
|
||
aborts.
|
||
|
||
12.1 Discussion of Byte Stream with Mark
|
||
|
||
INTRODUCTION
|
||
|
||
Byte Stream with Mark is a reliable, bidirectional byte stream with
|
||
one out-of-band (but not out-of-sequence) signal called a "mark".
|
||
The design of Byte Stream with Mark ensures that the mark is always
|
||
recognizable on the receiving end. The Byte Stream with Mark is
|
||
built on an underlying stream, which must support the transmission of
|
||
8-bit bytes. Byte Stream with Mark has been implemented to run on
|
||
TCP and Chaos. Marks are implemented differently on the two
|
||
protocols.
|
||
|
||
Marks are used to resynchronize the stream when something has
|
||
occurred to interrupt normal operations. For example, an application
|
||
layer sending data over the Byte Stream with Mark can abort in the
|
||
middle of sending that data. Recovery is handled by sending a mark.
|
||
|
||
In the context of this document, "aborting" is defined as follows:
|
||
Aborting the current execution of a program means to halt that
|
||
execution and to abandon it, never to complete it. The data
|
||
representing the state of the execution are irrevocably discarded.
|
||
|
||
EXAMPLE OF USE
|
||
|
||
Byte Stream with Mark is the layer of protocol underlying NFILE.
|
||
NFILE uses the marks implemented in Byte Stream with Mark to
|
||
resynchronize control connections or data channels whose
|
||
synchronization has been lost. For a description of NFILE's use of
|
||
marks to resynchronize streams: See the section "NFILE
|
||
Resynchronization Procedure", section 9.
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 73]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
BYTE STREAM WITH MARK ON CHAOSNET
|
||
|
||
A mark is recognized on Chaosnet by a packet bearing the opcode 201
|
||
(octal). There is no data in a mark packet, so the data portion of
|
||
the packet is ignored. Byte Stream with Mark transmits all data in
|
||
packets bearing opcode 200 (octal).
|
||
|
||
If Byte Stream with Mark is implemented on another (non-Chaos) stream
|
||
that supports opcode-bearing packets, the recommended implementation
|
||
is the reservation of an opcode for the mark.
|
||
|
||
BYTE STREAM WITH MARK ON TCP: RECORD MODE
|
||
|
||
The purpose of Byte Stream with Mark is to guarantee that marks can
|
||
always be unambiguously identified. Therefore, for TCP (and for any
|
||
transport layer that does not implement packets natively) a simple
|
||
record stream is imposed on the stream. The record boundaries serve
|
||
only to distinguish where a mark can occur. A record consists of a
|
||
two-byte byte count, most significant byte first, followed by that
|
||
many bytes of data. A byte count of zero is recognized as a mark.
|
||
|
||
Both the sending side and the receiving side must rigorously maintain
|
||
the integrity of the record boundaries. A writer to the stream must
|
||
never output a byte count without that number of data bytes
|
||
following. Similarly, a reader of the stream, after reading a byte
|
||
count, has effectively contracted to read that many bytes from the
|
||
encapsulated stream, regardless of whether those bytes are requested
|
||
by the application layer.
|
||
|
||
MAINTAINING RECORD INTEGRITY
|
||
|
||
This subsection deals with maintaining record integrity on non-Chaos
|
||
networks. Since Chaos implements packets natively, no special care
|
||
is required to maintain record integrity on the Chaos network.
|
||
|
||
The design discussed here guarantees record integrity; the underlying
|
||
stream must guarantee data integrity.
|
||
|
||
The basic design of Byte Stream with Mark on TCP (and other transport
|
||
layers that do not implement packets natively) is to preserve record
|
||
integrity by putting clearly demarcated, byte-counted records in the
|
||
natural records of the encapsulated stream. Therefore, when the
|
||
outer stream requests a buffer's worth of file data from the
|
||
encapsulated stream, it expects to receive a buffer containing one
|
||
entire, ntegral, record of that stream, complete with byte count.
|
||
|
||
Because of diverse network implementations on different operating
|
||
systems, the software that implements the encapsulated stream might
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 74]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
not be able to provide integral record buffers to the Byte Stream
|
||
with Mark implementation. For example, the writing stream could have
|
||
written records that are much longer than available buffers on the
|
||
receiving system. In this case, a request to read from the
|
||
encapsulated stream returns some buffer or some amount of data
|
||
representing less than an entire Byte Stream with Mark record. The
|
||
input subroutine of the Byte Stream with Mark implementation must
|
||
therefore return a region of this (smaller) buffer, representing less
|
||
than the full Byte Stream with Mark record. Nevertheless, the Byte
|
||
Stream with Mark must extract the count of the full Byte Stream with
|
||
Mark record from the first such buffer of each Byte Stream with Mark
|
||
record, and maintain and update this count as succeeding component
|
||
buffers are read.
|
||
|
||
In this case, if the program reading from the Byte Stream with Mark
|
||
aborts while reading data, the implementation of Byte Stream with
|
||
Mark must continue to read through the remaining buffers of the Byte
|
||
Stream with Mark record that has been subdivided in this fashion.
|
||
|
||
The user side program will have determined that an abort has
|
||
occurred, and will request the Byte Stream with Mark to read up to
|
||
and through the next mark. The Byte Stream with Mark will have
|
||
processed a fractional record, and must discard the remaining buffers
|
||
of the record now being read.
|
||
|
||
12.2 Byte Stream with Mark Abortable States
|
||
|
||
Byte Stream with Mark is designed to provide end-to-end stream
|
||
consistency in the face of user program aborts. This section
|
||
describes user program aborts, and how Byte Stream with Mark handles
|
||
them. In the context of this document, "aborting" is defined as
|
||
follows: Aborting the current execution of a program means to halt
|
||
that execution and to abandon it, never to complete it. The data
|
||
representing the state of the execution are irrevocably discarded.
|
||
|
||
USER PROGRAM ABORTS AND I/O STREAMS
|
||
|
||
Aborting the execution of the code that manipulates I/O streams, in
|
||
general, poses significant problems. Given that a stream is a static
|
||
data object, and is intended to be used over and over again, aborting
|
||
the execution of any routine manipulating a stream can leave it in an
|
||
inconsistent, unusable state.
|
||
|
||
Many operating systems solve this problem by manipulating a large
|
||
subset of streams within the confines of the supervisor or executive
|
||
program, which is not vulnerable to aborts, short of system or
|
||
network failure. Nevertheless, the need still exists to implement
|
||
streams outside of the boundaries of the supervisor. Furthermore,
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 75]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
the Symbolics computer environment has no supervisor or executive
|
||
program, and is thus vulnerable to aborts everywhere.
|
||
|
||
BYTE STREAM WITH MARK HANDLING OF USER PROGRAM ABORTS
|
||
|
||
Byte Stream with Mark is designed to be nearly impervious to the
|
||
aborting of programs using it. Its design is based on careful
|
||
analysis of all possible states of the stream, and of the effect of
|
||
aborts of the programs using the stream in each of these states.
|
||
This section provides that analysis.
|
||
|
||
A "transmission" is a collection of user data sent by the application
|
||
level through the Byte Stream with Mark whose end is well-defined,
|
||
once its start has been recognized. For instance, the token list
|
||
stream, when using Byte Stream with Mark, sends token lists. When a
|
||
TOP-LEVEL-LIST-BEGIN has been sent, the containing transmission is
|
||
not considered complete until the corresponding TOP-LEVEL-LIST-END is
|
||
read. See the section "Token List Transport Layer", section 11.
|
||
|
||
The following cases are possible states of the stream when an abort
|
||
occurs:
|
||
|
||
1. Abort occurs when the user program is not manipulating the
|
||
stream.
|
||
|
||
This case presents no problem.
|
||
|
||
2. Abort occurs after a transmission has been partially sent,
|
||
at a packet or record boundary.
|
||
|
||
This implies that the datum that would indicate the
|
||
successful complete sending of that transmission has been
|
||
not yet been sent.
|
||
|
||
The Byte Stream with Mark state is consistent, but the
|
||
application level state is not. The application level must
|
||
determine that the execution of the code composing and
|
||
sending its transmission was, in fact, aborted, and
|
||
initiate resynchronization via marks.
|
||
|
||
The receiving side must be careful not to act upon a
|
||
transmission (that is, to perform any action or side
|
||
effect) until the transmission has been successfully
|
||
received in entirety. This protects the user program from
|
||
the possibility that an abort can occur after a
|
||
transmission has been partially sent.
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 76]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
3. Abort occurs during the sending or receiving of a record.
|
||
|
||
This is the most vulnerable state of the mechanism. This
|
||
case does not occur on packet-oriented media; it is
|
||
subsumed by the next case.
|
||
|
||
This case is handled by minimizing the extent of this
|
||
window, and killing the connection when and if the
|
||
situation is detected. Depending on the operating system
|
||
involved, this window could be minimized by using
|
||
interrupt-disabling mechanisms, auxiliary processes or
|
||
tasks, or some other technique.
|
||
|
||
For buffered streams, input and output waiting can be done
|
||
in consistent states, thus minimizing the amount of time
|
||
manipulating the actual encapsulated stream. For
|
||
unbuffered streams, a lot of time can be spent in this
|
||
window. It is expected that unbuffered streams will be
|
||
exceedingly uncommon. Nevertheless, the implementation of
|
||
Byte Stream with Mark must detect this case.
|
||
|
||
4. Abort occurs during the sending or receiving of fundamental
|
||
units of the lowest-level underlying stream (packets,
|
||
buffers, or bytes).
|
||
|
||
This case is usually handled by inhibiting interrupts, or
|
||
other forms of masking, in the code implementing the
|
||
encapsulated stream, since no waiting is possible at
|
||
unexpected times.
|
||
|
||
13. POSSIBLE FUTURE EXTENSIONS
|
||
|
||
NFILE was designed to be extended as the needs of its clients grow,
|
||
or as new clients with different needs appear. Currently it meets
|
||
the needs of the Symbolics Genera 7.0 operating system, although its
|
||
design is intentionally general. If users of other operating systems
|
||
identify new features that would be useful, they could be added to
|
||
NFILE. This section illustrates some areas areas where the design of
|
||
NFILE intentionally accommodates extensions.
|
||
|
||
- The NFILE protocol encodes commands and responses as text,
|
||
rather than using prearranged numbers. This means that new
|
||
commands and responses can be added without having to obtain
|
||
a new number from a central registry.
|
||
|
||
- The Token List Transport Layer provides a general substrate
|
||
for the value-transmission portion of network protocols. In
|
||
fact, it has been used at Symbolics for other protocols
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 77]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
besides NFILE. The Token List Transport Layer could
|
||
conveniently be extended to support transmission of other
|
||
types of values besides those it currently supports.
|
||
|
||
- The character set to be used for file transfer could be made
|
||
negotiable.
|
||
|
||
- The command character set could be made negotiable.
|
||
Currently there is no negotiation sequence, but one could be
|
||
added.
|
||
|
||
- Greater support for more complex file organizations could be
|
||
added, such as record files, databases, and so on. This
|
||
could be an extension to the direct access mode facility.
|
||
|
||
- Currently, the LOGIN command allows the user side to inform
|
||
the server which version of NFILE it is running. This
|
||
feature is included in NFILE so that a server can continue
|
||
to support older versions of the protocol even after new,
|
||
extended versions have been implemented. However, the
|
||
specification is currently somewhat vague as to how the
|
||
server can make use of the version.
|
||
|
||
- NFILE is not restricted to using TCP or Chaos as its
|
||
underlying protocol. NFILE can be built on any byte stream
|
||
protocol that supports reliable transmission of 8-bit bytes
|
||
and multiple connections.
|
||
|
||
In addition to the possible future extensions, we would like to
|
||
mention a known limitation of NFILE.
|
||
|
||
Currently NFILE requires multiple connections for a single session.
|
||
That is, the control connection must be separate from the data
|
||
connections. If NFILE is to be used over a telephone, this
|
||
requirement poses an inconvenient restriction. It is possible to
|
||
implement a multiplexing scheme as a level between NFILE and the
|
||
communication medium.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 78]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
APPENDIX A
|
||
NORMAL TRANSLATION MODE
|
||
|
||
|
||
NORMAL translation mode guarantees the following:
|
||
|
||
- A file containing characters in the NFILE character set can
|
||
be written to any NFILE server and read back intact
|
||
(containing the same characters).
|
||
|
||
- A file written by NFILE should not appear as "foreign" to a
|
||
server operating system unless the file contains NFILE's
|
||
extended characters. That is, a server file that uses only
|
||
the subset of the NFILE character set limited to standard
|
||
ASCII characters (the 95 printing characters, and the native
|
||
representation of return, linefeed, page, backspace, rubout,
|
||
and tab) can be read and written, with the result being the
|
||
same data in NFILE characters as exists in server
|
||
characters.
|
||
|
||
In this section, all numbers designating values of character codes
|
||
are to be interpreted in octal. The notation "x in c1..c2" means
|
||
"for all character codes x such that c1 <= x <= c2."
|
||
|
||
The NFILE character set is an extension of standard ASCII. The 95
|
||
ASCII printing characters have the same numerical codes in the NFILE
|
||
character set. Five ASCII non-printing characters have counterparts
|
||
in the NFILE character set, as shown in the following table. The
|
||
NFILE character set includes a single Return character, rather than
|
||
the carriage-return line-feed sequence typically used in ASCII. The
|
||
NFILE character set does not include the ASCII control characters,
|
||
other than the five shown in the following table, but does include
|
||
some additional printing and formatting characters that have no
|
||
counterparts in ASCII.
|
||
|
||
NFILE Standard ASCII
|
||
|
||
Rubout: 207 177
|
||
Backspace: 210 10
|
||
Tab: 211 11
|
||
Linefeed: 212 12
|
||
Page: 214 14
|
||
|
||
Note that the NFILE Return character is of code 215. This character
|
||
includes "going to the next line". This is a notable difference from
|
||
the convention used in PDP-10 ASCII in which lines are ended by a
|
||
pair of characters, "carriage return" and "line feed".
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 79]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
NORMAL TRANSLATION TO UNIX SERVERS
|
||
|
||
The translation given in this table is appropriate for use by UNIX
|
||
servers, or other servers that use 8-bit bytes to store ASCII
|
||
characters. Machines with 8-bit bytes usually place the extra NFILE
|
||
characters in the top half of their character set.
|
||
|
||
TABLE 1. TRANSLATIONS FROM NFILE CHARACTERS TO UNIX CHARACTERS
|
||
|
||
|
||
NFILE character UNIX character
|
||
|
||
x in 000..007 x
|
||
x in 010..015 x + 200
|
||
x in 016..176 x
|
||
177 377
|
||
x in 200..207 x
|
||
x in 210..211 x - 200
|
||
212 015
|
||
x in 213..214 x - 200
|
||
215 012
|
||
x in 216..376 x
|
||
377 177
|
||
|
||
TABLE 2. TRANSLATIONS FROM UNIX CHARACTERS TO NFILE CHARACTERS
|
||
|
||
|
||
UNIX character NFILE character
|
||
|
||
x in 000..007 x
|
||
x in 010..011 x + 200
|
||
012 215
|
||
x in 013..014 x + 200
|
||
015 212
|
||
x in 016..176 x
|
||
177 377
|
||
x in 200..207 x
|
||
x in 210..215 x - 200
|
||
x in 216..376 x
|
||
377 177
|
||
|
||
NORMAL TRANSLATION TO PDP-10 FAMILY SERVERS
|
||
|
||
The translation given in this table is appropriate for use by PDP-10
|
||
family servers, or other servers that use 7-bit bytes to store ASCII
|
||
characters. On the PDP-10 the sequence CRLF, 015 012, represents a
|
||
new line.
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 80]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
The mechanism for this translation on machines with 7-bit bytes is to
|
||
use the RUBOUT character (octal code 177) as an escape character.
|
||
|
||
TABLE 3. TRANSLATIONS FROM NFILE TO PDP-10 CHARACTERS
|
||
|
||
|
||
NFILE character PDP-10 character(s)
|
||
|
||
x in 000..007 x
|
||
x in 010..012 177 x
|
||
013 013
|
||
x in 014..015 177 x
|
||
x in 016..176 x
|
||
177 177 177
|
||
x in 200..207 177 x - 200
|
||
x in 210..212 x - 200
|
||
213 177 013
|
||
214 014
|
||
215 015 012
|
||
x in 216..376 177 x - 200
|
||
377 no corresponding code
|
||
|
||
These tables might seem confusing at first, but there are some
|
||
general rules about it that should make it clearer. First, NFILE
|
||
characters in the range 000..177 are generally represented as
|
||
themselves, and x in 200..377 is generally represented as 177
|
||
followed by x - 200. That is, 177 is used to quote the second 200
|
||
NFILE characters. It was deemed that 177 is a more useful and common
|
||
character than 377, so 177 177 means 177, and there is no way to
|
||
describe 377 with PDP-10 ASCII characters. In the NFILE character
|
||
set, the formatting control characters appear offset up by 200 with
|
||
respect to standard ASCII. This explains why the preferred mode of
|
||
expressing 210 (backspace) is 010, and 010 turns into 177 010. The
|
||
same reasoning applies to 211 (Tab), 212 (Linefeed), 214 (Formfeed),
|
||
and 215 (Return).
|
||
|
||
More special care is needed for the Return character, which is the
|
||
mapping of the system-dependent representation of "the start of a new
|
||
line". The NFILE Return (215) is equivalent to 015 012 (CRLF) in
|
||
some ASCII systems. In the NFILE character set there is no
|
||
representation
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 81]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
TABLE 4. TRANSLATIONS FROM PDP-10 CHARACTERS TO NFILE CHARACTERS
|
||
|
||
|
||
PDP-10 character NFILE character
|
||
|
||
x in 000..007 x
|
||
x in 010..012 x + 200
|
||
013 013
|
||
014 214
|
||
015 012 215
|
||
015 not-012 115
|
||
x in 016..176 x
|
||
177 x in 000..007 x + 200
|
||
177 x in 010..012 x
|
||
177 013 213
|
||
177 x in 014..015 x
|
||
177 x in 016..176 x + 200
|
||
177 177 177
|
||
|
||
of a carriage that doesn't go to a new line, so if there is one in a
|
||
server file, it must be translated to something else. When
|
||
converting ASCII characters to NFILE characters, an 015 followed by
|
||
an 012 therefore turns into a 215. A stray CR is arbitrarily
|
||
translated into a single M (115).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 82]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
APPENDIX B
|
||
RAW TRANSLATION MODE
|
||
|
||
|
||
RAW mode means no translation should be performed. In RAW mode the
|
||
server operating system should treat the file as a character file and
|
||
use the same data formatting that would be appropriate for a
|
||
character file, but transfer the actual binary values of the
|
||
character codes.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 83]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
APPENDIX C
|
||
SUPER-IMAGE TRANSLATION MODE
|
||
|
||
|
||
SUPER-IMAGE mode is intended for use by PDP-10 family machines only.
|
||
It is included largely as an illustration of a system-dependent
|
||
extension. A server machine that has 8-bit bytes should treat
|
||
SUPER-IMAGE mode the same as NORMAL mode.
|
||
|
||
In this section, all numbers designating values of character codes
|
||
are to be interpreted in octal. The notation "x in c1..c2" means
|
||
"for all character codes x such that c1 <= x <= c2."
|
||
|
||
SUPER-IMAGE mode suppresses the use of the 177 character as an escape
|
||
character. Character translation should be done as in NORMAL mode,
|
||
with one exception. When a two-character sequence beginning with 177
|
||
is detected, the 177 should not be output at all.
|
||
|
||
In this section, all numbers designating values of character codes
|
||
are to be interpreted in octal. SUPER-IMAGE mode is intended for use
|
||
by PDP-10 machines only.
|
||
|
||
SUPER-IMAGE suppresses the use of Rubout for quoting. That is, for
|
||
each entry beginning with a 177 in the PDP-10 character column in the
|
||
NORMAL translation table, the NFILE character has the 177 removed.
|
||
|
||
TABLE 5. SUPER-IMAGE TRANSLATION FROM NFILE TO ASCII
|
||
|
||
|
||
NFILE character PDP-10 character(s)
|
||
|
||
|
||
x in 000..177 x
|
||
x in 200..214 <x - 200>
|
||
215 015 012
|
||
x in 216..376 <x - 200>
|
||
377 no corresponding code
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 84]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
TABLE 6. SUPER-IMAGE TRANSLATION FROM ASCII TO NFILE
|
||
|
||
|
||
PDP-10 character NFILE character
|
||
|
||
|
||
x in 000..007 x
|
||
x in 010..012 x + 200
|
||
013 013
|
||
014 214
|
||
015 012 215
|
||
015 not-012 115
|
||
x in <016..176> x
|
||
177 177
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 85]
|
||
|
||
RFC 1037 NFILE - A File Access Protocol December 1987
|
||
|
||
|
||
NOTES
|
||
|
||
1. NFILE's requirement for using the NFILE character set is
|
||
recognized as a drawback for non-Symbolics machines. A useful
|
||
extension to NFILE would be a provision to make the character set
|
||
negotiable.
|
||
|
||
2. Implementation note: Care must be taken that the freeing is done
|
||
before the control connection is allowed to process another
|
||
command, or else the control connection may find the data channel
|
||
to be falsely indicated as being in use.
|
||
|
||
3. The Symbolics operating system has the policy that whenever the
|
||
user side is waiting for the server side, a user abort can occur.
|
||
This user side waiting can occur in any context, such awaiting a
|
||
response, waiting in the middle of reading network input, or
|
||
waiting in the middle of transmitting network output. Thus there
|
||
are no "hung" states.
|
||
|
||
4. Note that the Token List Transport Layer supplies a special token
|
||
to indicate Boolean truth, but no corresponding token to indicate
|
||
Boolean falsity. NFILE uses an empty token list to indicate
|
||
Boolean falsity. The historical reason for this asymmetry is the
|
||
inability of the Lisp language to differentiate between the empty
|
||
list and NIL, which is traditionally used to mean Boolean falsity.
|
||
If the flexibility of both a Boolean falsity and an empty token
|
||
list were allowed, it would create problems for an operating
|
||
system that cannot distinguish between the two. This aspect of
|
||
the protocol is recognized as a concession to the Lisp language.
|
||
The unfortunate effect is to disallow operating systems to
|
||
distinguish between Boolean falsity and an empty list.
|
||
|
||
5. No so-called "fat strings" can be sent.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Greenberg & Keene [Page 86]
|
||
|