This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add note to 'encoding' pod that it's removed
[perl5.git] / reentr.c
CommitLineData
37442d52
RGS
1/* -*- buffer-read-only: t -*-
2 *
10bc17b6
JH
3 * reentr.c
4 *
922adc66 5 * Copyright (C) 2002, 2003, 2005, 2006, 2007 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 *
78102347
NC
10 * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
11 * This file is built by regen/reentr.pl from data in regen/reentr.pl.
12 * Any changes made here will be lost!
10bc17b6
JH
13 *
14 * "Saruman," I said, standing away from him, "only one hand at a time can
15 * wield the One, and you know that well, so do not trouble to say we!"
16 *
61296642
DM
17 * This file contains a collection of automatically created wrappers
18 * (created by running reentr.pl) for reentrant (thread-safe) versions of
19 * various library calls, such as getpwent_r. The wrapping is done so
20 * that other files like pp_sys.c calling those library functions need not
21 * care about the differences between various platforms' idiosyncrasies
22 * regarding these reentrant interfaces.
10bc17b6
JH
23 */
24
25#include "EXTERN.h"
26#define PERL_IN_REENTR_C
27#include "perl.h"
28#include "reentr.h"
29
30void
31Perl_reentrant_size(pTHX) {
32#ifdef USE_REENTRANT_API
8695fa85
SR
33#define REENTRANTSMALLSIZE 256 /* Make something up. */
34#define REENTRANTUSUALSIZE 4096 /* Make something up. */
10bc17b6 35#ifdef HAS_ASCTIME_R
8695fa85 36 PL_reentrant_buffer->_asctime_size = REENTRANTSMALLSIZE;
10bc17b6
JH
37#endif /* HAS_ASCTIME_R */
38#ifdef HAS_CRYPT_R
39#endif /* HAS_CRYPT_R */
40#ifdef HAS_CTIME_R
8695fa85 41 PL_reentrant_buffer->_ctime_size = REENTRANTSMALLSIZE;
10bc17b6 42#endif /* HAS_CTIME_R */
10bc17b6 43#ifdef HAS_GETGRNAM_R
0de8cad8
RGS
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);
a3dd3f83 46 if (PL_reentrant_buffer->_grent_size == (size_t) -1)
0de8cad8 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 80 PL_reentrant_buffer->_pwent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
a3dd3f83 81 if (PL_reentrant_buffer->_pwent_size == (size_t) -1)
f7937171 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
JH
101# if defined(HAS_SYSCONF) && defined(_SC_GETPW_R_SIZE_MAX) && !defined(__GLIBC__)
102 PL_reentrant_buffer->_spent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
a3dd3f83 103 if (PL_reentrant_buffer->_spent_size == (size_t) -1)
0de8cad8 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 116#endif /* HAS_GETSPNAM_R */
10bc17b6
JH
117#ifdef HAS_READDIR_R
118 /* This is the size Solaris recommends.
119 * (though we go static, should use pathconf() instead) */
120 PL_reentrant_buffer->_readdir_size = sizeof(struct dirent) + MAXPATHLEN + 1;
121#endif /* HAS_READDIR_R */
122#ifdef HAS_READDIR64_R
123 /* This is the size Solaris recommends.
124 * (though we go static, should use pathconf() instead) */
125 PL_reentrant_buffer->_readdir64_size = sizeof(struct dirent64) + MAXPATHLEN + 1;
126#endif /* HAS_READDIR64_R */
127#ifdef HAS_SETLOCALE_R
8695fa85 128 PL_reentrant_buffer->_setlocale_size = REENTRANTSMALLSIZE;
10bc17b6
JH
129#endif /* HAS_SETLOCALE_R */
130#ifdef HAS_STRERROR_R
8695fa85 131 PL_reentrant_buffer->_strerror_size = REENTRANTSMALLSIZE;
10bc17b6
JH
132#endif /* HAS_STRERROR_R */
133#ifdef HAS_TTYNAME_R
8695fa85 134 PL_reentrant_buffer->_ttyname_size = REENTRANTSMALLSIZE;
10bc17b6
JH
135#endif /* HAS_TTYNAME_R */
136
137#endif /* USE_REENTRANT_API */
138}
139
140void
141Perl_reentrant_init(pTHX) {
142#ifdef USE_REENTRANT_API
a02a5408 143 Newx(PL_reentrant_buffer, 1, REENTR);
10bc17b6
JH
144 Perl_reentrant_size(aTHX);
145#ifdef HAS_ASCTIME_R
a02a5408 146 Newx(PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size, char);
10bc17b6
JH
147#endif /* HAS_ASCTIME_R */
148#ifdef HAS_CRYPT_R
05404ffe
JH
149#if CRYPT_R_PROTO != REENTRANT_PROTO_B_CCD
150 PL_reentrant_buffer->_crypt_struct_buffer = 0;
10bc17b6
JH
151#endif
152#endif /* HAS_CRYPT_R */
153#ifdef HAS_CTIME_R
a02a5408 154 Newx(PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size, char);
10bc17b6 155#endif /* HAS_CTIME_R */
10bc17b6 156#ifdef HAS_GETGRNAM_R
f7937171
JH
157# ifdef USE_GRENT_FPTR
158 PL_reentrant_buffer->_grent_fptr = NULL;
10bc17b6 159# endif
a02a5408 160 Newx(PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, char);
10bc17b6
JH
161#endif /* HAS_GETGRNAM_R */
162#ifdef HAS_GETHOSTBYNAME_R
163#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
a02a5408 164 Newx(PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, char);
10bc17b6
JH
165#endif
166#endif /* HAS_GETHOSTBYNAME_R */
167#ifdef HAS_GETLOGIN_R
a02a5408 168 Newx(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size, char);
10bc17b6
JH
169#endif /* HAS_GETLOGIN_R */
170#ifdef HAS_GETNETBYNAME_R
171#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
a02a5408 172 Newx(PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, char);
10bc17b6
JH
173#endif
174#endif /* HAS_GETNETBYNAME_R */
175#ifdef HAS_GETPROTOBYNAME_R
176#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
a02a5408 177 Newx(PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, char);
10bc17b6
JH
178#endif
179#endif /* HAS_GETPROTOBYNAME_R */
180#ifdef HAS_GETPWNAM_R
f7937171
JH
181# ifdef USE_PWENT_FPTR
182 PL_reentrant_buffer->_pwent_fptr = NULL;
10bc17b6 183# endif
a02a5408 184 Newx(PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, char);
10bc17b6
JH
185#endif /* HAS_GETPWNAM_R */
186#ifdef HAS_GETSERVBYNAME_R
187#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
a02a5408 188 Newx(PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, char);
10bc17b6
JH
189#endif
190#endif /* HAS_GETSERVBYNAME_R */
191#ifdef HAS_GETSPNAM_R
f7937171
JH
192# ifdef USE_SPENT_FPTR
193 PL_reentrant_buffer->_spent_fptr = NULL;
194# endif
a02a5408 195 Newx(PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, char);
10bc17b6 196#endif /* HAS_GETSPNAM_R */
10bc17b6
JH
197#ifdef HAS_READDIR_R
198 PL_reentrant_buffer->_readdir_struct = (struct dirent*)safemalloc(PL_reentrant_buffer->_readdir_size);
199#endif /* HAS_READDIR_R */
200#ifdef HAS_READDIR64_R
201 PL_reentrant_buffer->_readdir64_struct = (struct dirent64*)safemalloc(PL_reentrant_buffer->_readdir64_size);
202#endif /* HAS_READDIR64_R */
203#ifdef HAS_SETLOCALE_R
a02a5408 204 Newx(PL_reentrant_buffer->_setlocale_buffer, PL_reentrant_buffer->_setlocale_size, char);
10bc17b6
JH
205#endif /* HAS_SETLOCALE_R */
206#ifdef HAS_STRERROR_R
a02a5408 207 Newx(PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size, char);
10bc17b6
JH
208#endif /* HAS_STRERROR_R */
209#ifdef HAS_TTYNAME_R
a02a5408 210 Newx(PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size, char);
10bc17b6
JH
211#endif /* HAS_TTYNAME_R */
212
213#endif /* USE_REENTRANT_API */
214}
215
216void
217Perl_reentrant_free(pTHX) {
218#ifdef USE_REENTRANT_API
219#ifdef HAS_ASCTIME_R
220 Safefree(PL_reentrant_buffer->_asctime_buffer);
221#endif /* HAS_ASCTIME_R */
222#ifdef HAS_CRYPT_R
05404ffe
JH
223#if CRYPT_R_PROTO != REENTRANT_PROTO_B_CCD
224 Safefree(PL_reentrant_buffer->_crypt_struct_buffer);
225#endif
10bc17b6
JH
226#endif /* HAS_CRYPT_R */
227#ifdef HAS_CTIME_R
228 Safefree(PL_reentrant_buffer->_ctime_buffer);
229#endif /* HAS_CTIME_R */
10bc17b6 230#ifdef HAS_GETGRNAM_R
f7937171 231 Safefree(PL_reentrant_buffer->_grent_buffer);
10bc17b6
JH
232#endif /* HAS_GETGRNAM_R */
233#ifdef HAS_GETHOSTBYNAME_R
234#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 235 Safefree(PL_reentrant_buffer->_hostent_buffer);
10bc17b6
JH
236#endif
237#endif /* HAS_GETHOSTBYNAME_R */
238#ifdef HAS_GETLOGIN_R
239 Safefree(PL_reentrant_buffer->_getlogin_buffer);
240#endif /* HAS_GETLOGIN_R */
241#ifdef HAS_GETNETBYNAME_R
242#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 243 Safefree(PL_reentrant_buffer->_netent_buffer);
10bc17b6
JH
244#endif
245#endif /* HAS_GETNETBYNAME_R */
246#ifdef HAS_GETPROTOBYNAME_R
247#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 248 Safefree(PL_reentrant_buffer->_protoent_buffer);
10bc17b6
JH
249#endif
250#endif /* HAS_GETPROTOBYNAME_R */
251#ifdef HAS_GETPWNAM_R
f7937171 252 Safefree(PL_reentrant_buffer->_pwent_buffer);
10bc17b6
JH
253#endif /* HAS_GETPWNAM_R */
254#ifdef HAS_GETSERVBYNAME_R
255#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 256 Safefree(PL_reentrant_buffer->_servent_buffer);
10bc17b6
JH
257#endif
258#endif /* HAS_GETSERVBYNAME_R */
259#ifdef HAS_GETSPNAM_R
f7937171 260 Safefree(PL_reentrant_buffer->_spent_buffer);
10bc17b6 261#endif /* HAS_GETSPNAM_R */
10bc17b6
JH
262#ifdef HAS_READDIR_R
263 Safefree(PL_reentrant_buffer->_readdir_struct);
264#endif /* HAS_READDIR_R */
265#ifdef HAS_READDIR64_R
266 Safefree(PL_reentrant_buffer->_readdir64_struct);
267#endif /* HAS_READDIR64_R */
268#ifdef HAS_SETLOCALE_R
269 Safefree(PL_reentrant_buffer->_setlocale_buffer);
270#endif /* HAS_SETLOCALE_R */
271#ifdef HAS_STRERROR_R
272 Safefree(PL_reentrant_buffer->_strerror_buffer);
273#endif /* HAS_STRERROR_R */
274#ifdef HAS_TTYNAME_R
275 Safefree(PL_reentrant_buffer->_ttyname_buffer);
276#endif /* HAS_TTYNAME_R */
277
278 Safefree(PL_reentrant_buffer);
279#endif /* USE_REENTRANT_API */
280}
281
edd309b7
JH
282void*
283Perl_reentrant_retry(const char *f, ...)
284{
edd309b7 285 void *retptr = NULL;
fe5bfecd 286 va_list ap;
7918f24d 287#ifdef USE_REENTRANT_API
dbf7dff6 288 dTHX;
7918f24d
NC
289 /* Easier to special case this here than in embed.pl. (Look at what it
290 generates for proto.h) */
291 PERL_ARGS_ASSERT_REENTRANT_RETRY;
292#endif
fe5bfecd 293 va_start(ap, f);
369ec4b2 294 {
edd309b7 295#ifdef USE_REENTRANT_API
0891a229 296# 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
297 void *p0;
298# endif
f7937171 299# if defined(USE_SERVENT_BUFFER)
e3410746
SR
300 void *p1;
301# endif
f7937171 302# if defined(USE_HOSTENT_BUFFER)
edd309b7 303 size_t asize;
e3410746 304# endif
f7937171 305# if defined(USE_HOSTENT_BUFFER) || defined(USE_NETENT_BUFFER) || defined(USE_PROTOENT_BUFFER) || defined(USE_SERVENT_BUFFER)
edd309b7 306 int anint;
e3410746 307# endif
edd309b7 308
edd309b7 309 switch (PL_op->op_type) {
f7937171 310#ifdef USE_HOSTENT_BUFFER
edd309b7
JH
311 case OP_GHBYADDR:
312 case OP_GHBYNAME:
313 case OP_GHOSTENT:
314 {
af685957
JH
315#ifdef PERL_REENTRANT_MAXSIZE
316 if (PL_reentrant_buffer->_hostent_size <=
317 PERL_REENTRANT_MAXSIZE / 2)
318#endif
319 {
f7937171
JH
320 PL_reentrant_buffer->_hostent_size *= 2;
321 Renew(PL_reentrant_buffer->_hostent_buffer,
322 PL_reentrant_buffer->_hostent_size, char);
edd309b7
JH
323 switch (PL_op->op_type) {
324 case OP_GHBYADDR:
325 p0 = va_arg(ap, void *);
326 asize = va_arg(ap, size_t);
327 anint = va_arg(ap, int);
328 retptr = gethostbyaddr(p0, asize, anint); break;
329 case OP_GHBYNAME:
330 p0 = va_arg(ap, void *);
f6f0b69b 331 retptr = gethostbyname((char *)p0); break;
edd309b7
JH
332 case OP_GHOSTENT:
333 retptr = gethostent(); break;
334 default:
0de8cad8 335 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
336 break;
337 }
338 }
339 }
340 break;
341#endif
f7937171 342#ifdef USE_GRENT_BUFFER
edd309b7
JH
343 case OP_GGRNAM:
344 case OP_GGRGID:
345 case OP_GGRENT:
346 {
af685957
JH
347#ifdef PERL_REENTRANT_MAXSIZE
348 if (PL_reentrant_buffer->_grent_size <=
349 PERL_REENTRANT_MAXSIZE / 2)
350#endif
351 {
edd309b7 352 Gid_t gid;
f7937171
JH
353 PL_reentrant_buffer->_grent_size *= 2;
354 Renew(PL_reentrant_buffer->_grent_buffer,
355 PL_reentrant_buffer->_grent_size, char);
edd309b7
JH
356 switch (PL_op->op_type) {
357 case OP_GGRNAM:
358 p0 = va_arg(ap, void *);
f6f0b69b 359 retptr = getgrnam((char *)p0); break;
edd309b7 360 case OP_GGRGID:
ab2b559b
JH
361#if Gid_t_size < INTSIZE
362 gid = (Gid_t)va_arg(ap, int);
363#else
edd309b7 364 gid = va_arg(ap, Gid_t);
ab2b559b 365#endif
edd309b7
JH
366 retptr = getgrgid(gid); break;
367 case OP_GGRENT:
368 retptr = getgrent(); break;
369 default:
0de8cad8 370 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
371 break;
372 }
373 }
374 }
375 break;
376#endif
f7937171 377#ifdef USE_NETENT_BUFFER
edd309b7
JH
378 case OP_GNBYADDR:
379 case OP_GNBYNAME:
380 case OP_GNETENT:
381 {
af685957
JH
382#ifdef PERL_REENTRANT_MAXSIZE
383 if (PL_reentrant_buffer->_netent_size <=
384 PERL_REENTRANT_MAXSIZE / 2)
385#endif
386 {
edd309b7 387 Netdb_net_t net;
f7937171
JH
388 PL_reentrant_buffer->_netent_size *= 2;
389 Renew(PL_reentrant_buffer->_netent_buffer,
390 PL_reentrant_buffer->_netent_size, char);
edd309b7
JH
391 switch (PL_op->op_type) {
392 case OP_GNBYADDR:
393 net = va_arg(ap, Netdb_net_t);
394 anint = va_arg(ap, int);
395 retptr = getnetbyaddr(net, anint); break;
396 case OP_GNBYNAME:
397 p0 = va_arg(ap, void *);
f6f0b69b 398 retptr = getnetbyname((char *)p0); break;
edd309b7
JH
399 case OP_GNETENT:
400 retptr = getnetent(); break;
401 default:
0de8cad8 402 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
403 break;
404 }
405 }
406 }
407 break;
408#endif
f7937171 409#ifdef USE_PWENT_BUFFER
edd309b7
JH
410 case OP_GPWNAM:
411 case OP_GPWUID:
412 case OP_GPWENT:
413 {
af685957
JH
414#ifdef PERL_REENTRANT_MAXSIZE
415 if (PL_reentrant_buffer->_pwent_size <=
416 PERL_REENTRANT_MAXSIZE / 2)
417#endif
418 {
edd309b7 419 Uid_t uid;
f7937171
JH
420 PL_reentrant_buffer->_pwent_size *= 2;
421 Renew(PL_reentrant_buffer->_pwent_buffer,
422 PL_reentrant_buffer->_pwent_size, char);
edd309b7
JH
423 switch (PL_op->op_type) {
424 case OP_GPWNAM:
425 p0 = va_arg(ap, void *);
f6f0b69b 426 retptr = getpwnam((char *)p0); break;
edd309b7 427 case OP_GPWUID:
ab2b559b
JH
428#if Uid_t_size < INTSIZE
429 uid = (Uid_t)va_arg(ap, int);
430#else
edd309b7 431 uid = va_arg(ap, Uid_t);
ab2b559b 432#endif
edd309b7 433 retptr = getpwuid(uid); break;
123829cf 434#if defined(HAS_GETPWENT) || defined(HAS_GETPWENT_R)
edd309b7
JH
435 case OP_GPWENT:
436 retptr = getpwent(); break;
123829cf 437#endif
edd309b7 438 default:
0de8cad8 439 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
440 break;
441 }
442 }
443 }
444 break;
445#endif
f7937171 446#ifdef USE_PROTOENT_BUFFER
edd309b7
JH
447 case OP_GPBYNAME:
448 case OP_GPBYNUMBER:
449 case OP_GPROTOENT:
450 {
af685957
JH
451#ifdef PERL_REENTRANT_MAXSIZE
452 if (PL_reentrant_buffer->_protoent_size <=
453 PERL_REENTRANT_MAXSIZE / 2)
454#endif
455 {
f7937171
JH
456 PL_reentrant_buffer->_protoent_size *= 2;
457 Renew(PL_reentrant_buffer->_protoent_buffer,
458 PL_reentrant_buffer->_protoent_size, char);
edd309b7
JH
459 switch (PL_op->op_type) {
460 case OP_GPBYNAME:
461 p0 = va_arg(ap, void *);
f6f0b69b 462 retptr = getprotobyname((char *)p0); break;
edd309b7
JH
463 case OP_GPBYNUMBER:
464 anint = va_arg(ap, int);
465 retptr = getprotobynumber(anint); break;
466 case OP_GPROTOENT:
467 retptr = getprotoent(); break;
468 default:
0de8cad8 469 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
470 break;
471 }
472 }
473 }
474 break;
475#endif
f7937171 476#ifdef USE_SERVENT_BUFFER
edd309b7
JH
477 case OP_GSBYNAME:
478 case OP_GSBYPORT:
479 case OP_GSERVENT:
480 {
af685957
JH
481#ifdef PERL_REENTRANT_MAXSIZE
482 if (PL_reentrant_buffer->_servent_size <=
483 PERL_REENTRANT_MAXSIZE / 2)
484#endif
485 {
f7937171
JH
486 PL_reentrant_buffer->_servent_size *= 2;
487 Renew(PL_reentrant_buffer->_servent_buffer,
488 PL_reentrant_buffer->_servent_size, char);
edd309b7
JH
489 switch (PL_op->op_type) {
490 case OP_GSBYNAME:
491 p0 = va_arg(ap, void *);
492 p1 = va_arg(ap, void *);
f6f0b69b 493 retptr = getservbyname((char *)p0, (char *)p1); break;
edd309b7
JH
494 case OP_GSBYPORT:
495 anint = va_arg(ap, int);
496 p0 = va_arg(ap, void *);
f6f0b69b 497 retptr = getservbyport(anint, (char *)p0); break;
edd309b7
JH
498 case OP_GSERVENT:
499 retptr = getservent(); break;
500 default:
0de8cad8 501 SETERRNO(ERANGE, LIB_INVARG);
edd309b7
JH
502 break;
503 }
504 }
505 }
506 break;
507#endif
508 default:
509 /* Not known how to retry, so just fail. */
510 break;
511 }
6148ee25
SP
512#else
513 PERL_UNUSED_ARG(f);
edd309b7 514#endif
369ec4b2 515 }
fe5bfecd 516 va_end(ap);
edd309b7
JH
517 return retptr;
518}
519
37442d52 520/* ex: set ro: */