\chapter{Reading netrc-files}\label{cha:netrc}
%
\begin{description}
\item[Used files:] netrc.scm
\item[Name of the package:] netrc
\end{description}
%
\section{Overview}
This module provides procedures to parse authentication information
contained in \ex{~/.netrc}.

On Unix systems the \ex{~/.netrc} file (in the user's home directory)
may contain information allowing automatic login to remote hosts.  The
format of the file is defined in the \ex{ftp}(1) manual page.  Example
lines are
\begin{alltt}
machine ondine.cict.fr login marsden password secret
default login anonymous password user@site%
\end{alltt}

The \ex{~/.netrc} file should be protected by appropriate permissions, and
(like \ex{/usr/bin/ftp}) this library will refuse to read the file if it is
badly protected. (unlike \ex{ftp} this library will always refuse
to read the file -- \ex{ftp} refuses it only if the password is
given for a non-default account). Appropriate permissions are set if
only the user has permissions on the file.

Note following restrictions and differences:
\begin{itemize}
\item The macdef statement (defining macros) is not supported.
\item The settings for one machine must be on a single line.
\item The is no error proof while reading the file.
\item Default need not be the last line of the netrc-file.
\end{itemize}



\section{Entry points}

What you probably want, is to read out the default netrc-file. Do the
following:
\begin{alltt}
 (let ((netrc-record (netrc:parse)))
    (netrc:lookup netrc-record "name of the machine")) 
\end{alltt}
 
and you will receive three values: \semvar{login-name},
\semvar{password} and \semvar{account-name}. If you only want the
login name or the password, use \ex{netrc:\ob{}lookup\=login} or
\ex{netrc:\ob{}lookup\=password}, resp.

You will get either the login / password for the specified machine, or
a default login / password if the machine is unknown.


\begin{defundesc}{user-mail-address}{}{string}
  Calculate the user's email address, as per the Emacs function of the
  same name. Will take into account the environment variable
  \ex{REPLYTO}, if set. Otherwise the mail-address will look like
  \ex{user@\ob{}hostname}.
\end{defundesc}

\defun{netrc:parse} {\ovar{filename \ovar{fallback-password
      \ovar{fallback-login}}}} {netrc-record}
\begin{defundescx}{netrc:try-parse} {filename fallback-password
    fallback-login} {netrc-record}
        
  \ex{netrc:parse} parses the netrc file and returns a \ex{netrc}
  record, containing all necessary information for the following
  procedures.
  
  \semvar{filename} defaults to ``~/.netrc'',
  \semvar{fallback-password} defaults to the result of the call to
  \ex{user\=mail\=address} and \semvar{fallback-login} defaults to
  ``anonymous''. If the netrc file does not provide a default password
  or a default login (stated by the ``default'' statement),
  \semvar{fallback-password} and \semvar{fallback-login} will be used
  as default password or login, respectively (thus,
  \ex{user\=mail\=address} is only called if the netrc file does not
  contain a default specification).  If the netrc file does not exist,
  a netrc-record filled with default values is returned.  If the netrc
  file does not have the correct permissions, a message is printed to
  the current error port and a netrc-record filled with default values
  is returned.
  
  \ex{netrc:try-parse} does the same as \ex{netrc:\ob{}parse}, except
  of the following: if there is no file called \semvar{filename}, the
  according error will be raised and if the specified file does not
  have the correct permissions set, a \ex{netrc\=refuse\=warning} will
  be signalled. So, if you don't like the error handling and behavior
  of \ex{netrc:\ob{}parse}, use \ex{netrc:\ob{}try\=parse} and catch
  the signalled conditions. Note, that \ex{netrc:\ob{}parse} resolves
  \semvar{filename} for you, \ex{netrc:\ob{}try-parse} does not -- you
  have to do it on your own.
\end{defundescx}

\defun{netrc:lookup}{netrc-record machine \ovar{default?}} {string
  string string}
\defunx{netrc:lookup-password}{netrc-record machine
  \ovar{default?}}{string}
\defunx{netrc:lookup-login}{netrc-record machine
  \ovar{default?}}{string}
\begin{desc}
  Return the login, password and / or account information for
  \semvar{machine} specified by \semvar{netrc-record}, respectively.
  If \semvar{default?} is \sharpt, default values are returned if no
  such \semvar{machine} is specified in the \semvar{netrc-record}.
  Otherwise [\sharpf\ \sharpf\ \sharpf] or \sharpf\ is returned,
  respectively.
\end{desc}

\defun{netrc:default-login}{netrc-record}{string}
\begin{defundescx}{netrc:default-password}{netrc-record}{string}
  Return the default values for the login or the password, respectively,
  specified by \semvar{netrc-record}. If the netrc file did not
  specify a default login, ``anonymous'' is returned by
  \ex{netrc:\ob{}default\=login}. If the netrc file did not specify a
  default password, the result of the call to \ex{user\=mail\=address}
  is returned by \ex{netrc:\ob{}default\=password}.
\end{defundescx}

\section{Related work}
\begin{itemize}
\item Graham Barr has written a similar library for Perl, called
  \ex{Netrc.pm}.
\item \ex{ange-ftp.el} (transparent remote file access for Emacs)
  parses the user's netrc file.
\end{itemize}

\section{Desirable things}
\begin{itemize}
\item Remove restrictions (as stated in `\emph{Overview}') and behave like
   \ex{/usr/\ob{}bin/\ob{}ftp} behaves
\item perhaps: adding case-insensitivity (for host names)
\item perhaps: better record-disclosers for netrc-entry- and
  netrc-records
\end{itemize}

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