\section{\module{dl} ---
         Call C functions in shared objects}
\declaremodule{extension}{dl}
  \platform{Unix} %?????????? Anyone????????????
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
\modulesynopsis{Call C functions in shared objects.}

The \module{dl} module defines an interface to the
\cfunction{dlopen()} function, which is the most common interface on
\UNIX{} platforms for handling dynamically linked libraries. It allows
the program to call arbitrary functions in such a library.

\note{This module will not work unless
\code{sizeof(int) == sizeof(long) == sizeof(char *)}
If this is not the case, \exception{SystemError} will be raised on
import.}

The \module{dl} module defines the following function:

\begin{funcdesc}{open}{name\optional{, mode\code{ = RTLD_LAZY}}}
Open a shared object file, and return a handle. Mode
signifies late binding (\constant{RTLD_LAZY}) or immediate binding
(\constant{RTLD_NOW}). Default is \constant{RTLD_LAZY}. Note that some
systems do not support \constant{RTLD_NOW}.

Return value is a \pytype{dlobject}.
\end{funcdesc}

The \module{dl} module defines the following constants:

\begin{datadesc}{RTLD_LAZY}
Useful as an argument to \function{open()}.
\end{datadesc}

\begin{datadesc}{RTLD_NOW}
Useful as an argument to \function{open()}.  Note that on systems
which do not support immediate binding, this constant will not appear
in the module. For maximum portability, use \function{hasattr()} to
determine if the system supports immediate binding.
\end{datadesc}

The \module{dl} module defines the following exception:

\begin{excdesc}{error}
Exception raised when an error has occurred inside the dynamic loading
and linking routines.
\end{excdesc}

Example:

\begin{verbatim}
>>> import dl, time
>>> a=dl.open('/lib/libc.so.6')
>>> a.call('time'), time.time()
(929723914, 929723914.498)
\end{verbatim}

This example was tried on a Debian GNU/Linux system, and is a good
example of the fact that using this module is usually a bad alternative.

\subsection{Dl Objects \label{dl-objects}}

Dl objects, as returned by \function{open()} above, have the
following methods:

\begin{methoddesc}{close}{}
Free all resources, except the memory.
\end{methoddesc}

\begin{methoddesc}{sym}{name}
Return the pointer for the function named \var{name}, as a number, if
it exists in the referenced shared object, otherwise \code{None}. This
is useful in code like:

\begin{verbatim}
>>> if a.sym('time'): 
...     a.call('time')
... else: 
...     time.time()
\end{verbatim}

(Note that this function will return a non-zero number, as zero is the
\NULL{} pointer)
\end{methoddesc}

\begin{methoddesc}{call}{name\optional{, arg1\optional{, arg2\ldots}}}
Call the function named \var{name} in the referenced shared object.
The arguments must be either Python integers, which will be 
passed as is, Python strings, to which a pointer will be passed, 
or \code{None}, which will be passed as \NULL.  Note that 
strings should only be passed to functions as \ctype{const char*}, as
Python will not like its string mutated.

There must be at most 10 arguments, and arguments not given will be
treated as \code{None}. The function's return value must be a C
\ctype{long}, which is a Python integer.
\end{methoddesc}
