
\section{Built-in Module \sectcode{macdnr}}
\bimodindex{macdnr}

This module provides an interface to the Macintosh Domain Name
Resolver.  It is usually used in conjunction with the \var{mactcp}
module, to map hostnames to IP-addresses.  It may not be available in
all Mac Python versions.

The \code{macdnr} module defines the following functions:

\renewcommand{\indexsubitem}{(in module macdnr)}

\begin{funcdesc}{Open}{\optional{filename}}
Open the domain name resolver extension.  If \var{filename} is given it
should be the pathname of the extension, otherwise a default is
used.  Normally, this call is not needed since the other calls will
open the extension automatically.
\end{funcdesc}

\begin{funcdesc}{Close}{}
Close the resolver extension.  Again, not needed for normal use.
\end{funcdesc}

\begin{funcdesc}{StrToAddr}{hostname}
Look up the IP address for \var{hostname}.  This call returns a dnr
result object of the ``address'' variation.
\end{funcdesc}

\begin{funcdesc}{AddrToName}{addr}
Do a reverse lookup on the 32-bit integer IP-address
\var{addr}.  Returns a dnr result object of the ``address'' variation.
\end{funcdesc}

\begin{funcdesc}{AddrToStr}{addr}
Convert the 32-bit integer IP-address \var{addr} to a dotted-decimal
string.  Returns the string.
\end{funcdesc}

\begin{funcdesc}{HInfo}{hostname}
Query the nameservers for a \code{HInfo} record for host
\var{hostname}.  These records contain hardware and software
information about the machine in question (if they are available in
the first place).  Returns a dnr result object of the ``hinfo''
variety.
\end{funcdesc}

\begin{funcdesc}{MXInfo}{domain}
Query the nameservers for a mail exchanger for \var{domain}.  This is
the hostname of a host willing to accept SMTP mail for the given
domain.  Returns a dnr result object of the ``mx'' variety.
\end{funcdesc}

\subsection{dnr result object}

Since the DNR calls all execute asynchronously you do not get the
results back immediately.  Instead, you get a dnr result object.  You
can check this object to see whether the query is complete, and access
its attributes to obtain the information when it is.

Alternatively, you can also reference the result attributes directly,
this will result in an implicit wait for the query to complete.

The \var{rtnCode} and \var{cname} attributes are always available, the
others depend on the type of query (address, hinfo or mx).

\renewcommand{\indexsubitem}{(dnr result object method)}

% Add args, as in {arg1\, arg2 \optional{\, arg3}}
\begin{funcdesc}{wait}{}
Wait for the query to complete.
\end{funcdesc}

% Add args, as in {arg1\, arg2 \optional{\, arg3}}
\begin{funcdesc}{isdone}{}
Return 1 if the query is complete.
\end{funcdesc}

\renewcommand{\indexsubitem}{(dnr result object attribute)}

\begin{datadesc}{rtnCode}
The error code returned by the query.
\end{datadesc}

\begin{datadesc}{cname}
The canonical name of the host that was queried.
\end{datadesc}

\begin{datadesc}{ip0}
\dataline{ip1}
\dataline{ip2}
\dataline{ip3}
At most four integer IP addresses for this host.  Unused entries are
zero.  Valid only for address queries.
\end{datadesc}

\begin{datadesc}{cpuType}
\dataline{osType}
Textual strings giving the machine type an OS name.  Valid for hinfo
queries.
\end{datadesc}

\begin{datadesc}{exchange}
The name of a mail-exchanger host.  Valid for mx queries.
\end{datadesc}

\begin{datadesc}{preference}
The preference of this mx record.  Not too useful, since the Macintosh
will only return a single mx record.  Mx queries only.
\end{datadesc}

The simplest way to use the module to convert names to dotted-decimal
strings, without worrying about idle time, etc:
\begin{verbatim}
>>> def gethostname(name):
...     import macdnr
...     dnrr = macdnr.StrToAddr(name)
...     return macdnr.AddrToStr(dnrr.ip0)
\end{verbatim}
