diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:15 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:15 -0400 |
| commit | 253e67c8b3a72b3a4757fdbc5845297628db0a4a (patch) | |
| tree | adf53b66087aa30dfbf8bf391a1dadb044c3bf4d /static/netbsd/man3/nsdispatch.3 | |
| parent | a9157ce950dfe2fc30795d43b9d79b9d1bffc48b (diff) | |
docs: Added All NetBSD Manuals
Diffstat (limited to 'static/netbsd/man3/nsdispatch.3')
| -rw-r--r-- | static/netbsd/man3/nsdispatch.3 | 959 |
1 files changed, 959 insertions, 0 deletions
diff --git a/static/netbsd/man3/nsdispatch.3 b/static/netbsd/man3/nsdispatch.3 new file mode 100644 index 00000000..8b61ec0b --- /dev/null +++ b/static/netbsd/man3/nsdispatch.3 @@ -0,0 +1,959 @@ +.\" $NetBSD: nsdispatch.3,v 1.34 2017/07/03 21:32:49 wiz Exp $ +.\" +.\" Copyright (c) 1997, 1998, 1999, 2004, 2005, 2008 +.\" The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Luke Mewburn; and by Jason R. Thorpe. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd January 4, 2015 +.Dt NSDISPATCH 3 +.Os +.Sh NAME +.Nm nsdispatch +.Nd name-service switch dispatcher routine +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In nsswitch.h +.Ft int +.Fo nsdispatch +.Fa "void *nsdrv" +.Fa "const ns_dtab dtab[]" +.Fa "const char *database" +.Fa "const char *name" +.Fa "const ns_src defaults[]" +.Fa "..." +.Fc +.Sh DESCRIPTION +The +.Fn nsdispatch +function invokes the callback functions specified in +.Fa dtab +in the order given in +.Pa /etc/nsswitch.conf +for the database +.Fa database +until the action criteria for a source of that database is fulfilled. +.Pp +.Fa nsdrv +is passed to each callback function to use as necessary +(to pass back to the caller of +.Fn nsdispatch ) . +.Pp +.Fa dtab +is an array of +.Fa ns_dtab +structures, which have the following format: +.Bl -item -offset indent +.It +.Bd -literal +typedef struct { + const char *src; + nss_method cb; + void *cb_data; +} ns_dtab; +.Ed +.It +The +.Fa dtab +array should consist of one entry for each source type that has a +static implementation, +with +.Fa src +as the name of the source, +.Fa cb +as a callback function which handles that source, and +.Fa cb_data +as a pointer to arbitrary data to be passed to the callback function. +The last entry in +.Fa dtab +should contain +.Dv NULL +values for +.Fa src , +.Fa cb , +and +.Fa cb_data . +.It +The callback function signature is described by the typedef: +.Bd -ragged -offset indent +.Ft typedef int +.Fo \*(lp*nss_method\*(rp +.Fa "void *cbrv" +.Fa "void *cbdata" +.Fa "va_list ap" +.Fc ; +.Bl -tag -width cbdata +.It Fa cbrv +The +.Fa nsdrv +that +.Fn nsdispatch +was invoked with. +.It Fa cbdata +The +.Fa cb_data +member of the array entry for the source that this +callback function implements in the +.Fa dtab +argument of +.Fn nsdispatch . +.It Fa ap +The +.Fa ... +arguments to +.Fn nsdispatch , +converted to a +.Ft va_list . +.El +.Ed +.El +.Pp +.Fa database +and +.Fa name +are used to select methods from optional per-source +dynamically-loaded modules. +.Fa name +is usually the name of the function calling +.Fn nsdispatch . +Note that the callback functions provided by +.Fa dtab +take priority over those implemented in dynamically-loaded modules in the +event of a conflict. +.Pp +.Fa defaults +contains a list of default sources to try in the case of +a missing or corrupt +.Xr nsswitch.conf 5 , +or if there isn't a relevant entry for +.Fa database . +It is an array of +.Fa ns_src +structures, which have the following format: +.Bl -item -offset indent +.It +.Bd -literal +typedef struct { + const char *src; + uint32_t flags; +} ns_src; +.Ed +.It +The +.Fa defaults +array should consist of one entry for each source to consult by default +indicated by +.Fa src , +and +.Fa flags +set to the desired behavior +(usually +.Dv NS_SUCCESS ; +refer to +.Sx Callback function return values +for more information). +The last entry in +.Fa defaults +should have +.Fa src +set to +.Dv NULL +and +.Fa flags +set to 0. +.It +Some invokers of +.Fn nsdispatch +(such as +.Xr setgrent 3 ) +need to force all callback functions to be invoked, +irrespective of the action criteria listed in +.Xr nsswitch.conf 5 . +This can be achieved by adding +.Dv NS_FORCEALL +to +.Fa defaults[0].flags +before invoking +.Fn nsdispatch . +The return value of +.Fn nsdispatch +will be the result of the final callback function invoked. +.It +For convenience, a global variable defined as: +.Dl extern const ns_src __nsdefaultsrc[]; +exists which contains a single default entry for +.Sq files +for use by callers which don't require complicated default rules. +.El +.Pp +.Fa ... +are optional extra arguments, which +are passed to the appropriate callback function as a +.Xr stdarg 3 +variable argument +list of the type +.Fa va_list . +.Pp +.Nm +returns the value of the callback function that caused the dispatcher +to finish, or +.Dv NS_NOTFOUND +otherwise. +.\" +.Ss Dynamically-loaded module interface +The +.Fn nsdispatch +function loads callback functions from the run-time link-editor's search +path using the following naming convention: +.Bl -item -offset indent +.It +.Bd -literal +nss_<source>.so.<version> +.Ed +.Bl -tag -width XversionX +.It Aq source +The source that the module implements. +.It Aq version +The +.Nm nsdispatch +module interface version, which is defined by the integer +.Dv NSS_MODULE_INTERFACE_VERSION , +which has the value 0. +.El +.El +.Pp +When a module is loaded, +.Fn nsdispatch +looks for and calls the following function in the module: +.Pp +.Bd -ragged -offset indent +.Ft ns_mtab * +.Fo nss_module_register +.Fa "const char *source" +.Fa "u_int *nelems" +.Fa "nss_module_unregister_fn *unreg" +.Fc ; +.Pp +.Bl -tag -width source +.It Fa source +The name of the source that the module implements, as used by +.Fn nsdispatch +to construct the module's name. +.It Fa nelems +A pointer to an unsigned integer that +.Fn nss_module_register +should set to the number of elements in the +.Ft ns_mtab +array returned by +.Fn nss_module_register , +or +.Dv 0 +if there was a failure. +.It Fa unreg +A pointer to a function pointer that +.Fn nss_module_register +can optionally set to an unregister function to be invoked when the module is +unloaded, or +.Dv NULL +if there isn't one. +.El +.Ed +.Pp +The unregister function signature is described by the typedef: +.Pp +.Bd -ragged -offset indent +.Ft typedef void +.Fo \*(lp*nss_module_unregister_fn\*(rp +.Fa "ns_mtab *mtab" +.Fa "u_int nelems" +.Fc ; +.Pp +.Bl -tag -width nelems +.It Fa mtab +The array of +.Ft ns_mtab +structures returned by +.Fn nss_module_register . +.It Fa nelems +The +.Fa *nelems +value set by +.Fn nss_module_register . +.El +.Ed +.Pp +.Fn nss_module_register +returns an array of +.Ft ns_mtab +structures +(with +.Fa *nelems +entries), or +.Dv NULL +if there was a failure. +The +.Ft ns_mtab +structures have the following format: +.Bl -item -offset indent +.It +.Bd -literal +typedef struct { + const char *database; + const char *name; + nss_method method; + void *mdata; +} ns_mtab; +.Ed +.It +The +.Fa mtab +array should consist of one entry for each callback function (method) +that is implemented, +with +.Fa database +as the name of the database, +.Fa name +as the name of the callback function, +.Fa method +as the +.Ft nss_method +callback function that implements the method, and +.Fa mdata +as a pointer to arbitrary data to be passed to the callback function as its +.Fa cbdata +argument. +.El +.\" +.Ss Valid source types +While there is support for arbitrary sources, the following +#defines for commonly implemented sources are provided: +.Bl -column NSSRC_COMPAT COMPAT -offset indent +.It Sy #define Value +.It NSSRC_FILES "files" +.It NSSRC_DNS "dns" +.It NSSRC_NIS "nis" +.It NSSRC_COMPAT "compat" +.El +.Pp +Refer to +.Xr nsswitch.conf 5 +for a complete description of what each source type is. +.\" +.Ss Valid database types +While there is support for arbitrary databases, the following +#defines for currently implemented system databases are provided: +.Bl -column NSDB_PASSWD_COMPAT PASSWD_COMPAT -offset indent +.It Sy #define Value +.It NSDB_HOSTS "hosts" +.It NSDB_GROUP "group" +.It NSDB_GROUP_COMPAT "group_compat" +.It NSDB_NETGROUP "netgroup" +.It NSDB_NETWORKS "networks" +.It NSDB_PASSWD "passwd" +.It NSDB_PASSWD_COMPAT "passwd_compat" +.It NSDB_SHELLS "shells" +.El +.Pp +Refer to +.Xr nsswitch.conf 5 +for a complete description of what each database is. +.\" +.Ss Callback function return values +The callback functions should return one of the following values +depending upon status of the lookup: +.Bl -column NS_NOTFOUND -offset indent +.It Sy "Return value" Status code +.It NS_SUCCESS The requested entry was found. +.It NS_NOTFOUND The entry is not present at this source. +.It NS_TRYAGAIN The source is busy, and may respond to retries. +.It NS_UNAVAIL The source is not responding, or entry is corrupt. +.El +.\" +.Sh CALLBACK FUNCTION API FOR STANDARD DATABASES +The organization of the +.Fa ap +argument for an +.Fn nss_method +callback function for a standard method in a standard database is: +.Bl -enum -offset indent -compact +.It +Pointer to return value of the standard function. +.It +First argument of the standard function. +.It +(etc.) +.El +.Pp +For example, given the standard function +.Xr getgrnam 3 : +.Bd -ragged -offset indent -compact +.Ft struct group * +.Fn getgrnam "const char *name" +.Ed +the +.Fa ap +organization used by the callback functions is: +.Bl -enum -offset indent -compact +.It +.Ft "struct group **" +.It +.Ft "const char *" +.El +.Pp +.Sy NOTE: +Not all standard databases are using this calling convention yet; +those that aren't are noted below. +These will be changed in the future. +.Pp +The callback function names and +.Ft va_list +organization for various standard database callback functions are: +.\" +.Ss Methods for hosts database +.Bl -tag -width 3n +.It Sy getaddrinfo +.Ft "char *name" , +.Ft "const struct addrinfo *pai" +.Pp +Returns +.Ft "struct addrinfo *" +via +.Ft "void *cbrv" . +.It Sy gethostbyaddr +.Ft "unsigned char *addr" , +.Ft "int addrlen" , +.Ft "int af" +.Pp +Returns +.Ft "struct getnamaddr *" +via +.Ft "void *cbrv" . +.It Sy gethostbyname +.Ft "char *name" , +.Ft "int namelen" , +.Ft "int af" +.Pp +Returns +.Ft "struct getnamaddr *" +via +.Ft "void *cbrv" . +.El +.Pp +The +.Ft "struct getnamaddr" +is defined internally in libc as: +.Bd -literal +struct getnamaddr { + struct hostent *hp; + char *buf; + size_t buflen; + int *he; +}; +.Ed +.\" +.Ss Methods for group and group_compat databases +.Bl -tag -width 3n +.It Sy endgrent +Empty +.Fa ap . +.Pp +All methods for all sources are invoked for this method name. +.It Sy getgrent +.Ft "struct group **retval" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct group" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getgrent 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getgrent_r +.Ft "int *retval" , +.Ft "struct group *grp" , +.Ft "char *buffer" , +.Ft "size_t buflen" , +.Ft "struct group **result" +.Pp +.Fa *retval +should be set to an appropriate +.Xr errno 2 +on failure. +.Pp +.Xr getgrent_r 3 +returns 0 +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS +or +.Dv NS_NOTFOUND , +and +.Fa *retval +otherwise. +.It Sy getgrgid +.Ft "struct group **retval" , +.Ft "gid_t gid" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct group" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getgrgid 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getgrgid_r +.Ft "int *retval" , +.Ft "gid_t gid" , +.Ft "struct group *grp" , +.Ft "char *buffer" , +.Ft "size_t buflen" , +.Ft "struct group **result" +.Pp +.Fa *retval +should be set to an appropriate +.Xr errno 2 +on failure. +.Pp +.Xr getgrgid_r 3 +returns 0 +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS +or +.Dv NS_NOTFOUND , +and +.Fa *retval +otherwise. +.It Sy getgrnam +.Ft "struct group **retval" , +.Ft "const char *name" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct group" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getgrnam 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getgrnam_r +.Ft "int *retval" , +.Ft "const char *name" , +.Ft "struct group *grp" , +.Ft "char *buffer" , +.Ft "size_t buflen" , +.Ft "struct group **result" +.Pp +.Fa *retval +should be set to an appropriate +.Xr errno 2 +on failure. +.Pp +.Xr getgrnam_r 3 +returns 0 +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS +or +.Dv NS_NOTFOUND , +and +.Fa *retval +otherwise. +.It Sy getgroupmembership +.Ft "int *retval" , +.Ft "const char *name" , +.Ft "gid_t basegid" , +.Ft "gid_t *groups" , +.Ft "int maxgrp" , +.Ft "int *groupc" +.Pp +.Fa retval +is unused. +.Pp +Lookups for +.Sy group_compat +are also stopped if +.Dv NS_SUCCESS +was returned to prevent multiple +.Dq "+:" +compat entries from being expanded. +.Pp +.Xr getgroupmembership 3 +returns +is -1 if +.Fa *groupc +is greater than to +.Fa maxgrp , +and 0 otherwise. +.It Sy setgroupent +.Ft "int *retval" , +.Ft "int stayopen" +.Pp +.Fa retval +should be set to 0 on failure and 1 on success. +.Pp +All methods for all sources are invoked for this method name. +.It Sy setgrent +Empty +.Fa ap . +.Pp +All methods for all sources are invoked for this method name. +.El +.\" +.Ss Methods for netgroup database +.Sy NOTE: +The method APIs for this database will be changing in the near future. +.Bl -tag -width 3n +.It Sy endnetgrent +Empty +.Fa ap . +.It Sy lookup +.Ft "char *name" , +.Ft "char **line" , +.Ft "int bywhat" +.Pp +Find the given +.Fa name +and return its value in +.Fa line . +.Fa bywhat +is one of +.Dv _NG_KEYBYNAME , +.Dv _NG_KEYBYUSER , +or +.Dv _NG_KEYBYHOST . +.It Sy getnetgrent +.Ft "int *retval" , +.Ft "const char **host" , +.Ft "const char **user" , +.Ft "const char **domain" +.Pp +.Fa *retval +should be set to 0 for no more netgroup members and 1 otherwise. +.Pp +.Xr getnetgrent 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +0 otherwise. +.It Sy innetgr +.Ft "int *retval" , +.Ft "const char *grp" , +.Ft "const char *host" , +.Ft "const char *user" , +.Ft "const char *domain" +.Pp +.Fa *retval +should be set to 1 for a successful match and 0 otherwise. +.It Sy setnetgrent +.Ft "const char *netgroup" +.El +.\" +.Ss Methods for networks database +.Bl -tag -width 3n +.It Sy getnetbyaddr +.Ft "struct netent **retval" , +.Ft "uint32_t net" , +.Ft "int type" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct netent" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getnetbyaddr 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getnetbyname +.Ft "struct netent **retval" , +.Ft "const char *name" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct netent" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getnetbyname 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.El +.\" +.Ss Methods for passwd and passwd_compat databases +.Bl -tag -width 3n +.It Sy endpwent +Empty +.Fa ap . +.Pp +All methods for all sources are invoked for this method name. +.It Sy getpwent +.Ft "struct passwd **retval" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct passwd" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getpwent 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getpwent_r +.Ft "int *retval" , +.Ft "struct passwd *pw" , +.Ft "char *buffer" , +.Ft "size_t buflen" , +.Ft "struct passwd **result" +.Pp +.Fa *retval +should be set to an appropriate +.Xr errno 2 +on failure. +.Pp +.Xr getpwent_r 3 +returns 0 +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS +or +.Dv NS_NOTFOUND , +and +.Fa *retval +otherwise. +.It Sy getpwnam +.Ft "struct passwd **retval" , +.Ft "const char *name" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct passwd" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getpwnam 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getpwnam_r +.Ft "int *retval" , +.Ft "const char *name" , +.Ft "struct passwd *pw" , +.Ft "char *buffer" , +.Ft "size_t buflen" , +.Ft "struct passwd **result" +.Pp +.Fa *retval +should be set to an appropriate +.Xr errno 2 +on failure. +.Pp +.Xr getpwnam_r 3 +returns 0 +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS +or +.Dv NS_NOTFOUND , +and +.Fa *retval +otherwise. +.It Sy getpwuid +.Ft "struct passwd **retval" , +.Ft "uid_t uid" +.Pp +.Fa *retval +should be set to a pointer to an internal static +.Ft "struct passwd" +on success, +.Dv NULL +otherwise. +.Pp +.Xr getpwuid 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +.Dv NULL +otherwise. +.It Sy getpwuid_r +.Ft "int *retval" , +.Ft "uid_t uid" , +.Ft "struct passwd *pw" , +.Ft "char *buffer" , +.Ft "size_t buflen" , +.Ft "struct passwd **result" +.Pp +.Fa *retval +should be set to an appropriate +.Xr errno 2 +on failure. +.Pp +.Xr getpwuid_r 3 +returns 0 +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS +or +.Dv NS_NOTFOUND , +and +.Fa *retval +otherwise. +.It Sy setpassent +.Ft "int *retval" , +.Ft "int stayopen" +.Pp +.Fa retval +should be set to 0 on failure and 1 on success. +.Pp +All methods for all sources are invoked for this method name. +.It Sy setpwent +Empty +.Fa ap . +.Pp +All methods for all sources are invoked for this method name. +.El +.\" +.Ss Methods for shells database +.Bl -tag -width 3n +.It Sy endusershell +Empty +.Fa ap . +.Pp +All methods for all sources are invoked for this method name. +.It Sy getusershell +.Ft "char **retval" +.Pp +.Xr getusershell 3 +returns +.Fa *retval +if +.Fn nsdispatch +returns +.Dv NS_SUCCESS , +and 0 otherwise. +.It Sy setusershell +Empty +.Fa ap . +.Pp +All methods for all sources are invoked for this method name. +.El +.\" +.Sh SEE ALSO +.Xr ld.elf_so 1 , +.Xr hesiod 3 , +.Xr stdarg 3 , +.Xr ypclnt 3 , +.Xr nsswitch.conf 5 +.Sh HISTORY +The +.Nm +routines first appeared in +.Nx 1.4 . +Support for dynamically-loaded modules first appeared in +.Nx 3.0 . +.Sh AUTHORS +.An Luke Mewburn +.Aq Mt lukem@NetBSD.org +wrote this freely distributable name-service switch implementation, +using ideas from the +.Tn ULTRIX +.Xr svc.conf 5 +and +.Tn Solaris +.Xr nsswitch.conf 4 +manual pages. +Support for dynamically-loaded modules was added by +.An Jason Thorpe +.Aq Mt thorpej@NetBSD.org , +based on code developed by the +.Fx +Project. |
