]> git.ipfire.org Git - thirdparty/glibc.git/blame - manual/nss.texi
Remove a.out.h.
[thirdparty/glibc.git] / manual / nss.texi
CommitLineData
706074a5
UD
1@c each section should have index entries corresponding to the section title
2
3@node Name Service Switch
4@chapter System Databases and Name Service Switch
5
2c6fe0bd
UD
6@cindex Name Service Switch
7@cindex NSS
8@cindex databses
706074a5
UD
9Various functions in the C Library need to be configured to work
10correctly in the local environment. Traditionally, this was done by
11using files (e.g., @file{/etc/passwd}), but other nameservices (line the
12Network Information Service (NIS) and the Domain Name Service (DNS))
13became popular, and were hacked into the C library, usually with a fixed
84384f5b 14search order (@pxref{frobnicate, , ,jargon, The Jargon File}).
706074a5
UD
15
16The GNU C Library contains a cleaner solution of this problem. It is
17designed after a method used by Sun Microsystems in the C library of
18@w{Solaris 2}. GNU C Library follows their name and calls this
19scheme @dfn{Name Service Switch} (NSS).
20
21Though the interface might be similar to Sun's version there is no
22common code. We never saw any source code of Sun's implementation and
2de99474 23so the internal interface is incompatible. This is also manifests in the
706074a5
UD
24file names we use as we will see later.
25
26
27@menu
28* NSS Basics:: What is this NSS good for.
29* NSS Configuration File:: Configuring NSS.
30* NSS Module Internals:: How does it work internally.
31* Extending NSS:: What to do to add services or databases.
32@end menu
33
34@node NSS Basics, NSS Configuration File, Name Service Switch, Name Service Switch
35@section NSS Basics
36
37The basic idea is to put the implementation of the different services
38offered to access the databases in separate modules. This has some
39advantages:
40
41@enumerate
42@item
43Contributors can add new services without adding them to GNU C Library.
44@item
45The modules can be updated separately.
46@item
47The C library image is smaller.
48@end enumerate
49
50To fulfill the first goal above the ABI of the modules will be described
51below. For getting the implementation of a new service right it is
52important to understand how the functions in the modules get called.
53They are in no way designed to be used by the programmer directly.
54Instead the programmer should only use the documented and standardized
55functions to access the databases.
56
57@noindent
58The databases available in the NSS are
59
60@cindex ethers
61@cindex group
62@cindex hosts
ba1ffaa1 63@cindex netgroup
706074a5
UD
64@cindex network
65@cindex protocols
66@cindex passwd
67@cindex rpc
68@cindex services
69@cindex shadow
70@vtable @code
71@item ethers
72Ethernet numbers,
73@comment @pxref{Ethernet Numbers}.
74@item group
75Groups of users, @pxref{Group Database}.
76@item hosts
77Host names and numbers, @pxref{Host Names}.
ba1ffaa1
UD
78@item netgroup
79Network wide list of host and users, @pxref{Netgroup Database}.
706074a5
UD
80@item network
81Network names and numbers, @pxref{Networks Database}.
82@item protocols
83Network protocols, @pxref{Protocols Database}.
84@item passwd
85User passwords, @pxref{User Database}.
86@item rpc
87Remote procedure call names and numbers,
88@comment @pxref{RPC Database}.
89@item services
90Network services, @pxref{Services Database}.
91@item shadow
92Shadow user passwords,
93@comment @pxref{Shadow Password Database}.
94@end vtable
95
96@noindent
97There will be some more added later (@code{aliases}, @code{automount},
ba1ffaa1 98@code{bootparams}, @code{netmasks}, and @code{publickey}).
706074a5
UD
99
100@node NSS Configuration File, NSS Module Internals, NSS Basics, Name Service Switch
101@section The NSS Configuration File
102
103@cindex @file{/etc/nsswitch.conf}
104@cindex @file{nsswitch.conf}
105Somehow the NSS code must be told about the wishes of the user. For
106this reason there is the file @file{/etc/nsswitch.conf}. For each
107database this file contain a specification how the lookup process should
108work. The file could look like this:
109
110@example
111@include nsswitch.texi
112@end example
113
114The first column is the database as you can guess from the table above.
115The rest of the line specifies how the lookup process works. Please
116note that you specify the way it works for each database individually.
117This cannot be done with the old way of a monolithic implementation.
118
119The configuration specification for each database can contain two
120different items:
121
122@itemize @bullet
123@item
124the service specification like @code{files}, @code{db}, or @code{nis}.
125@item
126the reaction on lookup result line @code{[NOTFOUND=return]}.
127@end itemize
128
129@menu
ba1ffaa1 130* Services in the NSS configuration:: Service names in the NSS configuration.
706074a5
UD
131* Actions in the NSS configuration:: React approprite on the lookup result.
132* Notes on NSS Configuration File:: Things to take care about while
133 configuring NSS.
134@end menu
135
136@node Services in the NSS configuration, Actions in the NSS configuration, NSS Configuration File, NSS Configuration File
137@subsection Services in the NSS configuration File
138
139The above example file mentions four different services: @code{files},
140@code{db}, @code{nis}, and @code{nisplus}. This does not mean these
141services are available on all sites and it does also not mean these are
142all the services which will ever be available.
143
144In fact, these names are simply strings which the NSS code uses to find
145the implicitly addressed functions. The internal interface will be
146described later. Visible to the user are the modules which implement an
147individual service.
148
149Assume the service @var{name} shall be used for a lookup. The code for
150this service is implemented in a module called @file{libnss_@var{name}}.
151On a system supporting shared libraries this is in fact a shared library
152with the name (for example) @file{libnss_@var{name}.so.1}. The number
153at the end is the currently used version of the interface which will not
154change frequently. Normally the user should not have to be cognizant of
155these files since they should be placed in a directory where they are
156found automatically. Only the names of all available services are
157important.
158
159@node Actions in the NSS configuration, Notes on NSS Configuration File, Services in the NSS configuration, NSS Configuration File
160@subsection Actions in the NSS configuration
161
162The second item in the specification gives the user much finer control
163on the lookup process. Action items are placed between two service
164names and are written within brackets. The general form is
165
2de99474 166@display
57ba7bb4 167@code{[} ( @code{!}? @var{status} @code{=} @var{action} )+ @code{]}
2de99474 168@end display
706074a5
UD
169
170@noindent
171where
172
173@smallexample
174@var{status} @result{} success | notfound | unavail | tryagain
175@var{action} @result{} return | continue
176@end smallexample
177
178The case of the keywords is insignificant. The @var{status}
179values are the results of a call to a lookup function of a specific
180service. They mean
181
182@ftable @samp
183@item success
184No error occured an the wanted entry is returned. The default action
185for this is @code{return}.
186
187@item notfound
188The lookup process works ok but the needed value was not found. The
189default action is @code{continue}.
190
191@item unavail
192@cindex DNS server unavailable
193The service is permanently unavailable. This can either mean the needed
194file is not available, or, for DNS, the server is not available or does
195not allow queries. The default action is @code{continue}.
196
197@item tryagain
198The service is temporarily unavailable. This could mean a file is
199locked or a server currently cannot accept more connections. The
200default action is @code{continue}.
201@end ftable
202
203@noindent
204If we have a line like
205
206@smallexample
207ethers: nisplus [NOTFOUND=return] db files
208@end smallexample
209
210@noindent
211this is equivalent to
212
213@smallexample
214ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue
215 TRYAGAIN=continue]
216 db [SUCCESS=return NOTFOUND=continue UNAVAIL=continue
217 TRYAGAIN=continue]
218 files
219@end smallexample
220
221@noindent
222(except that it would have to be written on one line). The default
223value for the actions are normally what you want, and only need to be
224changed in exceptional cases.
225
226If the optional @code{!} is placed before the @var{status} this means
227the following action is used for all statii but @var{status} itself.
228I.e., @code{!} is negation as in the C language (and others).
229
230Before we explain the exception which makes this action item necessary
231one more remark: obviously it makes no sense to add another action
232item after the @code{files} service. Since there is no other service
233following the action @emph{always} is @code{return}.
234
235@cindex nisplus, and completeness
236Now, why is this @code{[NOTFOUND=return]} action useful? To understand
237this we should know that the @code{nisplus} service is often
238complete; i.e., if an entry is not available in the NIS+ tables it is
239not available anywhere else. This is what is expressed by this action
240item: it is useless to examine further services since they will not give
241us a result.
242
243@cindex nisplus, and booting
244@cindex bootstrapping, and services
245The situation would be different if the NIS+ service is not available
246because the machine is booting. In this case the return value of the
247lookup function is not @code{notfound} but instead @code{unavail}. And
248as you can see in the complete form above: in this situation the
249@code{db} and @code{files} services are used. Neat, isn't it? The
250system administrator need not pay special care for the time the system
251is not completely ready to work (while booting or shutdown or
252network problems).
253
254
255@node Notes on NSS Configuration File, , Actions in the NSS configuration, NSS Configuration File
256@subsection Notes on the NSS Configuration File
257
258Finally a few more hints. The NSS implementation is not completely
259helpless if @file{/etc/nsswitch.conf} does not exist. For
260all supported databases there is a default value so it should normally
261be possible to get the system running even if the file is corrupted or
262missing.
263
ba1ffaa1
UD
264@cindex default value, and NSS
265For the @code{hosts} and @code{network} databases the default value is
266@code{dns [!UNAVAIL=return] files}. I.e., the system is prepared for
267the DNS service not to be available but if it is available the answer it
268returns is ultimative.
269
270For all other databases the default value is
271@code{compat [NOTFOUND=return] files}. This solution give the best
272chance to be correct since NIS and file based lookup is used. The
273@code{compat} service is available in a separate add-on to GNU C
274library, available in the same place you got the GNU C library source
275from.
276
277@cindex optimizing NSS
706074a5
UD
278A second point is that the user should try to optimize the lookup
279process. The different service have different response times. A simple
280file look up on a local file could be fast, but if the file is long and the
281needed entry is near the end of the file this may take quite some time.
282In this case it might be better to use the @code{db} service which
283allows fast local access to large data sets.
284
285Often the situation is that some global information like NIS must be
286used. So it is unavoidable to use service entries like @code{nis} etc.
287But one should avoid slow services like this if possible.
288
289
290@node NSS Module Internals, Extending NSS, NSS Configuration File, Name Service Switch
291@section NSS Module Internals
292
293Now it is time to described how the modules look like. The functions
294contained in a module are identified by their names. I.e., there is no
295jump table or the like. How this is done is of no interest here; those
296interested in this topic should read about Dynamic Linking.
297@comment @ref{Dynamic Linking}.
298
299
300@menu
301* NSS Module Names:: Construction of the interface function of
302 the NSS modules.
303* NSS Modules Interface:: Programming interface in the NSS module
304 functions.
305@end menu
306
307@node NSS Module Names, NSS Modules Interface, NSS Module Internals, NSS Module Internals
308@subsection The Naming Scheme of the NSS Modules
309
310@noindent
311The name of each function consist of various parts:
312
313@quotation
314 _nss_@var{service}_@var{function}
315@end quotation
316
317@var{service} of course corresponds to the name of the module this
318function is found in.@footnote{Now you might ask why to duplicate this
319information. The answer is that we want to keep the possibility to link
320directly with these shared objects.} The @var{function} part is derived
321from the interface function in the C library itself. If the user calls
322the function @code{gethostbyname} and the service used is @code{files}
323the function
324
325@smallexample
326 _nss_files_gethostbyname_r
327@end smallexample
328
329@noindent
330in the module
331
332@smallexample
333 libnss_files.so.1
334@end smallexample
335
336@noindent
337@cindex reentrant NSS functions
338is used. You see, what is explained above in not the whole truth. In
339fact the NSS modules only contain reentrant versions of the lookup
340functions. I.e., if the user would call the @code{gethostbyname_r}
341function this also would end in the above function. For all user
342interface functions the C library maps this call to a call to the
343reentrant function. For reentrant functions this is trivial since the
344interface is (nearly) the same. For the non-reentrant version pointers
345to static buffers are used to replace the user supplied buffers.
346
347I.e., the reentrant functions @emph{can} have counterparts. No service
348module is forced to have functions for all databases and all kinds to
349access them. If a function is not available it is simply treated as if
350the function would return @code{unavail}
351(@pxref{Actions in the NSS configuration}).
352
2de99474
UD
353The file name @file{libnss_files.so.1} would be on a @w{Solaris 2}
354system @file{nss_files.so.1}. This is the difference mentioned above.
355Sun's NSS modules are usable as modules which get indirectly loaded
356only.
357
358The NSS modules in the GNU C Library are prepared to be used as normal
359libraries itself.
360@comment Fix me if necessary.
361This is @emph{not} true in the moment, though. But the different
362organization of the name space in the modules does not make it
363impossible like it is for Solaris. Now you can see why the modules are
364still libraries.@footnote{There is a second explanation: we were too
365lazy to change the Makefiles to allow the generation of shared objects
366not starting with @file{lib} but do not tell this anybody.}
367
706074a5
UD
368
369@node NSS Modules Interface, , NSS Module Names, NSS Module Internals
370@subsection The Interface of the Function in NSS Modules
371
372Now we know about the functions contained in the modules. It is now
373time to describe the types. When we mentioned the reentrant versions of
374the functions above, this means there are some additional arguments
375(compared with the standard, non-reentrant version). The prototypes for
376the non-reentrant and reentrant versions of our function above are:
377
378@smallexample
379struct hostent *gethostbyname (const char *name)
380
381struct hostent *gethostbyname_r (const char *name,
382 struct hostent *result_buf, char *buf,
383 int buflen, int *h_errnop)
384@end smallexample
385
386@noindent
ba1ffaa1 387The actual prototype of the function in the NSS modules in this case is
706074a5
UD
388
389@smallexample
ba1ffaa1
UD
390enum nss_status _nss_files_gethostbyname_r (const char *name,
391 struct hostent *result_buf,
392 char *buf, int buflen,
393 int *h_errnop)
706074a5
UD
394@end smallexample
395
ba1ffaa1
UD
396I.e., the interface function is in fact the reentrant function with the
397change of the return value. While the user-level function returns a
398pointer to the result the reentrant function return an @code{enum
399nss_status} value:
706074a5 400
2c6fe0bd
UD
401@vindex NSS_STATUS_TRYAGAIN
402@vindex NSS_STATUS_UNAVAIL
403@vindex NSS_STATUS_NOTFOUND
404@vindex NSS_STATUS_SUCCESS
706074a5
UD
405@ftable @code
406@item NSS_STATUS_TRYAGAIN
407numeric value @code{-2}
408
409@item NSS_STATUS_UNAVAIL
410numeric value @code{-1}
411
412@item NSS_STATUS_NOTFOUND
413numeric value @code{0}
414
415@item NSS_STATUS_SUCCESS
416numeric value @code{1}
417@end ftable
418
419@noindent
420Now you see where the action items of the @file{/etc/nsswitch.conf} file
421are used.
422
ba1ffaa1
UD
423If you study the source code you will find there is a fifth value:
424@code{NSS_STATUS_RETURN}. This is an internal use only value, used by a
425few functions in places where none of the above value can be used. If
426necessary the source code should be examined to learn about the details.
427
428The above function has something special which is missing for almost all
706074a5
UD
429the other module functions. There is an argument @var{h_errnop}. This
430points to a variable which will be filled with the error code in case
431the execution of the function fails for some reason. The reentrant
432function cannot use the global variable @var{h_errno};
433@code{gethostbyname} calls @code{gethostbyname_r} with the
434last argument set to @code{&h_errno}.
435
436The @code{get@var{XXX}by@var{YYY}} functions are the most important
437functions in the NSS modules. But there are others which implement
438the other ways to access system databases (say for the
439password database, there are @code{setpwent}, @code{getpwent}, and
440@code{endpwent}). These will be described in more detail later.
441Here we give a general way to determine the
442signature of the module function:
443
444@itemize @bullet
445@item
446the return value is @code{int};
447@item
448the name is as explain in @pxref{NSS Module Names};
449@item
450the first arguments are identical to the arguments of the non-reentrant
451function;
452@item
453the next three arguments are:
454
455@table @code
456@item STRUCT_TYPE result_buf
457pointer to buffer where the result is stored. @code{STRUCT_TYPE} is
458normally a struct which corresponds to the database.
459@item char *buffer
460pointer to a buffer where the function can store additional adata for
461the result etc.
462@item int buflen
463length of the buffer pointed to by @var{buffer}.
464@end table
465
466@item
467possibly a last argument @var{h_errnop}, for the host name and network
468name lookup functions.
469@end itemize
470
471@noindent
472This table is correct for all functions but the @code{set@dots{}ent}
473and @code{end@dots{}ent} functions.
474
475
476@node Extending NSS, , NSS Module Internals, Name Service Switch
477@section Extending NSS
478
479One of the advantages of NSS mentioned above is that it can be extended
480quite easily. There are two ways in which the extension can happen:
481adding another database or adding another service. The former is
482normally done only by the C library developers. It is
483here only important to remember that adding another database is
484independent from adding another service because a service need not
485support all databases or lookup functions.
486
487A designer/implementor of a new service is therefore free to choose the
488databases s/he is interested in and leave the rest for later (or
489completely aside).
490
491@menu
492* Adding another Service to NSS:: What is to do to add a new service.
493* NSS Module Function Internals:: Guidelines for writing new NSS
494 service functions.
495@end menu
496
497@node Adding another Service to NSS, NSS Module Function Internals, Extending NSS, Extending NSS
498@subsection Adding another Service to NSS
499
500The sources for a new service need not (and should not) be part of the
501GNU C Library itself. The developer retains complete control over the
502sources and its development. The links between the C library and the
503new service module consists solely of the interface functions.
504
505Each module is designed following a specific interface specification.
506For now the version is 1 and this manifests in the version number of the
507shared library object of the NSS modules: they have the extension
508@code{.1}. If the interface ever changes in an incompatible way,
509this number will be increased---hopefully this will never be necessary.
510Modules using the old interface will still be usable.
511
512Developers of a new service will have to make sure that their module is
513created using the correct interface number. This means the file itself
514must have the correct name and on ElF systems the @dfn{soname} (Shared
515Object Name) must also have this number. Building a module from a bunch
516of object files on an ELF system using GNU CC could be done like this:
517
518@smallexample
519gcc -shared -o libnss_NAME.so.1 -Wl,-soname,libnss_NAME.so.1 OBJECTS
520@end smallexample
521
522@noindent
523@ref{Link Options, Options for Linking, , gcc, GNU CC}, to learn
524more about this command line.
525
526To use the new module the library must be able to find it. This can be
527achieved by using options for the dynamic linker so that it will search
528directory where the binary is placed. For an ELF system this could be
529done by adding the wanted directory to the value of
530@code{LD_LIBRARY_PATH}.
531
532But this is not always possible since some program (those which run
533under IDs which do not belong to the user) ignore this variable.
534Therefore the stable version of the module should be placed into a
535directory which is searched by the dynamic linker. Normally this should
536be the directory @file{$prefix/lib}, where @file{$prefix} corresponds to
537the value given to configure using the @code{--prefix} option. But be
538careful: this should only be done if it is clear the module does not
539cause any harm. System administrators should be careful.
540
541
542@node NSS Module Function Internals, , Adding another Service to NSS, Extending NSS
543@subsection Internals of the NSS Module Functions
544
545Until now we only provided the syntactic interface for the functions in
546the NSS module. In fact there is not more much we can tell since the
547implementation obviously is different for each function. But a few
548general rules must be followed by all functions.
549
550In fact there are four kinds of different functions which may appear in
551the interface. All derive from the traditional ones for system databases.
552@var{db} in the following table is normally an abbreviation for the
553database (e.g., it is @code{pw} for the password database).
554
555@table @code
556@item int _nss_@var{database}_set@var{db}ent (void)
557This function prepares the service for following operations. For a
558simple file based lookup this means files could be opened, for other
559services this function simply is a noop.
560
561One special case for this function is that it takes an additional
562argument for some @var{database}s (i.e., the interface is
563@code{int set@var{db}ent (int)}). @ref{Host Names}, which describes the
564@code{sethostent} function.
565
566The return value should be @var{NSS_STATUS_SUCCESS} or according to the
567table above in case of an error (@pxref{NSS Modules Interface}).
568
569@item int _nss_@var{database}_end@var{db}ent (void)
570This function simply closes all files which are still open or removes
571buffer caches. If there are no files or buffers to remove this is again
572a simple noop.
573
574There normally is no return value different to @var{NSS_STATUS_SUCCESS}.
575
576@item int _nss_@var{database}_get@var{db}ent_r (@var{STRUCTURE} *result, char *buffer, int buflen)
577Since this function will be called several times in a row to retrieve
578one entry after the other it must keep some kind of state. But this
579also means the functions are not really reentrant. They are reentrant
580only in that simultaneous calls to this function will not try to
581write the retrieved data in the same place (as it would be the case for
582the non-reentrant functions); instead, it writes to the structure
583pointed to by the @var{result} parameter. But the calls share a common
584state and in the case of a file access this means they return neighboring
585entries in the file.
586
587The buffer of length @var{buflen} pointed to by @var{buffer} can be used
588for storing some additional data for the result. It is @emph{not}
589guaranteed that the same buffer will be passed for the next call of this
590function. Therefore one must not misuse this buffer to save some state
591information from one call to another.
592
593As explained above this function could also have an additional last
594argument. This depends on the database used; it happens only for
595@code{host} and @code{network}.
596
597The function shall return @code{NSS_STATUS_SUCCESS} as long as their are
598more entries. When the last entry was read it should return
599@code{NSS_STATUS_NOTFOUND}. When the buffer given as an argument is too
600small for the data to be returned @code{NSS_STATUS_TRYAGAIN} should be
601returned. When the service was not formerly initialized by a call to
602@code{_nss_@var{DATABASE}_set@var{db}ent} all return value allowed for
603this function can also be returned here.
604
605@item int _nss_@var{DATABASE}_get@var{db}by@var{XX}_r (@var{PARAMS}, @var{STRUCTURE} *result, char *buffer, int buflen)
606This function shall return the entry from the database which is
607addressed by the @var{PARAMS}. The type and number of these arguments
608vary. It must be individually determined by looking to the user-level
609interface functions. All arguments given to the non-reentrant version
610are here described by @var{PARAMS}.
611
612The result must be stored in the structure pointed to by @var{result}.
613If there is additional data to return (say strings, where the
614@var{result} structure only contains pointers) the function must use the
615@var{buffer} or length @var{buflen}. There must not be any references
616to non-constant global data.
617
618The implementation of this function should honour the @var{stayopen}
619flag set by the @code{set@var{DB}ent} function whenever this makes sense.
620
621Again, this function takes an additional last argument for the
622@code{host} and @code{network} database.
623
624The return value should as always follow the rules given above
625(@pxref{NSS Modules Interface}).
626
627@end table