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