This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / reentr.h
CommitLineData
d8294a4d
NC
1/* -*- buffer-read-only: t -*-
2 *
10bc17b6
JH
3 * reentr.h
4 *
8916b559 5 * Copyright (C) 2002, 2003, 2005, 2006 by Larry Wall and others
10bc17b6
JH
6 *
7 * You may distribute under the terms of either the GNU General Public
8 * License or the Artistic License, as specified in the README file.
9 *
10 * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
40d34c0d 11 * This file is built by reentr.pl from data in reentr.pl.
10bc17b6
JH
12 */
13
14#ifndef REENTR_H
d8294a4d 15#define REENTR_H
10bc17b6 16
b499fd84
JH
17/* If compiling for a threaded perl, we will macro-wrap the system/library
18 * interfaces (e.g. getpwent()) which have threaded versions
19 * (e.g. getpwent_r()), which will handle things correctly for
20 * the Perl interpreter, but otherwise (for XS) the wrapping does
21 * not take place. See L<perlxs/Thread-aware system interfaces>.
22 */
23
24#ifndef PERL_REENTR_API
25# if defined(PERL_CORE) || defined(PERL_EXT)
26# define PERL_REENTR_API 1
27# else
28# define PERL_REENTR_API 0
29# endif
30#endif
31
10bc17b6 32#ifdef USE_REENTRANT_API
d909e69f
JD
33
34#ifdef PERL_CORE
35# define PL_REENTRANT_RETINT PL_reentrant_retint
36#endif
37
10bc17b6
JH
38/* Deprecations: some platforms have the said reentrant interfaces
39 * but they are declared obsolete and are not to be used. Often this
40 * means that the platform has threadsafed the interfaces (hopefully).
41 * All this is OS version dependent, so we are of course fooling ourselves.
b499fd84
JH
42 * If you know of more deprecations on some platforms, please add your own
43 * (by editing reentr.pl, mind!) */
10bc17b6
JH
44
45#ifdef __hpux
46# undef HAS_CRYPT_R
47# undef HAS_DRAND48_R
efa45b01
JH
48# undef HAS_ENDGRENT_R
49# undef HAS_ENDPWENT_R
10bc17b6
JH
50# undef HAS_GETGRENT_R
51# undef HAS_GETPWENT_R
52# undef HAS_SETLOCALE_R
53# undef HAS_SRAND48_R
54# undef HAS_STRERROR_R
55# define NETDB_R_OBSOLETE
56#endif
57
58#if defined(__osf__) && defined(__alpha) /* Tru64 aka Digital UNIX */
59# undef HAS_CRYPT_R
60# undef HAS_STRERROR_R
61# define NETDB_R_OBSOLETE
62#endif
63
64#ifdef NETDB_R_OBSOLETE
65# undef HAS_ENDHOSTENT_R
66# undef HAS_ENDNETENT_R
67# undef HAS_ENDPROTOENT_R
68# undef HAS_ENDSERVENT_R
69# undef HAS_GETHOSTBYADDR_R
70# undef HAS_GETHOSTBYNAME_R
71# undef HAS_GETHOSTENT_R
72# undef HAS_GETNETBYADDR_R
73# undef HAS_GETNETBYNAME_R
74# undef HAS_GETNETENT_R
75# undef HAS_GETPROTOBYNAME_R
76# undef HAS_GETPROTOBYNUMBER_R
77# undef HAS_GETPROTOENT_R
78# undef HAS_GETSERVBYNAME_R
79# undef HAS_GETSERVBYPORT_R
80# undef HAS_GETSERVENT_R
81# undef HAS_SETHOSTENT_R
82# undef HAS_SETNETENT_R
83# undef HAS_SETPROTOENT_R
84# undef HAS_SETSERVENT_R
85#endif
86
87#ifdef I_PWD
88# include <pwd.h>
89#endif
90#ifdef I_GRP
91# include <grp.h>
92#endif
93#ifdef I_NETDB
94# include <netdb.h>
95#endif
96#ifdef I_STDLIB
97# include <stdlib.h> /* drand48_data */
98#endif
99#ifdef I_CRYPT
100# ifdef I_CRYPT
101# include <crypt.h>
102# endif
103#endif
104#ifdef HAS_GETSPNAM_R
105# ifdef I_SHADOW
106# include <shadow.h>
107# endif
108#endif
109
110#define REENTRANT_PROTO_B_B 1
111#define REENTRANT_PROTO_B_BI 2
112#define REENTRANT_PROTO_B_BW 3
b430fd04
JH
113#define REENTRANT_PROTO_B_CCD 4
114#define REENTRANT_PROTO_B_CCS 5
115#define REENTRANT_PROTO_B_IBI 6
116#define REENTRANT_PROTO_B_IBW 7
117#define REENTRANT_PROTO_B_SB 8
118#define REENTRANT_PROTO_B_SBI 9
119#define REENTRANT_PROTO_I_BI 10
120#define REENTRANT_PROTO_I_BW 11
121#define REENTRANT_PROTO_I_CCSBWR 12
122#define REENTRANT_PROTO_I_CCSD 13
123#define REENTRANT_PROTO_I_CII 14
124#define REENTRANT_PROTO_I_CIISD 15
125#define REENTRANT_PROTO_I_CSBI 16
126#define REENTRANT_PROTO_I_CSBIR 17
127#define REENTRANT_PROTO_I_CSBWR 18
128#define REENTRANT_PROTO_I_CSBWRE 19
129#define REENTRANT_PROTO_I_CSD 20
130#define REENTRANT_PROTO_I_CWISBWRE 21
131#define REENTRANT_PROTO_I_CWISD 22
31ee0cb7
JH
132#define REENTRANT_PROTO_I_D 23
133#define REENTRANT_PROTO_I_H 24
134#define REENTRANT_PROTO_I_IBI 25
135#define REENTRANT_PROTO_I_IBW 26
136#define REENTRANT_PROTO_I_ICBI 27
137#define REENTRANT_PROTO_I_ICSBWR 28
138#define REENTRANT_PROTO_I_ICSD 29
139#define REENTRANT_PROTO_I_ID 30
140#define REENTRANT_PROTO_I_IISD 31
141#define REENTRANT_PROTO_I_ISBWR 32
142#define REENTRANT_PROTO_I_ISD 33
143#define REENTRANT_PROTO_I_LISBI 34
144#define REENTRANT_PROTO_I_LISD 35
145#define REENTRANT_PROTO_I_LS 36
b430fd04
JH
146#define REENTRANT_PROTO_I_SB 37
147#define REENTRANT_PROTO_I_SBI 38
148#define REENTRANT_PROTO_I_SBIE 39
149#define REENTRANT_PROTO_I_SBIH 40
150#define REENTRANT_PROTO_I_SBIR 41
151#define REENTRANT_PROTO_I_SBWR 42
152#define REENTRANT_PROTO_I_SBWRE 43
153#define REENTRANT_PROTO_I_SD 44
154#define REENTRANT_PROTO_I_ST 45
c71a3471
JH
155#define REENTRANT_PROTO_I_St 46
156#define REENTRANT_PROTO_I_TISD 47
157#define REENTRANT_PROTO_I_TS 48
158#define REENTRANT_PROTO_I_TSBI 49
159#define REENTRANT_PROTO_I_TSBIR 50
160#define REENTRANT_PROTO_I_TSBWR 51
161#define REENTRANT_PROTO_I_TSR 52
162#define REENTRANT_PROTO_I_TsISBWRE 53
163#define REENTRANT_PROTO_I_UISBWRE 54
164#define REENTRANT_PROTO_I_iS 55
165#define REENTRANT_PROTO_I_lS 56
166#define REENTRANT_PROTO_I_uISBWRE 57
167#define REENTRANT_PROTO_S_CBI 58
168#define REENTRANT_PROTO_S_CCSBI 59
169#define REENTRANT_PROTO_S_CIISBIE 60
170#define REENTRANT_PROTO_S_CSBI 61
171#define REENTRANT_PROTO_S_CSBIE 62
172#define REENTRANT_PROTO_S_CWISBIE 63
173#define REENTRANT_PROTO_S_CWISBWIE 64
174#define REENTRANT_PROTO_S_ICSBI 65
175#define REENTRANT_PROTO_S_ISBI 66
176#define REENTRANT_PROTO_S_LISBI 67
177#define REENTRANT_PROTO_S_SBI 68
178#define REENTRANT_PROTO_S_SBIE 69
179#define REENTRANT_PROTO_S_SBW 70
180#define REENTRANT_PROTO_S_TISBI 71
181#define REENTRANT_PROTO_S_TS 72
182#define REENTRANT_PROTO_S_TSBI 73
183#define REENTRANT_PROTO_S_TSBIE 74
184#define REENTRANT_PROTO_S_TWISBIE 75
185#define REENTRANT_PROTO_V_D 76
186#define REENTRANT_PROTO_V_H 77
187#define REENTRANT_PROTO_V_ID 78
10bc17b6
JH
188
189/* Defines for indicating which special features are supported. */
190
edd309b7
JH
191/* The getgrent getgrgid getgrnam using buffer? */
192
193#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR || GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBW || GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
194# define GETGRENT_R_HAS_BUFFER
195#else
196# undef GETGRENT_R_HAS_BUFFER
197#endif
198#if defined(HAS_GETGRGID_R) && (GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBI || GETGRGID_R_PROTO == REENTRANT_PROTO_S_TSBI)
199# define GETGRGID_R_HAS_BUFFER
200#else
201# undef GETGRGID_R_HAS_BUFFER
202#endif
203#if defined(HAS_GETGRNAM_R) && (GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR || GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CBI || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBI || GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CSBI)
204# define GETGRNAM_R_HAS_BUFFER
205#else
206# undef GETGRNAM_R_HAS_BUFFER
207#endif
208
209/* Any of the getgrent getgrgid getgrnam using buffer? */
210
211#if (defined(GETGRENT_R_HAS_BUFFER) || defined(GETGRGID_R_HAS_BUFFER) || defined(GETGRNAM_R_HAS_BUFFER))
f7937171 212# define USE_GRENT_BUFFER
edd309b7 213#else
f7937171 214# undef USE_GRENT_BUFFER
edd309b7
JH
215#endif
216
10bc17b6
JH
217/* The getgrent getgrgid getgrnam using ptr? */
218
09310450 219#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR)
10bc17b6
JH
220# define GETGRENT_R_HAS_PTR
221#else
222# undef GETGRENT_R_HAS_PTR
223#endif
09310450 224#if defined(HAS_GETGRGID_R) && (GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR)
10bc17b6
JH
225# define GETGRGID_R_HAS_PTR
226#else
227# undef GETGRGID_R_HAS_PTR
228#endif
09310450 229#if defined(HAS_GETGRNAM_R) && (GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR)
10bc17b6
JH
230# define GETGRNAM_R_HAS_PTR
231#else
232# undef GETGRNAM_R_HAS_PTR
233#endif
234
235/* Any of the getgrent getgrgid getgrnam using ptr? */
236
237#if (defined(GETGRENT_R_HAS_PTR) || defined(GETGRGID_R_HAS_PTR) || defined(GETGRNAM_R_HAS_PTR))
f7937171 238# define USE_GRENT_PTR
10bc17b6 239#else
f7937171 240# undef USE_GRENT_PTR
10bc17b6
JH
241#endif
242
243/* The getpwent getpwnam getpwuid using ptr? */
244
09310450 245#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR)
10bc17b6
JH
246# define GETPWENT_R_HAS_PTR
247#else
248# undef GETPWENT_R_HAS_PTR
249#endif
09310450 250#if defined(HAS_GETPWNAM_R) && (GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR)
10bc17b6
JH
251# define GETPWNAM_R_HAS_PTR
252#else
253# undef GETPWNAM_R_HAS_PTR
254#endif
09310450 255#if defined(HAS_GETPWUID_R) && (GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBIR)
10bc17b6
JH
256# define GETPWUID_R_HAS_PTR
257#else
258# undef GETPWUID_R_HAS_PTR
259#endif
260
261/* Any of the getpwent getpwnam getpwuid using ptr? */
262
263#if (defined(GETPWENT_R_HAS_PTR) || defined(GETPWNAM_R_HAS_PTR) || defined(GETPWUID_R_HAS_PTR))
f7937171 264# define USE_PWENT_PTR
10bc17b6 265#else
f7937171 266# undef USE_PWENT_PTR
10bc17b6
JH
267#endif
268
269/* The getspent getspnam using ptr? */
270
09310450 271#if defined(HAS_GETSPNAM_R) && (GETSPNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR)
10bc17b6
JH
272# define GETSPNAM_R_HAS_PTR
273#else
274# undef GETSPNAM_R_HAS_PTR
275#endif
276
277/* Any of the getspent getspnam using ptr? */
278
279#if (defined(GETSPENT_R_HAS_PTR) || defined(GETSPNAM_R_HAS_PTR))
f7937171 280# define USE_SPENT_PTR
10bc17b6 281#else
f7937171 282# undef USE_SPENT_PTR
10bc17b6
JH
283#endif
284
f7937171 285/* The getgrent getgrgid getgrnam setgrent endgrent using fptr? */
10bc17b6 286
09310450 287#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
10bc17b6
JH
288# define GETGRENT_R_HAS_FPTR
289#else
290# undef GETGRENT_R_HAS_FPTR
291#endif
f7937171
JH
292#if defined(HAS_SETGRENT_R) && (SETGRENT_R_PROTO == REENTRANT_PROTO_I_H || SETGRENT_R_PROTO == REENTRANT_PROTO_V_H)
293# define SETGRENT_R_HAS_FPTR
294#else
295# undef SETGRENT_R_HAS_FPTR
296#endif
297#if defined(HAS_ENDGRENT_R) && (ENDGRENT_R_PROTO == REENTRANT_PROTO_I_H || ENDGRENT_R_PROTO == REENTRANT_PROTO_V_H)
298# define ENDGRENT_R_HAS_FPTR
299#else
300# undef ENDGRENT_R_HAS_FPTR
301#endif
10bc17b6 302
f7937171 303/* Any of the getgrent getgrgid getgrnam setgrent endgrent using fptr? */
10bc17b6 304
f7937171
JH
305#if (defined(GETGRENT_R_HAS_FPTR) || defined(GETGRGID_R_HAS_FPTR) || defined(GETGRNAM_R_HAS_FPTR) || defined(SETGRENT_R_HAS_FPTR) || defined(ENDGRENT_R_HAS_FPTR))
306# define USE_GRENT_FPTR
10bc17b6 307#else
f7937171 308# undef USE_GRENT_FPTR
10bc17b6
JH
309#endif
310
f7937171 311/* The getpwent getpwnam getpwuid setpwent endpwent using fptr? */
10bc17b6 312
09310450 313#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
10bc17b6
JH
314# define GETPWENT_R_HAS_FPTR
315#else
316# undef GETPWENT_R_HAS_FPTR
317#endif
f7937171
JH
318#if defined(HAS_SETPWENT_R) && (SETPWENT_R_PROTO == REENTRANT_PROTO_I_H || SETPWENT_R_PROTO == REENTRANT_PROTO_V_H)
319# define SETPWENT_R_HAS_FPTR
320#else
321# undef SETPWENT_R_HAS_FPTR
322#endif
323#if defined(HAS_ENDPWENT_R) && (ENDPWENT_R_PROTO == REENTRANT_PROTO_I_H || ENDPWENT_R_PROTO == REENTRANT_PROTO_V_H)
324# define ENDPWENT_R_HAS_FPTR
325#else
326# undef ENDPWENT_R_HAS_FPTR
327#endif
10bc17b6 328
f7937171 329/* Any of the getpwent getpwnam getpwuid setpwent endpwent using fptr? */
10bc17b6 330
f7937171
JH
331#if (defined(GETPWENT_R_HAS_FPTR) || defined(GETPWNAM_R_HAS_FPTR) || defined(GETPWUID_R_HAS_FPTR) || defined(SETPWENT_R_HAS_FPTR) || defined(ENDPWENT_R_HAS_FPTR))
332# define USE_PWENT_FPTR
10bc17b6 333#else
f7937171 334# undef USE_PWENT_FPTR
10bc17b6
JH
335#endif
336
edd309b7
JH
337/* The getpwent getpwgid getpwnam using buffer? */
338
339#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR || GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBW || GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
340# define GETPWENT_R_HAS_BUFFER
341#else
342# undef GETPWENT_R_HAS_BUFFER
343#endif
344#if defined(HAS_GETPWNAM_R) && (GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR || GETPWNAM_R_PROTO == REENTRANT_PROTO_S_CSBI || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBI)
345# define GETPWNAM_R_HAS_BUFFER
346#else
347# undef GETPWNAM_R_HAS_BUFFER
348#endif
349
350/* Any of the getpwent getpwgid getpwnam using buffer? */
351
352#if (defined(GETPWENT_R_HAS_BUFFER) || defined(GETPWGID_R_HAS_BUFFER) || defined(GETPWNAM_R_HAS_BUFFER))
f7937171 353# define USE_PWENT_BUFFER
edd309b7 354#else
f7937171 355# undef USE_PWENT_BUFFER
edd309b7
JH
356#endif
357
10bc17b6
JH
358/* The gethostent gethostbyaddr gethostbyname using ptr? */
359
09310450 360#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE)
10bc17b6
JH
361# define GETHOSTENT_R_HAS_PTR
362#else
363# undef GETHOSTENT_R_HAS_PTR
364#endif
c71a3471 365#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
10bc17b6
JH
366# define GETHOSTBYADDR_R_HAS_PTR
367#else
368# undef GETHOSTBYADDR_R_HAS_PTR
369#endif
09310450 370#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
10bc17b6
JH
371# define GETHOSTBYNAME_R_HAS_PTR
372#else
373# undef GETHOSTBYNAME_R_HAS_PTR
374#endif
375
376/* Any of the gethostent gethostbyaddr gethostbyname using ptr? */
377
378#if (defined(GETHOSTENT_R_HAS_PTR) || defined(GETHOSTBYADDR_R_HAS_PTR) || defined(GETHOSTBYNAME_R_HAS_PTR))
f7937171 379# define USE_HOSTENT_PTR
10bc17b6 380#else
f7937171 381# undef USE_HOSTENT_PTR
10bc17b6
JH
382#endif
383
384/* The getnetent getnetbyaddr getnetbyname using ptr? */
385
09310450 386#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE)
10bc17b6
JH
387# define GETNETENT_R_HAS_PTR
388#else
389# undef GETNETENT_R_HAS_PTR
390#endif
c71a3471 391#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
10bc17b6
JH
392# define GETNETBYADDR_R_HAS_PTR
393#else
394# undef GETNETBYADDR_R_HAS_PTR
395#endif
09310450 396#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
10bc17b6
JH
397# define GETNETBYNAME_R_HAS_PTR
398#else
399# undef GETNETBYNAME_R_HAS_PTR
400#endif
401
402/* Any of the getnetent getnetbyaddr getnetbyname using ptr? */
403
404#if (defined(GETNETENT_R_HAS_PTR) || defined(GETNETBYADDR_R_HAS_PTR) || defined(GETNETBYNAME_R_HAS_PTR))
f7937171 405# define USE_NETENT_PTR
10bc17b6 406#else
f7937171 407# undef USE_NETENT_PTR
10bc17b6
JH
408#endif
409
410/* The getprotoent getprotobyname getprotobynumber using ptr? */
411
09310450 412#if defined(HAS_GETPROTOENT_R) && (GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR)
10bc17b6
JH
413# define GETPROTOENT_R_HAS_PTR
414#else
415# undef GETPROTOENT_R_HAS_PTR
416#endif
09310450 417#if defined(HAS_GETPROTOBYNAME_R) && (GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR)
10bc17b6
JH
418# define GETPROTOBYNAME_R_HAS_PTR
419#else
420# undef GETPROTOBYNAME_R_HAS_PTR
421#endif
09310450 422#if defined(HAS_GETPROTOBYNUMBER_R) && (GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR)
10bc17b6
JH
423# define GETPROTOBYNUMBER_R_HAS_PTR
424#else
425# undef GETPROTOBYNUMBER_R_HAS_PTR
426#endif
427
428/* Any of the getprotoent getprotobyname getprotobynumber using ptr? */
429
430#if (defined(GETPROTOENT_R_HAS_PTR) || defined(GETPROTOBYNAME_R_HAS_PTR) || defined(GETPROTOBYNUMBER_R_HAS_PTR))
f7937171 431# define USE_PROTOENT_PTR
10bc17b6 432#else
f7937171 433# undef USE_PROTOENT_PTR
10bc17b6
JH
434#endif
435
436/* The getservent getservbyname getservbyport using ptr? */
437
09310450 438#if defined(HAS_GETSERVENT_R) && (GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR)
10bc17b6
JH
439# define GETSERVENT_R_HAS_PTR
440#else
441# undef GETSERVENT_R_HAS_PTR
442#endif
09310450 443#if defined(HAS_GETSERVBYNAME_R) && (GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR)
10bc17b6
JH
444# define GETSERVBYNAME_R_HAS_PTR
445#else
446# undef GETSERVBYNAME_R_HAS_PTR
447#endif
09310450 448#if defined(HAS_GETSERVBYPORT_R) && (GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR)
10bc17b6
JH
449# define GETSERVBYPORT_R_HAS_PTR
450#else
451# undef GETSERVBYPORT_R_HAS_PTR
452#endif
453
454/* Any of the getservent getservbyname getservbyport using ptr? */
455
456#if (defined(GETSERVENT_R_HAS_PTR) || defined(GETSERVBYNAME_R_HAS_PTR) || defined(GETSERVBYPORT_R_HAS_PTR))
f7937171 457# define USE_SERVENT_PTR
10bc17b6 458#else
f7937171 459# undef USE_SERVENT_PTR
10bc17b6
JH
460#endif
461
edd309b7
JH
462/* The gethostent gethostbyaddr gethostbyname using buffer? */
463
464#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBI)
465# define GETHOSTENT_R_HAS_BUFFER
466#else
467# undef GETHOSTENT_R_HAS_BUFFER
468#endif
c71a3471 469#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
edd309b7
JH
470# define GETHOSTBYADDR_R_HAS_BUFFER
471#else
472# undef GETHOSTBYADDR_R_HAS_BUFFER
473#endif
474#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE)
475# define GETHOSTBYNAME_R_HAS_BUFFER
476#else
477# undef GETHOSTBYNAME_R_HAS_BUFFER
478#endif
479
480/* Any of the gethostent gethostbyaddr gethostbyname using buffer? */
481
482#if (defined(GETHOSTENT_R_HAS_BUFFER) || defined(GETHOSTBYADDR_R_HAS_BUFFER) || defined(GETHOSTBYNAME_R_HAS_BUFFER))
f7937171 483# define USE_HOSTENT_BUFFER
edd309b7 484#else
f7937171 485# undef USE_HOSTENT_BUFFER
edd309b7
JH
486#endif
487
488/* The getnetent getnetbyaddr getnetbyname using buffer? */
489
490#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBI)
491# define GETNETENT_R_HAS_BUFFER
492#else
493# undef GETNETENT_R_HAS_BUFFER
494#endif
c71a3471 495#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_TISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_LISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
edd309b7
JH
496# define GETNETBYADDR_R_HAS_BUFFER
497#else
498# undef GETNETBYADDR_R_HAS_BUFFER
499#endif
500#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBI || GETNETBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI)
501# define GETNETBYNAME_R_HAS_BUFFER
502#else
503# undef GETNETBYNAME_R_HAS_BUFFER
504#endif
505
506/* Any of the getnetent getnetbyaddr getnetbyname using buffer? */
507
508#if (defined(GETNETENT_R_HAS_BUFFER) || defined(GETNETBYADDR_R_HAS_BUFFER) || defined(GETNETBYNAME_R_HAS_BUFFER))
f7937171 509# define USE_NETENT_BUFFER
edd309b7 510#else
f7937171 511# undef USE_NETENT_BUFFER
edd309b7
JH
512#endif
513
514/* The getprotoent getprotobyname getprotobynumber using buffer? */
515
516#if defined(HAS_GETPROTOENT_R) && (GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETPROTOENT_R_PROTO == REENTRANT_PROTO_S_SBI)
517# define GETPROTOENT_R_HAS_BUFFER
518#else
519# undef GETPROTOENT_R_HAS_BUFFER
520#endif
521#if defined(HAS_GETPROTOBYNAME_R) && (GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI)
522# define GETPROTOBYNAME_R_HAS_BUFFER
523#else
524# undef GETPROTOBYNAME_R_HAS_BUFFER
525#endif
526#if defined(HAS_GETPROTOBYNUMBER_R) && (GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR || GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_S_ISBI)
527# define GETPROTOBYNUMBER_R_HAS_BUFFER
528#else
529# undef GETPROTOBYNUMBER_R_HAS_BUFFER
530#endif
531
532/* Any of the getprotoent getprotobyname getprotobynumber using buffer? */
533
534#if (defined(GETPROTOENT_R_HAS_BUFFER) || defined(GETPROTOBYNAME_R_HAS_BUFFER) || defined(GETPROTOBYNUMBER_R_HAS_BUFFER))
f7937171 535# define USE_PROTOENT_BUFFER
edd309b7 536#else
f7937171 537# undef USE_PROTOENT_BUFFER
edd309b7
JH
538#endif
539
540/* The getservent getservbyname getservbyport using buffer? */
541
542#if defined(HAS_GETSERVENT_R) && (GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETSERVENT_R_PROTO == REENTRANT_PROTO_S_SBI)
543# define GETSERVENT_R_HAS_BUFFER
544#else
545# undef GETSERVENT_R_HAS_BUFFER
546#endif
547#if defined(HAS_GETSERVBYNAME_R) && (GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR || GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_S_CCSBI)
548# define GETSERVBYNAME_R_HAS_BUFFER
549#else
550# undef GETSERVBYNAME_R_HAS_BUFFER
551#endif
552#if defined(HAS_GETSERVBYPORT_R) && (GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR || GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_S_ICSBI)
553# define GETSERVBYPORT_R_HAS_BUFFER
554#else
555# undef GETSERVBYPORT_R_HAS_BUFFER
556#endif
557
558/* Any of the getservent getservbyname getservbyport using buffer? */
559
560#if (defined(GETSERVENT_R_HAS_BUFFER) || defined(GETSERVBYNAME_R_HAS_BUFFER) || defined(GETSERVBYPORT_R_HAS_BUFFER))
f7937171 561# define USE_SERVENT_BUFFER
edd309b7 562#else
f7937171 563# undef USE_SERVENT_BUFFER
edd309b7
JH
564#endif
565
10bc17b6
JH
566/* The gethostent gethostbyaddr gethostbyname using errno? */
567
09310450 568#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE)
10bc17b6
JH
569# define GETHOSTENT_R_HAS_ERRNO
570#else
571# undef GETHOSTENT_R_HAS_ERRNO
572#endif
c71a3471 573#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
10bc17b6
JH
574# define GETHOSTBYADDR_R_HAS_ERRNO
575#else
576# undef GETHOSTBYADDR_R_HAS_ERRNO
577#endif
09310450 578#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE)
10bc17b6
JH
579# define GETHOSTBYNAME_R_HAS_ERRNO
580#else
581# undef GETHOSTBYNAME_R_HAS_ERRNO
582#endif
583
584/* Any of the gethostent gethostbyaddr gethostbyname using errno? */
585
586#if (defined(GETHOSTENT_R_HAS_ERRNO) || defined(GETHOSTBYADDR_R_HAS_ERRNO) || defined(GETHOSTBYNAME_R_HAS_ERRNO))
f7937171 587# define USE_HOSTENT_ERRNO
10bc17b6 588#else
f7937171 589# undef USE_HOSTENT_ERRNO
10bc17b6
JH
590#endif
591
592/* The getnetent getnetbyaddr getnetbyname using errno? */
593
09310450 594#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE)
10bc17b6
JH
595# define GETNETENT_R_HAS_ERRNO
596#else
597# undef GETNETENT_R_HAS_ERRNO
598#endif
c71a3471 599#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
10bc17b6
JH
600# define GETNETBYADDR_R_HAS_ERRNO
601#else
602# undef GETNETBYADDR_R_HAS_ERRNO
603#endif
09310450 604#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
10bc17b6
JH
605# define GETNETBYNAME_R_HAS_ERRNO
606#else
607# undef GETNETBYNAME_R_HAS_ERRNO
608#endif
609
610/* Any of the getnetent getnetbyaddr getnetbyname using errno? */
611
612#if (defined(GETNETENT_R_HAS_ERRNO) || defined(GETNETBYADDR_R_HAS_ERRNO) || defined(GETNETBYNAME_R_HAS_ERRNO))
f7937171 613# define USE_NETENT_ERRNO
10bc17b6 614#else
f7937171 615# undef USE_NETENT_ERRNO
10bc17b6
JH
616#endif
617
618
619typedef struct {
620#ifdef HAS_ASCTIME_R
621 char* _asctime_buffer;
622 size_t _asctime_size;
623#endif /* HAS_ASCTIME_R */
624#ifdef HAS_CRYPT_R
b430fd04
JH
625#if CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
626 CRYPTD* _crypt_data;
627#else
d909e69f 628 struct crypt_data _crypt_struct;
b430fd04 629#endif
10bc17b6
JH
630#endif /* HAS_CRYPT_R */
631#ifdef HAS_CTIME_R
632 char* _ctime_buffer;
633 size_t _ctime_size;
634#endif /* HAS_CTIME_R */
635#ifdef HAS_DRAND48_R
636 struct drand48_data _drand48_struct;
637 double _drand48_double;
638#endif /* HAS_DRAND48_R */
639#ifdef HAS_GETGRNAM_R
f7937171
JH
640 struct group _grent_struct;
641 char* _grent_buffer;
642 size_t _grent_size;
643# ifdef USE_GRENT_PTR
644 struct group* _grent_ptr;
10bc17b6 645# endif
f7937171
JH
646# ifdef USE_GRENT_FPTR
647 FILE* _grent_fptr;
10bc17b6
JH
648# endif
649#endif /* HAS_GETGRNAM_R */
650#ifdef HAS_GETHOSTBYNAME_R
f7937171 651 struct hostent _hostent_struct;
10bc17b6 652# if GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
f7937171 653 struct hostent_data _hostent_data;
10bc17b6 654# else
f7937171
JH
655 char* _hostent_buffer;
656 size_t _hostent_size;
10bc17b6 657# endif
f7937171
JH
658# ifdef USE_HOSTENT_PTR
659 struct hostent* _hostent_ptr;
10bc17b6 660# endif
f7937171
JH
661# ifdef USE_HOSTENT_ERRNO
662 int _hostent_errno;
10bc17b6
JH
663# endif
664#endif /* HAS_GETHOSTBYNAME_R */
665#ifdef HAS_GETLOGIN_R
666 char* _getlogin_buffer;
667 size_t _getlogin_size;
668#endif /* HAS_GETLOGIN_R */
669#ifdef HAS_GETNETBYNAME_R
f7937171 670 struct netent _netent_struct;
10bc17b6 671# if GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
f7937171 672 struct netent_data _netent_data;
10bc17b6 673# else
f7937171
JH
674 char* _netent_buffer;
675 size_t _netent_size;
10bc17b6 676# endif
f7937171
JH
677# ifdef USE_NETENT_PTR
678 struct netent* _netent_ptr;
10bc17b6 679# endif
f7937171
JH
680# ifdef USE_NETENT_ERRNO
681 int _netent_errno;
10bc17b6
JH
682# endif
683#endif /* HAS_GETNETBYNAME_R */
684#ifdef HAS_GETPROTOBYNAME_R
f7937171 685 struct protoent _protoent_struct;
10bc17b6 686# if GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
f7937171 687 struct protoent_data _protoent_data;
10bc17b6 688# else
f7937171
JH
689 char* _protoent_buffer;
690 size_t _protoent_size;
10bc17b6 691# endif
f7937171
JH
692# ifdef USE_PROTOENT_PTR
693 struct protoent* _protoent_ptr;
10bc17b6 694# endif
f7937171
JH
695# ifdef USE_PROTOENT_ERRNO
696 int _protoent_errno;
10bc17b6
JH
697# endif
698#endif /* HAS_GETPROTOBYNAME_R */
699#ifdef HAS_GETPWNAM_R
f7937171
JH
700 struct passwd _pwent_struct;
701 char* _pwent_buffer;
702 size_t _pwent_size;
703# ifdef USE_PWENT_PTR
704 struct passwd* _pwent_ptr;
10bc17b6 705# endif
f7937171
JH
706# ifdef USE_PWENT_FPTR
707 FILE* _pwent_fptr;
10bc17b6
JH
708# endif
709#endif /* HAS_GETPWNAM_R */
710#ifdef HAS_GETSERVBYNAME_R
f7937171 711 struct servent _servent_struct;
10bc17b6 712# if GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD
f7937171 713 struct servent_data _servent_data;
10bc17b6 714# else
f7937171
JH
715 char* _servent_buffer;
716 size_t _servent_size;
10bc17b6 717# endif
f7937171
JH
718# ifdef USE_SERVENT_PTR
719 struct servent* _servent_ptr;
10bc17b6 720# endif
f7937171
JH
721# ifdef USE_SERVENT_ERRNO
722 int _servent_errno;
10bc17b6
JH
723# endif
724#endif /* HAS_GETSERVBYNAME_R */
725#ifdef HAS_GETSPNAM_R
f7937171
JH
726 struct spwd _spent_struct;
727 char* _spent_buffer;
728 size_t _spent_size;
729# ifdef USE_SPENT_PTR
730 struct spwd* _spent_ptr;
731# endif
732# ifdef USE_SPENT_FPTR
733 FILE* _spent_fptr;
10bc17b6
JH
734# endif
735#endif /* HAS_GETSPNAM_R */
736#ifdef HAS_GMTIME_R
737 struct tm _gmtime_struct;
738#endif /* HAS_GMTIME_R */
739#ifdef HAS_LOCALTIME_R
740 struct tm _localtime_struct;
741#endif /* HAS_LOCALTIME_R */
742#ifdef HAS_RANDOM_R
d909e69f 743# if RANDOM_R_PROTO != REENTRANT_PROTO_I_St
10bc17b6 744 struct random_data _random_struct;
c71a3471 745# endif
10bc17b6
JH
746#endif /* HAS_RANDOM_R */
747#ifdef HAS_READDIR_R
748 struct dirent* _readdir_struct;
749 size_t _readdir_size;
750# if READDIR_R_PROTO == REENTRANT_PROTO_I_TSR
751 struct dirent* _readdir_ptr;
752# endif
753#endif /* HAS_READDIR_R */
754#ifdef HAS_READDIR64_R
755 struct dirent64* _readdir64_struct;
756 size_t _readdir64_size;
757# if READDIR64_R_PROTO == REENTRANT_PROTO_I_TSR
758 struct dirent64* _readdir64_ptr;
759# endif
760#endif /* HAS_READDIR64_R */
761#ifdef HAS_SETLOCALE_R
762 char* _setlocale_buffer;
763 size_t _setlocale_size;
764#endif /* HAS_SETLOCALE_R */
765#ifdef HAS_STRERROR_R
766 char* _strerror_buffer;
767 size_t _strerror_size;
768#endif /* HAS_STRERROR_R */
769#ifdef HAS_TTYNAME_R
770 char* _ttyname_buffer;
771 size_t _ttyname_size;
772#endif /* HAS_TTYNAME_R */
10bc17b6 773#ifdef HAS_CRYPT_R
d909e69f
JD
774#if CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
775#else
776 struct crypt_data *_crypt_struct_buffer;
777#endif
10bc17b6 778#endif /* HAS_CRYPT_R */
10bc17b6 779#ifdef HAS_RANDOM_R
d909e69f
JD
780# if RANDOM_R_PROTO == REENTRANT_PROTO_I_iS
781 int _random_retval;
c71a3471 782# endif
d909e69f
JD
783# if RANDOM_R_PROTO == REENTRANT_PROTO_I_lS
784 long _random_retval;
c71a3471 785# endif
d909e69f
JD
786# if RANDOM_R_PROTO == REENTRANT_PROTO_I_St
787 struct random_data _random_struct;
788 int32_t _random_retval;
10bc17b6
JH
789# endif
790#endif /* HAS_RANDOM_R */
b04fc15e
JD
791#ifdef HAS_SRANDOM_R
792 struct random_data _srandom_struct;
793#endif /* HAS_SRANDOM_R */
10bc17b6 794
d909e69f
JD
795 int dummy; /* cannot have empty structs */
796} REENTR;
630cd32b 797
10bc17b6 798#endif /* USE_REENTRANT_API */
10bc17b6 799
d909e69f 800#endif