reentrant buffers
[p5sagit/p5-mst-13.2.git] / reentr.c
CommitLineData
10bc17b6 1/*
2 * reentr.c
3 *
4 * Copyright (c) 1997-2002, Larry Wall
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 !!!!!!!
10 * This file is built by reentrl.pl from data in reentr.pl.
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 *
15 */
16
17#include "EXTERN.h"
18#define PERL_IN_REENTR_C
19#include "perl.h"
20#include "reentr.h"
21
22void
23Perl_reentrant_size(pTHX) {
24#ifdef USE_REENTRANT_API
8695fa85 25#define REENTRANTSMALLSIZE 256 /* Make something up. */
26#define REENTRANTUSUALSIZE 4096 /* Make something up. */
10bc17b6 27#ifdef HAS_ASCTIME_R
8695fa85 28 PL_reentrant_buffer->_asctime_size = REENTRANTSMALLSIZE;
10bc17b6 29#endif /* HAS_ASCTIME_R */
30#ifdef HAS_CRYPT_R
31#endif /* HAS_CRYPT_R */
32#ifdef HAS_CTIME_R
8695fa85 33 PL_reentrant_buffer->_ctime_size = REENTRANTSMALLSIZE;
10bc17b6 34#endif /* HAS_CTIME_R */
35#ifdef HAS_DRAND48_R
36#endif /* HAS_DRAND48_R */
37#ifdef HAS_GETGRNAM_R
f7937171 38# if defined(HAS_SYSCONF) && defined(_SC_GETPW_R_SIZE_MAX) && !defined(__GLIBC__)
39 PL_reentrant_buffer->_grent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
40 if (PL_reentrant_buffer->_pwent_size == -1)
41 PL_reentrant_buffer->_pwent_size = REENTRANTUSUALSIZE;
10bc17b6 42# else
43# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
f7937171 44 PL_reentrant_buffer->_grent_size = SIABUFSIZ;
10bc17b6 45# else
46# ifdef __sgi
f7937171 47 PL_reentrant_buffer->_grent_size = BUFSIZ;
10bc17b6 48# else
f7937171 49 PL_reentrant_buffer->_grent_size = REENTRANTUSUALSIZE;
10bc17b6 50# endif
51# endif
52# endif
53#endif /* HAS_GETGRNAM_R */
54#ifdef HAS_GETHOSTBYNAME_R
55#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 56 PL_reentrant_buffer->_hostent_size = REENTRANTUSUALSIZE;
10bc17b6 57#endif
58#endif /* HAS_GETHOSTBYNAME_R */
59#ifdef HAS_GETLOGIN_R
8695fa85 60 PL_reentrant_buffer->_getlogin_size = REENTRANTSMALLSIZE;
10bc17b6 61#endif /* HAS_GETLOGIN_R */
62#ifdef HAS_GETNETBYNAME_R
63#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 64 PL_reentrant_buffer->_netent_size = REENTRANTUSUALSIZE;
10bc17b6 65#endif
66#endif /* HAS_GETNETBYNAME_R */
67#ifdef HAS_GETPROTOBYNAME_R
68#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 69 PL_reentrant_buffer->_protoent_size = REENTRANTUSUALSIZE;
10bc17b6 70#endif
71#endif /* HAS_GETPROTOBYNAME_R */
72#ifdef HAS_GETPWNAM_R
73# if defined(HAS_SYSCONF) && defined(_SC_GETPW_R_SIZE_MAX) && !defined(__GLIBC__)
f7937171 74 PL_reentrant_buffer->_pwent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
75 if (PL_reentrant_buffer->_pwent_size == -1)
76 PL_reentrant_buffer->_pwent_size = REENTRANTUSUALSIZE;
10bc17b6 77# else
78# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
f7937171 79 PL_reentrant_buffer->_pwent_size = SIABUFSIZ;
10bc17b6 80# else
81# ifdef __sgi
f7937171 82 PL_reentrant_buffer->_pwent_size = BUFSIZ;
10bc17b6 83# else
f7937171 84 PL_reentrant_buffer->_pwent_size = REENTRANTUSUALSIZE;
10bc17b6 85# endif
86# endif
87# endif
88#endif /* HAS_GETPWNAM_R */
89#ifdef HAS_GETSERVBYNAME_R
90#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 91 PL_reentrant_buffer->_servent_size = REENTRANTUSUALSIZE;
10bc17b6 92#endif
93#endif /* HAS_GETSERVBYNAME_R */
94#ifdef HAS_GETSPNAM_R
f7937171 95# if defined(HAS_SYSCONF) && defined(_SC_GETPW_R_SIZE_MAX) && !defined(__GLIBC__)
96 PL_reentrant_buffer->_spent_size = sysconf(_SC_GETPW_R_SIZE_MAX);
97 if (PL_reentrant_buffer->_pwent_size == -1)
98 PL_reentrant_buffer->_pwent_size = REENTRANTUSUALSIZE;
99# else
100# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
101 PL_reentrant_buffer->_spent_size = SIABUFSIZ;
102# else
103# ifdef __sgi
104 PL_reentrant_buffer->_spent_size = BUFSIZ;
105# else
106 PL_reentrant_buffer->_spent_size = REENTRANTUSUALSIZE;
107# endif
108# endif
109# endif
10bc17b6 110#endif /* HAS_GETSPNAM_R */
111#ifdef HAS_GMTIME_R
112#endif /* HAS_GMTIME_R */
113#ifdef HAS_LOCALTIME_R
114#endif /* HAS_LOCALTIME_R */
115#ifdef HAS_RANDOM_R
116#endif /* HAS_RANDOM_R */
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 129#endif /* HAS_SETLOCALE_R */
130#ifdef HAS_STRERROR_R
8695fa85 131 PL_reentrant_buffer->_strerror_size = REENTRANTSMALLSIZE;
10bc17b6 132#endif /* HAS_STRERROR_R */
133#ifdef HAS_TTYNAME_R
8695fa85 134 PL_reentrant_buffer->_ttyname_size = REENTRANTSMALLSIZE;
10bc17b6 135#endif /* HAS_TTYNAME_R */
136
137#endif /* USE_REENTRANT_API */
138}
139
140void
141Perl_reentrant_init(pTHX) {
142#ifdef USE_REENTRANT_API
143 New(31337, PL_reentrant_buffer, 1, REENTR);
144 Perl_reentrant_size(aTHX);
145#ifdef HAS_ASCTIME_R
146 New(31338, PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size, char);
147#endif /* HAS_ASCTIME_R */
148#ifdef HAS_CRYPT_R
149#ifdef __GLIBC__
150 PL_reentrant_buffer->_crypt_struct.initialized = 0;
d5abad05 151 /* work around glibc-2.2.5 bug */
152 PL_reentrant_buffer->_crypt_struct.current_saltbits = 0;
10bc17b6 153#endif
154#endif /* HAS_CRYPT_R */
155#ifdef HAS_CTIME_R
156 New(31338, PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size, char);
157#endif /* HAS_CTIME_R */
158#ifdef HAS_DRAND48_R
159#endif /* HAS_DRAND48_R */
160#ifdef HAS_GETGRNAM_R
f7937171 161# ifdef USE_GRENT_FPTR
162 PL_reentrant_buffer->_grent_fptr = NULL;
10bc17b6 163# endif
f7937171 164 New(31338, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, char);
10bc17b6 165#endif /* HAS_GETGRNAM_R */
166#ifdef HAS_GETHOSTBYNAME_R
167#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 168 New(31338, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, char);
10bc17b6 169#endif
170#endif /* HAS_GETHOSTBYNAME_R */
171#ifdef HAS_GETLOGIN_R
172 New(31338, PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size, char);
173#endif /* HAS_GETLOGIN_R */
174#ifdef HAS_GETNETBYNAME_R
175#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 176 New(31338, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, char);
10bc17b6 177#endif
178#endif /* HAS_GETNETBYNAME_R */
179#ifdef HAS_GETPROTOBYNAME_R
180#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 181 New(31338, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, char);
10bc17b6 182#endif
183#endif /* HAS_GETPROTOBYNAME_R */
184#ifdef HAS_GETPWNAM_R
f7937171 185# ifdef USE_PWENT_FPTR
186 PL_reentrant_buffer->_pwent_fptr = NULL;
10bc17b6 187# endif
f7937171 188 New(31338, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, char);
10bc17b6 189#endif /* HAS_GETPWNAM_R */
190#ifdef HAS_GETSERVBYNAME_R
191#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 192 New(31338, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, char);
10bc17b6 193#endif
194#endif /* HAS_GETSERVBYNAME_R */
195#ifdef HAS_GETSPNAM_R
f7937171 196# ifdef USE_SPENT_FPTR
197 PL_reentrant_buffer->_spent_fptr = NULL;
198# endif
199 New(31338, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, char);
10bc17b6 200#endif /* HAS_GETSPNAM_R */
201#ifdef HAS_GMTIME_R
202#endif /* HAS_GMTIME_R */
203#ifdef HAS_LOCALTIME_R
204#endif /* HAS_LOCALTIME_R */
205#ifdef HAS_RANDOM_R
206#endif /* HAS_RANDOM_R */
207#ifdef HAS_READDIR_R
208 PL_reentrant_buffer->_readdir_struct = (struct dirent*)safemalloc(PL_reentrant_buffer->_readdir_size);
209#endif /* HAS_READDIR_R */
210#ifdef HAS_READDIR64_R
211 PL_reentrant_buffer->_readdir64_struct = (struct dirent64*)safemalloc(PL_reentrant_buffer->_readdir64_size);
212#endif /* HAS_READDIR64_R */
213#ifdef HAS_SETLOCALE_R
214 New(31338, PL_reentrant_buffer->_setlocale_buffer, PL_reentrant_buffer->_setlocale_size, char);
215#endif /* HAS_SETLOCALE_R */
216#ifdef HAS_STRERROR_R
217 New(31338, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size, char);
218#endif /* HAS_STRERROR_R */
219#ifdef HAS_TTYNAME_R
220 New(31338, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size, char);
221#endif /* HAS_TTYNAME_R */
222
223#endif /* USE_REENTRANT_API */
224}
225
226void
227Perl_reentrant_free(pTHX) {
228#ifdef USE_REENTRANT_API
229#ifdef HAS_ASCTIME_R
230 Safefree(PL_reentrant_buffer->_asctime_buffer);
231#endif /* HAS_ASCTIME_R */
232#ifdef HAS_CRYPT_R
233#endif /* HAS_CRYPT_R */
234#ifdef HAS_CTIME_R
235 Safefree(PL_reentrant_buffer->_ctime_buffer);
236#endif /* HAS_CTIME_R */
237#ifdef HAS_DRAND48_R
238#endif /* HAS_DRAND48_R */
239#ifdef HAS_GETGRNAM_R
f7937171 240 Safefree(PL_reentrant_buffer->_grent_buffer);
10bc17b6 241#endif /* HAS_GETGRNAM_R */
242#ifdef HAS_GETHOSTBYNAME_R
243#if !(GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 244 Safefree(PL_reentrant_buffer->_hostent_buffer);
10bc17b6 245#endif
246#endif /* HAS_GETHOSTBYNAME_R */
247#ifdef HAS_GETLOGIN_R
248 Safefree(PL_reentrant_buffer->_getlogin_buffer);
249#endif /* HAS_GETLOGIN_R */
250#ifdef HAS_GETNETBYNAME_R
251#if !(GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 252 Safefree(PL_reentrant_buffer->_netent_buffer);
10bc17b6 253#endif
254#endif /* HAS_GETNETBYNAME_R */
255#ifdef HAS_GETPROTOBYNAME_R
256#if !(GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD)
f7937171 257 Safefree(PL_reentrant_buffer->_protoent_buffer);
10bc17b6 258#endif
259#endif /* HAS_GETPROTOBYNAME_R */
260#ifdef HAS_GETPWNAM_R
f7937171 261 Safefree(PL_reentrant_buffer->_pwent_buffer);
10bc17b6 262#endif /* HAS_GETPWNAM_R */
263#ifdef HAS_GETSERVBYNAME_R
264#if !(GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD)
f7937171 265 Safefree(PL_reentrant_buffer->_servent_buffer);
10bc17b6 266#endif
267#endif /* HAS_GETSERVBYNAME_R */
268#ifdef HAS_GETSPNAM_R
f7937171 269 Safefree(PL_reentrant_buffer->_spent_buffer);
10bc17b6 270#endif /* HAS_GETSPNAM_R */
271#ifdef HAS_GMTIME_R
272#endif /* HAS_GMTIME_R */
273#ifdef HAS_LOCALTIME_R
274#endif /* HAS_LOCALTIME_R */
275#ifdef HAS_RANDOM_R
276#endif /* HAS_RANDOM_R */
277#ifdef HAS_READDIR_R
278 Safefree(PL_reentrant_buffer->_readdir_struct);
279#endif /* HAS_READDIR_R */
280#ifdef HAS_READDIR64_R
281 Safefree(PL_reentrant_buffer->_readdir64_struct);
282#endif /* HAS_READDIR64_R */
283#ifdef HAS_SETLOCALE_R
284 Safefree(PL_reentrant_buffer->_setlocale_buffer);
285#endif /* HAS_SETLOCALE_R */
286#ifdef HAS_STRERROR_R
287 Safefree(PL_reentrant_buffer->_strerror_buffer);
288#endif /* HAS_STRERROR_R */
289#ifdef HAS_TTYNAME_R
290 Safefree(PL_reentrant_buffer->_ttyname_buffer);
291#endif /* HAS_TTYNAME_R */
292
293 Safefree(PL_reentrant_buffer);
294#endif /* USE_REENTRANT_API */
295}
296
edd309b7 297void*
298Perl_reentrant_retry(const char *f, ...)
299{
300 dTHX;
301 void *retptr = NULL;
302#ifdef USE_REENTRANT_API
f7937171 303# if defined(USE_HOSTENT_BUFFER) || defined(USE_GRENT_BUFFER) || defined(USE_NETENT_BUFFER) || defined(USE_PWENT_BUFFER) || defined(USE_PROTOENT_BUFFER) || defined(USE_SRVENT_BUFFER)
e3410746 304 void *p0;
305# endif
f7937171 306# if defined(USE_SERVENT_BUFFER)
e3410746 307 void *p1;
308# endif
f7937171 309# if defined(USE_HOSTENT_BUFFER)
edd309b7 310 size_t asize;
e3410746 311# endif
f7937171 312# if defined(USE_HOSTENT_BUFFER) || defined(USE_NETENT_BUFFER) || defined(USE_PROTOENT_BUFFER) || defined(USE_SERVENT_BUFFER)
edd309b7 313 int anint;
e3410746 314# endif
af685957 315#ifdef PERL_REENTRANT_MAXSIZE
316 static const char larger[] = "Result from %s larger than %d bytes";
317#endif
edd309b7 318 va_list ap;
319
320 va_start(ap, f);
321
edd309b7 322 switch (PL_op->op_type) {
f7937171 323#ifdef USE_HOSTENT_BUFFER
edd309b7 324 case OP_GHBYADDR:
325 case OP_GHBYNAME:
326 case OP_GHOSTENT:
327 {
af685957 328#ifdef PERL_REENTRANT_MAXSIZE
329 if (PL_reentrant_buffer->_hostent_size <=
330 PERL_REENTRANT_MAXSIZE / 2)
331#endif
332 {
f7937171 333 PL_reentrant_buffer->_hostent_size *= 2;
334 Renew(PL_reentrant_buffer->_hostent_buffer,
335 PL_reentrant_buffer->_hostent_size, char);
edd309b7 336 switch (PL_op->op_type) {
337 case OP_GHBYADDR:
338 p0 = va_arg(ap, void *);
339 asize = va_arg(ap, size_t);
340 anint = va_arg(ap, int);
341 retptr = gethostbyaddr(p0, asize, anint); break;
342 case OP_GHBYNAME:
343 p0 = va_arg(ap, void *);
344 retptr = gethostbyname(p0); break;
345 case OP_GHOSTENT:
346 retptr = gethostent(); break;
347 default:
348 break;
349 }
350 }
351 }
352 break;
353#endif
f7937171 354#ifdef USE_GRENT_BUFFER
edd309b7 355 case OP_GGRNAM:
356 case OP_GGRGID:
357 case OP_GGRENT:
358 {
af685957 359#ifdef PERL_REENTRANT_MAXSIZE
360 if (PL_reentrant_buffer->_grent_size <=
361 PERL_REENTRANT_MAXSIZE / 2)
362#endif
363 {
edd309b7 364 Gid_t gid;
f7937171 365 PL_reentrant_buffer->_grent_size *= 2;
366 Renew(PL_reentrant_buffer->_grent_buffer,
367 PL_reentrant_buffer->_grent_size, char);
edd309b7 368 switch (PL_op->op_type) {
369 case OP_GGRNAM:
370 p0 = va_arg(ap, void *);
371 retptr = getgrnam(p0); break;
372 case OP_GGRGID:
373 gid = va_arg(ap, Gid_t);
374 retptr = getgrgid(gid); break;
375 case OP_GGRENT:
376 retptr = getgrent(); break;
377 default:
378 break;
379 }
380 }
381 }
382 break;
383#endif
f7937171 384#ifdef USE_NETENT_BUFFER
edd309b7 385 case OP_GNBYADDR:
386 case OP_GNBYNAME:
387 case OP_GNETENT:
388 {
af685957 389#ifdef PERL_REENTRANT_MAXSIZE
390 if (PL_reentrant_buffer->_netent_size <=
391 PERL_REENTRANT_MAXSIZE / 2)
392#endif
393 {
edd309b7 394 Netdb_net_t net;
f7937171 395 PL_reentrant_buffer->_netent_size *= 2;
396 Renew(PL_reentrant_buffer->_netent_buffer,
397 PL_reentrant_buffer->_netent_size, char);
edd309b7 398 switch (PL_op->op_type) {
399 case OP_GNBYADDR:
400 net = va_arg(ap, Netdb_net_t);
401 anint = va_arg(ap, int);
402 retptr = getnetbyaddr(net, anint); break;
403 case OP_GNBYNAME:
404 p0 = va_arg(ap, void *);
405 retptr = getnetbyname(p0); break;
406 case OP_GNETENT:
407 retptr = getnetent(); break;
408 default:
409 break;
410 }
411 }
af685957 412#ifdef PERL_REENTRANT_MAXSIZE
413 else if (ckWARN(WARN_MISC))
414 Perl_warner(aTHX_ packWARN(WARN_MISC),
415 larger, OP_NAME(PL_op), PERL_REENTRANT_MAXSIZE);
416#endif
edd309b7 417 }
418 break;
419#endif
f7937171 420#ifdef USE_PWENT_BUFFER
edd309b7 421 case OP_GPWNAM:
422 case OP_GPWUID:
423 case OP_GPWENT:
424 {
af685957 425#ifdef PERL_REENTRANT_MAXSIZE
426 if (PL_reentrant_buffer->_pwent_size <=
427 PERL_REENTRANT_MAXSIZE / 2)
428#endif
429 {
edd309b7 430 Uid_t uid;
f7937171 431 PL_reentrant_buffer->_pwent_size *= 2;
432 Renew(PL_reentrant_buffer->_pwent_buffer,
433 PL_reentrant_buffer->_pwent_size, char);
edd309b7 434 switch (PL_op->op_type) {
435 case OP_GPWNAM:
436 p0 = va_arg(ap, void *);
437 retptr = getpwnam(p0); break;
438 case OP_GPWUID:
439 uid = va_arg(ap, Uid_t);
440 retptr = getpwuid(uid); break;
441 case OP_GPWENT:
442 retptr = getpwent(); break;
443 default:
444 break;
445 }
446 }
af685957 447#ifdef PERL_REENTRANT_MAXSIZE
448 else if (ckWARN(WARN_MISC))
449 Perl_warner(aTHX_ packWARN(WARN_MISC),
450 larger, OP_NAME(PL_op), PERL_REENTRANT_MAXSIZE);
451#endif
edd309b7 452 }
453 break;
454#endif
f7937171 455#ifdef USE_PROTOENT_BUFFER
edd309b7 456 case OP_GPBYNAME:
457 case OP_GPBYNUMBER:
458 case OP_GPROTOENT:
459 {
af685957 460#ifdef PERL_REENTRANT_MAXSIZE
461 if (PL_reentrant_buffer->_protoent_size <=
462 PERL_REENTRANT_MAXSIZE / 2)
463#endif
464 {
f7937171 465 PL_reentrant_buffer->_protoent_size *= 2;
466 Renew(PL_reentrant_buffer->_protoent_buffer,
467 PL_reentrant_buffer->_protoent_size, char);
edd309b7 468 switch (PL_op->op_type) {
469 case OP_GPBYNAME:
470 p0 = va_arg(ap, void *);
471 retptr = getprotobyname(p0); break;
472 case OP_GPBYNUMBER:
473 anint = va_arg(ap, int);
474 retptr = getprotobynumber(anint); break;
475 case OP_GPROTOENT:
476 retptr = getprotoent(); break;
477 default:
478 break;
479 }
480 }
af685957 481#ifdef PERL_REENTRANT_MAXSIZE
482 else if (ckWARN(WARN_MISC))
483 Perl_warner(aTHX_ packWARN(WARN_MISC),
484 larger, OP_NAME(PL_op), PERL_REENTRANT_MAXSIZE);
485#endif
edd309b7 486 }
487 break;
488#endif
f7937171 489#ifdef USE_SERVENT_BUFFER
edd309b7 490 case OP_GSBYNAME:
491 case OP_GSBYPORT:
492 case OP_GSERVENT:
493 {
af685957 494#ifdef PERL_REENTRANT_MAXSIZE
495 if (PL_reentrant_buffer->_servent_size <=
496 PERL_REENTRANT_MAXSIZE / 2)
497#endif
498 {
f7937171 499 PL_reentrant_buffer->_servent_size *= 2;
500 Renew(PL_reentrant_buffer->_servent_buffer,
501 PL_reentrant_buffer->_servent_size, char);
edd309b7 502 switch (PL_op->op_type) {
503 case OP_GSBYNAME:
504 p0 = va_arg(ap, void *);
505 p1 = va_arg(ap, void *);
506 retptr = getservbyname(p0, p1); break;
507 case OP_GSBYPORT:
508 anint = va_arg(ap, int);
509 p0 = va_arg(ap, void *);
510 retptr = getservbyport(anint, p0); break;
511 case OP_GSERVENT:
512 retptr = getservent(); break;
513 default:
514 break;
515 }
516 }
af685957 517#ifdef PERL_REENTRANT_MAXSIZE
518 else if (ckWARN(WARN_MISC))
519 Perl_warner(aTHX_ packWARN(WARN_MISC),
520 larger, OP_NAME(PL_op), PERL_REENTRANT_MAXSIZE);
521#endif
edd309b7 522 }
523 break;
524#endif
525 default:
526 /* Not known how to retry, so just fail. */
527 break;
528 }
529
530 va_end(ap);
531#endif
532 return retptr;
533}
534