Remove building with NOCRYPTO option
[minix.git] / lib / libc / net / nsdispatch.3
blob8913b0ad66ad30f1304e73a25ba6c47d86053383
1 .\"     $NetBSD: nsdispatch.3,v 1.33 2015/01/04 21:38:58 wiz Exp $
2 .\"
3 .\" Copyright (c) 1997, 1998, 1999, 2004, 2005, 2008
4 .\" The NetBSD Foundation, Inc.
5 .\" All rights reserved.
6 .\"
7 .\" This code is derived from software contributed to The NetBSD Foundation
8 .\" by Luke Mewburn; and by Jason R. Thorpe.
9 .\"
10 .\" Redistribution and use in source and binary forms, with or without
11 .\" modification, are permitted provided that the following conditions
12 .\" are met:
13 .\" 1. Redistributions of source code must retain the above copyright
14 .\"    notice, this list of conditions and the following disclaimer.
15 .\" 2. Redistributions in binary form must reproduce the above copyright
16 .\"    notice, this list of conditions and the following disclaimer in the
17 .\"    documentation and/or other materials provided with the distribution.
18 .\"
19 .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 .\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 .\" POSSIBILITY OF SUCH DAMAGE.
30 .\"
31 .Dd January 4, 2015
32 .Dt NSDISPATCH 3
33 .Os
34 .Sh NAME
35 .Nm nsdispatch
36 .Nd name-service switch dispatcher routine
37 .Sh LIBRARY
38 .Lb libc
39 .Sh SYNOPSIS
40 .In nsswitch.h
41 .Ft int
42 .Fo nsdispatch
43 .Fa "void *nsdrv"
44 .Fa "const ns_dtab dtab[]"
45 .Fa "const char *database"
46 .Fa "const char *name"
47 .Fa "const ns_src defaults[]"
48 .Fa "..."
49 .Fc
50 .Sh DESCRIPTION
51 The
52 .Fn nsdispatch
53 function invokes the callback functions specified in
54 .Fa dtab
55 in the order given in
56 .Pa /etc/nsswitch.conf
57 for the database
58 .Fa database
59 until the action criteria for a source of that database is fulfilled.
60 .Pp
61 .Fa nsdrv
62 is passed to each callback function to use as necessary
63 (to pass back to the caller of
64 .Fn nsdispatch ) .
65 .Pp
66 .Fa dtab
67 is an array of
68 .Fa ns_dtab
69 structures, which have the following format:
70 .Bl -item -offset indent
71 .It
72 .Bd -literal
73 typedef struct {
74         const char *src;
75         nss_method cb;
76         void *cb_data;
77 } ns_dtab;
78 .Ed
79 .It
80 The
81 .Fa dtab
82 array should consist of one entry for each source type that has a
83 static implementation,
84 with
85 .Fa src
86 as the name of the source,
87 .Fa cb
88 as a callback function which handles that source, and
89 .Fa cb_data
90 as a pointer to arbitrary data to be passed to the callback function.
91 The last entry in
92 .Fa dtab
93 should contain
94 .Dv NULL
95 values for
96 .Fa src ,
97 .Fa cb ,
98 and
99 .Fa cb_data .
101 The callback function signature is described by the typedef:
102 .Bd -ragged -offset indent
103 .Ft typedef int
104 .Fo \*(lp*nss_method\*(rp
105 .Fa "void *cbrv"
106 .Fa "void *cbdata"
107 .Fa "va_list ap"
108 .Fc ;
109 .Bl -tag -width cbdata
110 .It Fa cbrv
112 .Fa nsdrv
113 that
114 .Fn nsdispatch
115 was invoked with.
116 .It Fa cbdata
118 .Fa cb_data
119 member of the array entry for the source that this
120 callback function implements in the
121 .Fa dtab
122 argument of
123 .Fn nsdispatch .
124 .It Fa ap
126 .Fa ...
127 arguments to
128 .Fn nsdispatch ,
129 converted to a
130 .Ft va_list .
135 .Fa database
137 .Fa name
138 are used to select methods from optional per-source
139 dynamically-loaded modules.
140 .Fa name
141 is usually the name of the function calling
142 .Fn nsdispatch .
143 Note that the callback functions provided by
144 .Fa dtab
145 take priority over those implemented in dynamically-loaded modules in the
146 event of a conflict.
148 .Fa defaults
149 contains a list of default sources to try in the case of
150 a missing or corrupt
151 .Xr nsswitch.conf 5 ,
152 or if there isn't a relevant entry for
153 .Fa database .
154 It is an array of
155 .Fa ns_src
156 structures, which have the following format:
157 .Bl -item -offset indent
159 .Bd -literal
160 typedef struct {
161         const char *src;
162         uint32_t flags;
163 } ns_src;
167 .Fa defaults
168 array should consist of one entry for each source to consult by default
169 indicated by
170 .Fa src ,
172 .Fa flags
173 set to the desired behavior
174 (usually
175 .Dv NS_SUCCESS ;
176 refer to
177 .Sx Callback function return values
178 for more information).
179 The last entry in
180 .Fa defaults
181 should have
182 .Fa src
183 set to
184 .Dv NULL
186 .Fa flags
187 set to 0.
189 Some invokers of
190 .Fn nsdispatch
191 (such as
192 .Xr setgrent 3 )
193 need to force all callback functions to be invoked,
194 irrespective of the action criteria listed in
195 .Xr nsswitch.conf 5 .
196 This can be achieved by adding
197 .Dv NS_FORCEALL
199 .Fa defaults[0].flags
200 before invoking
201 .Fn nsdispatch .
202 The return value of
203 .Fn nsdispatch
204 will be the result of the final callback function invoked.
206 For convenience, a global variable defined as:
207 .Dl extern const ns_src __nsdefaultsrc[];
208 exists which contains a single default entry for
209 .Sq files
210 for use by callers which don't require complicated default rules.
213 .Fa ...
214 are optional extra arguments, which
215 are passed to the appropriate callback function as a
216 .Xr stdarg 3
217 variable argument
218 list of the type
219 .Fa va_list .
222 returns the value of the callback function that caused the dispatcher
223 to finish, or
224 .Dv NS_NOTFOUND
225 otherwise.
227 .Ss Dynamically-loaded module interface
229 .Fn nsdispatch
230 function loads callback functions from the run-time link-editor's search
231 path using the following naming convention:
232 .Bl -item -offset indent
234 .Bd -literal
235 nss_\*[Lt]source\*[Gt].so.\*[Lt]version\*[Gt]
237 .Bl -tag -width XversionX
238 .It Aq source
239 The source that the module implements.
240 .It Aq version
242 .Nm nsdispatch
243 module interface version, which is defined by the integer
244 .Dv NSS_MODULE_INTERFACE_VERSION ,
245 which has the value 0.
249 When a module is loaded,
250 .Fn nsdispatch
251 looks for and calls the following function in the module:
253 .Bd -ragged -offset indent
254 .Ft ns_mtab *
255 .Fo nss_module_register
256 .Fa "const char *source"
257 .Fa "u_int *nelems"
258 .Fa "nss_module_unregister_fn *unreg"
259 .Fc ;
261 .Bl -tag -width source
262 .It Fa source
263 The name of the source that the module implements, as used by
264 .Fn nsdispatch
265 to construct the module's name.
266 .It Fa nelems
267 A pointer to an unsigned integer that
268 .Fn nss_module_register
269 should set to the number of elements in the
270 .Ft ns_mtab
271 array returned by
272 .Fn nss_module_register ,
274 .Dv 0
275 if there was a failure.
276 .It Fa unreg
277 A pointer to a function pointer that
278 .Fn nss_module_register
279 can optionally set to an unregister function to be invoked when the module is
280 unloaded, or
281 .Dv NULL
282 if there isn't one.
286 The unregister function signature is described by the typedef:
288 .Bd -ragged -offset indent
289 .Ft typedef void
290 .Fo \*(lp*nss_module_unregister_fn\*(rp
291 .Fa "ns_mtab *mtab"
292 .Fa "u_int nelems"
293 .Fc ;
295 .Bl -tag -width nelems
296 .It Fa mtab
297 The array of
298 .Ft ns_mtab
299 structures returned by
300 .Fn nss_module_register .
301 .It Fa nelems
303 .Fa *nelems
304 value set by
305 .Fn nss_module_register .
309 .Fn nss_module_register
310 returns an array of
311 .Ft ns_mtab
312 structures
313 (with
314 .Fa *nelems
315 entries), or
316 .Dv NULL
317 if there was a failure.
319 .Ft ns_mtab
320 structures have the following format:
321 .Bl -item -offset indent
323 .Bd -literal
324 typedef struct {
325         const char *database;
326         const char *name;
327         nss_method method;
328         void *mdata;
329 } ns_mtab;
333 .Fa mtab
334 array should consist of one entry for each callback function (method)
335 that is implemented,
336 with
337 .Fa database
338 as the name of the database,
339 .Fa name
340 as the name of the callback function,
341 .Fa method
342 as the
343 .Ft nss_method
344 callback function that implements the method, and
345 .Fa mdata
346 as a pointer to arbitrary data to be passed to the callback function as its
347 .Fa cbdata
348 argument.
351 .Ss Valid source types
352 While there is support for arbitrary sources, the following
353 #defines for commonly implemented sources are provided:
354 .Bl -column NSSRC_COMPAT COMPAT -offset indent
355 .It Sy #define  Value
356 .It NSSRC_FILES "files"
357 .It NSSRC_DNS   "dns"
358 .It NSSRC_NIS   "nis"
359 .It NSSRC_COMPAT        "compat"
362 Refer to
363 .Xr nsswitch.conf 5
364 for a complete description of what each source type is.
366 .Ss Valid database types
367 While there is support for arbitrary databases, the following
368 #defines for currently implemented system databases are provided:
369 .Bl -column NSDB_PASSWD_COMPAT PASSWD_COMPAT -offset indent
370 .It Sy #define  Value
371 .It NSDB_HOSTS  "hosts"
372 .It NSDB_GROUP  "group"
373 .It NSDB_GROUP_COMPAT   "group_compat"
374 .It NSDB_NETGROUP       "netgroup"
375 .It NSDB_NETWORKS       "networks"
376 .It NSDB_PASSWD "passwd"
377 .It NSDB_PASSWD_COMPAT  "passwd_compat"
378 .It NSDB_SHELLS "shells"
381 Refer to
382 .Xr nsswitch.conf 5
383 for a complete description of what each database is.
385 .Ss Callback function return values
386 The callback functions should return one of the following values
387 depending upon status of the lookup:
388 .Bl -column NS_NOTFOUND -offset indent
389 .It Sy "Return value"   Status code
390 .It NS_SUCCESS  The requested entry was found.
391 .It NS_NOTFOUND The entry is not present at this source.
392 .It NS_TRYAGAIN The source is busy, and may respond to retries.
393 .It NS_UNAVAIL  The source is not responding, or entry is corrupt.
396 .Sh CALLBACK FUNCTION API FOR STANDARD DATABASES
397 The organization of the
398 .Fa ap
399 argument for an
400 .Fn nss_method
401 callback function for a standard method in a standard database is:
402 .Bl -enum -offset indent -compact
404 Pointer to return value of the standard function.
406 First argument of the standard function.
408 (etc.)
411 For example, given the standard function
412 .Xr getgrnam 3 :
413 .Bd -ragged -offset indent -compact
414 .Ft struct group *
415 .Fn getgrnam "const char *name"
418 .Fa ap
419 organization used by the callback functions is:
420 .Bl -enum -offset indent -compact
422 .Ft "struct group **"
424 .Ft "const char *"
427 .Sy NOTE:
428 Not all standard databases are using this calling convention yet;
429 those that aren't are noted below.
430 These will be changed in the future.
432 The callback function names and
433 .Ft va_list
434 organization for various standard database callback functions are:
436 .Ss Methods for hosts database
437 .Bl -tag -width 3n
438 .It Sy getaddrinfo
439 .Ft "char *name" ,
440 .Ft "const struct addrinfo *pai"
442 Returns
443 .Ft "struct addrinfo *"
445 .Ft "void *cbrv" .
446 .It Sy gethostbyaddr
447 .Ft "unsigned char *addr" ,
448 .Ft "int addrlen" ,
449 .Ft "int af"
451 Returns
452 .Ft "struct getnamaddr *"
454 .Ft "void *cbrv" .
455 .It Sy gethostbyname
456 .Ft "char *name" ,
457 .Ft "int namelen" ,
458 .Ft "int af"
460 Returns
461 .Ft "struct getnamaddr *"
463 .Ft "void *cbrv" .
467 .Ft "struct getnamaddr"
468 is defined internally in libc as:
469 .Bd -literal
470 struct getnamaddr { 
471         struct hostent *hp;
472         char *buf; 
473         size_t buflen;
474         int *he; 
475 }; 
478 .Ss Methods for group and group_compat databases
479 .Bl -tag -width 3n
480 .It Sy endgrent
481 Empty
482 .Fa ap .
484 All methods for all sources are invoked for this method name.
485 .It Sy getgrent
486 .Ft "struct group **retval"
488 .Fa *retval
489 should be set to a pointer to an internal static
490 .Ft "struct group"
491 on success,
492 .Dv NULL
493 otherwise.
495 .Xr getgrent 3
496 returns
497 .Fa *retval
499 .Fn nsdispatch
500 returns
501 .Dv NS_SUCCESS ,
502 .Dv NULL
503 otherwise.
504 .It Sy getgrent_r
505 .Ft "int *retval" ,
506 .Ft "struct group *grp" ,
507 .Ft "char *buffer" ,
508 .Ft "size_t buflen" ,
509 .Ft "struct group **result"
511 .Fa *retval
512 should be set to an appropriate
513 .Xr errno 2
514 on failure.
516 .Xr getgrent_r 3
517 returns 0
519 .Fn nsdispatch
520 returns
521 .Dv NS_SUCCESS
523 .Dv NS_NOTFOUND ,
525 .Fa *retval
526 otherwise.
527 .It Sy getgrgid
528 .Ft "struct group **retval" ,
529 .Ft "gid_t gid"
531 .Fa *retval
532 should be set to a pointer to an internal static
533 .Ft "struct group"
534 on success,
535 .Dv NULL
536 otherwise.
538 .Xr getgrgid 3
539 returns
540 .Fa *retval
542 .Fn nsdispatch
543 returns
544 .Dv NS_SUCCESS ,
545 .Dv NULL
546 otherwise.
547 .It Sy getgrgid_r
548 .Ft "int *retval" ,
549 .Ft "gid_t gid" ,
550 .Ft "struct group *grp" ,
551 .Ft "char *buffer" ,
552 .Ft "size_t buflen" ,
553 .Ft "struct group **result"
555 .Fa *retval
556 should be set to an appropriate
557 .Xr errno 2
558 on failure.
560 .Xr getgrgid_r 3
561 returns 0
563 .Fn nsdispatch
564 returns
565 .Dv NS_SUCCESS
567 .Dv NS_NOTFOUND ,
569 .Fa *retval
570 otherwise.
571 .It Sy getgrnam
572 .Ft "struct group **retval" ,
573 .Ft "const char *name"
575 .Fa *retval
576 should be set to a pointer to an internal static
577 .Ft "struct group"
578 on success,
579 .Dv NULL
580 otherwise.
582 .Xr getgrnam 3
583 returns
584 .Fa *retval
586 .Fn nsdispatch
587 returns
588 .Dv NS_SUCCESS ,
589 .Dv NULL
590 otherwise.
591 .It Sy getgrnam_r
592 .Ft "int *retval" ,
593 .Ft "const char *name" ,
594 .Ft "struct group *grp" ,
595 .Ft "char *buffer" ,
596 .Ft "size_t buflen" ,
597 .Ft "struct group **result"
599 .Fa *retval
600 should be set to an appropriate
601 .Xr errno 2
602 on failure.
604 .Xr getgrnam_r 3
605 returns 0
607 .Fn nsdispatch
608 returns
609 .Dv NS_SUCCESS
611 .Dv NS_NOTFOUND ,
613 .Fa *retval
614 otherwise.
615 .It Sy getgroupmembership
616 .Ft "int *retval" ,
617 .Ft "const char *name" ,
618 .Ft "gid_t basegid" ,
619 .Ft "gid_t *groups" ,
620 .Ft "int maxgrp" ,
621 .Ft "int *groupc"
623 .Fa retval
624 is unused.
626 Lookups for
627 .Sy group_compat
628 are also stopped if
629 .Dv NS_SUCCESS
630 was returned to prevent multiple
631 .Dq "+:"
632 compat entries from being expanded.
634 .Xr getgroupmembership 3
635 returns
636 is -1 if
637 .Fa *groupc
638 is greater than to
639 .Fa maxgrp ,
640 and 0 otherwise.
641 .It Sy setgroupent
642 .Ft "int *retval" ,
643 .Ft "int stayopen"
645 .Fa retval
646 should be set to 0 on failure and 1 on success.
648 All methods for all sources are invoked for this method name.
649 .It Sy setgrent
650 Empty
651 .Fa ap .
653 All methods for all sources are invoked for this method name.
656 .Ss Methods for netgroup database
657 .Sy NOTE:
658 The method APIs for this database will be changing in the near future.
659 .Bl -tag -width 3n
660 .It Sy endnetgrent
661 Empty
662 .Fa ap .
663 .It Sy lookup
664 .Ft "char *name" ,
665 .Ft "char **line" ,
666 .Ft "int bywhat"
668 Find the given
669 .Fa name
670 and return its value in
671 .Fa line .
672 .Fa bywhat
673 is one of
674 .Dv _NG_KEYBYNAME ,
675 .Dv _NG_KEYBYUSER ,
677 .Dv _NG_KEYBYHOST .
678 .It Sy getnetgrent
679 .Ft "int *retval" ,
680 .Ft "const char **host" ,
681 .Ft "const char **user" ,
682 .Ft "const char **domain"
684 .Fa *retval
685 should be set to 0 for no more netgroup members and 1 otherwise.
687 .Xr getnetgrent 3
688 returns
689 .Fa *retval
691 .Fn nsdispatch
692 returns
693 .Dv NS_SUCCESS ,
694 0 otherwise.
695 .It Sy innetgr
696 .Ft "int *retval" ,
697 .Ft "const char *grp" ,
698 .Ft "const char *host" ,
699 .Ft "const char *user" ,
700 .Ft "const char *domain"
702 .Fa *retval
703 should be set to 1 for a successful match and 0 otherwise.
704 .It Sy setnetgrent
705 .Ft "const char *netgroup"
708 .Ss Methods for networks database
709 .Bl -tag -width 3n
710 .It Sy getnetbyaddr
711 .Ft "struct netent **retval" ,
712 .Ft "uint32_t net" ,
713 .Ft "int type"
715 .Fa *retval
716 should be set to a pointer to an internal static
717 .Ft "struct netent"
718 on success,
719 .Dv NULL
720 otherwise.
722 .Xr getnetbyaddr 3
723 returns
724 .Fa *retval
726 .Fn nsdispatch
727 returns
728 .Dv NS_SUCCESS ,
729 .Dv NULL
730 otherwise.
731 .It Sy getnetbyname
732 .Ft "struct netent **retval" ,
733 .Ft "const char *name"
735 .Fa *retval
736 should be set to a pointer to an internal static
737 .Ft "struct netent"
738 on success,
739 .Dv NULL
740 otherwise.
742 .Xr getnetbyname 3
743 returns
744 .Fa *retval
746 .Fn nsdispatch
747 returns
748 .Dv NS_SUCCESS ,
749 .Dv NULL
750 otherwise.
753 .Ss Methods for passwd and passwd_compat databases
754 .Bl -tag -width 3n
755 .It Sy endpwent
756 Empty
757 .Fa ap .
759 All methods for all sources are invoked for this method name.
760 .It Sy getpwent
761 .Ft "struct passwd **retval"
763 .Fa *retval
764 should be set to a pointer to an internal static
765 .Ft "struct passwd"
766 on success,
767 .Dv NULL
768 otherwise.
770 .Xr getpwent 3
771 returns
772 .Fa *retval
774 .Fn nsdispatch
775 returns
776 .Dv NS_SUCCESS ,
777 .Dv NULL
778 otherwise.
779 .It Sy getpwent_r
780 .Ft "int *retval" ,
781 .Ft "struct passwd *pw" ,
782 .Ft "char *buffer" ,
783 .Ft "size_t buflen" ,
784 .Ft "struct passwd **result"
786 .Fa *retval
787 should be set to an appropriate
788 .Xr errno 2
789 on failure.
791 .Xr getpwent_r 3
792 returns 0
794 .Fn nsdispatch
795 returns
796 .Dv NS_SUCCESS
798 .Dv NS_NOTFOUND ,
800 .Fa *retval
801 otherwise.
802 .It Sy getpwnam
803 .Ft "struct passwd **retval" ,
804 .Ft "const char *name"
806 .Fa *retval
807 should be set to a pointer to an internal static
808 .Ft "struct passwd"
809 on success,
810 .Dv NULL
811 otherwise.
813 .Xr getpwnam 3
814 returns
815 .Fa *retval
817 .Fn nsdispatch
818 returns
819 .Dv NS_SUCCESS ,
820 .Dv NULL
821 otherwise.
822 .It Sy getpwnam_r
823 .Ft "int *retval" ,
824 .Ft "const char *name" ,
825 .Ft "struct passwd *pw" ,
826 .Ft "char *buffer" ,
827 .Ft "size_t buflen" ,
828 .Ft "struct passwd **result"
830 .Fa *retval
831 should be set to an appropriate
832 .Xr errno 2
833 on failure.
835 .Xr getpwnam_r 3
836 returns 0
838 .Fn nsdispatch
839 returns
840 .Dv NS_SUCCESS
842 .Dv NS_NOTFOUND ,
844 .Fa *retval
845 otherwise.
846 .It Sy getpwuid
847 .Ft "struct passwd **retval" ,
848 .Ft "uid_t uid"
850 .Fa *retval
851 should be set to a pointer to an internal static
852 .Ft "struct passwd"
853 on success,
854 .Dv NULL
855 otherwise.
857 .Xr getpwuid 3
858 returns
859 .Fa *retval
861 .Fn nsdispatch
862 returns
863 .Dv NS_SUCCESS ,
864 .Dv NULL
865 otherwise.
866 .It Sy getpwuid_r
867 .Ft "int *retval" ,
868 .Ft "uid_t uid" ,
869 .Ft "struct passwd *pw" ,
870 .Ft "char *buffer" ,
871 .Ft "size_t buflen" ,
872 .Ft "struct passwd **result"
874 .Fa *retval
875 should be set to an appropriate
876 .Xr errno 2
877 on failure.
879 .Xr getpwuid_r 3
880 returns 0
882 .Fn nsdispatch
883 returns
884 .Dv NS_SUCCESS
886 .Dv NS_NOTFOUND ,
888 .Fa *retval
889 otherwise.
890 .It Sy setpassent
891 .Ft "int *retval" ,
892 .Ft "int stayopen"
894 .Fa retval
895 should be set to 0 on failure and 1 on success.
897 All methods for all sources are invoked for this method name.
898 .It Sy setpwent
899 Empty
900 .Fa ap .
902 All methods for all sources are invoked for this method name.
905 .Ss Methods for shells database
906 .Bl -tag -width 3n
907 .It Sy endusershell
908 Empty
909 .Fa ap .
911 All methods for all sources are invoked for this method name.
912 .It Sy getusershell
913 .Ft "char **retval"
915 .Xr getusershell 3
916 returns
917 .Fa *retval
919 .Fn nsdispatch
920 returns
921 .Dv NS_SUCCESS ,
922 and 0 otherwise.
923 .It Sy setusershell
924 Empty
925 .Fa ap .
927 All methods for all sources are invoked for this method name.
930 .Sh SEE ALSO
931 .Xr ld.elf_so 1 ,
932 .Xr hesiod 3 ,
933 .Xr stdarg 3 ,
934 .Xr ypclnt 3 ,
935 .Xr nsswitch.conf 5
936 .Sh HISTORY
939 routines first appeared in
940 .Nx 1.4 .
941 Support for dynamically-loaded modules first appeared in
942 .Nx 3.0 .
943 .Sh AUTHORS
944 .An Luke Mewburn
945 .Aq Mt lukem@NetBSD.org
946 wrote this freely distributable name-service switch implementation,
947 using ideas from the
948 .Tn ULTRIX
949 .Xr svc.conf 5
951 .Tn Solaris
952 .Xr nsswitch.conf 4
953 manual pages.
954 Support for dynamically-loaded modules was added by
955 .An Jason Thorpe
956 .Aq Mt thorpej@NetBSD.org ,
957 based on code developed by the
959 Project.