aboutsummaryrefslogtreecommitdiff
path: root/manual/nss.texi
diff options
context:
space:
mode:
Diffstat (limited to 'manual/nss.texi')
-rw-r--r--manual/nss.texi734
1 files changed, 0 insertions, 734 deletions
diff --git a/manual/nss.texi b/manual/nss.texi
deleted file mode 100644
index ee70ad309d..0000000000
--- a/manual/nss.texi
+++ /dev/null
@@ -1,734 +0,0 @@
-@node Name Service Switch, Users and Groups, Job Control, Top
-@chapter System Databases and Name Service Switch
-@c %MENU% Accessing system databases
-@cindex Name Service Switch
-@cindex NSS
-@cindex databases
-
-Various functions in the C Library need to be configured to work
-correctly in the local environment. Traditionally, this was done by
-using files (e.g., @file{/etc/passwd}), but other nameservices (like the
-Network Information Service (NIS) and the Domain Name Service (DNS))
-became popular, and were hacked into the C library, usually with a fixed
-search order.
-
-@Theglibc{} contains a cleaner solution to this problem. It is
-designed after a method used by Sun Microsystems in the C library of
-@w{Solaris 2}. @Theglibc{} follows their name and calls this
-scheme @dfn{Name Service Switch} (NSS).
-
-Though the interface might be similar to Sun's version there is no
-common code. We never saw any source code of Sun's implementation and
-so the internal interface is incompatible. This also manifests in the
-file names we use as we will see later.
-
-
-@menu
-* NSS Basics:: What is this NSS good for.
-* NSS Configuration File:: Configuring NSS.
-* NSS Module Internals:: How does it work internally.
-* Extending NSS:: What to do to add services or databases.
-@end menu
-
-@node NSS Basics, NSS Configuration File, Name Service Switch, Name Service Switch
-@section NSS Basics
-
-The basic idea is to put the implementation of the different services
-offered to access the databases in separate modules. This has some
-advantages:
-
-@enumerate
-@item
-Contributors can add new services without adding them to @theglibc{}.
-@item
-The modules can be updated separately.
-@item
-The C library image is smaller.
-@end enumerate
-
-To fulfill the first goal above, the ABI of the modules will be described
-below. For getting the implementation of a new service right it is
-important to understand how the functions in the modules get called.
-They are in no way designed to be used by the programmer directly.
-Instead the programmer should only use the documented and standardized
-functions to access the databases.
-
-@noindent
-The databases available in the NSS are
-
-@cindex ethers
-@cindex group
-@cindex hosts
-@cindex netgroup
-@cindex networks
-@cindex protocols
-@cindex passwd
-@cindex rpc
-@cindex services
-@cindex shadow
-@table @code
-@item aliases
-Mail aliases
-@comment @pxref{Mail Aliases}.
-@item ethers
-Ethernet numbers,
-@comment @pxref{Ethernet Numbers}.
-@item group
-Groups of users, @pxref{Group Database}.
-@item hosts
-Host names and numbers, @pxref{Host Names}.
-@item netgroup
-Network wide list of host and users, @pxref{Netgroup Database}.
-@item networks
-Network names and numbers, @pxref{Networks Database}.
-@item protocols
-Network protocols, @pxref{Protocols Database}.
-@item passwd
-User passwords, @pxref{User Database}.
-@item rpc
-Remote procedure call names and numbers,
-@comment @pxref{RPC Database}.
-@item services
-Network services, @pxref{Services Database}.
-@item shadow
-Shadow user passwords,
-@comment @pxref{Shadow Password Database}.
-@end table
-
-@noindent
-There will be some more added later (@code{automount}, @code{bootparams},
-@code{netmasks}, and @code{publickey}).
-
-@node NSS Configuration File, NSS Module Internals, NSS Basics, Name Service Switch
-@section The NSS Configuration File
-
-@cindex @file{/etc/nsswitch.conf}
-@cindex @file{nsswitch.conf}
-Somehow the NSS code must be told about the wishes of the user. For
-this reason there is the file @file{/etc/nsswitch.conf}. For each
-database, this file contains a specification of how the lookup process should
-work. The file could look like this:
-
-@example
-@include nsswitch.texi
-@end example
-
-The first column is the database as you can guess from the table above.
-The rest of the line specifies how the lookup process works. Please
-note that you specify the way it works for each database individually.
-This cannot be done with the old way of a monolithic implementation.
-
-The configuration specification for each database can contain two
-different items:
-
-@itemize @bullet
-@item
-the service specification like @code{files}, @code{db}, or @code{nis}.
-@item
-the reaction on lookup result like @code{[NOTFOUND=return]}.
-@end itemize
-
-@menu
-* Services in the NSS configuration:: Service names in the NSS configuration.
-* Actions in the NSS configuration:: React appropriately to the lookup result.
-* Notes on NSS Configuration File:: Things to take care about while
- configuring NSS.
-@end menu
-
-@node Services in the NSS configuration, Actions in the NSS configuration, NSS Configuration File, NSS Configuration File
-@subsection Services in the NSS configuration File
-
-The above example file mentions five different services: @code{files},
-@code{db}, @code{dns}, @code{nis}, and @code{nisplus}. This does not
-mean these
-services are available on all sites and neither does it mean these are
-all the services which will ever be available.
-
-In fact, these names are simply strings which the NSS code uses to find
-the implicitly addressed functions. The internal interface will be
-described later. Visible to the user are the modules which implement an
-individual service.
-
-Assume the service @var{name} shall be used for a lookup. The code for
-this service is implemented in a module called @file{libnss_@var{name}}.
-On a system supporting shared libraries this is in fact a shared library
-with the name (for example) @file{libnss_@var{name}.so.2}. The number
-at the end is the currently used version of the interface which will not
-change frequently. Normally the user should not have to be cognizant of
-these files since they should be placed in a directory where they are
-found automatically. Only the names of all available services are
-important.
-
-@node Actions in the NSS configuration, Notes on NSS Configuration File, Services in the NSS configuration, NSS Configuration File
-@subsection Actions in the NSS configuration
-
-The second item in the specification gives the user much finer control
-on the lookup process. Action items are placed between two service
-names and are written within brackets. The general form is
-
-@display
-@code{[} ( @code{!}? @var{status} @code{=} @var{action} )+ @code{]}
-@end display
-
-@noindent
-where
-
-@smallexample
-@var{status} @result{} success | notfound | unavail | tryagain
-@var{action} @result{} return | continue
-@end smallexample
-
-The case of the keywords is insignificant. The @var{status}
-values are the results of a call to a lookup function of a specific
-service. They mean:
-
-@ftable @samp
-@item success
-No error occurred and the wanted entry is returned. The default action
-for this is @code{return}.
-
-@item notfound
-The lookup process works ok but the needed value was not found. The
-default action is @code{continue}.
-
-@item unavail
-@cindex DNS server unavailable
-The service is permanently unavailable. This can either mean the needed
-file is not available, or, for DNS, the server is not available or does
-not allow queries. The default action is @code{continue}.
-
-@item tryagain
-The service is temporarily unavailable. This could mean a file is
-locked or a server currently cannot accept more connections. The
-default action is @code{continue}.
-@end ftable
-
-@noindent
-The @var{action} values mean:
-
-@ftable @samp
-@item return
-
-If the status matches, stop the lookup process at this service
-specification. If an entry is available, provide it to the application.
-If an error occurred, report it to the application. In case of a prior
-@samp{merge} action, the data is combined with previous lookup results,
-as explained below.
-
-@item continue
-
-If the status matches, proceed with the lookup process at the next
-entry, discarding the result of the current lookup (and any merged
-data). An exception is the @samp{initgroups} database and the
-@samp{success} status, where @samp{continue} acts like @code{merge}
-below.
-
-@item merge
-
-Proceed with the lookup process, retaining the current lookup result.
-This action is useful only with the @samp{success} status. If a
-subsequent service lookup succeeds and has a matching @samp{return}
-specification, the results are merged, the lookup process ends, and the
-merged results are returned to the application. If the following service
-has a matching @samp{merge} action, the lookup process continues,
-retaining the combined data from this and any previous lookups.
-
-After a @code{merge} action, errors from subsequent lookups are ignored,
-and the data gathered so far will be returned.
-
-The @samp{merge} only applies to the @samp{success} status. It is
-currently implemented for the @samp{group} database and its group
-members field, @samp{gr_mem}. If specified for other databases, it
-causes the lookup to fail (if the @var{status} matches).
-
-When processing @samp{merge} for @samp{group} membership, the group GID
-and name must be identical for both entries. If only one or the other is
-a match, the behavior is undefined.
-
-@end ftable
-
-@noindent
-If we have a line like
-
-@smallexample
-ethers: nisplus [NOTFOUND=return] db files
-@end smallexample
-
-@noindent
-this is equivalent to
-
-@smallexample
-ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue
- TRYAGAIN=continue]
- db [SUCCESS=return NOTFOUND=continue UNAVAIL=continue
- TRYAGAIN=continue]
- files
-@end smallexample
-
-@noindent
-(except that it would have to be written on one line). The default
-value for the actions are normally what you want, and only need to be
-changed in exceptional cases.
-
-If the optional @code{!} is placed before the @var{status} this means
-the following action is used for all statuses but @var{status} itself.
-I.e., @code{!} is negation as in the C language (and others).
-
-Before we explain the exception which makes this action item necessary
-one more remark: obviously it makes no sense to add another action
-item after the @code{files} service. Since there is no other service
-following the action @emph{always} is @code{return}.
-
-@cindex nisplus, and completeness
-Now, why is this @code{[NOTFOUND=return]} action useful? To understand
-this we should know that the @code{nisplus} service is often
-complete; i.e., if an entry is not available in the NIS+ tables it is
-not available anywhere else. This is what is expressed by this action
-item: it is useless to examine further services since they will not give
-us a result.
-
-@cindex nisplus, and booting
-@cindex bootstrapping, and services
-The situation would be different if the NIS+ service is not available
-because the machine is booting. In this case the return value of the
-lookup function is not @code{notfound} but instead @code{unavail}. And
-as you can see in the complete form above: in this situation the
-@code{db} and @code{files} services are used. Neat, isn't it? The
-system administrator need not pay special care for the time the system
-is not completely ready to work (while booting or shutdown or
-network problems).
-
-
-@node Notes on NSS Configuration File, , Actions in the NSS configuration, NSS Configuration File
-@subsection Notes on the NSS Configuration File
-
-Finally a few more hints. The NSS implementation is not completely
-helpless if @file{/etc/nsswitch.conf} does not exist. For
-all supported databases there is a default value so it should normally
-be possible to get the system running even if the file is corrupted or
-missing.
-
-@cindex default value, and NSS
-For the @code{hosts} and @code{networks} databases the default value is
-@code{dns [!UNAVAIL=return] files}. I.e., the system is prepared for
-the DNS service not to be available but if it is available the answer it
-returns is definitive.
-
-The @code{passwd}, @code{group}, and @code{shadow} databases are
-traditionally handled in a special way. The appropriate files in the
-@file{/etc} directory are read but if an entry with a name starting
-with a @code{+} character is found NIS is used. This kind of lookup
-remains possible by using the special lookup service @code{compat}
-and the default value for the three databases above is
-@code{compat [NOTFOUND=return] files}.
-
-For all other databases the default value is
-@code{nis [NOTFOUND=return] files}. This solution gives the best
-chance to be correct since NIS and file based lookups are used.
-
-@cindex optimizing NSS
-A second point is that the user should try to optimize the lookup
-process. The different service have different response times.
-A simple file look up on a local file could be fast, but if the file
-is long and the needed entry is near the end of the file this may take
-quite some time. In this case it might be better to use the @code{db}
-service which allows fast local access to large data sets.
-
-Often the situation is that some global information like NIS must be
-used. So it is unavoidable to use service entries like @code{nis} etc.
-But one should avoid slow services like this if possible.
-
-
-@node NSS Module Internals, Extending NSS, NSS Configuration File, Name Service Switch
-@section NSS Module Internals
-
-Now it is time to describe what the modules look like. The functions
-contained in a module are identified by their names. I.e., there is no
-jump table or the like. How this is done is of no interest here; those
-interested in this topic should read about Dynamic Linking.
-@comment @ref{Dynamic Linking}.
-
-
-@menu
-* NSS Module Names:: Construction of the interface function of
- the NSS modules.
-* NSS Modules Interface:: Programming interface in the NSS module
- functions.
-@end menu
-
-@node NSS Module Names, NSS Modules Interface, NSS Module Internals, NSS Module Internals
-@subsection The Naming Scheme of the NSS Modules
-
-@noindent
-The name of each function consists of various parts:
-
-@quotation
- _nss_@var{service}_@var{function}
-@end quotation
-
-@var{service} of course corresponds to the name of the module this
-function is found in.@footnote{Now you might ask why this information is
-duplicated. The answer is that we want to make it possible to link
-directly with these shared objects.} The @var{function} part is derived
-from the interface function in the C library itself. If the user calls
-the function @code{gethostbyname} and the service used is @code{files}
-the function
-
-@smallexample
- _nss_files_gethostbyname_r
-@end smallexample
-
-@noindent
-in the module
-
-@smallexample
- libnss_files.so.2
-@end smallexample
-
-@noindent
-@cindex reentrant NSS functions
-is used. You see, what is explained above in not the whole truth. In
-fact the NSS modules only contain reentrant versions of the lookup
-functions. I.e., if the user would call the @code{gethostbyname_r}
-function this also would end in the above function. For all user
-interface functions the C library maps this call to a call to the
-reentrant function. For reentrant functions this is trivial since the
-interface is (nearly) the same. For the non-reentrant version the
-library keeps internal buffers which are used to replace the user
-supplied buffer.
-
-I.e., the reentrant functions @emph{can} have counterparts. No service
-module is forced to have functions for all databases and all kinds to
-access them. If a function is not available it is simply treated as if
-the function would return @code{unavail}
-(@pxref{Actions in the NSS configuration}).
-
-The file name @file{libnss_files.so.2} would be on a @w{Solaris 2}
-system @file{nss_files.so.2}. This is the difference mentioned above.
-Sun's NSS modules are usable as modules which get indirectly loaded
-only.
-
-The NSS modules in @theglibc{} are prepared to be used as normal
-libraries themselves. This is @emph{not} true at the moment, though.
-However, the organization of the name space in the modules does not make it
-impossible like it is for Solaris. Now you can see why the modules are
-still libraries.@footnote{There is a second explanation: we were too
-lazy to change the Makefiles to allow the generation of shared objects
-not starting with @file{lib} but don't tell this to anybody.}
-
-
-@node NSS Modules Interface, , NSS Module Names, NSS Module Internals
-@subsection The Interface of the Function in NSS Modules
-
-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 versions). The prototypes for
-the non-reentrant and reentrant versions of our function above are:
-
-@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)
-@end smallexample
-
-@noindent
-The actual prototype of the function in the NSS modules in this case is
-
-@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)
-@end smallexample
-
-I.e., the interface function is in fact the reentrant function with the
-change of the return value, the omission of the @var{result} parameter,
-and the addition of the @var{errnop} parameter. While the user-level
-function returns a pointer to the result the reentrant function return
-an @code{enum nss_status} value:
-
-@vtable @code
-@item NSS_STATUS_TRYAGAIN
-numeric value @code{-2}
-
-@item NSS_STATUS_UNAVAIL
-numeric value @code{-1}
-
-@item NSS_STATUS_NOTFOUND
-numeric value @code{0}
-
-@item NSS_STATUS_SUCCESS
-numeric value @code{1}
-@end vtable
-
-@noindent
-Now you see where the action items of the @file{/etc/nsswitch.conf} file
-are used.
-
-If you study the source code you will find there is a fifth value:
-@code{NSS_STATUS_RETURN}. 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.
-
-In case the interface function has to return an error it is important
-that the correct error code is stored in @code{*@var{errnop}}. Some
-return status values have only one associated error code, others have
-more.
-
-@multitable @columnfractions .3 .2 .50
-@item
-@code{NSS_STATUS_TRYAGAIN} @tab
- @code{EAGAIN} @tab One of the functions used ran temporarily out of
-resources or a service is currently not available.
-@item
-@tab
- @code{ERANGE} @tab The provided buffer is not large enough.
-The function should be called again with a larger buffer.
-@item
-@code{NSS_STATUS_UNAVAIL} @tab
- @code{ENOENT} @tab A necessary input file cannot be found.
-@item
-@code{NSS_STATUS_NOTFOUND} @tab
- @code{ENOENT} @tab The requested entry is not available.
-
-@item
-@code{NSS_STATUS_NOTFOUND} @tab
- @code{SUCCESS} @tab There are no entries.
-Use this to avoid returning errors for inactive services which may
-be enabled at a later time. This is not the same as the service
-being temporarily unavailable.
-@end multitable
-
-These are proposed values. There can be other error codes and the
-described error codes can have different meaning. @strong{With one
-exception:} when returning @code{NSS_STATUS_TRYAGAIN} the error code
-@code{ERANGE} @emph{must} mean that the user provided buffer is too
-small. Everything else is non-critical.
-
-In statically linked programs, the main application and NSS modules do
-not share the same thread-local variable @code{errno}, which is the
-reason why there is an explicit @var{errnop} function argument.
-
-The above function has something special which is missing for almost all
-the other module functions. There is an argument @var{h_errnop}. This
-points to a variable which will be filled with the error code in case
-the execution of the function fails for some reason. (In statically
-linked programs, the thread-local variable @code{h_errno} is not shared
-with the main application.)
-
-The @code{get@var{XXX}by@var{YYY}} 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{getpwent}, and
-@code{endpwent}). These will be described in more detail later.
-Here we give a general way to determine the
-signature of the module function:
-
-@itemize @bullet
-@item
-the return value is @code{enum nss_status};
-@item
-the name (@pxref{NSS Module Names});
-@item
-the first arguments are identical to the arguments of the non-reentrant
-function;
-@item
-the next four arguments are:
-
-@table @code
-@item STRUCT_TYPE *result_buf
-pointer to buffer where the result is stored. @code{STRUCT_TYPE} is
-normally a struct which corresponds to the database.
-@item char *buffer
-pointer to a buffer where the function can store additional data for
-the result etc.
-@item size_t buflen
-length of the buffer pointed to by @var{buffer}.
-@item int *errnop
-the low-level error code to return to the application. If the return
-value is not @code{NSS_STATUS_SUCCESS}, @code{*@var{errnop}} needs to be
-set to a non-zero value. An NSS module should never set
-@code{*@var{errnop}} to zero. The value @code{ERANGE} is special, as
-described above.
-@end table
-
-@item
-possibly a last argument @var{h_errnop}, for the host name and network
-name lookup functions. If the return value is not
-@code{NSS_STATUS_SUCCESS}, @code{*@var{h_errnop}} needs to be set to a
-non-zero value. A generic error code is @code{NETDB_INTERNAL}, which
-instructs the caller to examine @code{*@var{errnop}} for further
-details. (This includes the @code{ERANGE} special case.)
-@end itemize
-
-@noindent
-This table is correct for all functions but the @code{set@dots{}ent}
-and @code{end@dots{}ent} functions.
-
-
-@node Extending NSS, , NSS Module Internals, Name Service Switch
-@section Extending NSS
-
-One of the advantages of NSS mentioned above is that it can be extended
-quite easily. There are two ways in which the extension can happen:
-adding another database or adding another service. The former is
-normally done only by the C library developers. It is
-here only important to remember that adding another database is
-independent from adding another service because a service need not
-support all databases or lookup functions.
-
-A designer/implementer of a new service is therefore free to choose the
-databases s/he is interested in and leave the rest for later (or
-completely aside).
-
-@menu
-* Adding another Service to NSS:: What is to do to add a new service.
-* NSS Module Function Internals:: Guidelines for writing new NSS
- service functions.
-@end menu
-
-@node Adding another Service to NSS, NSS Module Function Internals, Extending NSS, Extending NSS
-@subsection Adding another Service to NSS
-
-The sources for a new service need not (and should not) be part of @theglibc{}
-itself. The developer retains complete control over the
-sources and its development. The links between the C library and the
-new service module consists solely of the interface functions.
-
-Each module is designed following a specific interface specification.
-For now the version is 2 (the interface in version 1 was not adequate)
-and this manifests in the version number of the shared library object of
-the NSS modules: they have the extension @code{.2}. If the interface
-changes again in an incompatible way, this number will be increased.
-Modules using the old interface will still be usable.
-
-Developers of a new service will have to make sure that their module is
-created using the correct interface number. This means the file itself
-must have the correct name and on ELF systems the @dfn{soname} (Shared
-Object Name) must also have this number. Building a module from a bunch
-of object files on an ELF system using GNU CC could be done like this:
-
-@smallexample
-gcc -shared -o libnss_NAME.so.2 -Wl,-soname,libnss_NAME.so.2 OBJECTS
-@end smallexample
-
-@noindent
-@ref{Link Options, Options for Linking, , gcc, GNU CC}, to learn
-more about this command line.
-
-To use the new module the library must be able to find it. This can be
-achieved by using options for the dynamic linker so that it will search
-the directory where the binary is placed. For an ELF system this could be
-done by adding the wanted directory to the value of
-@code{LD_LIBRARY_PATH}.
-
-But this is not always possible since some programs (those which run
-under IDs which do not belong to the user) ignore this variable.
-Therefore the stable version of the module should be placed into a
-directory which is searched by the dynamic linker. Normally this should
-be the directory @file{$prefix/lib}, where @file{$prefix} corresponds to
-the value given to configure using the @code{--prefix} option. But be
-careful: this should only be done if it is clear the module does not
-cause any harm. System administrators should be careful.
-
-
-@node NSS Module Function Internals, , Adding another Service to NSS, Extending NSS
-@subsection Internals of the NSS Module Functions
-
-Until now we only provided the syntactic interface for the functions in
-the NSS module. In fact there is not much more we can say since the
-implementation obviously is different for each function. But a few
-general rules must be followed by all functions.
-
-In fact there are four kinds of different functions which may appear in
-the interface. All derive from the traditional ones for system databases.
-@var{db} in the following table is normally an abbreviation for the
-database (e.g., it is @code{pw} for the password database).
-
-@table @code
-@item enum nss_status _nss_@var{database}_set@var{db}ent (void)
-This function prepares the service for following operations. For a
-simple file based lookup this means files could be opened, for other
-services this function simply is a noop.
-
-One special case for this function is that it takes an additional
-argument for some @var{database}s (i.e., the interface is
-@code{int set@var{db}ent (int)}). @ref{Host Names}, which describes the
-@code{sethostent} function.
-
-The return value should be @var{NSS_STATUS_SUCCESS} or according to the
-table above in case of an error (@pxref{NSS Modules Interface}).
-
-@item enum nss_status _nss_@var{database}_end@var{db}ent (void)
-This function simply closes all files which are still open or removes
-buffer caches. If there are no files or buffers to remove this is again
-a simple noop.
-
-There normally is no return value other than @var{NSS_STATUS_SUCCESS}.
-
-@item enum nss_status _nss_@var{database}_get@var{db}ent_r (@var{STRUCTURE} *result, char *buffer, size_t buflen, int *errnop)
-Since this function will be called several times in a row to retrieve
-one entry after the other it must keep some kind of state. But this
-also means the functions are not really reentrant. They are reentrant
-only in that simultaneous calls to this function will not try to
-write the retrieved data in the same place (as it would be the case for
-the non-reentrant functions); instead, it writes to the structure
-pointed to by the @var{result} parameter. But the calls share a common
-state and in the case of a file access this means they return neighboring
-entries in the file.
-
-The buffer of length @var{buflen} pointed to by @var{buffer} can be used
-for storing some additional data for the result. It is @emph{not}
-guaranteed that the same buffer will be passed for the next call of this
-function. Therefore one must not misuse this buffer to save some state
-information from one call to another.
-
-Before the function returns with a failure code, the implementation
-should store the value of the local @var{errno} variable in the variable
-pointed to be @var{errnop}. This is important to guarantee the module
-working in statically linked programs. The stored value must not be
-zero.
-
-As explained above this function could also have an additional last
-argument. This depends on the database used; it happens only for
-@code{host} and @code{networks}.
-
-The function shall return @code{NSS_STATUS_SUCCESS} as long as there are
-more entries. When the last entry was read it should return
-@code{NSS_STATUS_NOTFOUND}. When the buffer given as an argument is too
-small for the data to be returned @code{NSS_STATUS_TRYAGAIN} should be
-returned. When the service was not formerly initialized by a call to
-@code{_nss_@var{DATABASE}_set@var{db}ent} all return values allowed for
-this function can also be returned here.
-
-@item enum nss_status _nss_@var{DATABASE}_get@var{db}by@var{XX}_r (@var{PARAMS}, @var{STRUCTURE} *result, char *buffer, size_t buflen, int *errnop)
-This function shall return the entry from the database which is
-addressed by the @var{PARAMS}. The type and number of these arguments
-vary. It must be individually determined by looking to the user-level
-interface functions. All arguments given to the non-reentrant version
-are here described by @var{PARAMS}.
-
-The result must be stored in the structure pointed to by @var{result}.
-If there are additional data to return (say strings, where the
-@var{result} structure only contains pointers) the function must use the
-@var{buffer} of length @var{buflen}. There must not be any references
-to non-constant global data.
-
-The implementation of this function should honor the @var{stayopen}
-flag set by the @code{set@var{DB}ent} function whenever this makes sense.
-
-Before the function returns, the implementation should store the value of
-the local @var{errno} variable in the variable pointed to by
-@var{errnop}. This is important to guarantee the module works in
-statically linked programs.
-
-Again, this function takes an additional last argument for the
-@code{host} and @code{networks} database.
-
-The return value should as always follow the rules given above
-(@pxref{NSS Modules Interface}).
-
-@end table