\chapter{FTP Client}\label{cha:ftp}

The \ex{ftp} structure lets you transfer files between networked
machines from the Scheme Shell, using the File Transfer Protocol as
described in RFC~959.

Some of the procedures in this module extract useful information from
the server's reply, such as the size of a file, or the name of the
directory we have moved to.  These procedures return the extracted
information, or, if the server's response doesn't match the expected
code from the server, a catchable \ex{ftp-error} is raised.

\defun{ftp-connect}{host login password passive? [log-port]}{connection}
\begin{desc}
  Open a command connection with the remote machine \var{host} and
  login on that server with \var{login} and \var{password}.
  \var{Login} and \var{password} can be \sharpf, in which case the
  information is extracted from the user's \ex{.netrc} file if necessary.
  
  If \var{log-port} is specified, it must be an output port: this
  starts logging the conversation with the server to that port.  Note
  that the log contains passwords in clear text.
\end{desc}

\dfn{ftp-type}{\synvar{name}}{ftp-type}{syntax}
\defunx{set-ftp-type!}{connection ftp-type}{undefined}
\begin{desc}
  This change the transfer mode for future file transfers.  The
  transfer mode is specfified by \var{ftp-type} which can be created
  with the \ex{ftp-type} macro.  \synvar{Name} must be either
  \ex{binary} for binary data or \ex{ascii} for text.
\end{desc}

\defun{ftp-rename}{connection old new}{undefined}
\begin{desc}
  This changes the name of \var{old} on the remote host to \var{new}
  (assuming sufficient permissions). \var{Old} and \var{new} are
  strings.
\end{desc}

\defun{ftp-delete}{connection file}{undefined}
\begin{desc}
  This deletes \var{file} from the remote host (assuming the user has
  appropriate permissions).
\end{desc}

\defun{ftp-cd}{connection dir}{undefined}
\begin{desc}
  This changes the current directory on the server.
\end{desc}

\defun{ftp-cdup}{connection}{undefined}
\begin{desc}
  This move to the parent directory on the server.
\end{desc}

\defun{ftp-pwd}{connection}{string}
\begin{desc}
  Return the current directory on the remote host, as a string.
\end{desc}

\defun{ftp-ls}{connection [dir]}{list}
\begin{desc}
  This returns a list of filenames on the remote host, either from the
  current directory (if \var{dir} is not specified), or from the
  directory specified by \var{dir}.
\end{desc}

\defun{ftp-dir}{connection [dir]}{status}
\begin{desc}
  This returns a list of long-form file name entries on the remote
  host, either from the current directory (if \var{dir} is not
  specified), or from the directory specified by \var{dir}.  (Note
  that the format for the long-form entries is not specified by the
  FTP standard.)
\end{desc}

\defun{ftp-get}{connection remote-file proc}{undefined}
\begin{desc}
  This downloads \var{remote-file} from the FTP server.
  \ex{Ftp-get} establishes a data conneciton to the server, attaches
  an input port to the data connection, and calls \var{proc} on that
  port.
\end{desc}

\defun{ftp-put}{connection remote-file proc}{undefined}
\begin{desc}
  This uploads \var{remote-file} to the FTP server.  \ex{Ftp-put}
  establishes a data conneciton to the server, attaches an output port
  to the data connection, and calls \var{proc} on that port.
\end{desc}

\defun{ftp-append}{connection remote-file proc}{undefined}
\begin{desc}
  This appends data to \var{remote-file} on the FTP server.
  \ex{Ftp-append} establishes a data conneciton to the server,
  attaches an output port to the data connection, and calls \var{proc}
  on that port.
\end{desc}

\defun{ftp-rmdir}{connection dir}{undefined}
\begin{desc}
  This removes the directory \var{dir} from the remote host (assuming
  sufficient permissions).
\end{desc}

\defun{ftp-mkdir}{connection dir}{undefined}
\begin{desc}
  This create a new directory named \var{dir} on the remote host
  (assuming sufficient permissions).
\end{desc}

\defun{ftp-modification-time}{connection file}{date}
\begin{desc}
  This requests the time of the last modification of \var{file} on the
  remote host, and on success return a Scsh date record.  (This command
  is not part of RFC~959 and is not implemented by all servers, but is
  useful for mirroring.)
\end{desc}

\defun{ftp-size}{connection file}{integer}
\begin{desc}
  This returns the size of \var{file} in bytes. (This command is not
  part of RFC~959 and is not implemented by all servers.)
\end{desc}

\defun{ftp-quit}{connection}{undefined}
\begin{desc}
  This closes the connection to the remote host.  The \var{connection}
  object is useless after a quit command.
\end{desc}

\defun{ftp-quot}{connection command}{status}
\begin{desc}
  This sends a \var{command} verbatim to the remote server and wait
  for a response.  The response text is returned verbatim.
\end{desc}

\defun{ftp-error?}{thing}{boolean}
\begin{desc}
  This returns \sharpt{} if \var{thing} is a \ex{ftp-error} object,
  otherwise \sharpf.
\end{desc}

\defun{copy-port->port-binary}{input-port oputput-port}{undefined}
\defunx{copy-port->port-ascii}{input-port oputput-port}{undefined}
\defunx{copy-ascii-port->port}{input-port oputput-port}{undefined}
\begin{desc}
  These procedures are useful for downloading and uploading data to an
  FTP connection via \ex{ftp-get}, \ex{ftp-get}, and \ex{ftp-append}.
  They all copy data from one port to another.
  \ex{Copy-port->port-binary} copies verbatim, while the other two
  perform CR/LF conversion for ASCII data transfers.
  \ex{Copy-port->port-ascii} adds CR/LFs at line endings on output,
  whereas \ex{Copy-ascii-port->port} removes CR/LFs at line endings
  end replaces them by ordinary LFs.
\end{desc}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "man"
%%% End: