This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
attributes-two.patch also contains a lot of const-ing, hence the
[perl5.git] / reentr.c
CommitLineData
10bc17b6
JH
1/*
2 * reentr.c
3 *
e6906430 4 * Copyright (C) 2002, 2003, by Larry Wall and others
10bc17b6
JH
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
40d34c0d 10 * This file is built by reentr.pl from data in reentr.pl.
10bc17b6
JH
11 *
12 * "Saruman," I said, standing away from him, "only one hand at a time can
13 * wield the One, and you know that well, so do not trouble to say we!"
14 *
40d34c0d
SB
15 * This file contains a collection of automatically created wrappers
16 * (created by running reentr.pl) for reentrant (thread-safe) versions of
17 * various library calls, such as getpwent_r. The wrapping is done so
18 * that other files like pp_sys.c calling those library functions need not
19 * care about the differences between various platforms' idiosyncrasies
20 * regarding these reentrant interfaces.
10bc17b6
JH
21 */
22
23#include "EXTERN.h"
24#define PERL_IN_REENTR_C
25#include "perl.h"
26#include "reentr.h"
27
28void
29Perl_reentrant_size(pTHX) {
30#ifdef USE_REENTRANT_API
8695fa85
SR
31#define REENTRANTSMALLSIZE 256 /* Make something up. */
32#define REENTRANTUSUALSIZE 4096 /* Make something up. */
10bc17b6 33#ifdef HAS_ASCTIME_R
8695fa85 34 PL_reentrant_buffer->_asctime_size = REENTRANTSMALLSIZE;
10bc17b6
JH
35#endif /* HAS_ASCTIME_R */
36#ifdef HAS_CRYPT_R
37#endif /* HAS_CRYPT_R */
38#ifdef HAS_CTIME_R
8695fa85 39 PL_reentrant_buffer->_ctime_size = REENTRANTSMALLSIZE;
10bc17b6
JH
40#endif /* HAS_CTIME_R */
41#ifdef HAS_DRAND48_R
42#endif /* HAS_DRAND48_R */
43#ifdef HAS_GETGRNAM_R
c45c44aa
JH
44# if defined(HAS_SYSCONF) && defined(_SC_GETGR_R_SIZE_MAX) && !defined(__GLIBC__)
45 PL_reentrant_buffer->_grent_size = sysconf(_SC_GETGR_R_SIZE_MAX);
46 if (PL_reentrant_buffer->_grent_size == -1)
47 PL_reentrant_buffer->_grent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
48# else
49# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
f7937171 50 PL_reentrant_buffer->_grent_size = SIABUFSIZ;
10bc17b6
JH
51# else
52# ifdef __sgi
f7937171 53 PL_reentrant_buffer->_grent_size = BUFSIZ;
10bc17b6 54# else
f7937171 55 PL_reentrant_buffer->_grent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
56# endif
57# endif
58# endif
59#endif /* HAS_GETGRNAM_R */
60#ifdef HAS_GETHOSTBYNAME_R
61#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 62 PL_reentrant_buffer->_hostent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
63#endif
64#endif /* HAS_GETHOSTBYNAME_R */
65#ifdef HAS_GETLOGIN_R
8695fa85 66 PL_reentrant_buffer->_getlogin_size = REENTRANTSMALLSIZE;
10bc17b6
JH
67#endif /* HAS_GETLOGIN_R */
68#ifdef HAS_GETNETBYNAME_R
69#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 70 PL_reentrant_buffer->_netent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
71#endif
72#endif /* HAS_GETNETBYNAME_R */
73#ifdef HAS_GETPROTOBYNAME_R
74#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 75 PL_reentrant_buffer->_protoent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
76#endif
77#endif /* HAS_GETPROTOBYNAME_R */
78#ifdef HAS_GETPWNAM_R
79# if defined(HAS_SYSCONF) && defined(_SC_GETPW_R_SIZE_MAX) && !defined(__GLIBC__)
f7937171
JH
80 PL_reentrant_buffer->_pwent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
81 if (PL_reentrant_buffer->_pwent_size == -1)
82 PL_reentrant_buffer->_pwent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
83# else
84# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
f7937171 85 PL_reentrant_buffer->_pwent_size = SIABUFSIZ;
10bc17b6
JH
86# else
87# ifdef __sgi
f7937171 88 PL_reentrant_buffer->_pwent_size = BUFSIZ;
10bc17b6 89# else
f7937171 90 PL_reentrant_buffer->_pwent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
91# endif
92# endif
93# endif
94#endif /* HAS_GETPWNAM_R */
95#ifdef HAS_GETSERVBYNAME_R
96#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 97 PL_reentrant_buffer->_servent_size = REENTRANTUSUALSIZE;
10bc17b6
JH
98#endif
99#endif /* HAS_GETSERVBYNAME_R */
100#ifdef HAS_GETSPNAM_R
f7937171 101# if defined(HAS_SYSCONF) && defined(_SC_GETPW_R_SIZE_MAX) && !defined(__GLIBC__)
51beb6bd
JH
102 PL_reentrant_buffer->_spent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
103 if (PL_reentrant_buffer->_spent_size == -1)
104 PL_reentrant_buffer->_spent_size = REENTRANTUSUALSIZE;
f7937171
JH
105# else
106# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
107 PL_reentrant_buffer->_spent_size = SIABUFSIZ;
108# else
109# ifdef __sgi
110 PL_reentrant_buffer->_spent_size = BUFSIZ;
111# else
112 PL_reentrant_buffer->_spent_size = REENTRANTUSUALSIZE;
113# endif
114# endif
115# endif
10bc17b6
JH
116#endif /* HAS_GETSPNAM_R */
117#ifdef HAS_GMTIME_R
118#endif /* HAS_GMTIME_R */
119#ifdef HAS_LOCALTIME_R
120#endif /* HAS_LOCALTIME_R */
121#ifdef HAS_RANDOM_R
122#endif /* HAS_RANDOM_R */
123#ifdef HAS_READDIR_R
124 /* This is the size Solaris recommends.
125 * (though we go static, should use pathconf() instead) */
126 PL_reentrant_buffer->_readdir_size = sizeof(struct dirent) + MAXPATHLEN + 1;
127#endif /* HAS_READDIR_R */
128#ifdef HAS_READDIR64_R
129 /* This is the size Solaris recommends.
130 * (though we go static, should use pathconf() instead) */
131 PL_reentrant_buffer->_readdir64_size = sizeof(struct dirent64) + MAXPATHLEN + 1;
132#endif /* HAS_READDIR64_R */
133#ifdef HAS_SETLOCALE_R
8695fa85 134 PL_reentrant_buffer->_setlocale_size = REENTRANTSMALLSIZE;
10bc17b6
JH
135#endif /* HAS_SETLOCALE_R */
136#ifdef HAS_STRERROR_R
8695fa85 137 PL_reentrant_buffer->_strerror_size = REENTRANTSMALLSIZE;
10bc17b6
JH
138#endif /* HAS_STRERROR_R */
139#ifdef HAS_TTYNAME_R
8695fa85 140 PL_reentrant_buffer->_ttyname_size = REENTRANTSMALLSIZE;
10bc17b6
JH
141#endif /* HAS_TTYNAME_R */
142
143#endif /* USE_REENTRANT_API */
144}
145
146void
147Perl_reentrant_init(pTHX) {
148#ifdef USE_REENTRANT_API
149 New(31337, PL_reentrant_buffer, 1, REENTR);
150 Perl_reentrant_size(aTHX);
151#ifdef HAS_ASCTIME_R
152 New(31338, PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size, char);
153#endif /* HAS_ASCTIME_R */
154#ifdef HAS_CRYPT_R
5338c2bb
JH
155#if CRYPT_R_PROTO != REENTRANT_PROTO_B_CCD
156 PL_reentrant_buffer->_crypt_struct_buffer = 0;
10bc17b6
JH
157#endif
158#endif /* HAS_CRYPT_R */
159#ifdef HAS_CTIME_R
160 New(31338, PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size, char);
161#endif /* HAS_CTIME_R */
162#ifdef HAS_DRAND48_R
163#endif /* HAS_DRAND48_R */
164#ifdef HAS_GETGRNAM_R
f7937171
JH
165# ifdef USE_GRENT_FPTR
166 PL_reentrant_buffer->_grent_fptr = NULL;
10bc17b6 167# endif
f7937171 168 New(31338, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, char);
10bc17b6
JH
169#endif /* HAS_GETGRNAM_R */
170#ifdef HAS_GETHOSTBYNAME_R
171#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 172 New(31338, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, char);
10bc17b6
JH
173#endif
174#endif /* HAS_GETHOSTBYNAME_R */
175#ifdef HAS_GETLOGIN_R
176 New(31338, PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size, char);
177#endif /* HAS_GETLOGIN_R */
178#ifdef HAS_GETNETBYNAME_R
179#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 180 New(31338, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, char);
10bc17b6
JH
181#endif
182#endif /* HAS_GETNETBYNAME_R */
183#ifdef HAS_GETPROTOBYNAME_R
184#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 185 New(31338, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, char);
10bc17b6
JH
186#endif
187#endif /* HAS_GETPROTOBYNAME_R */
188#ifdef HAS_GETPWNAM_R
f7937171
JH
189# ifdef USE_PWENT_FPTR
190 PL_reentrant_buffer->_pwent_fptr = NULL;
10bc17b6 191# endif
f7937171 192 New(31338, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, char);
10bc17b6
JH
193#endif /* HAS_GETPWNAM_R */
194#ifdef HAS_GETSERVBYNAME_R
195#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 196 New(31338, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, char);
10bc17b6
JH
197#endif
198#endif /* HAS_GETSERVBYNAME_R */
199#ifdef HAS_GETSPNAM_R
f7937171
JH
200# ifdef USE_SPENT_FPTR
201 PL_reentrant_buffer->_spent_fptr = NULL;
202# endif
203 New(31338, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, char);
10bc17b6
JH
204#endif /* HAS_GETSPNAM_R */
205#ifdef HAS_GMTIME_R
206#endif /* HAS_GMTIME_R */
207#ifdef HAS_LOCALTIME_R
208#endif /* HAS_LOCALTIME_R */
209#ifdef HAS_RANDOM_R
210#endif /* HAS_RANDOM_R */
211#ifdef HAS_READDIR_R
212 PL_reentrant_buffer->_readdir_struct = (struct dirent*)safemalloc(PL_reentrant_buffer->_readdir_size);
213#endif /* HAS_READDIR_R */
214#ifdef HAS_READDIR64_R
215 PL_reentrant_buffer->_readdir64_struct = (struct dirent64*)safemalloc(PL_reentrant_buffer->_readdir64_size);
216#endif /* HAS_READDIR64_R */
217#ifdef HAS_SETLOCALE_R
218 New(31338, PL_reentrant_buffer->_setlocale_buffer, PL_reentrant_buffer->_setlocale_size, char);
219#endif /* HAS_SETLOCALE_R */
220#ifdef HAS_STRERROR_R
221 New(31338, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size, char);
222#endif /* HAS_STRERROR_R */
223#ifdef HAS_TTYNAME_R
224 New(31338, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size, char);
225#endif /* HAS_TTYNAME_R */
226
227#endif /* USE_REENTRANT_API */
228}
229
230void
231Perl_reentrant_free(pTHX) {
232#ifdef USE_REENTRANT_API
233#ifdef HAS_ASCTIME_R
234 Safefree(PL_reentrant_buffer->_asctime_buffer);
235#endif /* HAS_ASCTIME_R */
236#ifdef HAS_CRYPT_R
5338c2bb
JH
237#if CRYPT_R_PROTO != REENTRANT_PROTO_B_CCD
238 Safefree(PL_reentrant_buffer->_crypt_struct_buffer);
239#endif
10bc17b6
JH
240#endif /* HAS_CRYPT_R */
241#ifdef HAS_CTIME_R
242 Safefree(PL_reentrant_buffer->_ctime_buffer);
243#endif /* HAS_CTIME_R */
244#ifdef HAS_DRAND48_R
245#endif /* HAS_DRAND48_R */
246#ifdef HAS_GETGRNAM_R
f7937171 247 Safefree(PL_reentrant_buffer->_grent_buffer);
10bc17b6
JH
248#endif /* HAS_GETGRNAM_R */
249#ifdef HAS_GETHOSTBYNAME_R
250#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 251 Safefree(PL_reentrant_buffer->_hostent_buffer);
10bc17b6
JH
252#endif
253#endif /* HAS_GETHOSTBYNAME_R */
254#ifdef HAS_GETLOGIN_R
255 Safefree(PL_reentrant_buffer->_getlogin_buffer);
256#endif /* HAS_GETLOGIN_R */
257#ifdef HAS_GETNETBYNAME_R
258#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 259 Safefree(PL_reentrant_buffer->_netent_buffer);
10bc17b6
JH
260#endif
261#endif /* HAS_GETNETBYNAME_R */
262#ifdef HAS_GETPROTOBYNAME_R
263#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 264 Safefree(PL_reentrant_buffer->_protoent_buffer);
10bc17b6
JH
265#endif
266#endif /* HAS_GETPROTOBYNAME_R */
267#ifdef HAS_GETPWNAM_R
f7937171 268 Safefree(PL_reentrant_buffer->_pwent_buffer);
10bc17b6
JH
269#endif /* HAS_GETPWNAM_R */
270#ifdef HAS_GETSERVBYNAME_R
271#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 272 Safefree(PL_reentrant_buffer->_servent_buffer);
10bc17b6
JH
273#endif
274#endif /* HAS_GETSERVBYNAME_R */
275#ifdef HAS_GETSPNAM_R
f7937171 276 Safefree(PL_reentrant_buffer->_spent_buffer);
10bc17b6
JH
277#endif /* HAS_GETSPNAM_R */
278#ifdef HAS_GMTIME_R
279#endif /* HAS_GMTIME_R */
280#ifdef HAS_LOCALTIME_R
281#endif /* HAS_LOCALTIME_R */
282#ifdef HAS_RANDOM_R
283#endif /* HAS_RANDOM_R */
284#ifdef HAS_READDIR_R
285 Safefree(PL_reentrant_buffer->_readdir_struct);
286#endif /* HAS_READDIR_R */
287#ifdef HAS_READDIR64_R
288 Safefree(PL_reentrant_buffer->_readdir64_struct);
289#endif /* HAS_READDIR64_R */
290#ifdef HAS_SETLOCALE_R
291 Safefree(PL_reentrant_buffer->_setlocale_buffer);
292#endif /* HAS_SETLOCALE_R */
293#ifdef HAS_STRERROR_R
294 Safefree(PL_reentrant_buffer->_strerror_buffer);
295#endif /* HAS_STRERROR_R */
296#ifdef HAS_TTYNAME_R
297 Safefree(PL_reentrant_buffer->_ttyname_buffer);
298#endif /* HAS_TTYNAME_R */
299
300 Safefree(PL_reentrant_buffer);
301#endif /* USE_REENTRANT_API */
302}
303
edd309b7
JH
304void*
305Perl_reentrant_retry(const char *f, ...)
306{
307 dTHX;
308 void *retptr = NULL;
309#ifdef USE_REENTRANT_API
630cd32b 310# if defined(USE_HOSTENT_BUFFER) || defined(USE_GRENT_BUFFER) || defined(USE_NETENT_BUFFER) || defined(USE_PWENT_BUFFER) || defined(USE_PROTOENT_BUFFER) || defined(USE_SERVENT_BUFFER)
e3410746
SR
311 void *p0;
312# endif
f7937171 313# if defined(USE_SERVENT_BUFFER)
e3410746
SR
314 void *p1;
315# endif
f7937171 316# if defined(USE_HOSTENT_BUFFER)
edd309b7 317 size_t asize;
e3410746 318# endif
f7937171 319# if defined(USE_HOSTENT_BUFFER) || defined(USE_NETENT_BUFFER) || defined(USE_PROTOENT_BUFFER) || defined(USE_SERVENT_BUFFER)
edd309b7 320 int anint;
e3410746 321# endif
edd309b7
JH
322 va_list ap;
323
324 va_start(ap, f);
325
edd309b7 326 switch (PL_op->op_type) {
f7937171 327#ifdef USE_HOSTENT_BUFFER
edd309b7
JH
328 case OP_GHBYADDR:
329 case OP_GHBYNAME:
330 case OP_GHOSTENT:
331 {
5b7ea690
JH
332#ifdef PERL_REENTRANT_MAXSIZE
333 if (PL_reentrant_buffer->_hostent_size <=
334 PERL_REENTRANT_MAXSIZE / 2)
335#endif
336 {
f7937171
JH
337 PL_reentrant_buffer->_hostent_size *= 2;
338 Renew(PL_reentrant_buffer->_hostent_buffer,
339 PL_reentrant_buffer->_hostent_size, char);
edd309b7
JH
340 switch (PL_op->op_type) {
341 case OP_GHBYADDR:
342 p0 = va_arg(ap, void *);
343 asize = va_arg(ap, size_t);
344 anint = va_arg(ap, int);
345 retptr = gethostbyaddr(p0, asize, anint); break;
346 case OP_GHBYNAME:
347 p0 = va_arg(ap, void *);
da01b85b 348 retptr = gethostbyname((char *)p0); break;
edd309b7
JH
349 case OP_GHOSTENT:
350 retptr = gethostent(); break;
351 default:
c45c44aa 352 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
353 break;
354 }
355 }
356 }
357 break;
358#endif
f7937171 359#ifdef USE_GRENT_BUFFER
edd309b7
JH
360 case OP_GGRNAM:
361 case OP_GGRGID:
362 case OP_GGRENT:
363 {
5b7ea690
JH
364#ifdef PERL_REENTRANT_MAXSIZE
365 if (PL_reentrant_buffer->_grent_size <=
366 PERL_REENTRANT_MAXSIZE / 2)
367#endif
368 {
edd309b7 369 Gid_t gid;
f7937171
JH
370 PL_reentrant_buffer->_grent_size *= 2;
371 Renew(PL_reentrant_buffer->_grent_buffer,
372 PL_reentrant_buffer->_grent_size, char);
edd309b7
JH
373 switch (PL_op->op_type) {
374 case OP_GGRNAM:
375 p0 = va_arg(ap, void *);
da01b85b 376 retptr = getgrnam((char *)p0); break;
edd309b7 377 case OP_GGRGID:
ecde6dd6
NA
378#if Gid_t_size < INTSIZE
379 gid = (Gid_t)va_arg(ap, int);
380#else
edd309b7 381 gid = va_arg(ap, Gid_t);
ecde6dd6 382#endif
edd309b7
JH
383 retptr = getgrgid(gid); break;
384 case OP_GGRENT:
385 retptr = getgrent(); break;
386 default:
c45c44aa 387 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
388 break;
389 }
390 }
391 }
392 break;
393#endif
f7937171 394#ifdef USE_NETENT_BUFFER
edd309b7
JH
395 case OP_GNBYADDR:
396 case OP_GNBYNAME:
397 case OP_GNETENT:
398 {
5b7ea690
JH
399#ifdef PERL_REENTRANT_MAXSIZE
400 if (PL_reentrant_buffer->_netent_size <=
401 PERL_REENTRANT_MAXSIZE / 2)
402#endif
403 {
edd309b7 404 Netdb_net_t net;
f7937171
JH
405 PL_reentrant_buffer->_netent_size *= 2;
406 Renew(PL_reentrant_buffer->_netent_buffer,
407 PL_reentrant_buffer->_netent_size, char);
edd309b7
JH
408 switch (PL_op->op_type) {
409 case OP_GNBYADDR:
410 net = va_arg(ap, Netdb_net_t);
411 anint = va_arg(ap, int);
412 retptr = getnetbyaddr(net, anint); break;
413 case OP_GNBYNAME:
414 p0 = va_arg(ap, void *);
da01b85b 415 retptr = getnetbyname((char *)p0); break;
edd309b7
JH
416 case OP_GNETENT:
417 retptr = getnetent(); break;
418 default:
c45c44aa 419 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
420 break;
421 }
422 }
423 }
424 break;
425#endif
f7937171 426#ifdef USE_PWENT_BUFFER
edd309b7
JH
427 case OP_GPWNAM:
428 case OP_GPWUID:
429 case OP_GPWENT:
430 {
5b7ea690
JH
431#ifdef PERL_REENTRANT_MAXSIZE
432 if (PL_reentrant_buffer->_pwent_size <=
433 PERL_REENTRANT_MAXSIZE / 2)
434#endif
435 {
edd309b7 436 Uid_t uid;
f7937171
JH
437 PL_reentrant_buffer->_pwent_size *= 2;
438 Renew(PL_reentrant_buffer->_pwent_buffer,
439 PL_reentrant_buffer->_pwent_size, char);
edd309b7
JH
440 switch (PL_op->op_type) {
441 case OP_GPWNAM:
442 p0 = va_arg(ap, void *);
da01b85b 443 retptr = getpwnam((char *)p0); break;
edd309b7 444 case OP_GPWUID:
ecde6dd6
NA
445#if Uid_t_size < INTSIZE
446 uid = (Uid_t)va_arg(ap, int);
447#else
edd309b7 448 uid = va_arg(ap, Uid_t);
ecde6dd6 449#endif
edd309b7
JH
450 retptr = getpwuid(uid); break;
451 case OP_GPWENT:
452 retptr = getpwent(); break;
453 default:
c45c44aa 454 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
455 break;
456 }
457 }
458 }
459 break;
460#endif
f7937171 461#ifdef USE_PROTOENT_BUFFER
edd309b7
JH
462 case OP_GPBYNAME:
463 case OP_GPBYNUMBER:
464 case OP_GPROTOENT:
465 {
5b7ea690
JH
466#ifdef PERL_REENTRANT_MAXSIZE
467 if (PL_reentrant_buffer->_protoent_size <=
468 PERL_REENTRANT_MAXSIZE / 2)
469#endif
470 {
f7937171
JH
471 PL_reentrant_buffer->_protoent_size *= 2;
472 Renew(PL_reentrant_buffer->_protoent_buffer,
473 PL_reentrant_buffer->_protoent_size, char);
edd309b7
JH
474 switch (PL_op->op_type) {
475 case OP_GPBYNAME:
476 p0 = va_arg(ap, void *);
da01b85b 477 retptr = getprotobyname((char *)p0); break;
edd309b7
JH
478 case OP_GPBYNUMBER:
479 anint = va_arg(ap, int);
480 retptr = getprotobynumber(anint); break;
481 case OP_GPROTOENT:
482 retptr = getprotoent(); break;
483 default:
c45c44aa 484 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
485 break;
486 }
487 }
488 }
489 break;
490#endif
f7937171 491#ifdef USE_SERVENT_BUFFER
edd309b7
JH
492 case OP_GSBYNAME:
493 case OP_GSBYPORT:
494 case OP_GSERVENT:
495 {
5b7ea690
JH
496#ifdef PERL_REENTRANT_MAXSIZE
497 if (PL_reentrant_buffer->_servent_size <=
498 PERL_REENTRANT_MAXSIZE / 2)
499#endif
500 {
f7937171
JH
501 PL_reentrant_buffer->_servent_size *= 2;
502 Renew(PL_reentrant_buffer->_servent_buffer,
503 PL_reentrant_buffer->_servent_size, char);
edd309b7
JH
504 switch (PL_op->op_type) {
505 case OP_GSBYNAME:
506 p0 = va_arg(ap, void *);
507 p1 = va_arg(ap, void *);
da01b85b 508 retptr = getservbyname((char *)p0, (char *)p1); break;
edd309b7
JH
509 case OP_GSBYPORT:
510 anint = va_arg(ap, int);
511 p0 = va_arg(ap, void *);
da01b85b 512 retptr = getservbyport(anint, (char *)p0); break;
edd309b7
JH
513 case OP_GSERVENT:
514 retptr = getservent(); break;
515 default:
c45c44aa 516 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
517 break;
518 }
519 }
520 }
521 break;
522#endif
523 default:
524 /* Not known how to retry, so just fail. */
525 break;
526 }
527
528 va_end(ap);
529#endif
530 return retptr;
531}
532