clipper@uwocsd.csd.uwo.ca (Khun Yee Fung) (10/14/90)
This is the ASCII version of AFTP. Khun Yee clipper@csd.uwo.ca ---- Anonymous File Transfer Protocol (AFTP) by Khun Yee Fung The University of Western Ontario September 1990 1. Introduction The purpose of Anonymous File Transfer Protocol (AFTP) is to promote sharing of public available programs, documents, and data. To achieve this objective, AFTP shields the user from the variations in various file systems and operating systems. This protocol also allows multiple data transfer simultaneously. This protocol is specified such that intelligent, flexible and secure servers and clients can be written easily. 2. Background Anonymous FTP has been around for a few years now. Its popularity is undeniable. You can find lists of anonymous FTP sites published in newsgroups, anonymous FTP sites for software requested in newsgroups, and anonymous FTP site given for software written. The use of anonymous FTP also rises a lot of concerns. Foremost is the security of the machines providing this service. FTP is meant for users to log in to their own accounts and transfer files from a machine to another machine. The accounts must exist for the users to log on. Thus accountability is maintained, albeit remotely. However, anonymous FTP has the opposite idea of letting anybody to logon using a common account. Restrictions must then be applied to ensure the integrity of the file system of the server machine. Since the FTP server must have a very high privilege to be able to log on to any user's account, any hole in the implementation can lead to disaster if a criminal logs on. I think anonymous FTP is in general unsuitable for FTP because of this security problem. Another reason of not having anonymous FTP in FTP is that there are many different machines around. Each operating system usually has different convention to name files, organizes directories, and in general does things differently. For normal FTP, this is no problem because the user is expected to know the remote machine well enough to transfer files from one machine to another. But for anonymous FTP, this is different. A user can log in on a Tops-10 machine without a clue as to how to proceed. Directories can be organized in a bizarre way. Different structures for files and directories means that automatic programs for transferring files at a set time from a machine are difficult to write and usually not general enough to work on all machines. AFTP tries to aviate these problems. It is designed solely for anonymous file transfer. It only has to know a limited amount of files. Therefore, the AFTP server can have the same privilege as a normal user on a system. It is easy to limit its knowledge of the machine it is on. On a Unix machine, the AFTP server can be owned by a ordinary user id. And implement the server such that only files owned by this user id can be transferred. This solves the security problem. To solve the incompatible file systems problem, AFTP defines a fixed format for directory listings. It decrees that files and directories must be listed separately. It also provides a change-to-parent-directory command for tree-structured file systems. 3. Data Representation The only recognized data representation in AFTP is the octet. The server and client are responsible for the conversion of other representations to octets. As in standard practice, ASCII characters are converted to octets by adding a zero bit in the most significant end of the characters. For example, an ASCII character, 1001001 in binary is converted to a octet, 01001001 in binary. There is a provision for extending the number of data representations recognized by AFTP. Up to 10 file types can be specified. This will be left for future considerations. Whether to use <CR><LF> or <LF> to delimit lines in a ASCII file is left to the discretion of the servers and clients. The server and the client are expected to send files as they are in the file system, converted to octets if necessary. 4. Terminology - ASCII: In AFTP, eight-bit ASCII is used. Eight-bit ASCII characters are derived by adding a zero bit at the most significant bit of the seven-bit ASCII characters. - Client: The part of a connection that demands service. - Client machine: The machine the client is on. - Command: A series of octets sent by the client to the server to request service. - Connection: A communication path between the client and the server for the exchange of commands, replies, and data. - Control Connection: The connection for the server to send replies and the client to send commands. This connection exists from the beginning for a AFTP session to the end. - Control port: The port for the control connection. - Data connection: The connection for exchanging data. A data connection is established when a command requiring data transfer requests a connection through the specification of a port number. After the data transfer, a data connection is disconnected. - Data port: The port for a data connection. - Directory: A logical container in a file system containing files. It can contain other directories too. - Errorcode: The third, fourth, and fifth digit of a return code. - File: A series of octets with a size, date of creation and filename. It has a type of either ASCII, binary, or Tenex. More file types can be defined when needs arise. - File position: A pointer in a file after a certain number of octets. - Filename: The name of a file in a directory. - Guest directory: The directory for clients to put files to. The server can decide whether it wants to have such a directory. - Local machine: The machine the client is on. - Octet: A eight-bit byte. - Opcode: The first two digits of a return code. - Path: The name of a file or directory independent of the current directory. It is assumed that the LF (ASCII 10, decimal) character is not valid in a path. - Regexp: Regular expression used to discriminate files to be shown in a directory listing. - Remote machine: The machine the server is on. - Reply: A message sent by the server to indicate success or failure. It includes a return code with possibly text. - Return code: A nine digit code sent by the server to signal success or failure of a n operation demanded by the client. - Serial number: A serial number is a three-digit decimal number with leading zeroes from 000 to 999, assigned to a command by the client. It is used to identify a command. The server will use this serial number to precisely acknowledge a command sent by the client. This is important because multiple commands can be outstanding. Serial numbers are used to avoid confusion. The assigning of numbers is up to the client. - Server: The part of a connection that accepts requests and manages the AFTP area of a machine. - Server machine: The machine the server is on. 5. Definitions 5.1 Files and Directories In AFTP, a virtual file system is defined with the convention that there are two types of files: directories and regular files. These two types can never be mixed together in AFTP. There can be directories in a directory. However, directories need not be a tree-like structure. A file has the following attributes: size, date of creation, and filename. A directory has: date of creation, and directory name. The size of a file is the number of octets that would be sent if this file is to be sent. The date of creation is the date the file was created. The filename of a file is the name of the file in its directory. 5.2 Replies In this protocol, we use a serial-number acknowledgement scheme. After a command is sent by the client requesting a service, the server will send back a reply informing the client whether the requested command has been carried out correctly or not. A reply contains a return code and possibly text data after the return code. In every command, there is a serial number; the return code for a particular command has the same serial number. Therefore, more than one command can be sent by the client at one time and the server acknowledges them separately. A data transfer is finished when the server closes the data connection. We will discuss more about multiple commands later on. A return code always consists of nine digits. The first three digits constitute the serial number of the command this return code is acknowledging. The serial number of a command is assigned by the client. It can be selected arbitrarily. To avoid confusion, incrementing the serial number for each command is a good idea but not compulsory. The next two digits refer to the type of the command this return code is acknowledging. The next three digits are used to indicate error or success. The last digit is used for providing additional information. This last digit is used only in some commands. In other commands, it is left zero. Syntax of a reply: reply = serial space opcode space errorcode space digit data serial = digit digit digit data = space text | empty empty = opcode = "00" | "01" | "02" | "03" | "04" | "05" | "06" | "07" | "08" | "09" | "10" | "11" | "12" | "13" | "14" | "15" | "16" | "99" errorcode = "000" | "001" | "002" | "003" | "004" | "005" | "006" | "007" | "008" | "009" | "010" | "011" | "012" | "013" | "014" | "015" | "016" digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" space = " " ``text'' is a series of octets not containing the line feed character (ASCII 10 decimal). It can exist only in errorcode `000'. In this document, we generally omit the serial number when we discuss the possible return codes sent by the server. The set of opcodes and errorcodes can be expanded when needs arise. The following is the set of opcodes. +--------+----------+--------+--------------+ | Opcode | Command | Opcode | Command | +--------+----------+--------+--------------+ | 00 | continue | 01 | LD | | 02 | CD | 03 | SD | | 04 | GF | 05 | PF | | 06 | ABORT | 07 | GD | | 08 | TOP | 09 | RF | | 10 | QUIT | 11 | TIME | | 12 | TELLME | 13 | IAM | | 14 | MD | 15 | RD | | 16 |CDUP | 99 | System error | +--------+----------+--------+--------------+ Opcode `00' is used in places for signaling success where no other opcodes are applicable, for example right after connection. The opcode `99' is used when the server encounters some system errors that it must terminate the AFTP session or an illegal command is sent by the client. For both of these opcodes, the serial number can be any number. The errorcodes have the following meaning: - 000. No error. Requested action carried out successfully. It can have optional text as a means of returning information requested by the client. Other errorcodes do not have this property. - 001. Syntax error. The last digit of the return code specifies which word is in error. - 002. Action not done. The client does not have the privilege to request the action. This is most common when the client wants to delete a file which it does not have the permission to. - 003. No such file or directory. The client has specified a file or a directory that the server does not know. - 004. Data transfer failed for some reason. This errorcode is given when in the middle of a data transfer, something happened in the server machine and the data connection must be terminated. This errorcode substitutes the normal success `000' errorcode. - 005. This is specific for the commands ``GF'' and ``PF''. The file position (explained later) specified is too large. - 006. The server has encountered a problem. It must terminate the AFTP session. The opcode of this errorcode is always `99'. This errorcode can be sent anytime the server encounters a problem, whether a data transfer is taking place or not. - 007. No more data connection allowed. The server decides how many data connections allowed for a control connection. - 008. The server is not prepared to serve a client. This is sent right after connection to inform the client that the server machine's system load is too high or there are too many AFTP connections. - 009. Current time is not permitted for a AFTP connection on server machine. In most machines, AFTP connections are restricted to a certain period in a day. If AFTP connections are not permitted at a certain time, this errorcode should be sent right after the connection. The opcode for this errorcode is always `99'. - 010. No such command. The client has sent a command that the server does not know. The opcode for this errorcode is always `99'. - 011. File or directory exists when ``PF'' is requested. Delete the file before attempting the action. - 012. File type is given in the last digit. This errorcode is given when the client requests a file to be sent. The meaning of the last digit is: 0 -- binary, 1 -- ASCII, 2 -- TENEX. This list can be expanded to others. This code is sent to inform the client of the type of the file being sent over. So that the client knows how to reassemble the file from the octets received from the server. - 013. The server has waited too long for the client. Timed out. Two trials should be given. The server should then terminate the AFTP session. The opcode of this errorcode is always `99'. - 014. Signals the client to go ahead with the action or to get ready for data. - 015. Currently no command with the serial number specified is being executed. This command is used to respond to a ``ABORT'' command when the command to be aborted is either not existing or has been completed. - 016. Cannot open data connection. The server cannot open a data connection for reason other than too many data connections. This errorcode is used before any data transfer has been done whereas `004' is used when some data transfer has been done. 5.3 The AFTP Model For a client to connect to a remote machine, there must be a server running in the remote machine. The server is expected to constantly listening to the AFTP port. The client initiates the control connection by trying to connect to the AFTP port. The server is expected to accept the connection. Once the control connection is established, a standard reply is sent from the server to the client to inform the client whether the connection is ready (`00 000 0' return code). Or, instead, the server can inform the client that the system work load for the remote machine is too great for a new AFTP session (`99 008 0' return code); or the remote machine does not accept AFTP connections at current time (`99 009 0' return code). Once this reply is received, the client can start issuing commands if the connection is successful or terminate the connection if not. Any time the control connection is closed by the client, the server will close all data connections outstanding. It is the responsibility of the client to make sure the control connection is open throughout the AFTP session. If the client is idle for more than a specific amount of time (about 15 minutes probably), the server can terminate the AFTP session after sending two `013' time out errorcodes. 5.4 Data and Control Connections A AFTP session begins when a control connection is established. This connection continues until the end of the AFTP session. Commands and replies are exchanged using this connection. When a command requiring data transfer is passed to the server, it passes a port number to the server at the same time. This port number represents the port the data transfer will take place. This port is called the data port. The connection for the data port is called the data connection. A data port exists only for the transferring of data of one command. After the data transfer is over, the data connection is closed. The client is expected to listen to the port before issuing a data transfer command. It then sends the command with the port number. Once the server has received the command and agrees to the data transfer, the server should try to connect to the port specified. The client then accepts the connection and the data transfer can then take place. When data transfer occurs, the server is expected to monitor the control connection for further commands sent by the client. Simultaneous data transfer is possible because of this policy and the use of the serial number acknowledgement scheme. The maximum number of simultaneous data connections allowed for a single control connection is left to the server to decide. If this number is exceeded, the server sends a `007' errorcode to indicate this problem. A data connection is closed by the party sending data. The server will send back a reply indicating that it has closed the data connection or it has noticed the closing of the data port. 6. Commands Each command is prefixed by a three-digit serial number, the command body and terminated by a single LF (Line Feed, ASCII 10 decimal). There should be at least one space character between words in the commands, no space characters are allowed between the beginning of the command and the first character of the command, and no space characters are allowed after the last character and the end of the command. Cases of the words in a command are always significant so that `LD' is different from `ld'. We will omit the serial number in the explanations here. They must exist in each command sent by the client. No command can have more than 1024 octets, including the Line Feed character at the end of the command. For commands requiring a data port for data transfer, the client should open the data port and wait for the server to signal `go ahead' by sending a `014' errorcode. It can then receive or send data using the data port. If the client sends data, it should close after data has been sent. The server should close the data connection after the server has sent all the data. After the data has been sent, the server should send either `000' errorcode to signal success, or `004' to signal failed data transfer to the client. Syntax of a command: aftp-command = serial space command command = LD-command | CD-command | SD-command | GF-command | PF-command | ABORT-command | GD-command | RF-command | QUIT-command | TIME-command | TELLME-command | IAM-command | TOP-command | MD-command RD-command | CDUP-command space = " " 6.1 LD, list a directory Lists a directory and show the files or directories in the current directory. The syntax of the command, in BNF: LD-command = "LD" port "FULL" order regexp | "LD" port order type regexp order = "ALPHA" | "TIME" type = "FILE" | "DIR" regexp = alt | reg | empty alt = "(" reg ")" "|" alt | "(" reg ")" reg = kleene | plus | charcl | any | char | kleene reg | plus reg | charcl reg | char reg | any reg plus = char "+" | any "+" chars = char | char "-" char | char chars | char "-" char chars suffix = "+" | "*" | empty neg = "^" | empty charcl = "[" neg chars "]" suffix kleene = char "*" | any "*" any = "?" empty = port = eightbit "," eightbit "," eightbit "," eightbit "," eightbit "," eightbit ``eightbit'' is a number from 0 to 255. The first four numbers in ``port'' constitutes the IP address of the client machine. The last two numbers represent the 32-bit TCP port number. To convert the 32-bit port number to two ``eightbit''s, divide the port number by 256. The quotient is the first ``eightbit'' number, and the remainder is the second ``eightbit'' number. To get the meta-characters used in the regular expressions, add ``\'' in front of the character to be escaped. The sequence ``\\'' yields a single ``\''. There are a few special characters that can be specified only by using the escape mechanism. They are line feed (\n ASCII 10 decimal), tab (\t ASCII 9 decimal), carriage return (\r ASCII decimal 13), backspace (\b ASCII 8 decimal) and form feed (\f ASCII 12 decimal). These special characters, and other regular characters constitute the syntax category ``char'' in the BNF above. Only files and directories that can be read by the client should be listed by this command. When ``FULL'' is specified, all files accessible by AFTP should be listed in the order selected by the command. Ordered by ``ALPHA'' means that files are ordered in their alphabetical order. For characters other than the alphabets, the order is chosen according to their ASCII values. Ordered by ``TIME'' means the files should be listed according to how recently they were created. The least recent file is sent first and the most recent file is sent last. Either ``FILE''s can be listed or ``DIR''ectories can be listed, but not both. If ``regexp'' exists, it is used to discriminate the files or directories to be listed. Only files or directories with filenames matching the ``regexp'' will be listed. The semantics of ``regexp'' is almost identical to the usual Unix regular expressions. The output of the ``LD'' command is standardized. For regular files, each line of the output should be in the following form, with white spaces (tabs and space characters) separating the fields: size date filename Where ``size'' is the size of the file, ``date'' the date of creation of the file, and ``filename'' the filename of the file. Each line of listing is delimited by a single LF (line-Feed ASCII 10 decimal) character. The field ``date'' is a decimal number representing the number of seconds since 00:00:00 GMT, Jan. 1, 1970. Files created before that time has negative numbers for their dates. The syntax for ``date'' is: date = neg number neg = "-" | empty number = digit number | digit For directory listings, each line should have the following format, with white spaces (tab or space characters) separating the fields: date directory-name Where ``date'' is the date of creation, and ``directory-name'' the name of the directory. Each line of listing should be delimited by a single LF (line-Feed ASCII 10 decimal) character. A `01 014 0' return code will be sent if the request is successful. The client should expect the listing to follow from the data port it specified. After the end of the listing, a `01 000 0' return code will be sent to indicate the end of the listing. Other return codes relevant for this command are: +-------------+----------------------------------------+ | Return code | Explanation | +-------------+----------------------------------------+ | 01 001 X | Syntax error in word X | | 01 003 0 | Directory not found | | 01 007 0 | No more data connection allowed | | 01 016 0 | The server cannot open data connection | +-------------+----------------------------------------+ 6.2 CD, change current directory CD changes the current directory. The current directory is only useful for the user. Syntax: CD-command = "CD" file file = filename | path The syntax for ``filename'' and ``path'' is system-dependent. However, it is always assumed that the LF character (ASCII 10 decimal) is not a valid character in them. +-------------+------------------------+ | Return code | Explanation | +-------------+------------------------+ | 02 000 0 | Success | | 02 001 X | Syntax error in word X | | 02 003 0 | Directory not found | +-------------+------------------------+ 6.3 SD, show current directory Syntax: SD-command = "SD" SD shows the name of the current directory. This is meant for the user only. The path of the directory should be returned by the server. If successful, a `03 000 0' return code will be returned by the server with the current directory follows. Syntax of the output: SD-reply = serial " 03 000 0 " path Other return codes: +-------------+------------------------+ | Return code | Explanation | +-------------+------------------------+ | 03 001 X | Syntax error in word X | +-------------+------------------------+ 6.4 GF, get a file from the server The syntax for this command is: GF-command = "GF" port number file The file matches the file should be sent from the server, starting from the position after ``number''. For example, ``GF 10 pub/readme.txt'' means getting the file named ``pub/readme.txt'' starting from the 11th octet from the beginning of the file. If successful, the server will send back `04 012 X', where `X' is the file type of the file to be sent. The client should then expect to receive the contents of the file from the data connection it specified. The server will then send `04 000 0' to signal completion of the data transfer. The types of files supported right now is ASCII and binary. Tenex file type is defined but not supported. The numeric representation for ASCII file is 1, and 0 for binary. +-------------+-----------------------------------------------------+ | Return code | Explanation | +-------------+-----------------------------------------------------+ | 04 001 X | Syntax error in word X | | 04 003 0 | Directory not found | | 04 005 0 | The file position specified is larger than the file | | 04 007 0 | No more data connection allowed | | 04 016 0 | The server cannot open data connection | +-------------+-----------------------------------------------------+ 6.5 PF, put a file to server machine The syntax of the PF command is: PF-command = "PF" port number length type file type = "BIN" | "ASCII" | "TENEX" length = number ``number'' is the file position to start putting the file. The file type is sent on the command line to the server so that the servers knows how to store the file being sent from the client. The number of file types can be expanded by two agreeing machines. If successful, the server will send back `05 014 0'. The client should then send the contents of the file using the data port specified. The server will then send `05 000 0' to signal completion of the data transfer. All files sent from the client to the server will reside in the guest directory. To change to the guest directory, use the ``GD'' command. If the syntax of the filename is not valid on the server machine, the server is responsible for the renaming of the file. It can do it in anyway it deems appropriate. The file types it supports can be expanded when need arises. +-------------+-----------------------------------------------------+ | Return code | Explanation | +-------------+-----------------------------------------------------+ | 05 001 X | Syntax error in word X | | 05 002 0 | Guest directory does not exist | | 05 005 0 | The file position specified is larger than the file | | 05 007 0 | No more data connection allowed | | 05 011 0 | The named file exists | | 05 016 0 | The server cannot open the data connection | +-------------+-----------------------------------------------------+ 6.6 ABORT, abort an executing command Syntax: ABORT-command = "ABORT" serial This command terminates the execution of the command identified by the serial number. The response from the server is: +-------------+------------------------------------+ | Return code | Explanation | +-------------+------------------------------------+ | 06 000 0 | Success | | 06 001 X | Syntax error in word X | | 06 015 0 | No command with such serial number | +-------------+------------------------------------+ The serial number in the reply should be the serial number of the ``ABORT'' command, not the command the ``ABORT'' command is trying to abort. This command can only be used to abort multiple step commands, namely, ``LD'', ``PF'', ``GF'', and ``TELLME''. 6.7 GD, change to guest directory Syntax: GD-command = "GD" If the guest directory exists, the server changes current directory to the guest directory and return its path using `07 000 0' return code with the path after the return code and before the line feed of the return code. The syntax of the output: GD-reply = serial " 07 000 0 " path Other return codes are: +-------------+--------------------------------+ | Return code | Explanation | +-------------+--------------------------------+ | 07 001 X | Syntax error in word X | | 07 002 0 | Guest directory does not exist | +-------------+--------------------------------+ 6.8 TOP, change to the top directory This command changes the current directory to the directory AFTP puts the client on when the control connection was first established. Syntax: TOP-command = "TOP" The server returns a `08 000 0' return code after the operation is carried out. `08 001 X' is returned if the server encounters a syntax error in word `X'. 6.9 RF, delete a file Syntax: RF-command = "RF" file The file named is deleted. The server decides whether this command will succeed. The file to be deleted must be in the guest directory. Files in other directories are not allowed to be deleted by a client. +-------------+---------------------------------------+ | Return code | Explanation | +-------------+---------------------------------------+ | 09 000 0 | Success | | 09 001 X | Syntax error in word X | | 09 002 0 | Client not allowed to delete the file | | 09 003 0 | The named file does not exist | +-------------+---------------------------------------+ 6.10 QUIT, terminate AFTP session Syntax: QUIT-command = "QUIT" Everything being done should be aborted and the session terminated. +-------------+------------------------+ | Return code | Explanation | +-------------+------------------------+ | 10 000 0 | Success | | 10 001 X | Syntax error in word X | +-------------+------------------------+ After send `10 000 0', the server can severe the control connection. All data connections are also closed with no warning sent from the server. 6.11 TIME, show the time of the server machine Syntax: TIME-command = "TIME" The time of the local machine of the server should be returned. The syntax for specifying a date is the same as the ``date'' syntax in command ``LD''. The server sends back `11 000 0' if the server agrees to send back the local time. The time is given after the return code and before the line feed of the reply. The syntax of the reply is: TIME-reply = serial " 11 000 0 " date The server sends back `11 001 X' if it found a syntax error in word `X'. 6.12 TELLME, print introduction Syntax: TELLME-command = "TELLME" port This command requests the server to send the introduction of the server machine. This command is allowed to fail if the server machine does not have such a file. If successful, the server sends back `12 014 0' if it is ready to send the file. The client should expect to receive data from the data port it specified. The server then sends `12 000 0' to signal the completion of the transfer. The server sends back `12 001 X' if it found a syntax error in word `X'. The server send back a `12 007 0' return code if no more data connections are allowed. The server sends `12 016 0' if it cannot open the data port requested by the client. 6.13 IAM, identifying client This commands identifies the client. This can be the first command sent by the client after connection. Syntax: IAM-command = "IAM" username Everything after the command word ``IAM'' until the end of line is taken to be the username. The server sends back `13 000 0' if the operation is successful. The server sends back `13 001 X' if it found syntax error in word `X'. 6.14 MD, create a directory The syntax of the MD command is: MD-command = "MD" filename If successful, the server will send back `05 000 0'. A directory should not be allowed to be created in places other than in the guest directory. It is up to the server to enforce this. If the filename is not valid on the server machine, the server is responsible for the renaming of the file. It can do it in anyway it deems appropriate. The other responses are: +-------------+--------------------------+ | Return code | Explanation | +-------------+--------------------------+ | 14 001 X | Syntax error in word X | | 14 002 0 | Directory is not created | | 14 011 0 | The named file exists | +-------------+--------------------------+ 6.15 RD, remove a directory Syntax: RF-command = "RF" file The file named is deleted. The server decides whether this command will succeed. The directory to be deleted must be in the guest directory. Directories in other directories are not allowed to be deleted by a client. The server decides whether a non-empty directory can be deleted or not. +-------------+--------------------------------------------+ | Return code | Explanation | +-------------+--------------------------------------------+ | 15 000 0 | Success | | 15 001 X | Syntax error in word X | | 15 002 0 | Client not allowed to delete the directory | | 15 003 0 | The named directory does not exist | +-------------+--------------------------------------------+ 6.16 CDUP, change to the parent of the current directory Syntax: CDUP-command = "CDUP" This command changes directory to be the parent of the current directory. Only file systems with tree-structured directories should allow this. The successful execution of this command should return `16 000 0'. Other return codes: +-------------+-----------------------------------------------+ | Return code | Explanation | +-------------+-----------------------------------------------+ | 16 001 X | Syntax error in word X | | 16 002 0 | This command is not valid in this file system | +-------------+-----------------------------------------------+ The parent of the root directory is the root itself. The server should be careful not to change directory beyond the AFTP area. 7. References Jon Postel, and Joyce Reynolds, ``File Transfer Protocol'', `rfc 959', ISI, October 1985. 8. Author Information Khun Yee Fung Department of Computer Science Middlesex College The University of Western Ontario London, Ontario N6A 5B7 Canada clipper@csd.uwo.ca -- ---- In Real life: Khun Yee Fung clipper@csd.uwo.ca (Internet) Alternative: 4054_3267@UWOVAX.BITNET UUCP: ...!{ihnp4|decvax|seismo}!{watmath|utzoo}!ria!csd!clipper Department of Computer Science Middlesex College The University of Western Ontario London, Ontario, N6A 5B7 CANADA