blob: 1fd692acd5561831e24ba18e953a06d9ef6ae05a [file] [log] [blame]
<html lang="en">
<head>
<title>NSS Modules Interface - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="NSS-Module-Internals.html#NSS-Module-Internals" title="NSS Module Internals">
<link rel="prev" href="NSS-Module-Names.html#NSS-Module-Names" title="NSS Module Names">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="NSS-Modules-Interface"></a>
<p>
Previous:&nbsp;<a rel="previous" accesskey="p" href="NSS-Module-Names.html#NSS-Module-Names">NSS Module Names</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="NSS-Module-Internals.html#NSS-Module-Internals">NSS Module Internals</a>
<hr>
</div>
<h4 class="subsection">28.3.2 The Interface of the Function in NSS Modules</h4>
<p>Now we know about the functions contained in the modules. It is now
time to describe the types. When we mentioned the reentrant versions of
the functions above, this means there are some additional arguments
(compared with the standard, non-reentrant version). The prototypes for
the non-reentrant and reentrant versions of our function above are:
<pre class="smallexample"> struct hostent *gethostbyname (const char *name)
int gethostbyname_r (const char *name, struct hostent *result_buf,
char *buf, size_t buflen, struct hostent **result,
int *h_errnop)
</pre>
<p class="noindent">The actual prototype of the function in the NSS modules in this case is
<pre class="smallexample"> enum nss_status _nss_files_gethostbyname_r (const char *name,
struct hostent *result_buf,
char *buf, size_t buflen,
int *errnop, int *h_errnop)
</pre>
<p>I.e., the interface function is in fact the reentrant function with the
change of the return value and the omission of the <var>result</var>
parameter. While the user-level function returns a pointer to the
result the reentrant function return an <code>enum nss_status</code> value:
<dl>
<dt><code>NSS_STATUS_TRYAGAIN</code><a name="index-NSS_005fSTATUS_005fTRYAGAIN-3286"></a><dd>numeric value <code>-2</code>
<br><dt><code>NSS_STATUS_UNAVAIL</code><a name="index-NSS_005fSTATUS_005fUNAVAIL-3287"></a><dd>numeric value <code>-1</code>
<br><dt><code>NSS_STATUS_NOTFOUND</code><a name="index-NSS_005fSTATUS_005fNOTFOUND-3288"></a><dd>numeric value <code>0</code>
<br><dt><code>NSS_STATUS_SUCCESS</code><a name="index-NSS_005fSTATUS_005fSUCCESS-3289"></a><dd>numeric value <code>1</code>
</dl>
<p class="noindent">Now you see where the action items of the <samp><span class="file">/etc/nsswitch.conf</span></samp> file
are used.
<p>If you study the source code you will find there is a fifth value:
<code>NSS_STATUS_RETURN</code>. This is an internal use only value, used by a
few functions in places where none of the above value can be used. If
necessary the source code should be examined to learn about the details.
<p>In case the interface function has to return an error it is important
that the correct error code is stored in <code>*</code><var>errnop</var>. Some
return status value have only one associated error code, others have
more.
<p><table summary=""><tr align="left"><td valign="top" width="30%"><code>NSS_STATUS_TRYAGAIN</code> </td><td valign="top" width="20%">
<code>EAGAIN</code> </td><td valign="top" width="50%">One of the functions used ran temporarily out of
resources or a service is currently not available.
<br></td></tr><tr align="left"><td valign="top" width="30%"></td><td valign="top" width="20%">
<code>ERANGE</code> </td><td valign="top" width="50%">The provided buffer is not large enough.
The function should be called again with a larger buffer.
<br></td></tr><tr align="left"><td valign="top" width="30%"><code>NSS_STATUS_UNAVAIL</code> </td><td valign="top" width="20%">
<code>ENOENT</code> </td><td valign="top" width="50%">A necessary input file cannot be found.
<br></td></tr><tr align="left"><td valign="top" width="30%"><code>NSS_STATUS_NOTFOUND</code> </td><td valign="top" width="20%">
<code>ENOENT</code> </td><td valign="top" width="50%">The requested entry is not available.
<br></td></tr></table>
<p>These are proposed values. There can be other error codes and the
described error codes can have different meaning. <strong>With one
exception:</strong> when returning <code>NSS_STATUS_TRYAGAIN</code> the error code
<code>ERANGE</code> <em>must</em> mean that the user provided buffer is too
small. Everything is non-critical.
<p>The above function has something special which is missing for almost all
the other module functions. There is an argument <var>h_errnop</var>. This
points to a variable which will be filled with the error code in case
the execution of the function fails for some reason. The reentrant
function cannot use the global variable <var>h_errno</var>;
<code>gethostbyname</code> calls <code>gethostbyname_r</code> with the last argument
set to <code>&amp;h_errno</code>.
<p>The <code>get</code><var>XXX</var><code>by</code><var>YYY</var> functions are the most important
functions in the NSS modules. But there are others which implement
the other ways to access system databases (say for the
password database, there are <code>setpwent</code>, <code>getpwent</code>, and
<code>endpwent</code>). These will be described in more detail later.
Here we give a general way to determine the
signature of the module function:
<ul>
<li>the return value is <code>int</code>;
<li>the name is as explained in see <a href="NSS-Module-Names.html#NSS-Module-Names">NSS Module Names</a>;
<li>the first arguments are identical to the arguments of the non-reentrant
function;
<li>the next three arguments are:
<dl>
<dt><code>STRUCT_TYPE *result_buf</code><dd>pointer to buffer where the result is stored. <code>STRUCT_TYPE</code> is
normally a struct which corresponds to the database.
<br><dt><code>char *buffer</code><dd>pointer to a buffer where the function can store additional data for
the result etc.
<br><dt><code>size_t buflen</code><dd>length of the buffer pointed to by <var>buffer</var>.
</dl>
<li>possibly a last argument <var>h_errnop</var>, for the host name and network
name lookup functions.
</ul>
<p class="noindent">This table is correct for all functions but the <code>set...ent</code>
and <code>end...ent</code> functions.
</body></html>