1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3 
4 #include <grp.h>
5 #include <netdb.h>
6 #include <nss.h>
7 #include <pwd.h>
8 #include <resolv.h>
9 
10 #define NSS_SIGNALS_BLOCK SIGALRM,SIGVTALRM,SIGPIPE,SIGCHLD,SIGTSTP,SIGIO,SIGHUP,SIGUSR1,SIGUSR2,SIGPROF,SIGURG,SIGWINCH
11 
12 #ifndef DEPRECATED_RES_USE_INET6
13 #  define DEPRECATED_RES_USE_INET6 0x00002000
14 #endif
15 
16 #define NSS_GETHOSTBYNAME_PROTOTYPES(module)            \
17 enum nss_status _nss_##module##_gethostbyname4_r(       \
18                 const char *name,                       \
19                 struct gaih_addrtuple **pat,            \
20                 char *buffer, size_t buflen,            \
21                 int *errnop, int *h_errnop,             \
22                 int32_t *ttlp) _public_;                \
23 enum nss_status _nss_##module##_gethostbyname3_r(       \
24                 const char *name,                       \
25                 int af,                                 \
26                 struct hostent *host,                   \
27                 char *buffer, size_t buflen,            \
28                 int *errnop, int *h_errnop,             \
29                 int32_t *ttlp,                          \
30                 char **canonp) _public_;                \
31 enum nss_status _nss_##module##_gethostbyname2_r(       \
32                 const char *name,                       \
33                 int af,                                 \
34                 struct hostent *host,                   \
35                 char *buffer, size_t buflen,            \
36                 int *errnop, int *h_errnop) _public_;   \
37 enum nss_status _nss_##module##_gethostbyname_r(        \
38                 const char *name,                       \
39                 struct hostent *host,                   \
40                 char *buffer, size_t buflen,            \
41                 int *errnop, int *h_errnop) _public_
42 
43 #define NSS_GETHOSTBYADDR_PROTOTYPES(module)            \
44 enum nss_status _nss_##module##_gethostbyaddr2_r(       \
45                 const void* addr, socklen_t len,        \
46                 int af,                                 \
47                 struct hostent *host,                   \
48                 char *buffer, size_t buflen,            \
49                 int *errnop, int *h_errnop,             \
50                 int32_t *ttlp) _public_;                \
51 enum nss_status _nss_##module##_gethostbyaddr_r(        \
52                 const void* addr, socklen_t len,        \
53                 int af,                                 \
54                 struct hostent *host,                   \
55                 char *buffer, size_t buflen,            \
56                 int *errnop, int *h_errnop) _public_
57 
58 #define NSS_GETHOSTBYNAME_FALLBACKS(module)             \
59 enum nss_status _nss_##module##_gethostbyname2_r(       \
60                 const char *name,                       \
61                 int af,                                 \
62                 struct hostent *host,                   \
63                 char *buffer, size_t buflen,            \
64                 int *errnop, int *h_errnop) {           \
65         return _nss_##module##_gethostbyname3_r(        \
66                         name,                           \
67                         af,                             \
68                         host,                           \
69                         buffer, buflen,                 \
70                         errnop, h_errnop,               \
71                         NULL,                           \
72                         NULL);                          \
73 }                                                       \
74 enum nss_status _nss_##module##_gethostbyname_r(        \
75                 const char *name,                       \
76                 struct hostent *host,                   \
77                 char *buffer, size_t buflen,            \
78                 int *errnop, int *h_errnop) {           \
79         enum nss_status ret = NSS_STATUS_NOTFOUND;      \
80                                                         \
81         if (_res.options & DEPRECATED_RES_USE_INET6)    \
82                 ret = _nss_##module##_gethostbyname3_r( \
83                         name,                           \
84                         AF_INET6,                       \
85                         host,                           \
86                         buffer, buflen,                 \
87                         errnop, h_errnop,               \
88                         NULL,                           \
89                         NULL);                          \
90         if (ret == NSS_STATUS_NOTFOUND)                 \
91                 ret = _nss_##module##_gethostbyname3_r( \
92                         name,                           \
93                         AF_INET,                        \
94                         host,                           \
95                         buffer, buflen,                 \
96                         errnop, h_errnop,               \
97                         NULL,                           \
98                         NULL);                          \
99        return ret;                                      \
100 }
101 
102 #define NSS_GETHOSTBYADDR_FALLBACKS(module)             \
103 enum nss_status _nss_##module##_gethostbyaddr_r(        \
104                 const void* addr, socklen_t len,        \
105                 int af,                                 \
106                 struct hostent *host,                   \
107                 char *buffer, size_t buflen,            \
108                 int *errnop, int *h_errnop) {           \
109         return _nss_##module##_gethostbyaddr2_r(        \
110                         addr, len,                      \
111                         af,                             \
112                         host,                           \
113                         buffer, buflen,                 \
114                         errnop, h_errnop,               \
115                         NULL);                          \
116 }
117 
118 #define NSS_GETPW_PROTOTYPES(module)                    \
119 enum nss_status _nss_##module##_getpwnam_r(             \
120                 const char *name,                       \
121                 struct passwd *pwd,                     \
122                 char *buffer, size_t buflen,            \
123                 int *errnop) _public_;                  \
124 enum nss_status _nss_##module##_getpwuid_r(             \
125                 uid_t uid,                              \
126                 struct passwd *pwd,                     \
127                 char *buffer, size_t buflen,            \
128                 int *errnop) _public_
129 
130 #define NSS_GETSP_PROTOTYPES(module)                    \
131 enum nss_status _nss_##module##_getspnam_r(             \
132                 const char *name,                       \
133                 struct spwd *spwd,                      \
134                 char *buffer, size_t buflen,            \
135                 int *errnop) _public_
136 
137 #define NSS_GETSG_PROTOTYPES(module)                    \
138 enum nss_status _nss_##module##_getsgnam_r(             \
139                 const char *name,                       \
140                 struct sgrp *sgrp,                      \
141                 char *buffer, size_t buflen,            \
142                 int *errnop) _public_
143 
144 #define NSS_GETGR_PROTOTYPES(module)                    \
145 enum nss_status _nss_##module##_getgrnam_r(             \
146                 const char *name,                       \
147                 struct group *gr,                       \
148                 char *buffer, size_t buflen,            \
149                 int *errnop) _public_;                  \
150 enum nss_status _nss_##module##_getgrgid_r(             \
151                 gid_t gid,                              \
152                 struct group *gr,                       \
153                 char *buffer, size_t buflen,            \
154                 int *errnop) _public_
155 
156 #define NSS_PWENT_PROTOTYPES(module)                    \
157 enum nss_status _nss_##module##_endpwent(               \
158                 void) _public_;                         \
159 enum nss_status _nss_##module##_setpwent(               \
160                 int stayopen) _public_;                 \
161 enum nss_status _nss_##module##_getpwent_r(             \
162                 struct passwd *result,                  \
163                 char *buffer,                           \
164                 size_t buflen,                          \
165                 int *errnop) _public_;
166 
167 #define NSS_SPENT_PROTOTYPES(module)                    \
168 enum nss_status _nss_##module##_endspent(               \
169                 void) _public_;                         \
170 enum nss_status _nss_##module##_setspent(               \
171                 int stayopen) _public_;                 \
172 enum nss_status _nss_##module##_getspent_r(             \
173                 struct spwd *spwd,                      \
174                 char *buffer,                           \
175                 size_t buflen,                          \
176                 int *errnop) _public_;
177 
178 #define NSS_GRENT_PROTOTYPES(module)                    \
179 enum nss_status _nss_##module##_endgrent(               \
180                 void) _public_;                         \
181 enum nss_status _nss_##module##_setgrent(               \
182                 int stayopen) _public_;                 \
183 enum nss_status _nss_##module##_getgrent_r(             \
184                 struct group *result,                   \
185                 char *buffer,                           \
186                 size_t buflen,                          \
187                 int *errnop) _public_;
188 
189 #define NSS_SGENT_PROTOTYPES(module)                    \
190 enum nss_status _nss_##module##_endsgent(               \
191                 void) _public_;                         \
192 enum nss_status _nss_##module##_setsgent(               \
193                 int stayopen) _public_;                 \
194 enum nss_status _nss_##module##_getsgent_r(             \
195                 struct sgrp *sgrp,                      \
196                 char *buffer,                           \
197                 size_t buflen,                          \
198                 int *errnop) _public_;
199 
200 #define NSS_INITGROUPS_PROTOTYPE(module)                \
201 enum nss_status _nss_##module##_initgroups_dyn(         \
202                 const char *user,                       \
203                 gid_t group,                            \
204                 long int *start,                        \
205                 long int *size,                         \
206                 gid_t **groupsp,                        \
207                 long int limit,                         \
208                 int *errnop) _public_;
209 
210 typedef enum nss_status (*_nss_gethostbyname4_r_t)(
211                 const char *name,
212                 struct gaih_addrtuple **pat,
213                 char *buffer, size_t buflen,
214                 int *errnop, int *h_errnop,
215                 int32_t *ttlp);
216 
217 typedef enum nss_status (*_nss_gethostbyname3_r_t)(
218                 const char *name,
219                 int af,
220                 struct hostent *result,
221                 char *buffer, size_t buflen,
222                 int *errnop, int *h_errnop,
223                 int32_t *ttlp,
224                 char **canonp);
225 
226 typedef enum nss_status (*_nss_gethostbyname2_r_t)(
227                 const char *name,
228                 int af,
229                 struct hostent *result,
230                 char *buffer, size_t buflen,
231                 int *errnop, int *h_errnop);
232 
233 typedef enum nss_status (*_nss_gethostbyname_r_t)(
234                 const char *name,
235                 struct hostent *result,
236                 char *buffer, size_t buflen,
237                 int *errnop, int *h_errnop);
238 
239 typedef enum nss_status (*_nss_gethostbyaddr2_r_t)(
240                 const void* addr, socklen_t len,
241                 int af,
242                 struct hostent *result,
243                 char *buffer, size_t buflen,
244                 int *errnop, int *h_errnop,
245                 int32_t *ttlp);
246 typedef enum nss_status (*_nss_gethostbyaddr_r_t)(
247                 const void* addr, socklen_t len,
248                 int af,
249                 struct hostent *host,
250                 char *buffer, size_t buflen,
251                 int *errnop, int *h_errnop);
252 
253 typedef enum nss_status (*_nss_getpwnam_r_t)(
254                 const char *name,
255                 struct passwd *pwd,
256                 char *buffer, size_t buflen,
257                 int *errnop);
258 typedef enum nss_status (*_nss_getpwuid_r_t)(
259                 uid_t uid,
260                 struct passwd *pwd,
261                 char *buffer, size_t buflen,
262                 int *errnop);
263 
264 typedef enum nss_status (*_nss_getgrnam_r_t)(
265                 const char *name,
266                 struct group *gr,
267                 char *buffer, size_t buflen,
268                 int *errnop);
269 typedef enum nss_status (*_nss_getgrgid_r_t)(
270                 gid_t gid,
271                 struct group *gr,
272                 char *buffer, size_t buflen,
273                 int *errnop);
274