1 | /* Copyright (C) 1996-1999,2001,2002,2003,2004 Free Software Foundation, Inc. |
---|
2 | This file is part of the GNU C Library. |
---|
3 | |
---|
4 | The GNU C Library is free software; you can redistribute it and/or |
---|
5 | modify it under the terms of the GNU Lesser General Public |
---|
6 | License as published by the Free Software Foundation; either |
---|
7 | version 2.1 of the License, or (at your option) any later version. |
---|
8 | |
---|
9 | The GNU C Library is distributed in the hope that it will be useful, |
---|
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
12 | Lesser General Public License for more details. |
---|
13 | |
---|
14 | You should have received a copy of the GNU Lesser General Public |
---|
15 | License along with the GNU C Library; if not, write to the Free |
---|
16 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
---|
17 | 02111-1307 USA. */ |
---|
18 | |
---|
19 | #ifndef _NSSWITCH_H |
---|
20 | #define _NSSWITCH_H 1 |
---|
21 | |
---|
22 | /* This is an *internal* header. */ |
---|
23 | |
---|
24 | #include <arpa/nameser.h> |
---|
25 | #include <netinet/in.h> |
---|
26 | #include <nss.h> |
---|
27 | #include <resolv.h> |
---|
28 | #include <search.h> |
---|
29 | #include <dlfcn.h> |
---|
30 | #include <libc-symbols.h> |
---|
31 | |
---|
32 | /* Actions performed after lookup finished. */ |
---|
33 | typedef enum |
---|
34 | { |
---|
35 | NSS_ACTION_CONTINUE, |
---|
36 | NSS_ACTION_RETURN |
---|
37 | } lookup_actions; |
---|
38 | |
---|
39 | |
---|
40 | typedef struct service_library |
---|
41 | { |
---|
42 | /* Name of service (`files', `dns', `nis', ...). */ |
---|
43 | const char *name; |
---|
44 | /* Pointer to the loaded shared library. */ |
---|
45 | void *lib_handle; |
---|
46 | /* And the link to the next entry. */ |
---|
47 | struct service_library *next; |
---|
48 | } service_library; |
---|
49 | |
---|
50 | |
---|
51 | /* For mapping a function name to a function pointer. It is known in |
---|
52 | nsswitch.c:nss_lookup_function that a string pointer for the lookup key |
---|
53 | is the first member. */ |
---|
54 | typedef struct |
---|
55 | { |
---|
56 | const char *fct_name; |
---|
57 | void *fct_ptr; |
---|
58 | } known_function; |
---|
59 | |
---|
60 | |
---|
61 | typedef struct service_user |
---|
62 | { |
---|
63 | /* And the link to the next entry. */ |
---|
64 | struct service_user *next; |
---|
65 | /* Action according to result. */ |
---|
66 | lookup_actions actions[5]; |
---|
67 | /* Link to the underlying library object. */ |
---|
68 | service_library *library; |
---|
69 | /* Collection of known functions. */ |
---|
70 | struct entry *known; |
---|
71 | /* Name of the service (`files', `dns', `nis', ...). */ |
---|
72 | char name[0]; |
---|
73 | } service_user; |
---|
74 | |
---|
75 | /* To access the action based on the status value use this macro. */ |
---|
76 | #define nss_next_action(ni, status) ((ni)->actions[2 + status]) |
---|
77 | |
---|
78 | |
---|
79 | typedef struct name_database_entry |
---|
80 | { |
---|
81 | /* And the link to the next entry. */ |
---|
82 | struct name_database_entry *next; |
---|
83 | /* List of service to be used. */ |
---|
84 | service_user *service; |
---|
85 | /* Name of the database. */ |
---|
86 | char name[0]; |
---|
87 | } name_database_entry; |
---|
88 | |
---|
89 | |
---|
90 | typedef struct name_database |
---|
91 | { |
---|
92 | /* List of all known databases. */ |
---|
93 | name_database_entry *entry; |
---|
94 | /* List of libraries with service implementation. */ |
---|
95 | service_library *library; |
---|
96 | } name_database; |
---|
97 | |
---|
98 | |
---|
99 | /* Interface functions for NSS. */ |
---|
100 | |
---|
101 | /* Get the data structure representing the specified database. |
---|
102 | If there is no configuration for this database in the file, |
---|
103 | parse a service list from DEFCONFIG and use that. More |
---|
104 | than one function can use the database. */ |
---|
105 | extern int __nss_database_lookup (const char *database, |
---|
106 | const char *alternative_name, |
---|
107 | const char *defconfig, service_user **ni); |
---|
108 | libc_hidden_proto (__nss_database_lookup) |
---|
109 | |
---|
110 | /* Put first function with name FCT_NAME for SERVICE in FCTP. The |
---|
111 | position is remembered in NI. The function returns a value < 0 if |
---|
112 | an error occurred or no such function exists. */ |
---|
113 | extern int __nss_lookup (service_user **ni, const char *fct_name, void **fctp); |
---|
114 | |
---|
115 | /* Determine the next step in the lookup process according to the |
---|
116 | result STATUS of the call to the last function returned by |
---|
117 | `__nss_lookup' or `__nss_next'. NI specifies the last function |
---|
118 | examined. The function return a value > 0 if the process should |
---|
119 | stop with the last result of the last function call to be the |
---|
120 | result of the entire lookup. The returned value is 0 if there is |
---|
121 | another function to use and < 0 if an error occurred. |
---|
122 | |
---|
123 | If ALL_VALUES is nonzero, the return value will not be > 0 as long as |
---|
124 | there is a possibility the lookup process can ever use following |
---|
125 | services. In other words, only if all four lookup results have |
---|
126 | the action RETURN associated the lookup process stops before the |
---|
127 | natural end. */ |
---|
128 | extern int __nss_next (service_user **ni, const char *fct_name, void **fctp, |
---|
129 | int status, int all_values); |
---|
130 | libc_hidden_proto (__nss_next) |
---|
131 | |
---|
132 | /* Search for the service described in NI for a function named FCT_NAME |
---|
133 | and return a pointer to this function if successful. */ |
---|
134 | extern void *__nss_lookup_function (service_user *ni, const char *fct_name); |
---|
135 | libc_hidden_proto (__nss_lookup_function) |
---|
136 | |
---|
137 | |
---|
138 | /* Called by NSCD to disable recursive calls. */ |
---|
139 | extern void __nss_disable_nscd (void); |
---|
140 | |
---|
141 | |
---|
142 | typedef int (*db_lookup_function) (service_user **, const char *, void **) |
---|
143 | internal_function; |
---|
144 | typedef enum nss_status (*setent_function) (int); |
---|
145 | typedef enum nss_status (*endent_function) (void); |
---|
146 | typedef enum nss_status (*getent_function) (void *, char *, size_t, |
---|
147 | int *, int *); |
---|
148 | typedef int (*getent_r_function) (void *, char *, size_t, |
---|
149 | void **result, int *); |
---|
150 | |
---|
151 | extern void __nss_setent (const char *func_name, |
---|
152 | db_lookup_function lookup_fct, |
---|
153 | service_user **nip, service_user **startp, |
---|
154 | service_user **last_nip, int stayon, |
---|
155 | int *stayon_tmp, int res); |
---|
156 | extern void __nss_endent (const char *func_name, |
---|
157 | db_lookup_function lookup_fct, |
---|
158 | service_user **nip, service_user **startp, |
---|
159 | service_user **last_nip, int res); |
---|
160 | extern int __nss_getent_r (const char *getent_func_name, |
---|
161 | const char *setent_func_name, |
---|
162 | db_lookup_function lookup_fct, |
---|
163 | service_user **nip, service_user **startp, |
---|
164 | service_user **last_nip, int *stayon_tmp, |
---|
165 | int res, |
---|
166 | void *resbuf, char *buffer, size_t buflen, |
---|
167 | void **result, int *h_errnop); |
---|
168 | extern void *__nss_getent (getent_r_function func, |
---|
169 | void **resbuf, char **buffer, size_t buflen, |
---|
170 | size_t *buffer_size, int *h_errnop); |
---|
171 | struct hostent; |
---|
172 | extern int __nss_hostname_digits_dots (const char *name, |
---|
173 | struct hostent *resbuf, char **buffer, |
---|
174 | size_t *buffer_size, size_t buflen, |
---|
175 | struct hostent **result, |
---|
176 | enum nss_status *status, int af, |
---|
177 | int *h_errnop); |
---|
178 | libc_hidden_proto (__nss_hostname_digits_dots) |
---|
179 | |
---|
180 | #endif /* nsswitch.h */ |
---|