This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
For the rare case of EMFILE during require, save object code space
[perl5.git] / util.c
CommitLineData
a0d0e21e 1/* util.c
a687059c 2 *
4bb101f2 3 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
770526c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
a687059c 5 *
d48672a2
LW
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.
8d063cd8 8 *
8d063cd8 9 */
a0d0e21e
LW
10
11/*
12 * "Very useful, no doubt, that was to Saruman; yet it seems that he was
13 * not content." --Gandalf
14 */
8d063cd8 15
166f8a29
DM
16/* This file contains assorted utility routines.
17 * Which is a polite way of saying any stuff that people couldn't think of
18 * a better place for. Amongst other things, it includes the warning and
19 * dieing stuff, plus wrappers for malloc code.
20 */
21
8d063cd8 22#include "EXTERN.h"
864dbfa3 23#define PERL_IN_UTIL_C
8d063cd8 24#include "perl.h"
62b28dd9 25
64ca3a65 26#ifndef PERL_MICRO
a687059c 27#include <signal.h>
36477c24 28#ifndef SIG_ERR
29# define SIG_ERR ((Sighandler_t) -1)
30#endif
64ca3a65 31#endif
36477c24 32
172d2248
OS
33#ifdef __Lynx__
34/* Missing protos on LynxOS */
35int putenv(char *);
36#endif
37
ff68c719 38#ifdef I_SYS_WAIT
39# include <sys/wait.h>
40#endif
41
868439a2
JH
42#ifdef HAS_SELECT
43# ifdef I_SYS_SELECT
44# include <sys/select.h>
45# endif
46#endif
47
8d063cd8 48#define FLUSH
8d063cd8 49
16cebae2
GS
50#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
51# define FD_CLOEXEC 1 /* NeXT needs this */
52#endif
53
a687059c
LW
54/* NOTE: Do not call the next three routines directly. Use the macros
55 * in handy.h, so that we can easily redefine everything to do tracking of
56 * allocated hunks back to the original New to track down any memory leaks.
20cec16a 57 * XXX This advice seems to be widely ignored :-( --AD August 1996.
a687059c
LW
58 */
59
ca8d8976
NC
60static char *
61S_write_no_mem(pTHX)
62{
63 /* Can't use PerlIO to write as it allocates memory */
64 PerlLIO_write(PerlIO_fileno(Perl_error_log),
65 PL_no_mem, strlen(PL_no_mem));
66 my_exit(1);
1f440eb2 67 NORETURN_FUNCTION_END;
ca8d8976
NC
68}
69
26fa51c3
AMS
70/* paranoid version of system's malloc() */
71
bd4080b3 72Malloc_t
4f63d024 73Perl_safesysmalloc(MEM_SIZE size)
8d063cd8 74{
54aff467 75 dTHX;
bd4080b3 76 Malloc_t ptr;
55497cff 77#ifdef HAS_64K_LIMIT
62b28dd9 78 if (size > 0xffff) {
bf49b057 79 PerlIO_printf(Perl_error_log,
16cebae2 80 "Allocation too large: %lx\n", size) FLUSH;
54aff467 81 my_exit(1);
62b28dd9 82 }
55497cff 83#endif /* HAS_64K_LIMIT */
e8dda941
JD
84#ifdef PERL_TRACK_MEMPOOL
85 size += sTHX;
86#endif
34de22dd
LW
87#ifdef DEBUGGING
88 if ((long)size < 0)
4f63d024 89 Perl_croak_nocontext("panic: malloc");
34de22dd 90#endif
12ae5dfc 91 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
da927450 92 PERL_ALLOC_CHECK(ptr);
97835f67 93 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
e8dda941
JD
94 if (ptr != Nullch) {
95#ifdef PERL_TRACK_MEMPOOL
731dcb42 96 ((struct perl_memory_debug_header *)ptr)->interpreter = aTHX;
cd1541b2
NC
97# ifdef PERL_POISON
98 ((struct perl_memory_debug_header *)ptr)->size = size;
99 ((struct perl_memory_debug_header *)ptr)->in_use = PERL_POISON_INUSE;
100# endif
e8dda941
JD
101 ptr = (Malloc_t)((char*)ptr+sTHX);
102#endif
8d063cd8 103 return ptr;
e8dda941 104}
3280af22 105 else if (PL_nomemok)
7c0587c8 106 return Nullch;
8d063cd8 107 else {
0bd48802 108 return write_no_mem();
8d063cd8
LW
109 }
110 /*NOTREACHED*/
111}
112
f2517201 113/* paranoid version of system's realloc() */
8d063cd8 114
bd4080b3 115Malloc_t
4f63d024 116Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
8d063cd8 117{
54aff467 118 dTHX;
bd4080b3 119 Malloc_t ptr;
9a34ef1d 120#if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
6ad3d225 121 Malloc_t PerlMem_realloc();
ecfc5424 122#endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
8d063cd8 123
a1d180c4 124#ifdef HAS_64K_LIMIT
5f05dabc 125 if (size > 0xffff) {
bf49b057 126 PerlIO_printf(Perl_error_log,
5f05dabc 127 "Reallocation too large: %lx\n", size) FLUSH;
54aff467 128 my_exit(1);
5f05dabc 129 }
55497cff 130#endif /* HAS_64K_LIMIT */
7614df0c 131 if (!size) {
f2517201 132 safesysfree(where);
7614df0c
JD
133 return NULL;
134 }
135
378cc40b 136 if (!where)
f2517201 137 return safesysmalloc(size);
e8dda941
JD
138#ifdef PERL_TRACK_MEMPOOL
139 where = (Malloc_t)((char*)where-sTHX);
140 size += sTHX;
731dcb42 141 if (((struct perl_memory_debug_header *)where)->interpreter != aTHX) {
e8dda941
JD
142 /* int *nowhere = NULL; *nowhere = 0; */
143 Perl_croak_nocontext("panic: realloc from wrong pool");
144 }
cd1541b2
NC
145# ifdef PERL_POISON
146 ((struct perl_memory_debug_header *)where)->size = size;
147 /* FIXME poison the end if it gets shorter. */
148# endif
e8dda941 149#endif
34de22dd
LW
150#ifdef DEBUGGING
151 if ((long)size < 0)
4f63d024 152 Perl_croak_nocontext("panic: realloc");
34de22dd 153#endif
12ae5dfc 154 ptr = (Malloc_t)PerlMem_realloc(where,size);
da927450 155 PERL_ALLOC_CHECK(ptr);
a1d180c4 156
97835f67
JH
157 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
158 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
79072805 159
e8dda941
JD
160 if (ptr != Nullch) {
161#ifdef PERL_TRACK_MEMPOOL
162 ptr = (Malloc_t)((char*)ptr+sTHX);
163#endif
8d063cd8 164 return ptr;
e8dda941 165 }
3280af22 166 else if (PL_nomemok)
7c0587c8 167 return Nullch;
8d063cd8 168 else {
0bd48802 169 return write_no_mem();
8d063cd8
LW
170 }
171 /*NOTREACHED*/
172}
173
f2517201 174/* safe version of system's free() */
8d063cd8 175
54310121 176Free_t
4f63d024 177Perl_safesysfree(Malloc_t where)
8d063cd8 178{
27da23d5 179 dVAR;
e8dda941 180#if defined(PERL_IMPLICIT_SYS) || defined(PERL_TRACK_MEMPOOL)
54aff467 181 dTHX;
155aba94 182#endif
97835f67 183 DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
378cc40b 184 if (where) {
e8dda941
JD
185#ifdef PERL_TRACK_MEMPOOL
186 where = (Malloc_t)((char*)where-sTHX);
731dcb42 187 if (((struct perl_memory_debug_header *)where)->interpreter != aTHX) {
e8dda941
JD
188 /* int *nowhere = NULL; *nowhere = 0; */
189 Perl_croak_nocontext("panic: free from wrong pool");
190 }
cd1541b2
NC
191# ifdef PERL_POISON
192 {
193 if (((struct perl_memory_debug_header *)where)->in_use
194 == PERL_POISON_FREE) {
195 Perl_croak_nocontext("panic: duplicate free");
196 }
197 if (((struct perl_memory_debug_header *)where)->in_use
198 != PERL_POISON_INUSE) {
199 Perl_croak_nocontext("panic: bad free ");
200 }
201 ((struct perl_memory_debug_header *)where)->in_use
202 = PERL_POISON_FREE;
203 }
204 Poison(where, ((struct perl_memory_debug_header *)where)->size, char);
205# endif
e8dda941 206#endif
6ad3d225 207 PerlMem_free(where);
378cc40b 208 }
8d063cd8
LW
209}
210
f2517201 211/* safe version of system's calloc() */
1050c9ca 212
bd4080b3 213Malloc_t
4f63d024 214Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
1050c9ca 215{
54aff467 216 dTHX;
bd4080b3 217 Malloc_t ptr;
1050c9ca 218
55497cff 219#ifdef HAS_64K_LIMIT
5f05dabc 220 if (size * count > 0xffff) {
bf49b057 221 PerlIO_printf(Perl_error_log,
5f05dabc 222 "Allocation too large: %lx\n", size * count) FLUSH;
54aff467 223 my_exit(1);
5f05dabc 224 }
55497cff 225#endif /* HAS_64K_LIMIT */
1050c9ca 226#ifdef DEBUGGING
227 if ((long)size < 0 || (long)count < 0)
4f63d024 228 Perl_croak_nocontext("panic: calloc");
1050c9ca 229#endif
0b7c1c42 230 size *= count;
e8dda941
JD
231#ifdef PERL_TRACK_MEMPOOL
232 size += sTHX;
233#endif
12ae5dfc 234 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
da927450 235 PERL_ALLOC_CHECK(ptr);
97835f67 236 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) calloc %ld x %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)count,(long)size));
1050c9ca 237 if (ptr != Nullch) {
238 memset((void*)ptr, 0, size);
e8dda941 239#ifdef PERL_TRACK_MEMPOOL
731dcb42 240 ((struct perl_memory_debug_header *)ptr)->interpreter = aTHX;
cd1541b2
NC
241# ifdef PERL_POISON
242 ((struct perl_memory_debug_header *)ptr)->size = size;
243 ((struct perl_memory_debug_header *)ptr)->in_use = PERL_POISON_INUSE;
244# endif
e8dda941
JD
245 ptr = (Malloc_t)((char*)ptr+sTHX);
246#endif
1050c9ca 247 return ptr;
248 }
3280af22 249 else if (PL_nomemok)
1050c9ca 250 return Nullch;
0bd48802 251 return write_no_mem();
1050c9ca 252}
253
cae6d0e5
GS
254/* These must be defined when not using Perl's malloc for binary
255 * compatibility */
256
257#ifndef MYMALLOC
258
259Malloc_t Perl_malloc (MEM_SIZE nbytes)
260{
261 dTHXs;
077a72a9 262 return (Malloc_t)PerlMem_malloc(nbytes);
cae6d0e5
GS
263}
264
265Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
266{
267 dTHXs;
077a72a9 268 return (Malloc_t)PerlMem_calloc(elements, size);
cae6d0e5
GS
269}
270
271Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
272{
273 dTHXs;
077a72a9 274 return (Malloc_t)PerlMem_realloc(where, nbytes);
cae6d0e5
GS
275}
276
277Free_t Perl_mfree (Malloc_t where)
278{
279 dTHXs;
280 PerlMem_free(where);
281}
282
283#endif
284
8d063cd8
LW
285/* copy a string up to some (non-backslashed) delimiter, if any */
286
287char *
e1ec3a88 288Perl_delimcpy(pTHX_ register char *to, register const char *toend, register const char *from, register const char *fromend, register int delim, I32 *retlen)
8d063cd8 289{
fc36a67e 290 register I32 tolen;
291 for (tolen = 0; from < fromend; from++, tolen++) {
378cc40b
LW
292 if (*from == '\\') {
293 if (from[1] == delim)
294 from++;
fc36a67e 295 else {
296 if (to < toend)
297 *to++ = *from;
298 tolen++;
299 from++;
300 }
378cc40b 301 }
bedebaa5 302 else if (*from == delim)
8d063cd8 303 break;
fc36a67e 304 if (to < toend)
305 *to++ = *from;
8d063cd8 306 }
bedebaa5
CS
307 if (to < toend)
308 *to = '\0';
fc36a67e 309 *retlen = tolen;
73d840c0 310 return (char *)from;
8d063cd8
LW
311}
312
313/* return ptr to little string in big string, NULL if not found */
378cc40b 314/* This routine was donated by Corey Satten. */
8d063cd8
LW
315
316char *
864dbfa3 317Perl_instr(pTHX_ register const char *big, register const char *little)
378cc40b 318{
79072805 319 register I32 first;
378cc40b 320
a687059c 321 if (!little)
08105a92 322 return (char*)big;
a687059c 323 first = *little++;
378cc40b 324 if (!first)
08105a92 325 return (char*)big;
378cc40b 326 while (*big) {
66a1b24b 327 register const char *s, *x;
378cc40b
LW
328 if (*big++ != first)
329 continue;
330 for (x=big,s=little; *s; /**/ ) {
331 if (!*x)
332 return Nullch;
4fc877ac 333 if (*s != *x)
378cc40b 334 break;
4fc877ac
AL
335 else {
336 s++;
337 x++;
378cc40b
LW
338 }
339 }
340 if (!*s)
08105a92 341 return (char*)(big-1);
378cc40b
LW
342 }
343 return Nullch;
344}
8d063cd8 345
a687059c
LW
346/* same as instr but allow embedded nulls */
347
348char *
864dbfa3 349Perl_ninstr(pTHX_ register const char *big, register const char *bigend, const char *little, const char *lend)
8d063cd8 350{
e1ec3a88 351 register const I32 first = *little;
7452cf6a 352 register const char * const littleend = lend;
378cc40b 353
a0d0e21e 354 if (!first && little >= littleend)
08105a92 355 return (char*)big;
de3bb511
LW
356 if (bigend - big < littleend - little)
357 return Nullch;
a687059c
LW
358 bigend -= littleend - little++;
359 while (big <= bigend) {
66a1b24b 360 register const char *s, *x;
a687059c
LW
361 if (*big++ != first)
362 continue;
363 for (x=big,s=little; s < littleend; /**/ ) {
4fc877ac 364 if (*s != *x)
a687059c 365 break;
4fc877ac
AL
366 else {
367 s++;
368 x++;
a687059c
LW
369 }
370 }
371 if (s >= littleend)
08105a92 372 return (char*)(big-1);
378cc40b 373 }
a687059c
LW
374 return Nullch;
375}
376
377/* reverse of the above--find last substring */
378
379char *
864dbfa3 380Perl_rninstr(pTHX_ register const char *big, const char *bigend, const char *little, const char *lend)
a687059c 381{
08105a92 382 register const char *bigbeg;
e1ec3a88 383 register const I32 first = *little;
7452cf6a 384 register const char * const littleend = lend;
a687059c 385
a0d0e21e 386 if (!first && little >= littleend)
08105a92 387 return (char*)bigend;
a687059c
LW
388 bigbeg = big;
389 big = bigend - (littleend - little++);
390 while (big >= bigbeg) {
66a1b24b 391 register const char *s, *x;
a687059c
LW
392 if (*big-- != first)
393 continue;
394 for (x=big+2,s=little; s < littleend; /**/ ) {
4fc877ac 395 if (*s != *x)
a687059c 396 break;
4fc877ac
AL
397 else {
398 x++;
399 s++;
a687059c
LW
400 }
401 }
402 if (s >= littleend)
08105a92 403 return (char*)(big+1);
378cc40b 404 }
a687059c 405 return Nullch;
378cc40b 406}
a687059c 407
cf93c79d
IZ
408#define FBM_TABLE_OFFSET 2 /* Number of bytes between EOS and table*/
409
410/* As a space optimization, we do not compile tables for strings of length
411 0 and 1, and for strings of length 2 unless FBMcf_TAIL. These are
412 special-cased in fbm_instr().
413
414 If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
415
954c1994 416/*
ccfc67b7
JH
417=head1 Miscellaneous Functions
418
954c1994
GS
419=for apidoc fbm_compile
420
421Analyses the string in order to make fast searches on it using fbm_instr()
422-- the Boyer-Moore algorithm.
423
424=cut
425*/
426
378cc40b 427void
7506f9c3 428Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
378cc40b 429{
0d46e09a 430 register const U8 *s;
79072805 431 register U32 i;
0b71040e 432 STRLEN len;
79072805
LW
433 I32 rarest = 0;
434 U32 frequency = 256;
435
c517dc2b 436 if (flags & FBMcf_TAIL) {
890ce7af 437 MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
cf93c79d 438 sv_catpvn(sv, "\n", 1); /* Taken into account in fbm_instr() */
c517dc2b
JH
439 if (mg && mg->mg_len >= 0)
440 mg->mg_len++;
441 }
9cbe880b 442 s = (U8*)SvPV_force_mutable(sv, len);
862a34c6 443 SvUPGRADE(sv, SVt_PVBM);
d1be9408 444 if (len == 0) /* TAIL might be on a zero-length string. */
cf93c79d 445 return;
02128f11 446 if (len > 2) {
9cbe880b 447 const unsigned char *sb;
66a1b24b 448 const U8 mlen = (len>255) ? 255 : (U8)len;
890ce7af 449 register U8 *table;
cf93c79d 450
7506f9c3 451 Sv_Grow(sv, len + 256 + FBM_TABLE_OFFSET);
9cbe880b 452 table = (unsigned char*)(SvPVX_mutable(sv) + len + FBM_TABLE_OFFSET);
7506f9c3
GS
453 s = table - 1 - FBM_TABLE_OFFSET; /* last char */
454 memset((void*)table, mlen, 256);
455 table[-1] = (U8)flags;
02128f11 456 i = 0;
7506f9c3 457 sb = s - mlen + 1; /* first char (maybe) */
cf93c79d
IZ
458 while (s >= sb) {
459 if (table[*s] == mlen)
7506f9c3 460 table[*s] = (U8)i;
cf93c79d
IZ
461 s--, i++;
462 }
378cc40b 463 }
14befaf4 464 sv_magic(sv, Nullsv, PERL_MAGIC_bm, Nullch, 0); /* deep magic */
79072805 465 SvVALID_on(sv);
378cc40b 466
9cbe880b 467 s = (const unsigned char*)(SvPVX_const(sv)); /* deeper magic */
bbce6d69 468 for (i = 0; i < len; i++) {
22c35a8c 469 if (PL_freq[s[i]] < frequency) {
bbce6d69 470 rarest = i;
22c35a8c 471 frequency = PL_freq[s[i]];
378cc40b
LW
472 }
473 }
79072805 474 BmRARE(sv) = s[rarest];
eb160463 475 BmPREVIOUS(sv) = (U16)rarest;
cf93c79d
IZ
476 BmUSEFUL(sv) = 100; /* Initial value */
477 if (flags & FBMcf_TAIL)
478 SvTAIL_on(sv);
7506f9c3
GS
479 DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %d\n",
480 BmRARE(sv),BmPREVIOUS(sv)));
378cc40b
LW
481}
482
cf93c79d
IZ
483/* If SvTAIL(littlestr), it has a fake '\n' at end. */
484/* If SvTAIL is actually due to \Z or \z, this gives false positives
485 if multiline */
486
954c1994
GS
487/*
488=for apidoc fbm_instr
489
490Returns the location of the SV in the string delimited by C<str> and
491C<strend>. It returns C<Nullch> if the string can't be found. The C<sv>
492does not have to be fbm_compiled, but the search will not be as fast
493then.
494
495=cut
496*/
497
378cc40b 498char *
864dbfa3 499Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
378cc40b 500{
a687059c 501 register unsigned char *s;
cf93c79d 502 STRLEN l;
9cbe880b
NC
503 register const unsigned char *little
504 = (const unsigned char *)SvPV_const(littlestr,l);
cf93c79d 505 register STRLEN littlelen = l;
e1ec3a88 506 register const I32 multiline = flags & FBMrf_MULTILINE;
cf93c79d 507
eb160463 508 if ((STRLEN)(bigend - big) < littlelen) {
a1d180c4 509 if ( SvTAIL(littlestr)
eb160463 510 && ((STRLEN)(bigend - big) == littlelen - 1)
a1d180c4 511 && (littlelen == 1
12ae5dfc 512 || (*big == *little &&
27da23d5 513 memEQ((char *)big, (char *)little, littlelen - 1))))
cf93c79d
IZ
514 return (char*)big;
515 return Nullch;
516 }
378cc40b 517
cf93c79d 518 if (littlelen <= 2) { /* Special-cased */
cf93c79d
IZ
519
520 if (littlelen == 1) {
521 if (SvTAIL(littlestr) && !multiline) { /* Anchor only! */
522 /* Know that bigend != big. */
523 if (bigend[-1] == '\n')
524 return (char *)(bigend - 1);
525 return (char *) bigend;
526 }
527 s = big;
528 while (s < bigend) {
529 if (*s == *little)
530 return (char *)s;
531 s++;
532 }
533 if (SvTAIL(littlestr))
534 return (char *) bigend;
535 return Nullch;
536 }
537 if (!littlelen)
538 return (char*)big; /* Cannot be SvTAIL! */
539
540 /* littlelen is 2 */
541 if (SvTAIL(littlestr) && !multiline) {
542 if (bigend[-1] == '\n' && bigend[-2] == *little)
543 return (char*)bigend - 2;
544 if (bigend[-1] == *little)
545 return (char*)bigend - 1;
546 return Nullch;
547 }
548 {
549 /* This should be better than FBM if c1 == c2, and almost
550 as good otherwise: maybe better since we do less indirection.
551 And we save a lot of memory by caching no table. */
66a1b24b
AL
552 const unsigned char c1 = little[0];
553 const unsigned char c2 = little[1];
cf93c79d
IZ
554
555 s = big + 1;
556 bigend--;
557 if (c1 != c2) {
558 while (s <= bigend) {
559 if (s[0] == c2) {
560 if (s[-1] == c1)
561 return (char*)s - 1;
562 s += 2;
563 continue;
3fe6f2dc 564 }
cf93c79d
IZ
565 next_chars:
566 if (s[0] == c1) {
567 if (s == bigend)
568 goto check_1char_anchor;
569 if (s[1] == c2)
570 return (char*)s;
571 else {
572 s++;
573 goto next_chars;
574 }
575 }
576 else
577 s += 2;
578 }
579 goto check_1char_anchor;
580 }
581 /* Now c1 == c2 */
582 while (s <= bigend) {
583 if (s[0] == c1) {
584 if (s[-1] == c1)
585 return (char*)s - 1;
586 if (s == bigend)
587 goto check_1char_anchor;
588 if (s[1] == c1)
589 return (char*)s;
590 s += 3;
02128f11 591 }
c277df42 592 else
cf93c79d 593 s += 2;
c277df42 594 }
c277df42 595 }
cf93c79d
IZ
596 check_1char_anchor: /* One char and anchor! */
597 if (SvTAIL(littlestr) && (*bigend == *little))
598 return (char *)bigend; /* bigend is already decremented. */
599 return Nullch;
d48672a2 600 }
cf93c79d 601 if (SvTAIL(littlestr) && !multiline) { /* tail anchored? */
bbce6d69 602 s = bigend - littlelen;
a1d180c4 603 if (s >= big && bigend[-1] == '\n' && *s == *little
cf93c79d
IZ
604 /* Automatically of length > 2 */
605 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
7506f9c3 606 {
bbce6d69 607 return (char*)s; /* how sweet it is */
7506f9c3
GS
608 }
609 if (s[1] == *little
610 && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
611 {
cf93c79d 612 return (char*)s + 1; /* how sweet it is */
7506f9c3 613 }
02128f11
IZ
614 return Nullch;
615 }
cf93c79d 616 if (SvTYPE(littlestr) != SVt_PVBM || !SvVALID(littlestr)) {
c4420975 617 char * const b = ninstr((char*)big,(char*)bigend,
cf93c79d
IZ
618 (char*)little, (char*)little + littlelen);
619
620 if (!b && SvTAIL(littlestr)) { /* Automatically multiline! */
621 /* Chop \n from littlestr: */
622 s = bigend - littlelen + 1;
7506f9c3
GS
623 if (*s == *little
624 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
625 {
3fe6f2dc 626 return (char*)s;
7506f9c3 627 }
cf93c79d 628 return Nullch;
a687059c 629 }
cf93c79d 630 return b;
a687059c 631 }
a1d180c4 632
cf93c79d 633 { /* Do actual FBM. */
c4420975 634 register const unsigned char * const table = little + littlelen + FBM_TABLE_OFFSET;
0d46e09a 635 register const unsigned char *oldlittle;
cf93c79d 636
eb160463 637 if (littlelen > (STRLEN)(bigend - big))
cf93c79d
IZ
638 return Nullch;
639 --littlelen; /* Last char found by table lookup */
640
641 s = big + littlelen;
642 little += littlelen; /* last char */
643 oldlittle = little;
644 if (s < bigend) {
645 register I32 tmp;
646
647 top2:
7506f9c3 648 if ((tmp = table[*s])) {
cf93c79d 649 if ((s += tmp) < bigend)
62b28dd9 650 goto top2;
cf93c79d
IZ
651 goto check_end;
652 }
653 else { /* less expensive than calling strncmp() */
66a1b24b 654 register unsigned char * const olds = s;
cf93c79d
IZ
655
656 tmp = littlelen;
657
658 while (tmp--) {
659 if (*--s == *--little)
660 continue;
cf93c79d
IZ
661 s = olds + 1; /* here we pay the price for failure */
662 little = oldlittle;
663 if (s < bigend) /* fake up continue to outer loop */
664 goto top2;
665 goto check_end;
666 }
667 return (char *)s;
a687059c 668 }
378cc40b 669 }
cf93c79d
IZ
670 check_end:
671 if ( s == bigend && (table[-1] & FBMcf_TAIL)
12ae5dfc
JH
672 && memEQ((char *)(bigend - littlelen),
673 (char *)(oldlittle - littlelen), littlelen) )
cf93c79d
IZ
674 return (char*)bigend - littlelen;
675 return Nullch;
378cc40b 676 }
378cc40b
LW
677}
678
c277df42
IZ
679/* start_shift, end_shift are positive quantities which give offsets
680 of ends of some substring of bigstr.
a0288114 681 If "last" we want the last occurrence.
c277df42 682 old_posp is the way of communication between consequent calls if
a1d180c4 683 the next call needs to find the .
c277df42 684 The initial *old_posp should be -1.
cf93c79d
IZ
685
686 Note that we take into account SvTAIL, so one can get extra
687 optimizations if _ALL flag is set.
c277df42
IZ
688 */
689
cf93c79d 690/* If SvTAIL is actually due to \Z or \z, this gives false positives
26fa51c3 691 if PL_multiline. In fact if !PL_multiline the authoritative answer
cf93c79d
IZ
692 is not supported yet. */
693
378cc40b 694char *
864dbfa3 695Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
378cc40b 696{
0d46e09a 697 register const unsigned char *big;
79072805
LW
698 register I32 pos;
699 register I32 previous;
700 register I32 first;
0d46e09a 701 register const unsigned char *little;
c277df42 702 register I32 stop_pos;
0d46e09a 703 register const unsigned char *littleend;
c277df42 704 I32 found = 0;
378cc40b 705
c277df42 706 if (*old_posp == -1
3280af22 707 ? (pos = PL_screamfirst[BmRARE(littlestr)]) < 0
cf93c79d
IZ
708 : (((pos = *old_posp), pos += PL_screamnext[pos]) == 0)) {
709 cant_find:
a1d180c4 710 if ( BmRARE(littlestr) == '\n'
cf93c79d 711 && BmPREVIOUS(littlestr) == SvCUR(littlestr) - 1) {
cfd0369c 712 little = (const unsigned char *)(SvPVX_const(littlestr));
cf93c79d
IZ
713 littleend = little + SvCUR(littlestr);
714 first = *little++;
715 goto check_tail;
716 }
378cc40b 717 return Nullch;
cf93c79d
IZ
718 }
719
cfd0369c 720 little = (const unsigned char *)(SvPVX_const(littlestr));
79072805 721 littleend = little + SvCUR(littlestr);
378cc40b 722 first = *little++;
c277df42 723 /* The value of pos we can start at: */
79072805 724 previous = BmPREVIOUS(littlestr);
cfd0369c 725 big = (const unsigned char *)(SvPVX_const(bigstr));
c277df42
IZ
726 /* The value of pos we can stop at: */
727 stop_pos = SvCUR(bigstr) - end_shift - (SvCUR(littlestr) - 1 - previous);
cf93c79d 728 if (previous + start_shift > stop_pos) {
0fe87f7c
HS
729/*
730 stop_pos does not include SvTAIL in the count, so this check is incorrect
731 (I think) - see [ID 20010618.006] and t/op/study.t. HVDS 2001/06/19
732*/
733#if 0
cf93c79d
IZ
734 if (previous + start_shift == stop_pos + 1) /* A fake '\n'? */
735 goto check_tail;
0fe87f7c 736#endif
cf93c79d
IZ
737 return Nullch;
738 }
c277df42 739 while (pos < previous + start_shift) {
3280af22 740 if (!(pos += PL_screamnext[pos]))
cf93c79d 741 goto cant_find;
378cc40b 742 }
de3bb511 743 big -= previous;
bbce6d69 744 do {
0d46e09a 745 register const unsigned char *s, *x;
ef64f398 746 if (pos >= stop_pos) break;
bbce6d69 747 if (big[pos] != first)
748 continue;
749 for (x=big+pos+1,s=little; s < littleend; /**/ ) {
bbce6d69 750 if (*s++ != *x++) {
751 s--;
752 break;
378cc40b 753 }
bbce6d69 754 }
c277df42
IZ
755 if (s == littleend) {
756 *old_posp = pos;
757 if (!last) return (char *)(big+pos);
758 found = 1;
759 }
3280af22 760 } while ( pos += PL_screamnext[pos] );
a1d180c4 761 if (last && found)
cf93c79d 762 return (char *)(big+(*old_posp));
cf93c79d
IZ
763 check_tail:
764 if (!SvTAIL(littlestr) || (end_shift > 0))
765 return Nullch;
766 /* Ignore the trailing "\n". This code is not microoptimized */
cfd0369c 767 big = (const unsigned char *)(SvPVX_const(bigstr) + SvCUR(bigstr));
cf93c79d
IZ
768 stop_pos = littleend - little; /* Actual littlestr len */
769 if (stop_pos == 0)
770 return (char*)big;
771 big -= stop_pos;
772 if (*big == first
12ae5dfc
JH
773 && ((stop_pos == 1) ||
774 memEQ((char *)(big + 1), (char *)little, stop_pos - 1)))
cf93c79d
IZ
775 return (char*)big;
776 return Nullch;
8d063cd8
LW
777}
778
79072805 779I32
864dbfa3 780Perl_ibcmp(pTHX_ const char *s1, const char *s2, register I32 len)
79072805 781{
e1ec3a88
AL
782 register const U8 *a = (const U8 *)s1;
783 register const U8 *b = (const U8 *)s2;
79072805 784 while (len--) {
22c35a8c 785 if (*a != *b && *a != PL_fold[*b])
bbce6d69 786 return 1;
787 a++,b++;
788 }
789 return 0;
790}
791
792I32
864dbfa3 793Perl_ibcmp_locale(pTHX_ const char *s1, const char *s2, register I32 len)
bbce6d69 794{
27da23d5 795 dVAR;
e1ec3a88
AL
796 register const U8 *a = (const U8 *)s1;
797 register const U8 *b = (const U8 *)s2;
bbce6d69 798 while (len--) {
22c35a8c 799 if (*a != *b && *a != PL_fold_locale[*b])
bbce6d69 800 return 1;
801 a++,b++;
79072805
LW
802 }
803 return 0;
804}
805
8d063cd8
LW
806/* copy a string to a safe spot */
807
954c1994 808/*
ccfc67b7
JH
809=head1 Memory Management
810
954c1994
GS
811=for apidoc savepv
812
61a925ed
AMS
813Perl's version of C<strdup()>. Returns a pointer to a newly allocated
814string which is a duplicate of C<pv>. The size of the string is
815determined by C<strlen()>. The memory allocated for the new string can
816be freed with the C<Safefree()> function.
954c1994
GS
817
818=cut
819*/
820
8d063cd8 821char *
efdfce31 822Perl_savepv(pTHX_ const char *pv)
8d063cd8 823{
e90e2364
NC
824 if (!pv)
825 return Nullch;
66a1b24b
AL
826 else {
827 char *newaddr;
828 const STRLEN pvlen = strlen(pv)+1;
a02a5408 829 Newx(newaddr,pvlen,char);
490a0e98 830 return memcpy(newaddr,pv,pvlen);
66a1b24b 831 }
e90e2364 832
8d063cd8
LW
833}
834
a687059c
LW
835/* same thing but with a known length */
836
954c1994
GS
837/*
838=for apidoc savepvn
839
61a925ed
AMS
840Perl's version of what C<strndup()> would be if it existed. Returns a
841pointer to a newly allocated string which is a duplicate of the first
842C<len> bytes from C<pv>. The memory allocated for the new string can be
843freed with the C<Safefree()> function.
954c1994
GS
844
845=cut
846*/
847
a687059c 848char *
efdfce31 849Perl_savepvn(pTHX_ const char *pv, register I32 len)
a687059c
LW
850{
851 register char *newaddr;
852
a02a5408 853 Newx(newaddr,len+1,char);
92110913 854 /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
efdfce31 855 if (pv) {
e90e2364
NC
856 /* might not be null terminated */
857 newaddr[len] = '\0';
07409e01 858 return (char *) CopyD(pv,newaddr,len,char);
92110913
NIS
859 }
860 else {
07409e01 861 return (char *) ZeroD(newaddr,len+1,char);
92110913 862 }
a687059c
LW
863}
864
05ec9bb3
NIS
865/*
866=for apidoc savesharedpv
867
61a925ed
AMS
868A version of C<savepv()> which allocates the duplicate string in memory
869which is shared between threads.
05ec9bb3
NIS
870
871=cut
872*/
873char *
efdfce31 874Perl_savesharedpv(pTHX_ const char *pv)
05ec9bb3 875{
e90e2364 876 register char *newaddr;
490a0e98 877 STRLEN pvlen;
e90e2364
NC
878 if (!pv)
879 return Nullch;
880
490a0e98
NC
881 pvlen = strlen(pv)+1;
882 newaddr = (char*)PerlMemShared_malloc(pvlen);
e90e2364 883 if (!newaddr) {
0bd48802 884 return write_no_mem();
05ec9bb3 885 }
490a0e98 886 return memcpy(newaddr,pv,pvlen);
05ec9bb3
NIS
887}
888
2e0de35c
NC
889/*
890=for apidoc savesvpv
891
6832267f 892A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
2e0de35c
NC
893the passed in SV using C<SvPV()>
894
895=cut
896*/
897
898char *
899Perl_savesvpv(pTHX_ SV *sv)
900{
901 STRLEN len;
7452cf6a 902 const char * const pv = SvPV_const(sv, len);
2e0de35c
NC
903 register char *newaddr;
904
26866f99 905 ++len;
a02a5408 906 Newx(newaddr,len,char);
07409e01 907 return (char *) CopyD(pv,newaddr,len,char);
2e0de35c 908}
05ec9bb3
NIS
909
910
cea2e8a9 911/* the SV for Perl_form() and mess() is not kept in an arena */
fc36a67e 912
76e3520e 913STATIC SV *
cea2e8a9 914S_mess_alloc(pTHX)
fc36a67e 915{
916 SV *sv;
917 XPVMG *any;
918
e72dc28c
GS
919 if (!PL_dirty)
920 return sv_2mortal(newSVpvn("",0));
921
0372dbb6
GS
922 if (PL_mess_sv)
923 return PL_mess_sv;
924
fc36a67e 925 /* Create as PVMG now, to avoid any upgrading later */
a02a5408
JC
926 Newx(sv, 1, SV);
927 Newxz(any, 1, XPVMG);
fc36a67e 928 SvFLAGS(sv) = SVt_PVMG;
929 SvANY(sv) = (void*)any;
cace1726 930 SvPV_set(sv, 0);
fc36a67e 931 SvREFCNT(sv) = 1 << 30; /* practically infinite */
e72dc28c 932 PL_mess_sv = sv;
fc36a67e 933 return sv;
934}
935
c5be433b 936#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
937char *
938Perl_form_nocontext(const char* pat, ...)
939{
940 dTHX;
c5be433b 941 char *retval;
cea2e8a9
GS
942 va_list args;
943 va_start(args, pat);
c5be433b 944 retval = vform(pat, &args);
cea2e8a9 945 va_end(args);
c5be433b 946 return retval;
cea2e8a9 947}
c5be433b 948#endif /* PERL_IMPLICIT_CONTEXT */
cea2e8a9 949
7c9e965c 950/*
ccfc67b7 951=head1 Miscellaneous Functions
7c9e965c
JP
952=for apidoc form
953
954Takes a sprintf-style format pattern and conventional
955(non-SV) arguments and returns the formatted string.
956
957 (char *) Perl_form(pTHX_ const char* pat, ...)
958
959can be used any place a string (char *) is required:
960
961 char * s = Perl_form("%d.%d",major,minor);
962
963Uses a single private buffer so if you want to format several strings you
964must explicitly copy the earlier strings away (and free the copies when you
965are done).
966
967=cut
968*/
969
8990e307 970char *
864dbfa3 971Perl_form(pTHX_ const char* pat, ...)
8990e307 972{
c5be433b 973 char *retval;
46fc3d4c 974 va_list args;
46fc3d4c 975 va_start(args, pat);
c5be433b 976 retval = vform(pat, &args);
46fc3d4c 977 va_end(args);
c5be433b
GS
978 return retval;
979}
980
981char *
982Perl_vform(pTHX_ const char *pat, va_list *args)
983{
2d03de9c 984 SV * const sv = mess_alloc();
c5be433b 985 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
e72dc28c 986 return SvPVX(sv);
46fc3d4c 987}
a687059c 988
5a844595
GS
989#if defined(PERL_IMPLICIT_CONTEXT)
990SV *
991Perl_mess_nocontext(const char *pat, ...)
992{
993 dTHX;
994 SV *retval;
995 va_list args;
996 va_start(args, pat);
997 retval = vmess(pat, &args);
998 va_end(args);
999 return retval;
1000}
1001#endif /* PERL_IMPLICIT_CONTEXT */
1002
06bf62c7 1003SV *
5a844595
GS
1004Perl_mess(pTHX_ const char *pat, ...)
1005{
1006 SV *retval;
1007 va_list args;
1008 va_start(args, pat);
1009 retval = vmess(pat, &args);
1010 va_end(args);
1011 return retval;
1012}
1013
ae7d165c 1014STATIC COP*
8772537c 1015S_closest_cop(pTHX_ COP *cop, const OP *o)
ae7d165c
PJ
1016{
1017 /* Look for PL_op starting from o. cop is the last COP we've seen. */
1018
1019 if (!o || o == PL_op) return cop;
1020
1021 if (o->op_flags & OPf_KIDS) {
1022 OP *kid;
1023 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1024 {
1025 COP *new_cop;
1026
1027 /* If the OP_NEXTSTATE has been optimised away we can still use it
1028 * the get the file and line number. */
1029
1030 if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
1031 cop = (COP *)kid;
1032
1033 /* Keep searching, and return when we've found something. */
1034
1035 new_cop = closest_cop(cop, kid);
1036 if (new_cop) return new_cop;
1037 }
1038 }
1039
1040 /* Nothing found. */
1041
8772537c 1042 return Null(COP *);
ae7d165c
PJ
1043}
1044
5a844595
GS
1045SV *
1046Perl_vmess(pTHX_ const char *pat, va_list *args)
46fc3d4c 1047{
c4420975 1048 SV * const sv = mess_alloc();
27da23d5 1049 static const char dgd[] = " during global destruction.\n";
46fc3d4c 1050
fc36a67e 1051 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
46fc3d4c 1052 if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
ae7d165c
PJ
1053
1054 /*
1055 * Try and find the file and line for PL_op. This will usually be
1056 * PL_curcop, but it might be a cop that has been optimised away. We
1057 * can try to find such a cop by searching through the optree starting
1058 * from the sibling of PL_curcop.
1059 */
1060
e1ec3a88 1061 const COP *cop = closest_cop(PL_curcop, PL_curcop->op_sibling);
ae7d165c
PJ
1062 if (!cop) cop = PL_curcop;
1063
1064 if (CopLINE(cop))
ed094faf 1065 Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
3aed30dc 1066 OutCopFILE(cop), (IV)CopLINE(cop));
2035c5e8 1067 if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
e1ec3a88 1068 const bool line_mode = (RsSIMPLE(PL_rs) &&
95a20fc0 1069 SvCUR(PL_rs) == 1 && *SvPVX_const(PL_rs) == '\n');
57def98f 1070 Perl_sv_catpvf(aTHX_ sv, ", <%s> %s %"IVdf,
edc2eac3
JH
1071 PL_last_in_gv == PL_argvgv ?
1072 "" : GvNAME(PL_last_in_gv),
1073 line_mode ? "line" : "chunk",
1074 (IV)IoLINES(GvIOp(PL_last_in_gv)));
a687059c 1075 }
515f54a1 1076 sv_catpv(sv, PL_dirty ? dgd : ".\n");
a687059c 1077 }
06bf62c7 1078 return sv;
a687059c
LW
1079}
1080
7ff03255
SG
1081void
1082Perl_write_to_stderr(pTHX_ const char* message, int msglen)
1083{
27da23d5 1084 dVAR;
7ff03255
SG
1085 IO *io;
1086 MAGIC *mg;
1087
1088 if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1089 && (io = GvIO(PL_stderrgv))
1090 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
1091 {
1092 dSP;
1093 ENTER;
1094 SAVETMPS;
1095
1096 save_re_context();
1097 SAVESPTR(PL_stderrgv);
1098 PL_stderrgv = Nullgv;
1099
1100 PUSHSTACKi(PERLSI_MAGIC);
1101
1102 PUSHMARK(SP);
1103 EXTEND(SP,2);
1104 PUSHs(SvTIED_obj((SV*)io, mg));
1105 PUSHs(sv_2mortal(newSVpvn(message, msglen)));
1106 PUTBACK;
1107 call_method("PRINT", G_SCALAR);
1108
1109 POPSTACK;
1110 FREETMPS;
1111 LEAVE;
1112 }
1113 else {
1114#ifdef USE_SFIO
1115 /* SFIO can really mess with your errno */
53c1dcc0 1116 const int e = errno;
7ff03255 1117#endif
53c1dcc0 1118 PerlIO * const serr = Perl_error_log;
7ff03255
SG
1119
1120 PERL_WRITE_MSG_TO_CONSOLE(serr, message, msglen);
1121 (void)PerlIO_flush(serr);
1122#ifdef USE_SFIO
1123 errno = e;
1124#endif
1125 }
1126}
1127
3ab1ac99
NC
1128/* Common code used by vcroak, vdie and vwarner */
1129
e07360fa 1130STATIC void
63315e18
NC
1131S_vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8)
1132{
1133 HV *stash;
1134 GV *gv;
1135 CV *cv;
1136 /* sv_2cv might call Perl_croak() */
890ce7af 1137 SV * const olddiehook = PL_diehook;
63315e18
NC
1138
1139 assert(PL_diehook);
1140 ENTER;
1141 SAVESPTR(PL_diehook);
1142 PL_diehook = Nullsv;
1143 cv = sv_2cv(olddiehook, &stash, &gv, 0);
1144 LEAVE;
1145 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1146 dSP;
1147 SV *msg;
1148
1149 ENTER;
1150 save_re_context();
1151 if (message) {
1152 msg = newSVpvn(message, msglen);
1153 SvFLAGS(msg) |= utf8;
1154 SvREADONLY_on(msg);
1155 SAVEFREESV(msg);
1156 }
1157 else {
1158 msg = ERRSV;
1159 }
1160
1161 PUSHSTACKi(PERLSI_DIEHOOK);
1162 PUSHMARK(SP);
1163 XPUSHs(msg);
1164 PUTBACK;
1165 call_sv((SV*)cv, G_DISCARD);
1166 POPSTACK;
1167 LEAVE;
1168 }
1169}
1170
cfd0369c 1171STATIC const char *
e07360fa
AT
1172S_vdie_croak_common(pTHX_ const char* pat, va_list* args, STRLEN* msglen,
1173 I32* utf8)
1174{
1175 dVAR;
cfd0369c 1176 const char *message;
e07360fa
AT
1177
1178 if (pat) {
890ce7af 1179 SV * const msv = vmess(pat, args);
e07360fa
AT
1180 if (PL_errors && SvCUR(PL_errors)) {
1181 sv_catsv(PL_errors, msv);
cfd0369c 1182 message = SvPV_const(PL_errors, *msglen);
e07360fa
AT
1183 SvCUR_set(PL_errors, 0);
1184 }
1185 else
cfd0369c 1186 message = SvPV_const(msv,*msglen);
e07360fa
AT
1187 *utf8 = SvUTF8(msv);
1188 }
1189 else {
1190 message = Nullch;
1191 }
1192
1193 DEBUG_S(PerlIO_printf(Perl_debug_log,
1194 "%p: die/croak: message = %s\ndiehook = %p\n",
1195 thr, message, PL_diehook));
1196 if (PL_diehook) {
1197 S_vdie_common(aTHX_ message, *msglen, *utf8);
1198 }
1199 return message;
1200}
1201
c5be433b
GS
1202OP *
1203Perl_vdie(pTHX_ const char* pat, va_list *args)
36477c24 1204{
73d840c0 1205 const char *message;
e1ec3a88 1206 const int was_in_eval = PL_in_eval;
06bf62c7 1207 STRLEN msglen;
ff882698 1208 I32 utf8 = 0;
36477c24 1209
bf49b057 1210 DEBUG_S(PerlIO_printf(Perl_debug_log,
199100c8 1211 "%p: die: curstack = %p, mainstack = %p\n",
533c011a 1212 thr, PL_curstack, PL_mainstack));
36477c24 1213
890ce7af 1214 message = vdie_croak_common(pat, args, &msglen, &utf8);
36477c24 1215
06bf62c7 1216 PL_restartop = die_where(message, msglen);
ff882698 1217 SvFLAGS(ERRSV) |= utf8;
bf49b057 1218 DEBUG_S(PerlIO_printf(Perl_debug_log,
7c06b590 1219 "%p: die: restartop = %p, was_in_eval = %d, top_env = %p\n",
533c011a 1220 thr, PL_restartop, was_in_eval, PL_top_env));
3280af22 1221 if ((!PL_restartop && was_in_eval) || PL_top_env->je_prev)
6224f72b 1222 JMPENV_JUMP(3);
3280af22 1223 return PL_restartop;
36477c24 1224}
1225
c5be433b 1226#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
1227OP *
1228Perl_die_nocontext(const char* pat, ...)
a687059c 1229{
cea2e8a9
GS
1230 dTHX;
1231 OP *o;
a687059c 1232 va_list args;
cea2e8a9 1233 va_start(args, pat);
c5be433b 1234 o = vdie(pat, &args);
cea2e8a9
GS
1235 va_end(args);
1236 return o;
1237}
c5be433b 1238#endif /* PERL_IMPLICIT_CONTEXT */
cea2e8a9
GS
1239
1240OP *
1241Perl_die(pTHX_ const char* pat, ...)
1242{
1243 OP *o;
1244 va_list args;
1245 va_start(args, pat);
c5be433b 1246 o = vdie(pat, &args);
cea2e8a9
GS
1247 va_end(args);
1248 return o;
1249}
1250
c5be433b
GS
1251void
1252Perl_vcroak(pTHX_ const char* pat, va_list *args)
cea2e8a9 1253{
73d840c0 1254 const char *message;
06bf62c7 1255 STRLEN msglen;
ff882698 1256 I32 utf8 = 0;
a687059c 1257
3ab1ac99 1258 message = S_vdie_croak_common(aTHX_ pat, args, &msglen, &utf8);
5a844595 1259
3280af22 1260 if (PL_in_eval) {
06bf62c7 1261 PL_restartop = die_where(message, msglen);
ff882698 1262 SvFLAGS(ERRSV) |= utf8;
6224f72b 1263 JMPENV_JUMP(3);
a0d0e21e 1264 }
84414e3e 1265 else if (!message)
cfd0369c 1266 message = SvPVx_const(ERRSV, msglen);
84414e3e 1267
7ff03255 1268 write_to_stderr(message, msglen);
f86702cc 1269 my_failure_exit();
a687059c
LW
1270}
1271
c5be433b 1272#if defined(PERL_IMPLICIT_CONTEXT)
8990e307 1273void
cea2e8a9 1274Perl_croak_nocontext(const char *pat, ...)
a687059c 1275{
cea2e8a9 1276 dTHX;
a687059c 1277 va_list args;
cea2e8a9 1278 va_start(args, pat);
c5be433b 1279 vcroak(pat, &args);
cea2e8a9
GS
1280 /* NOTREACHED */
1281 va_end(args);
1282}
1283#endif /* PERL_IMPLICIT_CONTEXT */
1284
954c1994 1285/*
ccfc67b7
JH
1286=head1 Warning and Dieing
1287
954c1994
GS
1288=for apidoc croak
1289
9983fa3c 1290This is the XSUB-writer's interface to Perl's C<die> function.
966353fd
MF
1291Normally call this function the same way you call the C C<printf>
1292function. Calling C<croak> returns control directly to Perl,
1293sidestepping the normal C order of execution. See C<warn>.
9983fa3c
GS
1294
1295If you want to throw an exception object, assign the object to
1296C<$@> and then pass C<Nullch> to croak():
1297
1298 errsv = get_sv("@", TRUE);
1299 sv_setsv(errsv, exception_object);
1300 croak(Nullch);
954c1994
GS
1301
1302=cut
1303*/
1304
cea2e8a9
GS
1305void
1306Perl_croak(pTHX_ const char *pat, ...)
1307{
1308 va_list args;
1309 va_start(args, pat);
c5be433b 1310 vcroak(pat, &args);
cea2e8a9
GS
1311 /* NOTREACHED */
1312 va_end(args);
1313}
1314
c5be433b
GS
1315void
1316Perl_vwarn(pTHX_ const char* pat, va_list *args)
cea2e8a9 1317{
27da23d5 1318 dVAR;
06bf62c7 1319 STRLEN msglen;
53c1dcc0
AL
1320 SV * const msv = vmess(pat, args);
1321 const I32 utf8 = SvUTF8(msv);
1322 const char * const message = SvPV_const(msv, msglen);
a687059c 1323
3280af22 1324 if (PL_warnhook) {
cea2e8a9 1325 /* sv_2cv might call Perl_warn() */
53c1dcc0
AL
1326 SV * const oldwarnhook = PL_warnhook;
1327 CV * cv;
1328 HV * stash;
1329 GV * gv;
1330
1738f5c4 1331 ENTER;
3280af22
NIS
1332 SAVESPTR(PL_warnhook);
1333 PL_warnhook = Nullsv;
20cec16a 1334 cv = sv_2cv(oldwarnhook, &stash, &gv, 0);
1738f5c4
CS
1335 LEAVE;
1336 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
20cec16a 1337 dSP;
774d564b 1338 SV *msg;
1339
1340 ENTER;
c5be5b4d
DM
1341 SAVESPTR(PL_warnhook);
1342 PL_warnhook = Nullsv;
3a1f2dc9 1343 save_re_context();
06bf62c7 1344 msg = newSVpvn(message, msglen);
ff882698 1345 SvFLAGS(msg) |= utf8;
774d564b 1346 SvREADONLY_on(msg);
1347 SAVEFREESV(msg);
1348
e788e7d3 1349 PUSHSTACKi(PERLSI_WARNHOOK);
924508f0 1350 PUSHMARK(SP);
774d564b 1351 XPUSHs(msg);
20cec16a 1352 PUTBACK;
864dbfa3 1353 call_sv((SV*)cv, G_DISCARD);
d3acc0f7 1354 POPSTACK;
774d564b 1355 LEAVE;
20cec16a 1356 return;
1357 }
748a9306 1358 }
87582a92 1359
7ff03255 1360 write_to_stderr(message, msglen);
a687059c 1361}
8d063cd8 1362
c5be433b 1363#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
1364void
1365Perl_warn_nocontext(const char *pat, ...)
1366{
1367 dTHX;
1368 va_list args;
1369 va_start(args, pat);
c5be433b 1370 vwarn(pat, &args);
cea2e8a9
GS
1371 va_end(args);
1372}
1373#endif /* PERL_IMPLICIT_CONTEXT */
1374
954c1994
GS
1375/*
1376=for apidoc warn
1377
966353fd
MF
1378This is the XSUB-writer's interface to Perl's C<warn> function. Call this
1379function the same way you call the C C<printf> function. See C<croak>.
954c1994
GS
1380
1381=cut
1382*/
1383
cea2e8a9
GS
1384void
1385Perl_warn(pTHX_ const char *pat, ...)
1386{
1387 va_list args;
1388 va_start(args, pat);
c5be433b 1389 vwarn(pat, &args);
cea2e8a9
GS
1390 va_end(args);
1391}
1392
c5be433b
GS
1393#if defined(PERL_IMPLICIT_CONTEXT)
1394void
1395Perl_warner_nocontext(U32 err, const char *pat, ...)
1396{
27da23d5 1397 dTHX;
c5be433b
GS
1398 va_list args;
1399 va_start(args, pat);
1400 vwarner(err, pat, &args);
1401 va_end(args);
1402}
1403#endif /* PERL_IMPLICIT_CONTEXT */
1404
599cee73 1405void
864dbfa3 1406Perl_warner(pTHX_ U32 err, const char* pat,...)
599cee73
PM
1407{
1408 va_list args;
c5be433b
GS
1409 va_start(args, pat);
1410 vwarner(err, pat, &args);
1411 va_end(args);
1412}
1413
1414void
1415Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args)
1416{
27da23d5 1417 dVAR;
d13b0d77 1418 if (ckDEAD(err)) {
a3b680e6 1419 SV * const msv = vmess(pat, args);
d13b0d77 1420 STRLEN msglen;
7452cf6a 1421 const char * const message = SvPV_const(msv, msglen);
a3b680e6 1422 const I32 utf8 = SvUTF8(msv);
599cee73 1423
3aed30dc 1424 if (PL_diehook) {
63315e18
NC
1425 assert(message);
1426 S_vdie_common(aTHX_ message, msglen, utf8);
3aed30dc
HS
1427 }
1428 if (PL_in_eval) {
1429 PL_restartop = die_where(message, msglen);
ff882698 1430 SvFLAGS(ERRSV) |= utf8;
3aed30dc
HS
1431 JMPENV_JUMP(3);
1432 }
7ff03255 1433 write_to_stderr(message, msglen);
3aed30dc 1434 my_failure_exit();
599cee73
PM
1435 }
1436 else {
d13b0d77 1437 Perl_vwarn(aTHX_ pat, args);
599cee73
PM
1438 }
1439}
1440
f54ba1c2
DM
1441/* implements the ckWARN? macros */
1442
1443bool
1444Perl_ckwarn(pTHX_ U32 w)
1445{
1446 return
1447 (
1448 isLEXWARN_on
1449 && PL_curcop->cop_warnings != pWARN_NONE
1450 && (
1451 PL_curcop->cop_warnings == pWARN_ALL
1452 || isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w))
1453 || (unpackWARN2(w) &&
1454 isWARN_on(PL_curcop->cop_warnings, unpackWARN2(w)))
1455 || (unpackWARN3(w) &&
1456 isWARN_on(PL_curcop->cop_warnings, unpackWARN3(w)))
1457 || (unpackWARN4(w) &&
1458 isWARN_on(PL_curcop->cop_warnings, unpackWARN4(w)))
1459 )
1460 )
1461 ||
1462 (
1463 isLEXWARN_off && PL_dowarn & G_WARN_ON
1464 )
1465 ;
1466}
1467
1468/* implements the ckWARN?_d macro */
1469
1470bool
1471Perl_ckwarn_d(pTHX_ U32 w)
1472{
1473 return
1474 isLEXWARN_off
1475 || PL_curcop->cop_warnings == pWARN_ALL
1476 || (
1477 PL_curcop->cop_warnings != pWARN_NONE
1478 && (
1479 isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w))
1480 || (unpackWARN2(w) &&
1481 isWARN_on(PL_curcop->cop_warnings, unpackWARN2(w)))
1482 || (unpackWARN3(w) &&
1483 isWARN_on(PL_curcop->cop_warnings, unpackWARN3(w)))
1484 || (unpackWARN4(w) &&
1485 isWARN_on(PL_curcop->cop_warnings, unpackWARN4(w)))
1486 )
1487 )
1488 ;
1489}
1490
1491
1492
e6587932
DM
1493/* since we've already done strlen() for both nam and val
1494 * we can use that info to make things faster than
1495 * sprintf(s, "%s=%s", nam, val)
1496 */
1497#define my_setenv_format(s, nam, nlen, val, vlen) \
1498 Copy(nam, s, nlen, char); \
1499 *(s+nlen) = '='; \
1500 Copy(val, s+(nlen+1), vlen, char); \
1501 *(s+(nlen+1+vlen)) = '\0'
1502
13b6e58c 1503#ifdef USE_ENVIRON_ARRAY
eccd403f 1504 /* VMS' my_setenv() is in vms.c */
2986a63f 1505#if !defined(WIN32) && !defined(NETWARE)
8d063cd8 1506void
e1ec3a88 1507Perl_my_setenv(pTHX_ const char *nam, const char *val)
8d063cd8 1508{
27da23d5 1509 dVAR;
4efc5df6
GS
1510#ifdef USE_ITHREADS
1511 /* only parent thread can modify process environment */
1512 if (PL_curinterp == aTHX)
1513#endif
1514 {
f2517201 1515#ifndef PERL_USE_SAFE_PUTENV
50acdf95 1516 if (!PL_use_safe_putenv) {
f2517201 1517 /* most putenv()s leak, so we manipulate environ directly */
79072805 1518 register I32 i=setenv_getix(nam); /* where does it go? */
e6587932 1519 int nlen, vlen;
8d063cd8 1520
3280af22 1521 if (environ == PL_origenviron) { /* need we copy environment? */
79072805
LW
1522 I32 j;
1523 I32 max;
fe14fcc3
LW
1524 char **tmpenv;
1525
1526 for (max = i; environ[max]; max++) ;
f2517201
GS
1527 tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
1528 for (j=0; j<max; j++) { /* copy environment */
e1ec3a88 1529 const int len = strlen(environ[j]);
3aed30dc
HS
1530 tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char));
1531 Copy(environ[j], tmpenv[j], len+1, char);
f2517201 1532 }
fe14fcc3
LW
1533 tmpenv[max] = Nullch;
1534 environ = tmpenv; /* tell exec where it is now */
1535 }
a687059c 1536 if (!val) {
f2517201 1537 safesysfree(environ[i]);
a687059c
LW
1538 while (environ[i]) {
1539 environ[i] = environ[i+1];
1540 i++;
1541 }
1542 return;
1543 }
8d063cd8 1544 if (!environ[i]) { /* does not exist yet */
f2517201 1545 environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
8d063cd8
LW
1546 environ[i+1] = Nullch; /* make sure it's null terminated */
1547 }
fe14fcc3 1548 else
f2517201 1549 safesysfree(environ[i]);
e6587932
DM
1550 nlen = strlen(nam);
1551 vlen = strlen(val);
f2517201 1552
e6587932
DM
1553 environ[i] = (char*)safesysmalloc((nlen+vlen+2) * sizeof(char));
1554 /* all that work just for this */
1555 my_setenv_format(environ[i], nam, nlen, val, vlen);
50acdf95
MS
1556 } else {
1557# endif
a0fd4948 1558# if defined(__CYGWIN__) || defined(EPOC) || defined(__SYMBIAN32__)
88f5bc07
AB
1559# if defined(HAS_UNSETENV)
1560 if (val == NULL) {
1561 (void)unsetenv(nam);
1562 } else {
1563 (void)setenv(nam, val, 1);
1564 }
1565# else /* ! HAS_UNSETENV */
1566 (void)setenv(nam, val, 1);
1567# endif /* HAS_UNSETENV */
47dafe4d 1568# else
88f5bc07
AB
1569# if defined(HAS_UNSETENV)
1570 if (val == NULL) {
1571 (void)unsetenv(nam);
1572 } else {
c4420975
AL
1573 const int nlen = strlen(nam);
1574 const int vlen = strlen(val);
1575 char * const new_env =
88f5bc07
AB
1576 (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
1577 my_setenv_format(new_env, nam, nlen, val, vlen);
1578 (void)putenv(new_env);
1579 }
1580# else /* ! HAS_UNSETENV */
1581 char *new_env;
c4420975
AL
1582 const int nlen = strlen(nam);
1583 int vlen;
88f5bc07
AB
1584 if (!val) {
1585 val = "";
1586 }
1587 vlen = strlen(val);
1588 new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
1589 /* all that work just for this */
1590 my_setenv_format(new_env, nam, nlen, val, vlen);
1591 (void)putenv(new_env);
1592# endif /* HAS_UNSETENV */
47dafe4d 1593# endif /* __CYGWIN__ */
50acdf95
MS
1594#ifndef PERL_USE_SAFE_PUTENV
1595 }
1596#endif
4efc5df6 1597 }
8d063cd8
LW
1598}
1599
2986a63f 1600#else /* WIN32 || NETWARE */
68dc0745 1601
1602void
72229eff 1603Perl_my_setenv(pTHX_ const char *nam, const char *val)
68dc0745 1604{
27da23d5 1605 dVAR;
ac5c734f 1606 register char *envstr;
e1ec3a88
AL
1607 const int nlen = strlen(nam);
1608 int vlen;
e6587932 1609
ac5c734f
GS
1610 if (!val) {
1611 val = "";
1612 }
e6587932 1613 vlen = strlen(val);
a02a5408 1614 Newx(envstr, nlen+vlen+2, char);
e6587932 1615 my_setenv_format(envstr, nam, nlen, val, vlen);
ac5c734f
GS
1616 (void)PerlEnv_putenv(envstr);
1617 Safefree(envstr);
3e3baf6d
TB
1618}
1619
2986a63f 1620#endif /* WIN32 || NETWARE */
3e3baf6d 1621
2f42fcb0 1622#ifndef PERL_MICRO
3e3baf6d 1623I32
e1ec3a88 1624Perl_setenv_getix(pTHX_ const char *nam)
3e3baf6d 1625{
53c1dcc0 1626 register I32 i;
0d46e09a 1627 register const I32 len = strlen(nam);
3e3baf6d
TB
1628
1629 for (i = 0; environ[i]; i++) {
1630 if (
1631#ifdef WIN32
1632 strnicmp(environ[i],nam,len) == 0
1633#else
1634 strnEQ(environ[i],nam,len)
1635#endif
1636 && environ[i][len] == '=')
1637 break; /* strnEQ must come first to avoid */
1638 } /* potential SEGV's */
1639 return i;
68dc0745 1640}
2f42fcb0 1641#endif /* !PERL_MICRO */
68dc0745 1642
ed79a026 1643#endif /* !VMS && !EPOC*/
378cc40b 1644
16d20bd9 1645#ifdef UNLINK_ALL_VERSIONS
79072805 1646I32
6e732051 1647Perl_unlnk(pTHX_ const char *f) /* unlink all versions of a file */
378cc40b 1648{
79072805 1649 I32 i;
378cc40b 1650
6ad3d225 1651 for (i = 0; PerlLIO_unlink(f) >= 0; i++) ;
378cc40b
LW
1652 return i ? 0 : -1;
1653}
1654#endif
1655
7a3f2258 1656/* this is a drop-in replacement for bcopy() */
2253333f 1657#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
378cc40b 1658char *
7a3f2258 1659Perl_my_bcopy(register const char *from,register char *to,register I32 len)
378cc40b 1660{
2d03de9c 1661 char * const retval = to;
378cc40b 1662
7c0587c8
LW
1663 if (from - to >= 0) {
1664 while (len--)
1665 *to++ = *from++;
1666 }
1667 else {
1668 to += len;
1669 from += len;
1670 while (len--)
faf8582f 1671 *(--to) = *(--from);
7c0587c8 1672 }
378cc40b
LW
1673 return retval;
1674}
ffed7fef 1675#endif
378cc40b 1676
7a3f2258 1677/* this is a drop-in replacement for memset() */
fc36a67e 1678#ifndef HAS_MEMSET
1679void *
7a3f2258 1680Perl_my_memset(register char *loc, register I32 ch, register I32 len)
fc36a67e 1681{
2d03de9c 1682 char * const retval = loc;
fc36a67e 1683
1684 while (len--)
1685 *loc++ = ch;
1686 return retval;
1687}
1688#endif
1689
7a3f2258 1690/* this is a drop-in replacement for bzero() */
7c0587c8 1691#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
378cc40b 1692char *
7a3f2258 1693Perl_my_bzero(register char *loc, register I32 len)
378cc40b 1694{
2d03de9c 1695 char * const retval = loc;
378cc40b
LW
1696
1697 while (len--)
1698 *loc++ = 0;
1699 return retval;
1700}
1701#endif
7c0587c8 1702
7a3f2258 1703/* this is a drop-in replacement for memcmp() */
36477c24 1704#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
79072805 1705I32
7a3f2258 1706Perl_my_memcmp(const char *s1, const char *s2, register I32 len)
7c0587c8 1707{
e1ec3a88
AL
1708 register const U8 *a = (const U8 *)s1;
1709 register const U8 *b = (const U8 *)s2;
79072805 1710 register I32 tmp;
7c0587c8
LW
1711
1712 while (len--) {
27da23d5 1713 if ((tmp = *a++ - *b++))
7c0587c8
LW
1714 return tmp;
1715 }
1716 return 0;
1717}
36477c24 1718#endif /* !HAS_MEMCMP || !HAS_SANE_MEMCMP */
a687059c 1719
fe14fcc3 1720#ifndef HAS_VPRINTF
a687059c 1721
85e6fe83 1722#ifdef USE_CHAR_VSPRINTF
a687059c
LW
1723char *
1724#else
1725int
1726#endif
08105a92 1727vsprintf(char *dest, const char *pat, char *args)
a687059c
LW
1728{
1729 FILE fakebuf;
1730
1731 fakebuf._ptr = dest;
1732 fakebuf._cnt = 32767;
35c8bce7
LW
1733#ifndef _IOSTRG
1734#define _IOSTRG 0
1735#endif
a687059c
LW
1736 fakebuf._flag = _IOWRT|_IOSTRG;
1737 _doprnt(pat, args, &fakebuf); /* what a kludge */
1738 (void)putc('\0', &fakebuf);
85e6fe83 1739#ifdef USE_CHAR_VSPRINTF
a687059c
LW
1740 return(dest);
1741#else
1742 return 0; /* perl doesn't use return value */
1743#endif
1744}
1745
fe14fcc3 1746#endif /* HAS_VPRINTF */
a687059c
LW
1747
1748#ifdef MYSWAP
ffed7fef 1749#if BYTEORDER != 0x4321
a687059c 1750short
864dbfa3 1751Perl_my_swap(pTHX_ short s)
a687059c
LW
1752{
1753#if (BYTEORDER & 1) == 0
1754 short result;
1755
1756 result = ((s & 255) << 8) + ((s >> 8) & 255);
1757 return result;
1758#else
1759 return s;
1760#endif
1761}
1762
1763long
864dbfa3 1764Perl_my_htonl(pTHX_ long l)
a687059c
LW
1765{
1766 union {
1767 long result;
ffed7fef 1768 char c[sizeof(long)];
a687059c
LW
1769 } u;
1770
ffed7fef 1771#if BYTEORDER == 0x1234
a687059c
LW
1772 u.c[0] = (l >> 24) & 255;
1773 u.c[1] = (l >> 16) & 255;
1774 u.c[2] = (l >> 8) & 255;
1775 u.c[3] = l & 255;
1776 return u.result;
1777#else
ffed7fef 1778#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
cea2e8a9 1779 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
a687059c 1780#else
79072805
LW
1781 register I32 o;
1782 register I32 s;
a687059c 1783
ffed7fef
LW
1784 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
1785 u.c[o & 0xf] = (l >> s) & 255;
a687059c
LW
1786 }
1787 return u.result;
1788#endif
1789#endif
1790}
1791
1792long
864dbfa3 1793Perl_my_ntohl(pTHX_ long l)
a687059c
LW
1794{
1795 union {
1796 long l;
ffed7fef 1797 char c[sizeof(long)];
a687059c
LW
1798 } u;
1799
ffed7fef 1800#if BYTEORDER == 0x1234
a687059c
LW
1801 u.c[0] = (l >> 24) & 255;
1802 u.c[1] = (l >> 16) & 255;
1803 u.c[2] = (l >> 8) & 255;
1804 u.c[3] = l & 255;
1805 return u.l;
1806#else
ffed7fef 1807#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
cea2e8a9 1808 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
a687059c 1809#else
79072805
LW
1810 register I32 o;
1811 register I32 s;
a687059c
LW
1812
1813 u.l = l;
1814 l = 0;
ffed7fef
LW
1815 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
1816 l |= (u.c[o & 0xf] & 255) << s;
a687059c
LW
1817 }
1818 return l;
1819#endif
1820#endif
1821}
1822
ffed7fef 1823#endif /* BYTEORDER != 0x4321 */
988174c1
LW
1824#endif /* MYSWAP */
1825
1826/*
1827 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1828 * If these functions are defined,
1829 * the BYTEORDER is neither 0x1234 nor 0x4321.
1830 * However, this is not assumed.
1831 * -DWS
1832 */
1833
1109a392 1834#define HTOLE(name,type) \
988174c1 1835 type \
ba106d47 1836 name (register type n) \
988174c1
LW
1837 { \
1838 union { \
1839 type value; \
1840 char c[sizeof(type)]; \
1841 } u; \
79072805 1842 register I32 i; \
1109a392
MHM
1843 register I32 s = 0; \
1844 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
988174c1
LW
1845 u.c[i] = (n >> s) & 0xFF; \
1846 } \
1847 return u.value; \
1848 }
1849
1109a392 1850#define LETOH(name,type) \
988174c1 1851 type \
ba106d47 1852 name (register type n) \
988174c1
LW
1853 { \
1854 union { \
1855 type value; \
1856 char c[sizeof(type)]; \
1857 } u; \
79072805 1858 register I32 i; \
1109a392 1859 register I32 s = 0; \
988174c1
LW
1860 u.value = n; \
1861 n = 0; \
1109a392
MHM
1862 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
1863 n |= ((type)(u.c[i] & 0xFF)) << s; \
988174c1
LW
1864 } \
1865 return n; \
1866 }
1867
1109a392
MHM
1868/*
1869 * Big-endian byte order functions.
1870 */
1871
1872#define HTOBE(name,type) \
1873 type \
1874 name (register type n) \
1875 { \
1876 union { \
1877 type value; \
1878 char c[sizeof(type)]; \
1879 } u; \
1880 register I32 i; \
1881 register I32 s = 8*(sizeof(u.c)-1); \
1882 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
1883 u.c[i] = (n >> s) & 0xFF; \
1884 } \
1885 return u.value; \
1886 }
1887
1888#define BETOH(name,type) \
1889 type \
1890 name (register type n) \
1891 { \
1892 union { \
1893 type value; \
1894 char c[sizeof(type)]; \
1895 } u; \
1896 register I32 i; \
1897 register I32 s = 8*(sizeof(u.c)-1); \
1898 u.value = n; \
1899 n = 0; \
1900 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
1901 n |= ((type)(u.c[i] & 0xFF)) << s; \
1902 } \
1903 return n; \
1904 }
1905
1906/*
1907 * If we just can't do it...
1908 */
1909
1910#define NOT_AVAIL(name,type) \
1911 type \
1912 name (register type n) \
1913 { \
1914 Perl_croak_nocontext(#name "() not available"); \
1915 return n; /* not reached */ \
1916 }
1917
1918
988174c1 1919#if defined(HAS_HTOVS) && !defined(htovs)
1109a392 1920HTOLE(htovs,short)
988174c1
LW
1921#endif
1922#if defined(HAS_HTOVL) && !defined(htovl)
1109a392 1923HTOLE(htovl,long)
988174c1
LW
1924#endif
1925#if defined(HAS_VTOHS) && !defined(vtohs)
1109a392 1926LETOH(vtohs,short)
988174c1
LW
1927#endif
1928#if defined(HAS_VTOHL) && !defined(vtohl)
1109a392
MHM
1929LETOH(vtohl,long)
1930#endif
1931
1932#ifdef PERL_NEED_MY_HTOLE16
1933# if U16SIZE == 2
1934HTOLE(Perl_my_htole16,U16)
1935# else
1936NOT_AVAIL(Perl_my_htole16,U16)
1937# endif
1938#endif
1939#ifdef PERL_NEED_MY_LETOH16
1940# if U16SIZE == 2
1941LETOH(Perl_my_letoh16,U16)
1942# else
1943NOT_AVAIL(Perl_my_letoh16,U16)
1944# endif
1945#endif
1946#ifdef PERL_NEED_MY_HTOBE16
1947# if U16SIZE == 2
1948HTOBE(Perl_my_htobe16,U16)
1949# else
1950NOT_AVAIL(Perl_my_htobe16,U16)
1951# endif
1952#endif
1953#ifdef PERL_NEED_MY_BETOH16
1954# if U16SIZE == 2
1955BETOH(Perl_my_betoh16,U16)
1956# else
1957NOT_AVAIL(Perl_my_betoh16,U16)
1958# endif
1959#endif
1960
1961#ifdef PERL_NEED_MY_HTOLE32
1962# if U32SIZE == 4
1963HTOLE(Perl_my_htole32,U32)
1964# else
1965NOT_AVAIL(Perl_my_htole32,U32)
1966# endif
1967#endif
1968#ifdef PERL_NEED_MY_LETOH32
1969# if U32SIZE == 4
1970LETOH(Perl_my_letoh32,U32)
1971# else
1972NOT_AVAIL(Perl_my_letoh32,U32)
1973# endif
1974#endif
1975#ifdef PERL_NEED_MY_HTOBE32
1976# if U32SIZE == 4
1977HTOBE(Perl_my_htobe32,U32)
1978# else
1979NOT_AVAIL(Perl_my_htobe32,U32)
1980# endif
1981#endif
1982#ifdef PERL_NEED_MY_BETOH32
1983# if U32SIZE == 4
1984BETOH(Perl_my_betoh32,U32)
1985# else
1986NOT_AVAIL(Perl_my_betoh32,U32)
1987# endif
1988#endif
1989
1990#ifdef PERL_NEED_MY_HTOLE64
1991# if U64SIZE == 8
1992HTOLE(Perl_my_htole64,U64)
1993# else
1994NOT_AVAIL(Perl_my_htole64,U64)
1995# endif
1996#endif
1997#ifdef PERL_NEED_MY_LETOH64
1998# if U64SIZE == 8
1999LETOH(Perl_my_letoh64,U64)
2000# else
2001NOT_AVAIL(Perl_my_letoh64,U64)
2002# endif
2003#endif
2004#ifdef PERL_NEED_MY_HTOBE64
2005# if U64SIZE == 8
2006HTOBE(Perl_my_htobe64,U64)
2007# else
2008NOT_AVAIL(Perl_my_htobe64,U64)
2009# endif
2010#endif
2011#ifdef PERL_NEED_MY_BETOH64
2012# if U64SIZE == 8
2013BETOH(Perl_my_betoh64,U64)
2014# else
2015NOT_AVAIL(Perl_my_betoh64,U64)
2016# endif
988174c1 2017#endif
a687059c 2018
1109a392
MHM
2019#ifdef PERL_NEED_MY_HTOLES
2020HTOLE(Perl_my_htoles,short)
2021#endif
2022#ifdef PERL_NEED_MY_LETOHS
2023LETOH(Perl_my_letohs,short)
2024#endif
2025#ifdef PERL_NEED_MY_HTOBES
2026HTOBE(Perl_my_htobes,short)
2027#endif
2028#ifdef PERL_NEED_MY_BETOHS
2029BETOH(Perl_my_betohs,short)
2030#endif
2031
2032#ifdef PERL_NEED_MY_HTOLEI
2033HTOLE(Perl_my_htolei,int)
2034#endif
2035#ifdef PERL_NEED_MY_LETOHI
2036LETOH(Perl_my_letohi,int)
2037#endif
2038#ifdef PERL_NEED_MY_HTOBEI
2039HTOBE(Perl_my_htobei,int)
2040#endif
2041#ifdef PERL_NEED_MY_BETOHI
2042BETOH(Perl_my_betohi,int)
2043#endif
2044
2045#ifdef PERL_NEED_MY_HTOLEL
2046HTOLE(Perl_my_htolel,long)
2047#endif
2048#ifdef PERL_NEED_MY_LETOHL
2049LETOH(Perl_my_letohl,long)
2050#endif
2051#ifdef PERL_NEED_MY_HTOBEL
2052HTOBE(Perl_my_htobel,long)
2053#endif
2054#ifdef PERL_NEED_MY_BETOHL
2055BETOH(Perl_my_betohl,long)
2056#endif
2057
2058void
2059Perl_my_swabn(void *ptr, int n)
2060{
2061 register char *s = (char *)ptr;
2062 register char *e = s + (n-1);
2063 register char tc;
2064
2065 for (n /= 2; n > 0; s++, e--, n--) {
2066 tc = *s;
2067 *s = *e;
2068 *e = tc;
2069 }
2070}
2071
4a7d1889
NIS
2072PerlIO *
2073Perl_my_popen_list(pTHX_ char *mode, int n, SV **args)
2074{
2986a63f 2075#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(NETWARE)
1f852d0d
NIS
2076 int p[2];
2077 register I32 This, that;
2078 register Pid_t pid;
2079 SV *sv;
2080 I32 did_pipes = 0;
2081 int pp[2];
2082
2083 PERL_FLUSHALL_FOR_CHILD;
2084 This = (*mode == 'w');
2085 that = !This;
2086 if (PL_tainting) {
2087 taint_env();
2088 taint_proper("Insecure %s%s", "EXEC");
2089 }
2090 if (PerlProc_pipe(p) < 0)
2091 return Nullfp;
2092 /* Try for another pipe pair for error return */
2093 if (PerlProc_pipe(pp) >= 0)
2094 did_pipes = 1;
52e18b1f 2095 while ((pid = PerlProc_fork()) < 0) {
1f852d0d
NIS
2096 if (errno != EAGAIN) {
2097 PerlLIO_close(p[This]);
4e6dfe71 2098 PerlLIO_close(p[that]);
1f852d0d
NIS
2099 if (did_pipes) {
2100 PerlLIO_close(pp[0]);
2101 PerlLIO_close(pp[1]);
2102 }
2103 return Nullfp;
2104 }
2105 sleep(5);
2106 }
2107 if (pid == 0) {
2108 /* Child */
1f852d0d
NIS
2109#undef THIS
2110#undef THAT
2111#define THIS that
2112#define THAT This
1f852d0d
NIS
2113 /* Close parent's end of error status pipe (if any) */
2114 if (did_pipes) {
2115 PerlLIO_close(pp[0]);
2116#if defined(HAS_FCNTL) && defined(F_SETFD)
2117 /* Close error pipe automatically if exec works */
2118 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2119#endif
2120 }
2121 /* Now dup our end of _the_ pipe to right position */
2122 if (p[THIS] != (*mode == 'r')) {
2123 PerlLIO_dup2(p[THIS], *mode == 'r');
2124 PerlLIO_close(p[THIS]);
4e6dfe71
GS
2125 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2126 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
1f852d0d 2127 }
4e6dfe71
GS
2128 else
2129 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
1f852d0d
NIS
2130#if !defined(HAS_FCNTL) || !defined(F_SETFD)
2131 /* No automatic close - do it by hand */
b7953727
JH
2132# ifndef NOFILE
2133# define NOFILE 20
2134# endif
a080fe3d
NIS
2135 {
2136 int fd;
2137
2138 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
3aed30dc 2139 if (fd != pp[1])
a080fe3d
NIS
2140 PerlLIO_close(fd);
2141 }
1f852d0d
NIS
2142 }
2143#endif
2144 do_aexec5(Nullsv, args-1, args-1+n, pp[1], did_pipes);
2145 PerlProc__exit(1);
2146#undef THIS
2147#undef THAT
2148 }
2149 /* Parent */
52e18b1f 2150 do_execfree(); /* free any memory malloced by child on fork */
1f852d0d
NIS
2151 if (did_pipes)
2152 PerlLIO_close(pp[1]);
2153 /* Keep the lower of the two fd numbers */
2154 if (p[that] < p[This]) {
2155 PerlLIO_dup2(p[This], p[that]);
2156 PerlLIO_close(p[This]);
2157 p[This] = p[that];
2158 }
4e6dfe71
GS
2159 else
2160 PerlLIO_close(p[that]); /* close child's end of pipe */
2161
1f852d0d
NIS
2162 LOCK_FDPID_MUTEX;
2163 sv = *av_fetch(PL_fdpid,p[This],TRUE);
2164 UNLOCK_FDPID_MUTEX;
862a34c6 2165 SvUPGRADE(sv,SVt_IV);
45977657 2166 SvIV_set(sv, pid);
1f852d0d
NIS
2167 PL_forkprocess = pid;
2168 /* If we managed to get status pipe check for exec fail */
2169 if (did_pipes && pid > 0) {
2170 int errkid;
2171 int n = 0, n1;
2172
2173 while (n < sizeof(int)) {
2174 n1 = PerlLIO_read(pp[0],
2175 (void*)(((char*)&errkid)+n),
2176 (sizeof(int)) - n);
2177 if (n1 <= 0)
2178 break;
2179 n += n1;
2180 }
2181 PerlLIO_close(pp[0]);
2182 did_pipes = 0;
2183 if (n) { /* Error */
2184 int pid2, status;
8c51524e 2185 PerlLIO_close(p[This]);
1f852d0d
NIS
2186 if (n != sizeof(int))
2187 Perl_croak(aTHX_ "panic: kid popen errno read");
2188 do {
2189 pid2 = wait4pid(pid, &status, 0);
2190 } while (pid2 == -1 && errno == EINTR);
2191 errno = errkid; /* Propagate errno from kid */
2192 return Nullfp;
2193 }
2194 }
2195 if (did_pipes)
2196 PerlLIO_close(pp[0]);
2197 return PerlIO_fdopen(p[This], mode);
2198#else
4a7d1889
NIS
2199 Perl_croak(aTHX_ "List form of piped open not implemented");
2200 return (PerlIO *) NULL;
1f852d0d 2201#endif
4a7d1889
NIS
2202}
2203
5f05dabc 2204 /* VMS' my_popen() is in VMS.c, same with OS/2. */
cd39f2b6 2205#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
760ac839 2206PerlIO *
3dd43144 2207Perl_my_popen(pTHX_ const char *cmd, const char *mode)
a687059c
LW
2208{
2209 int p[2];
8ac85365 2210 register I32 This, that;
d8a83dd3 2211 register Pid_t pid;
79072805 2212 SV *sv;
bfce84ec 2213 const I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
e446cec8
IZ
2214 I32 did_pipes = 0;
2215 int pp[2];
a687059c 2216
45bc9206 2217 PERL_FLUSHALL_FOR_CHILD;
ddcf38b7
IZ
2218#ifdef OS2
2219 if (doexec) {
23da6c43 2220 return my_syspopen(aTHX_ cmd,mode);
ddcf38b7 2221 }
a1d180c4 2222#endif
8ac85365
NIS
2223 This = (*mode == 'w');
2224 that = !This;
3280af22 2225 if (doexec && PL_tainting) {
bbce6d69 2226 taint_env();
2227 taint_proper("Insecure %s%s", "EXEC");
d48672a2 2228 }
c2267164
IZ
2229 if (PerlProc_pipe(p) < 0)
2230 return Nullfp;
e446cec8
IZ
2231 if (doexec && PerlProc_pipe(pp) >= 0)
2232 did_pipes = 1;
52e18b1f 2233 while ((pid = PerlProc_fork()) < 0) {
a687059c 2234 if (errno != EAGAIN) {
6ad3d225 2235 PerlLIO_close(p[This]);
b5ac89c3 2236 PerlLIO_close(p[that]);
e446cec8
IZ
2237 if (did_pipes) {
2238 PerlLIO_close(pp[0]);
2239 PerlLIO_close(pp[1]);
2240 }
a687059c 2241 if (!doexec)
cea2e8a9 2242 Perl_croak(aTHX_ "Can't fork");
a687059c
LW
2243 return Nullfp;
2244 }
2245 sleep(5);
2246 }
2247 if (pid == 0) {
79072805
LW
2248 GV* tmpgv;
2249
30ac6d9b
GS
2250#undef THIS
2251#undef THAT
a687059c 2252#define THIS that
8ac85365 2253#define THAT This
e446cec8
IZ
2254 if (did_pipes) {
2255 PerlLIO_close(pp[0]);
2256#if defined(HAS_FCNTL) && defined(F_SETFD)
2257 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2258#endif
2259 }
a687059c 2260 if (p[THIS] != (*mode == 'r')) {
6ad3d225
GS
2261 PerlLIO_dup2(p[THIS], *mode == 'r');
2262 PerlLIO_close(p[THIS]);
b5ac89c3
NIS
2263 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2264 PerlLIO_close(p[THAT]);
a687059c 2265 }
b5ac89c3
NIS
2266 else
2267 PerlLIO_close(p[THAT]);
4435c477 2268#ifndef OS2
a687059c 2269 if (doexec) {
a0d0e21e 2270#if !defined(HAS_FCNTL) || !defined(F_SETFD)
ae986130
LW
2271#ifndef NOFILE
2272#define NOFILE 20
2273#endif
a080fe3d 2274 {
3aed30dc 2275 int fd;
a080fe3d
NIS
2276
2277 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2278 if (fd != pp[1])
3aed30dc 2279 PerlLIO_close(fd);
a080fe3d 2280 }
ae986130 2281#endif
a080fe3d
NIS
2282 /* may or may not use the shell */
2283 do_exec3(cmd, pp[1], did_pipes);
6ad3d225 2284 PerlProc__exit(1);
a687059c 2285 }
4435c477 2286#endif /* defined OS2 */
306196c3 2287 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
4d76a344 2288 SvREADONLY_off(GvSV(tmpgv));
7766f137 2289 sv_setiv(GvSV(tmpgv), PerlProc_getpid());
4d76a344
RGS
2290 SvREADONLY_on(GvSV(tmpgv));
2291 }
2292#ifdef THREADS_HAVE_PIDS
2293 PL_ppid = (IV)getppid();
2294#endif
3280af22 2295 PL_forkprocess = 0;
ca0c25f6 2296#ifdef PERL_USES_PL_PIDSTATUS
3280af22 2297 hv_clear(PL_pidstatus); /* we have no children */
ca0c25f6 2298#endif
a687059c
LW
2299 return Nullfp;
2300#undef THIS
2301#undef THAT
2302 }
b5ac89c3 2303 do_execfree(); /* free any memory malloced by child on vfork */
e446cec8
IZ
2304 if (did_pipes)
2305 PerlLIO_close(pp[1]);
8ac85365 2306 if (p[that] < p[This]) {
6ad3d225
GS
2307 PerlLIO_dup2(p[This], p[that]);
2308 PerlLIO_close(p[This]);
8ac85365 2309 p[This] = p[that];
62b28dd9 2310 }
b5ac89c3
NIS
2311 else
2312 PerlLIO_close(p[that]);
2313
4755096e 2314 LOCK_FDPID_MUTEX;
3280af22 2315 sv = *av_fetch(PL_fdpid,p[This],TRUE);
4755096e 2316 UNLOCK_FDPID_MUTEX;
862a34c6 2317 SvUPGRADE(sv,SVt_IV);
45977657 2318 SvIV_set(sv, pid);
3280af22 2319 PL_forkprocess = pid;
e446cec8
IZ
2320 if (did_pipes && pid > 0) {
2321 int errkid;
2322 int n = 0, n1;
2323
2324 while (n < sizeof(int)) {
2325 n1 = PerlLIO_read(pp[0],
2326 (void*)(((char*)&errkid)+n),
2327 (sizeof(int)) - n);
2328 if (n1 <= 0)
2329 break;
2330 n += n1;
2331 }
2f96c702
IZ
2332 PerlLIO_close(pp[0]);
2333 did_pipes = 0;
e446cec8 2334 if (n) { /* Error */
faa466a7 2335 int pid2, status;
8c51524e 2336 PerlLIO_close(p[This]);
e446cec8 2337 if (n != sizeof(int))
cea2e8a9 2338 Perl_croak(aTHX_ "panic: kid popen errno read");
faa466a7
RG
2339 do {
2340 pid2 = wait4pid(pid, &status, 0);
2341 } while (pid2 == -1 && errno == EINTR);
e446cec8
IZ
2342 errno = errkid; /* Propagate errno from kid */
2343 return Nullfp;
2344 }
2345 }
2346 if (did_pipes)
2347 PerlLIO_close(pp[0]);
8ac85365 2348 return PerlIO_fdopen(p[This], mode);
a687059c 2349}
7c0587c8 2350#else
85ca448a 2351#if defined(atarist) || defined(EPOC)
7c0587c8 2352FILE *popen();
760ac839 2353PerlIO *
864dbfa3 2354Perl_my_popen(pTHX_ char *cmd, char *mode)
7c0587c8 2355{
45bc9206 2356 PERL_FLUSHALL_FOR_CHILD;
a1d180c4
NIS
2357 /* Call system's popen() to get a FILE *, then import it.
2358 used 0 for 2nd parameter to PerlIO_importFILE;
2359 apparently not used
2360 */
2361 return PerlIO_importFILE(popen(cmd, mode), 0);
7c0587c8 2362}
2b96b0a5
JH
2363#else
2364#if defined(DJGPP)
2365FILE *djgpp_popen();
2366PerlIO *
2367Perl_my_popen(pTHX_ char *cmd, char *mode)
2368{
2369 PERL_FLUSHALL_FOR_CHILD;
2370 /* Call system's popen() to get a FILE *, then import it.
2371 used 0 for 2nd parameter to PerlIO_importFILE;
2372 apparently not used
2373 */
2374 return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2375}
2376#endif
7c0587c8
LW
2377#endif
2378
2379#endif /* !DOSISH */
a687059c 2380
52e18b1f
GS
2381/* this is called in parent before the fork() */
2382void
2383Perl_atfork_lock(void)
2384{
27da23d5 2385 dVAR;
3db8f154 2386#if defined(USE_ITHREADS)
52e18b1f
GS
2387 /* locks must be held in locking order (if any) */
2388# ifdef MYMALLOC
2389 MUTEX_LOCK(&PL_malloc_mutex);
2390# endif
2391 OP_REFCNT_LOCK;
2392#endif
2393}
2394
2395/* this is called in both parent and child after the fork() */
2396void
2397Perl_atfork_unlock(void)
2398{
27da23d5 2399 dVAR;
3db8f154 2400#if defined(USE_ITHREADS)
52e18b1f
GS
2401 /* locks must be released in same order as in atfork_lock() */
2402# ifdef MYMALLOC
2403 MUTEX_UNLOCK(&PL_malloc_mutex);
2404# endif
2405 OP_REFCNT_UNLOCK;
2406#endif
2407}
2408
2409Pid_t
2410Perl_my_fork(void)
2411{
2412#if defined(HAS_FORK)
2413 Pid_t pid;
3db8f154 2414#if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
52e18b1f
GS
2415 atfork_lock();
2416 pid = fork();
2417 atfork_unlock();
2418#else
2419 /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2420 * handlers elsewhere in the code */
2421 pid = fork();
2422#endif
2423 return pid;
2424#else
2425 /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2426 Perl_croak_nocontext("fork() not available");
b961a566 2427 return 0;
52e18b1f
GS
2428#endif /* HAS_FORK */
2429}
2430
748a9306 2431#ifdef DUMP_FDS
35ff7856 2432void
864dbfa3 2433Perl_dump_fds(pTHX_ char *s)
ae986130
LW
2434{
2435 int fd;
c623ac67 2436 Stat_t tmpstatbuf;
ae986130 2437
bf49b057 2438 PerlIO_printf(Perl_debug_log,"%s", s);
ae986130 2439 for (fd = 0; fd < 32; fd++) {
6ad3d225 2440 if (PerlLIO_fstat(fd,&tmpstatbuf) >= 0)
bf49b057 2441 PerlIO_printf(Perl_debug_log," %d",fd);
ae986130 2442 }
bf49b057 2443 PerlIO_printf(Perl_debug_log,"\n");
27da23d5 2444 return;
ae986130 2445}
35ff7856 2446#endif /* DUMP_FDS */
ae986130 2447
fe14fcc3 2448#ifndef HAS_DUP2
fec02dd3 2449int
ba106d47 2450dup2(int oldfd, int newfd)
a687059c 2451{
a0d0e21e 2452#if defined(HAS_FCNTL) && defined(F_DUPFD)
fec02dd3
AD
2453 if (oldfd == newfd)
2454 return oldfd;
6ad3d225 2455 PerlLIO_close(newfd);
fec02dd3 2456 return fcntl(oldfd, F_DUPFD, newfd);
62b28dd9 2457#else
fc36a67e 2458#define DUP2_MAX_FDS 256
2459 int fdtmp[DUP2_MAX_FDS];
79072805 2460 I32 fdx = 0;
ae986130
LW
2461 int fd;
2462
fe14fcc3 2463 if (oldfd == newfd)
fec02dd3 2464 return oldfd;
6ad3d225 2465 PerlLIO_close(newfd);
fc36a67e 2466 /* good enough for low fd's... */
6ad3d225 2467 while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
fc36a67e 2468 if (fdx >= DUP2_MAX_FDS) {
6ad3d225 2469 PerlLIO_close(fd);
fc36a67e 2470 fd = -1;
2471 break;
2472 }
ae986130 2473 fdtmp[fdx++] = fd;
fc36a67e 2474 }
ae986130 2475 while (fdx > 0)
6ad3d225 2476 PerlLIO_close(fdtmp[--fdx]);
fec02dd3 2477 return fd;
62b28dd9 2478#endif
a687059c
LW
2479}
2480#endif
2481
64ca3a65 2482#ifndef PERL_MICRO
ff68c719 2483#ifdef HAS_SIGACTION
2484
abea2c45
HS
2485#ifdef MACOS_TRADITIONAL
2486/* We don't want restart behavior on MacOS */
2487#undef SA_RESTART
2488#endif
2489
ff68c719 2490Sighandler_t
864dbfa3 2491Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
ff68c719 2492{
27da23d5 2493 dVAR;
ff68c719 2494 struct sigaction act, oact;
2495
a10b1e10
JH
2496#ifdef USE_ITHREADS
2497 /* only "parent" interpreter can diddle signals */
2498 if (PL_curinterp != aTHX)
8aad04aa 2499 return (Sighandler_t) SIG_ERR;
a10b1e10
JH
2500#endif
2501
8aad04aa 2502 act.sa_handler = (void(*)(int))handler;
ff68c719 2503 sigemptyset(&act.sa_mask);
2504 act.sa_flags = 0;
2505#ifdef SA_RESTART
4ffa73a3
JH
2506 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2507 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
0a8e0eff 2508#endif
358837b8 2509#if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
8aad04aa 2510 if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
85264bed
CS
2511 act.sa_flags |= SA_NOCLDWAIT;
2512#endif
ff68c719 2513 if (sigaction(signo, &act, &oact) == -1)
8aad04aa 2514 return (Sighandler_t) SIG_ERR;
ff68c719 2515 else
8aad04aa 2516 return (Sighandler_t) oact.sa_handler;
ff68c719 2517}
2518
2519Sighandler_t
864dbfa3 2520Perl_rsignal_state(pTHX_ int signo)
ff68c719 2521{
2522 struct sigaction oact;
2523
2524 if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
8aad04aa 2525 return (Sighandler_t) SIG_ERR;
ff68c719 2526 else
8aad04aa 2527 return (Sighandler_t) oact.sa_handler;
ff68c719 2528}
2529
2530int
864dbfa3 2531Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
ff68c719 2532{
27da23d5 2533 dVAR;
ff68c719 2534 struct sigaction act;
2535
a10b1e10
JH
2536#ifdef USE_ITHREADS
2537 /* only "parent" interpreter can diddle signals */
2538 if (PL_curinterp != aTHX)
2539 return -1;
2540#endif
2541
8aad04aa 2542 act.sa_handler = (void(*)(int))handler;
ff68c719 2543 sigemptyset(&act.sa_mask);
2544 act.sa_flags = 0;
2545#ifdef SA_RESTART
4ffa73a3
JH
2546 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2547 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
0a8e0eff 2548#endif
36b5d377 2549#if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
8aad04aa 2550 if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
85264bed
CS
2551 act.sa_flags |= SA_NOCLDWAIT;
2552#endif
ff68c719 2553 return sigaction(signo, &act, save);
2554}
2555
2556int
864dbfa3 2557Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
ff68c719 2558{
27da23d5 2559 dVAR;
a10b1e10
JH
2560#ifdef USE_ITHREADS
2561 /* only "parent" interpreter can diddle signals */
2562 if (PL_curinterp != aTHX)
2563 return -1;
2564#endif
2565
ff68c719 2566 return sigaction(signo, save, (struct sigaction *)NULL);
2567}
2568
2569#else /* !HAS_SIGACTION */
2570
2571Sighandler_t
864dbfa3 2572Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
ff68c719 2573{
39f1703b 2574#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2575 /* only "parent" interpreter can diddle signals */
2576 if (PL_curinterp != aTHX)
8aad04aa 2577 return (Sighandler_t) SIG_ERR;
a10b1e10
JH
2578#endif
2579
6ad3d225 2580 return PerlProc_signal(signo, handler);
ff68c719 2581}
2582
ff68c719 2583static
2584Signal_t
4e35701f 2585sig_trap(int signo)
ff68c719 2586{
27da23d5
JH
2587 dVAR;
2588 PL_sig_trapped++;
ff68c719 2589}
2590
2591Sighandler_t
864dbfa3 2592Perl_rsignal_state(pTHX_ int signo)
ff68c719 2593{
27da23d5 2594 dVAR;
ff68c719 2595 Sighandler_t oldsig;
2596
39f1703b 2597#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2598 /* only "parent" interpreter can diddle signals */
2599 if (PL_curinterp != aTHX)
8aad04aa 2600 return (Sighandler_t) SIG_ERR;
a10b1e10
JH
2601#endif
2602
27da23d5 2603 PL_sig_trapped = 0;
6ad3d225
GS
2604 oldsig = PerlProc_signal(signo, sig_trap);
2605 PerlProc_signal(signo, oldsig);
27da23d5 2606 if (PL_sig_trapped)
3aed30dc 2607 PerlProc_kill(PerlProc_getpid(), signo);
ff68c719 2608 return oldsig;
2609}
2610
2611int
864dbfa3 2612Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
ff68c719 2613{
39f1703b 2614#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2615 /* only "parent" interpreter can diddle signals */
2616 if (PL_curinterp != aTHX)
2617 return -1;
2618#endif
6ad3d225 2619 *save = PerlProc_signal(signo, handler);
8aad04aa 2620 return (*save == (Sighandler_t) SIG_ERR) ? -1 : 0;
ff68c719 2621}
2622
2623int
864dbfa3 2624Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
ff68c719 2625{
39f1703b 2626#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2627 /* only "parent" interpreter can diddle signals */
2628 if (PL_curinterp != aTHX)
2629 return -1;
2630#endif
8aad04aa 2631 return (PerlProc_signal(signo, *save) == (Sighandler_t) SIG_ERR) ? -1 : 0;
ff68c719 2632}
2633
2634#endif /* !HAS_SIGACTION */
64ca3a65 2635#endif /* !PERL_MICRO */
ff68c719 2636
5f05dabc 2637 /* VMS' my_pclose() is in VMS.c; same with OS/2 */
cd39f2b6 2638#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
79072805 2639I32
864dbfa3 2640Perl_my_pclose(pTHX_ PerlIO *ptr)
a687059c 2641{
ff68c719 2642 Sigsave_t hstat, istat, qstat;
a687059c 2643 int status;
a0d0e21e 2644 SV **svp;
d8a83dd3
JH
2645 Pid_t pid;
2646 Pid_t pid2;
03136e13 2647 bool close_failed;
b7953727 2648 int saved_errno = 0;
22fae026
TM
2649#ifdef WIN32
2650 int saved_win32_errno;
2651#endif
a687059c 2652
4755096e 2653 LOCK_FDPID_MUTEX;
3280af22 2654 svp = av_fetch(PL_fdpid,PerlIO_fileno(ptr),TRUE);
4755096e 2655 UNLOCK_FDPID_MUTEX;
25d92023 2656 pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
a0d0e21e 2657 SvREFCNT_dec(*svp);
3280af22 2658 *svp = &PL_sv_undef;
ddcf38b7
IZ
2659#ifdef OS2
2660 if (pid == -1) { /* Opened by popen. */
2661 return my_syspclose(ptr);
2662 }
a1d180c4 2663#endif
03136e13
CS
2664 if ((close_failed = (PerlIO_close(ptr) == EOF))) {
2665 saved_errno = errno;
22fae026
TM
2666#ifdef WIN32
2667 saved_win32_errno = GetLastError();
2668#endif
03136e13 2669 }
7c0587c8 2670#ifdef UTS
6ad3d225 2671 if(PerlProc_kill(pid, 0) < 0) { return(pid); } /* HOM 12/23/91 */
7c0587c8 2672#endif
64ca3a65 2673#ifndef PERL_MICRO
8aad04aa
JH
2674 rsignal_save(SIGHUP, (Sighandler_t) SIG_IGN, &hstat);
2675 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &istat);
2676 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qstat);
64ca3a65 2677#endif
748a9306 2678 do {
1d3434b8
GS
2679 pid2 = wait4pid(pid, &status, 0);
2680 } while (pid2 == -1 && errno == EINTR);
64ca3a65 2681#ifndef PERL_MICRO
ff68c719 2682 rsignal_restore(SIGHUP, &hstat);
2683 rsignal_restore(SIGINT, &istat);
2684 rsignal_restore(SIGQUIT, &qstat);
64ca3a65 2685#endif
03136e13 2686 if (close_failed) {
ce6e1103 2687 SETERRNO(saved_errno, 0);
03136e13
CS
2688 return -1;
2689 }
1d3434b8 2690 return(pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status));
20188a90 2691}
4633a7c4
LW
2692#endif /* !DOSISH */
2693
2986a63f 2694#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(MACOS_TRADITIONAL)
79072805 2695I32
d8a83dd3 2696Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
20188a90 2697{
27da23d5 2698 I32 result = 0;
b7953727
JH
2699 if (!pid)
2700 return -1;
ca0c25f6 2701#ifdef PERL_USES_PL_PIDSTATUS
b7953727 2702 {
3aed30dc 2703 if (pid > 0) {
12072db5
NC
2704 /* The keys in PL_pidstatus are now the raw 4 (or 8) bytes of the
2705 pid, rather than a string form. */
c4420975 2706 SV * const * const svp = hv_fetch(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),FALSE);
3aed30dc
HS
2707 if (svp && *svp != &PL_sv_undef) {
2708 *statusp = SvIVX(*svp);
12072db5
NC
2709 (void)hv_delete(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),
2710 G_DISCARD);
3aed30dc
HS
2711 return pid;
2712 }
2713 }
2714 else {
2715 HE *entry;
2716
2717 hv_iterinit(PL_pidstatus);
2718 if ((entry = hv_iternext(PL_pidstatus))) {
c4420975 2719 SV * const sv = hv_iterval(PL_pidstatus,entry);
7ea75b61 2720 I32 len;
0bcc34c2 2721 const char * const spid = hv_iterkey(entry,&len);
27da23d5 2722
12072db5
NC
2723 assert (len == sizeof(Pid_t));
2724 memcpy((char *)&pid, spid, len);
3aed30dc 2725 *statusp = SvIVX(sv);
7b9a3241
NC
2726 /* The hash iterator is currently on this entry, so simply
2727 calling hv_delete would trigger the lazy delete, which on
2728 aggregate does more work, beacuse next call to hv_iterinit()
2729 would spot the flag, and have to call the delete routine,
2730 while in the meantime any new entries can't re-use that
2731 memory. */
2732 hv_iterinit(PL_pidstatus);
7ea75b61 2733 (void)hv_delete(PL_pidstatus,spid,len,G_DISCARD);
3aed30dc
HS
2734 return pid;
2735 }
20188a90
LW
2736 }
2737 }
68a29c53 2738#endif
79072805 2739#ifdef HAS_WAITPID
367f3c24
IZ
2740# ifdef HAS_WAITPID_RUNTIME
2741 if (!HAS_WAITPID_RUNTIME)
2742 goto hard_way;
2743# endif
cddd4526 2744 result = PerlProc_waitpid(pid,statusp,flags);
dfcfdb64 2745 goto finish;
367f3c24
IZ
2746#endif
2747#if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
cddd4526 2748 result = wait4((pid==-1)?0:pid,statusp,flags,Null(struct rusage *));
dfcfdb64 2749 goto finish;
367f3c24 2750#endif
ca0c25f6 2751#ifdef PERL_USES_PL_PIDSTATUS
27da23d5 2752#if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
367f3c24 2753 hard_way:
27da23d5 2754#endif
a0d0e21e 2755 {
a0d0e21e 2756 if (flags)
cea2e8a9 2757 Perl_croak(aTHX_ "Can't do waitpid with flags");
a0d0e21e 2758 else {
76e3520e 2759 while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
a0d0e21e
LW
2760 pidgone(result,*statusp);
2761 if (result < 0)
2762 *statusp = -1;
2763 }
a687059c
LW
2764 }
2765#endif
27da23d5 2766#if defined(HAS_WAITPID) || defined(HAS_WAIT4)
dfcfdb64 2767 finish:
27da23d5 2768#endif
cddd4526
NIS
2769 if (result < 0 && errno == EINTR) {
2770 PERL_ASYNC_CHECK();
2771 }
2772 return result;
a687059c 2773}
2986a63f 2774#endif /* !DOSISH || OS2 || WIN32 || NETWARE */
a687059c 2775
ca0c25f6 2776#ifdef PERL_USES_PL_PIDSTATUS
7c0587c8 2777void
d8a83dd3 2778Perl_pidgone(pTHX_ Pid_t pid, int status)
a687059c 2779{
79072805 2780 register SV *sv;
a687059c 2781
12072db5 2782 sv = *hv_fetch(PL_pidstatus,(const char*)&pid,sizeof(Pid_t),TRUE);
862a34c6 2783 SvUPGRADE(sv,SVt_IV);
45977657 2784 SvIV_set(sv, status);
20188a90 2785 return;
a687059c 2786}
ca0c25f6 2787#endif
a687059c 2788
85ca448a 2789#if defined(atarist) || defined(OS2) || defined(EPOC)
7c0587c8 2790int pclose();
ddcf38b7
IZ
2791#ifdef HAS_FORK
2792int /* Cannot prototype with I32
2793 in os2ish.h. */
ba106d47 2794my_syspclose(PerlIO *ptr)
ddcf38b7 2795#else
79072805 2796I32
864dbfa3 2797Perl_my_pclose(pTHX_ PerlIO *ptr)
a1d180c4 2798#endif
a687059c 2799{
760ac839 2800 /* Needs work for PerlIO ! */
c4420975 2801 FILE * const f = PerlIO_findFILE(ptr);
7452cf6a 2802 const I32 result = pclose(f);
2b96b0a5
JH
2803 PerlIO_releaseFILE(ptr,f);
2804 return result;
2805}
2806#endif
2807
933fea7f 2808#if defined(DJGPP)
2b96b0a5
JH
2809int djgpp_pclose();
2810I32
2811Perl_my_pclose(pTHX_ PerlIO *ptr)
2812{
2813 /* Needs work for PerlIO ! */
c4420975 2814 FILE * const f = PerlIO_findFILE(ptr);
2b96b0a5 2815 I32 result = djgpp_pclose(f);
933fea7f 2816 result = (result << 8) & 0xff00;
760ac839
LW
2817 PerlIO_releaseFILE(ptr,f);
2818 return result;
a687059c 2819}
7c0587c8 2820#endif
9f68db38
LW
2821
2822void
864dbfa3 2823Perl_repeatcpy(pTHX_ register char *to, register const char *from, I32 len, register I32 count)
9f68db38 2824{
79072805 2825 register I32 todo;
c4420975 2826 register const char * const frombase = from;
9f68db38
LW
2827
2828 if (len == 1) {
08105a92 2829 register const char c = *from;
9f68db38 2830 while (count-- > 0)
5926133d 2831 *to++ = c;
9f68db38
LW
2832 return;
2833 }
2834 while (count-- > 0) {
2835 for (todo = len; todo > 0; todo--) {
2836 *to++ = *from++;
2837 }
2838 from = frombase;
2839 }
2840}
0f85fab0 2841
fe14fcc3 2842#ifndef HAS_RENAME
79072805 2843I32
4373e329 2844Perl_same_dirent(pTHX_ const char *a, const char *b)
62b28dd9 2845{
93a17b20
LW
2846 char *fa = strrchr(a,'/');
2847 char *fb = strrchr(b,'/');
c623ac67
GS
2848 Stat_t tmpstatbuf1;
2849 Stat_t tmpstatbuf2;
c4420975 2850 SV * const tmpsv = sv_newmortal();
62b28dd9
LW
2851
2852 if (fa)
2853 fa++;
2854 else
2855 fa = a;
2856 if (fb)
2857 fb++;
2858 else
2859 fb = b;
2860 if (strNE(a,b))
2861 return FALSE;
2862 if (fa == a)
616d8c9c 2863 sv_setpvn(tmpsv, ".", 1);
62b28dd9 2864 else
46fc3d4c 2865 sv_setpvn(tmpsv, a, fa - a);
95a20fc0 2866 if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
62b28dd9
LW
2867 return FALSE;
2868 if (fb == b)
616d8c9c 2869 sv_setpvn(tmpsv, ".", 1);
62b28dd9 2870 else
46fc3d4c 2871 sv_setpvn(tmpsv, b, fb - b);
95a20fc0 2872 if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
62b28dd9
LW
2873 return FALSE;
2874 return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
2875 tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
2876}
fe14fcc3
LW
2877#endif /* !HAS_RENAME */
2878
491527d0 2879char*
7f315aed
NC
2880Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
2881 const char *const *const search_ext, I32 flags)
491527d0 2882{
e1ec3a88 2883 const char *xfound = Nullch;
491527d0 2884 char *xfailed = Nullch;
0f31cffe 2885 char tmpbuf[MAXPATHLEN];
491527d0 2886 register char *s;
5f74f29c 2887 I32 len = 0;
491527d0
GS
2888 int retval;
2889#if defined(DOSISH) && !defined(OS2) && !defined(atarist)
2890# define SEARCH_EXTS ".bat", ".cmd", NULL
2891# define MAX_EXT_LEN 4
2892#endif
2893#ifdef OS2
2894# define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
2895# define MAX_EXT_LEN 4
2896#endif
2897#ifdef VMS
2898# define SEARCH_EXTS ".pl", ".com", NULL
2899# define MAX_EXT_LEN 4
2900#endif
2901 /* additional extensions to try in each dir if scriptname not found */
2902#ifdef SEARCH_EXTS
0bcc34c2 2903 static const char *const exts[] = { SEARCH_EXTS };
7f315aed 2904 const char *const *const ext = search_ext ? search_ext : exts;
491527d0 2905 int extidx = 0, i = 0;
e1ec3a88 2906 const char *curext = Nullch;
491527d0 2907#else
53c1dcc0 2908 PERL_UNUSED_ARG(search_ext);
491527d0
GS
2909# define MAX_EXT_LEN 0
2910#endif
2911
2912 /*
2913 * If dosearch is true and if scriptname does not contain path
2914 * delimiters, search the PATH for scriptname.
2915 *
2916 * If SEARCH_EXTS is also defined, will look for each
2917 * scriptname{SEARCH_EXTS} whenever scriptname is not found
2918 * while searching the PATH.
2919 *
2920 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
2921 * proceeds as follows:
2922 * If DOSISH or VMSISH:
2923 * + look for ./scriptname{,.foo,.bar}
2924 * + search the PATH for scriptname{,.foo,.bar}
2925 *
2926 * If !DOSISH:
2927 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
2928 * this will not look in '.' if it's not in the PATH)
2929 */
84486fc6 2930 tmpbuf[0] = '\0';
491527d0
GS
2931
2932#ifdef VMS
2933# ifdef ALWAYS_DEFTYPES
2934 len = strlen(scriptname);
2935 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
c4420975 2936 int idx = 0, deftypes = 1;
491527d0
GS
2937 bool seen_dot = 1;
2938
c4420975 2939 const int hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch);
491527d0
GS
2940# else
2941 if (dosearch) {
c4420975 2942 int idx = 0, deftypes = 1;
491527d0
GS
2943 bool seen_dot = 1;
2944
c4420975 2945 const int hasdir = (strpbrk(scriptname,":[</") != Nullch);
491527d0
GS
2946# endif
2947 /* The first time through, just add SEARCH_EXTS to whatever we
2948 * already have, so we can check for default file types. */
2949 while (deftypes ||
84486fc6 2950 (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
491527d0
GS
2951 {
2952 if (deftypes) {
2953 deftypes = 0;
84486fc6 2954 *tmpbuf = '\0';
491527d0 2955 }
84486fc6
GS
2956 if ((strlen(tmpbuf) + strlen(scriptname)
2957 + MAX_EXT_LEN) >= sizeof tmpbuf)
491527d0 2958 continue; /* don't search dir with too-long name */
84486fc6 2959 strcat(tmpbuf, scriptname);
491527d0
GS
2960#else /* !VMS */
2961
2962#ifdef DOSISH
2963 if (strEQ(scriptname, "-"))
2964 dosearch = 0;
2965 if (dosearch) { /* Look in '.' first. */
fe2774ed 2966 const char *cur = scriptname;
491527d0
GS
2967#ifdef SEARCH_EXTS
2968 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
2969 while (ext[i])
2970 if (strEQ(ext[i++],curext)) {
2971 extidx = -1; /* already has an ext */
2972 break;
2973 }
2974 do {
2975#endif
2976 DEBUG_p(PerlIO_printf(Perl_debug_log,
2977 "Looking for %s\n",cur));
017f25f1
IZ
2978 if (PerlLIO_stat(cur,&PL_statbuf) >= 0
2979 && !S_ISDIR(PL_statbuf.st_mode)) {
491527d0
GS
2980 dosearch = 0;
2981 scriptname = cur;
2982#ifdef SEARCH_EXTS
2983 break;
2984#endif
2985 }
2986#ifdef SEARCH_EXTS
2987 if (cur == scriptname) {
2988 len = strlen(scriptname);
84486fc6 2989 if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
491527d0 2990 break;
490a0e98 2991 /* FIXME? Convert to memcpy */
84486fc6 2992 cur = strcpy(tmpbuf, scriptname);
491527d0
GS
2993 }
2994 } while (extidx >= 0 && ext[extidx] /* try an extension? */
84486fc6 2995 && strcpy(tmpbuf+len, ext[extidx++]));
491527d0
GS
2996#endif
2997 }
2998#endif
2999
cd39f2b6
JH
3000#ifdef MACOS_TRADITIONAL
3001 if (dosearch && !strchr(scriptname, ':') &&
3002 (s = PerlEnv_getenv("Commands")))
3003#else
491527d0
GS
3004 if (dosearch && !strchr(scriptname, '/')
3005#ifdef DOSISH
3006 && !strchr(scriptname, '\\')
3007#endif
cd39f2b6
JH
3008 && (s = PerlEnv_getenv("PATH")))
3009#endif
3010 {
491527d0 3011 bool seen_dot = 0;
92f0c265 3012
3280af22
NIS
3013 PL_bufend = s + strlen(s);
3014 while (s < PL_bufend) {
cd39f2b6
JH
3015#ifdef MACOS_TRADITIONAL
3016 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
3017 ',',
3018 &len);
3019#else
491527d0
GS
3020#if defined(atarist) || defined(DOSISH)
3021 for (len = 0; *s
3022# ifdef atarist
3023 && *s != ','
3024# endif
3025 && *s != ';'; len++, s++) {
84486fc6
GS
3026 if (len < sizeof tmpbuf)
3027 tmpbuf[len] = *s;
491527d0 3028 }
84486fc6
GS
3029 if (len < sizeof tmpbuf)
3030 tmpbuf[len] = '\0';
491527d0 3031#else /* ! (atarist || DOSISH) */
3280af22 3032 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
491527d0
GS
3033 ':',
3034 &len);
3035#endif /* ! (atarist || DOSISH) */
cd39f2b6 3036#endif /* MACOS_TRADITIONAL */
3280af22 3037 if (s < PL_bufend)
491527d0 3038 s++;
84486fc6 3039 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
491527d0 3040 continue; /* don't search dir with too-long name */
cd39f2b6
JH
3041#ifdef MACOS_TRADITIONAL
3042 if (len && tmpbuf[len - 1] != ':')
3043 tmpbuf[len++] = ':';
3044#else
491527d0 3045 if (len
490a0e98 3046# if defined(atarist) || defined(__MINT__) || defined(DOSISH)
84486fc6
GS
3047 && tmpbuf[len - 1] != '/'
3048 && tmpbuf[len - 1] != '\\'
490a0e98 3049# endif
491527d0 3050 )
84486fc6
GS
3051 tmpbuf[len++] = '/';
3052 if (len == 2 && tmpbuf[0] == '.')
491527d0 3053 seen_dot = 1;
cd39f2b6 3054#endif
490a0e98
NC
3055 /* FIXME? Convert to memcpy by storing previous strlen(scriptname)
3056 */
84486fc6 3057 (void)strcpy(tmpbuf + len, scriptname);
491527d0
GS
3058#endif /* !VMS */
3059
3060#ifdef SEARCH_EXTS
84486fc6 3061 len = strlen(tmpbuf);
491527d0
GS
3062 if (extidx > 0) /* reset after previous loop */
3063 extidx = 0;
3064 do {
3065#endif
84486fc6 3066 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3280af22 3067 retval = PerlLIO_stat(tmpbuf,&PL_statbuf);
017f25f1
IZ
3068 if (S_ISDIR(PL_statbuf.st_mode)) {
3069 retval = -1;
3070 }
491527d0
GS
3071#ifdef SEARCH_EXTS
3072 } while ( retval < 0 /* not there */
3073 && extidx>=0 && ext[extidx] /* try an extension? */
84486fc6 3074 && strcpy(tmpbuf+len, ext[extidx++])
491527d0
GS
3075 );
3076#endif
3077 if (retval < 0)
3078 continue;
3280af22
NIS
3079 if (S_ISREG(PL_statbuf.st_mode)
3080 && cando(S_IRUSR,TRUE,&PL_statbuf)
73811745 3081#if !defined(DOSISH) && !defined(MACOS_TRADITIONAL)
3280af22 3082 && cando(S_IXUSR,TRUE,&PL_statbuf)
491527d0
GS
3083#endif
3084 )
3085 {
3aed30dc 3086 xfound = tmpbuf; /* bingo! */
491527d0
GS
3087 break;
3088 }
3089 if (!xfailed)
84486fc6 3090 xfailed = savepv(tmpbuf);
491527d0
GS
3091 }
3092#ifndef DOSISH
017f25f1 3093 if (!xfound && !seen_dot && !xfailed &&
a1d180c4 3094 (PerlLIO_stat(scriptname,&PL_statbuf) < 0
017f25f1 3095 || S_ISDIR(PL_statbuf.st_mode)))
491527d0
GS
3096#endif
3097 seen_dot = 1; /* Disable message. */
9ccb31f9
GS
3098 if (!xfound) {
3099 if (flags & 1) { /* do or die? */
3aed30dc 3100 Perl_croak(aTHX_ "Can't %s %s%s%s",
9ccb31f9
GS
3101 (xfailed ? "execute" : "find"),
3102 (xfailed ? xfailed : scriptname),
3103 (xfailed ? "" : " on PATH"),
3104 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3105 }
3106 scriptname = Nullch;
3107 }
43c5f42d 3108 Safefree(xfailed);
491527d0
GS
3109 scriptname = xfound;
3110 }
9ccb31f9 3111 return (scriptname ? savepv(scriptname) : Nullch);
491527d0
GS
3112}
3113
ba869deb
GS
3114#ifndef PERL_GET_CONTEXT_DEFINED
3115
3116void *
3117Perl_get_context(void)
3118{
27da23d5 3119 dVAR;
3db8f154 3120#if defined(USE_ITHREADS)
ba869deb
GS
3121# ifdef OLD_PTHREADS_API
3122 pthread_addr_t t;
3123 if (pthread_getspecific(PL_thr_key, &t))
3124 Perl_croak_nocontext("panic: pthread_getspecific");
3125 return (void*)t;
3126# else
bce813aa 3127# ifdef I_MACH_CTHREADS
8b8b35ab 3128 return (void*)cthread_data(cthread_self());
bce813aa 3129# else
8b8b35ab
JH
3130 return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
3131# endif
c44d3fdb 3132# endif
ba869deb
GS
3133#else
3134 return (void*)NULL;
3135#endif
3136}
3137
3138void
3139Perl_set_context(void *t)
3140{
8772537c 3141 dVAR;
3db8f154 3142#if defined(USE_ITHREADS)
c44d3fdb
GS
3143# ifdef I_MACH_CTHREADS
3144 cthread_set_data(cthread_self(), t);
3145# else
ba869deb
GS
3146 if (pthread_setspecific(PL_thr_key, t))
3147 Perl_croak_nocontext("panic: pthread_setspecific");
c44d3fdb 3148# endif
b464bac0 3149#else
8772537c 3150 PERL_UNUSED_ARG(t);
ba869deb
GS
3151#endif
3152}
3153
3154#endif /* !PERL_GET_CONTEXT_DEFINED */
491527d0 3155
27da23d5 3156#if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
22239a37 3157struct perl_vars *
864dbfa3 3158Perl_GetVars(pTHX)
22239a37 3159{
533c011a 3160 return &PL_Vars;
22239a37 3161}
31fb1209
NIS
3162#endif
3163
1cb0ed9b 3164char **
864dbfa3 3165Perl_get_op_names(pTHX)
31fb1209 3166{
27da23d5 3167 return (char **)PL_op_name;
31fb1209
NIS
3168}
3169
1cb0ed9b 3170char **
864dbfa3 3171Perl_get_op_descs(pTHX)
31fb1209 3172{
27da23d5 3173 return (char **)PL_op_desc;
31fb1209 3174}
9e6b2b00 3175
e1ec3a88 3176const char *
864dbfa3 3177Perl_get_no_modify(pTHX)
9e6b2b00 3178{
e1ec3a88 3179 return PL_no_modify;
9e6b2b00
GS
3180}
3181
3182U32 *
864dbfa3 3183Perl_get_opargs(pTHX)
9e6b2b00 3184{
27da23d5 3185 return (U32 *)PL_opargs;
9e6b2b00 3186}
51aa15f3 3187
0cb96387
GS
3188PPADDR_t*
3189Perl_get_ppaddr(pTHX)
3190{
27da23d5 3191 dVAR;
12ae5dfc 3192 return (PPADDR_t*)PL_ppaddr;
0cb96387
GS
3193}
3194
a6c40364
GS
3195#ifndef HAS_GETENV_LEN
3196char *
bf4acbe4 3197Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
a6c40364 3198{
8772537c 3199 char * const env_trans = PerlEnv_getenv(env_elem);
a6c40364
GS
3200 if (env_trans)
3201 *len = strlen(env_trans);
3202 return env_trans;
f675dbe5
CB
3203}
3204#endif
3205
dc9e4912
GS
3206
3207MGVTBL*
864dbfa3 3208Perl_get_vtbl(pTHX_ int vtbl_id)
dc9e4912 3209{
7452cf6a 3210 const MGVTBL* result;
dc9e4912
GS
3211
3212 switch(vtbl_id) {
3213 case want_vtbl_sv:
3214 result = &PL_vtbl_sv;
3215 break;
3216 case want_vtbl_env:
3217 result = &PL_vtbl_env;
3218 break;
3219 case want_vtbl_envelem:
3220 result = &PL_vtbl_envelem;
3221 break;
3222 case want_vtbl_sig:
3223 result = &PL_vtbl_sig;
3224 break;
3225 case want_vtbl_sigelem:
3226 result = &PL_vtbl_sigelem;
3227 break;
3228 case want_vtbl_pack:
3229 result = &PL_vtbl_pack;
3230 break;
3231 case want_vtbl_packelem:
3232 result = &PL_vtbl_packelem;
3233 break;
3234 case want_vtbl_dbline:
3235 result = &PL_vtbl_dbline;
3236 break;
3237 case want_vtbl_isa:
3238 result = &PL_vtbl_isa;
3239 break;
3240 case want_vtbl_isaelem:
3241 result = &PL_vtbl_isaelem;
3242 break;
3243 case want_vtbl_arylen:
3244 result = &PL_vtbl_arylen;
3245 break;
3246 case want_vtbl_glob:
3247 result = &PL_vtbl_glob;
3248 break;
3249 case want_vtbl_mglob:
3250 result = &PL_vtbl_mglob;
3251 break;
3252 case want_vtbl_nkeys:
3253 result = &PL_vtbl_nkeys;
3254 break;
3255 case want_vtbl_taint:
3256 result = &PL_vtbl_taint;
3257 break;
3258 case want_vtbl_substr:
3259 result = &PL_vtbl_substr;
3260 break;
3261 case want_vtbl_vec:
3262 result = &PL_vtbl_vec;
3263 break;
3264 case want_vtbl_pos:
3265 result = &PL_vtbl_pos;
3266 break;
3267 case want_vtbl_bm:
3268 result = &PL_vtbl_bm;
3269 break;
3270 case want_vtbl_fm:
3271 result = &PL_vtbl_fm;
3272 break;
3273 case want_vtbl_uvar:
3274 result = &PL_vtbl_uvar;
3275 break;
dc9e4912
GS
3276 case want_vtbl_defelem:
3277 result = &PL_vtbl_defelem;
3278 break;
3279 case want_vtbl_regexp:
3280 result = &PL_vtbl_regexp;
3281 break;
3282 case want_vtbl_regdata:
3283 result = &PL_vtbl_regdata;
3284 break;
3285 case want_vtbl_regdatum:
3286 result = &PL_vtbl_regdatum;
3287 break;
3c90161d 3288#ifdef USE_LOCALE_COLLATE
dc9e4912
GS
3289 case want_vtbl_collxfrm:
3290 result = &PL_vtbl_collxfrm;
3291 break;
3c90161d 3292#endif
dc9e4912
GS
3293 case want_vtbl_amagic:
3294 result = &PL_vtbl_amagic;
3295 break;
3296 case want_vtbl_amagicelem:
3297 result = &PL_vtbl_amagicelem;
3298 break;
810b8aa5
GS
3299 case want_vtbl_backref:
3300 result = &PL_vtbl_backref;
3301 break;
7e8c5dac
HS
3302 case want_vtbl_utf8:
3303 result = &PL_vtbl_utf8;
3304 break;
7452cf6a
AL
3305 default:
3306 result = Null(MGVTBL*);
3307 break;
dc9e4912 3308 }
27da23d5 3309 return (MGVTBL*)result;
dc9e4912
GS
3310}
3311
767df6a1 3312I32
864dbfa3 3313Perl_my_fflush_all(pTHX)
767df6a1 3314{
f800e14d 3315#if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
ce720889 3316 return PerlIO_flush(NULL);
767df6a1 3317#else
8fbdfb7c 3318# if defined(HAS__FWALK)
f13a2bc0 3319 extern int fflush(FILE *);
74cac757
JH
3320 /* undocumented, unprototyped, but very useful BSDism */
3321 extern void _fwalk(int (*)(FILE *));
8fbdfb7c 3322 _fwalk(&fflush);
74cac757 3323 return 0;
8fa7f367 3324# else
8fbdfb7c 3325# if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
8fa7f367 3326 long open_max = -1;
8fbdfb7c 3327# ifdef PERL_FFLUSH_ALL_FOPEN_MAX
d2201af2 3328 open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
8fbdfb7c 3329# else
8fa7f367 3330# if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
767df6a1 3331 open_max = sysconf(_SC_OPEN_MAX);
8fa7f367
JH
3332# else
3333# ifdef FOPEN_MAX
74cac757 3334 open_max = FOPEN_MAX;
8fa7f367
JH
3335# else
3336# ifdef OPEN_MAX
74cac757 3337 open_max = OPEN_MAX;
8fa7f367
JH
3338# else
3339# ifdef _NFILE
d2201af2 3340 open_max = _NFILE;
8fa7f367
JH
3341# endif
3342# endif
74cac757 3343# endif
767df6a1
JH
3344# endif
3345# endif
767df6a1
JH
3346 if (open_max > 0) {
3347 long i;
3348 for (i = 0; i < open_max; i++)
d2201af2
AD
3349 if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3350 STDIO_STREAM_ARRAY[i]._file < open_max &&
3351 STDIO_STREAM_ARRAY[i]._flag)
3352 PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
767df6a1
JH
3353 return 0;
3354 }
8fbdfb7c 3355# endif
93189314 3356 SETERRNO(EBADF,RMS_IFI);
767df6a1 3357 return EOF;
74cac757 3358# endif
767df6a1
JH
3359#endif
3360}
097ee67d 3361
69282e91 3362void
e1ec3a88 3363Perl_report_evil_fh(pTHX_ const GV *gv, const IO *io, I32 op)
bc37a18f 3364{
b64e5050 3365 const char * const func =
66fc2fa5
JH
3366 op == OP_READLINE ? "readline" : /* "<HANDLE>" not nice */
3367 op == OP_LEAVEWRITE ? "write" : /* "write exit" not nice */
bc37a18f 3368 PL_op_desc[op];
b64e5050
AL
3369 const char * const pars = OP_IS_FILETEST(op) ? "" : "()";
3370 const char * const type = OP_IS_SOCKET(op)
3aed30dc
HS
3371 || (gv && io && IoTYPE(io) == IoTYPE_SOCKET)
3372 ? "socket" : "filehandle";
b64e5050 3373 const char * const name = gv && isGV(gv) ? GvENAME(gv) : NULL;
66fc2fa5 3374
4c80c0b2 3375 if (op == OP_phoney_OUTPUT_ONLY || op == OP_phoney_INPUT_ONLY) {
3aed30dc 3376 if (ckWARN(WARN_IO)) {
b64e5050 3377 const char * const direction = (op == OP_phoney_INPUT_ONLY) ? "in" : "out";
3aed30dc
HS
3378 if (name && *name)
3379 Perl_warner(aTHX_ packWARN(WARN_IO),
3380 "Filehandle %s opened only for %sput",
fd322ea4 3381 name, direction);
3aed30dc
HS
3382 else
3383 Perl_warner(aTHX_ packWARN(WARN_IO),
fd322ea4 3384 "Filehandle opened only for %sput", direction);
3aed30dc 3385 }
2dd78f96
JH
3386 }
3387 else {
e1ec3a88 3388 const char *vile;
3aed30dc
HS
3389 I32 warn_type;
3390
3391 if (gv && io && IoTYPE(io) == IoTYPE_CLOSED) {
3392 vile = "closed";
3393 warn_type = WARN_CLOSED;
3394 }
3395 else {
3396 vile = "unopened";
3397 warn_type = WARN_UNOPENED;
3398 }
3399
3400 if (ckWARN(warn_type)) {
3401 if (name && *name) {
3402 Perl_warner(aTHX_ packWARN(warn_type),
3403 "%s%s on %s %s %s", func, pars, vile, type, name);
3404 if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3405 Perl_warner(
3406 aTHX_ packWARN(warn_type),
3407 "\t(Are you trying to call %s%s on dirhandle %s?)\n",
3408 func, pars, name
3409 );
3410 }
3411 else {
3412 Perl_warner(aTHX_ packWARN(warn_type),
3413 "%s%s on %s %s", func, pars, vile, type);
3414 if (gv && io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3415 Perl_warner(
3416 aTHX_ packWARN(warn_type),
3417 "\t(Are you trying to call %s%s on dirhandle?)\n",
3418 func, pars
3419 );
3420 }
3421 }
bc37a18f 3422 }
69282e91 3423}
a926ef6b
JH
3424
3425#ifdef EBCDIC
cbebf344
JH
3426/* in ASCII order, not that it matters */
3427static const char controllablechars[] = "?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
3428
a926ef6b
JH
3429int
3430Perl_ebcdic_control(pTHX_ int ch)
3431{
3aed30dc 3432 if (ch > 'a') {
e1ec3a88 3433 const char *ctlp;
3aed30dc
HS
3434
3435 if (islower(ch))
3436 ch = toupper(ch);
3437
3438 if ((ctlp = strchr(controllablechars, ch)) == 0) {
3439 Perl_die(aTHX_ "unrecognised control character '%c'\n", ch);
a926ef6b 3440 }
3aed30dc
HS
3441
3442 if (ctlp == controllablechars)
3443 return('\177'); /* DEL */
3444 else
3445 return((unsigned char)(ctlp - controllablechars - 1));
3446 } else { /* Want uncontrol */
3447 if (ch == '\177' || ch == -1)
3448 return('?');
3449 else if (ch == '\157')
3450 return('\177');
3451 else if (ch == '\174')
3452 return('\000');
3453 else if (ch == '^') /* '\137' in 1047, '\260' in 819 */
3454 return('\036');
3455 else if (ch == '\155')
3456 return('\037');
3457 else if (0 < ch && ch < (sizeof(controllablechars) - 1))
3458 return(controllablechars[ch+1]);
3459 else
3460 Perl_die(aTHX_ "invalid control request: '\\%03o'\n", ch & 0xFF);
3461 }
a926ef6b
JH
3462}
3463#endif
e72cf795 3464
f6adc668 3465/* To workaround core dumps from the uninitialised tm_zone we get the
e72cf795
JH
3466 * system to give us a reasonable struct to copy. This fix means that
3467 * strftime uses the tm_zone and tm_gmtoff values returned by
3468 * localtime(time()). That should give the desired result most of the
3469 * time. But probably not always!
3470 *
f6adc668
JH
3471 * This does not address tzname aspects of NETaa14816.
3472 *
e72cf795 3473 */
f6adc668 3474
e72cf795
JH
3475#ifdef HAS_GNULIBC
3476# ifndef STRUCT_TM_HASZONE
3477# define STRUCT_TM_HASZONE
3478# endif
3479#endif
3480
f6adc668
JH
3481#ifdef STRUCT_TM_HASZONE /* Backward compat */
3482# ifndef HAS_TM_TM_ZONE
3483# define HAS_TM_TM_ZONE
3484# endif
3485#endif
3486
e72cf795 3487void
f1208910 3488Perl_init_tm(pTHX_ struct tm *ptm) /* see mktime, strftime and asctime */
e72cf795 3489{
f6adc668 3490#ifdef HAS_TM_TM_ZONE
e72cf795 3491 Time_t now;
1b6737cc 3492 const struct tm* my_tm;
e72cf795 3493 (void)time(&now);
82c57498 3494 my_tm = localtime(&now);
ca46b8ee
SP
3495 if (my_tm)
3496 Copy(my_tm, ptm, 1, struct tm);
1b6737cc
AL
3497#else
3498 PERL_UNUSED_ARG(ptm);
e72cf795
JH
3499#endif
3500}
3501
3502/*
3503 * mini_mktime - normalise struct tm values without the localtime()
3504 * semantics (and overhead) of mktime().
3505 */
3506void
f1208910 3507Perl_mini_mktime(pTHX_ struct tm *ptm)
e72cf795
JH
3508{
3509 int yearday;
3510 int secs;
3511 int month, mday, year, jday;
3512 int odd_cent, odd_year;
3513
3514#define DAYS_PER_YEAR 365
3515#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
3516#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
3517#define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
3518#define SECS_PER_HOUR (60*60)
3519#define SECS_PER_DAY (24*SECS_PER_HOUR)
3520/* parentheses deliberately absent on these two, otherwise they don't work */
3521#define MONTH_TO_DAYS 153/5
3522#define DAYS_TO_MONTH 5/153
3523/* offset to bias by March (month 4) 1st between month/mday & year finding */
3524#define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
3525/* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3526#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
3527
3528/*
3529 * Year/day algorithm notes:
3530 *
3531 * With a suitable offset for numeric value of the month, one can find
3532 * an offset into the year by considering months to have 30.6 (153/5) days,
3533 * using integer arithmetic (i.e., with truncation). To avoid too much
3534 * messing about with leap days, we consider January and February to be
3535 * the 13th and 14th month of the previous year. After that transformation,
3536 * we need the month index we use to be high by 1 from 'normal human' usage,
3537 * so the month index values we use run from 4 through 15.
3538 *
3539 * Given that, and the rules for the Gregorian calendar (leap years are those
3540 * divisible by 4 unless also divisible by 100, when they must be divisible
3541 * by 400 instead), we can simply calculate the number of days since some
3542 * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3543 * the days we derive from our month index, and adding in the day of the
3544 * month. The value used here is not adjusted for the actual origin which
3545 * it normally would use (1 January A.D. 1), since we're not exposing it.
3546 * We're only building the value so we can turn around and get the
3547 * normalised values for the year, month, day-of-month, and day-of-year.
3548 *
3549 * For going backward, we need to bias the value we're using so that we find
3550 * the right year value. (Basically, we don't want the contribution of
3551 * March 1st to the number to apply while deriving the year). Having done
3552 * that, we 'count up' the contribution to the year number by accounting for
3553 * full quadracenturies (400-year periods) with their extra leap days, plus
3554 * the contribution from full centuries (to avoid counting in the lost leap
3555 * days), plus the contribution from full quad-years (to count in the normal
3556 * leap days), plus the leftover contribution from any non-leap years.
3557 * At this point, if we were working with an actual leap day, we'll have 0
3558 * days left over. This is also true for March 1st, however. So, we have
3559 * to special-case that result, and (earlier) keep track of the 'odd'
3560 * century and year contributions. If we got 4 extra centuries in a qcent,
3561 * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3562 * Otherwise, we add back in the earlier bias we removed (the 123 from
3563 * figuring in March 1st), find the month index (integer division by 30.6),
3564 * and the remainder is the day-of-month. We then have to convert back to
3565 * 'real' months (including fixing January and February from being 14/15 in
3566 * the previous year to being in the proper year). After that, to get
3567 * tm_yday, we work with the normalised year and get a new yearday value for
3568 * January 1st, which we subtract from the yearday value we had earlier,
3569 * representing the date we've re-built. This is done from January 1
3570 * because tm_yday is 0-origin.
3571 *
3572 * Since POSIX time routines are only guaranteed to work for times since the
3573 * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3574 * applies Gregorian calendar rules even to dates before the 16th century
3575 * doesn't bother me. Besides, you'd need cultural context for a given
3576 * date to know whether it was Julian or Gregorian calendar, and that's
3577 * outside the scope for this routine. Since we convert back based on the
3578 * same rules we used to build the yearday, you'll only get strange results
3579 * for input which needed normalising, or for the 'odd' century years which
3580 * were leap years in the Julian calander but not in the Gregorian one.
3581 * I can live with that.
3582 *
3583 * This algorithm also fails to handle years before A.D. 1 gracefully, but
3584 * that's still outside the scope for POSIX time manipulation, so I don't
3585 * care.
3586 */
3587
3588 year = 1900 + ptm->tm_year;
3589 month = ptm->tm_mon;
3590 mday = ptm->tm_mday;
3591 /* allow given yday with no month & mday to dominate the result */
3592 if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
3593 month = 0;
3594 mday = 0;
3595 jday = 1 + ptm->tm_yday;
3596 }
3597 else {
3598 jday = 0;
3599 }
3600 if (month >= 2)
3601 month+=2;
3602 else
3603 month+=14, year--;
3604 yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3605 yearday += month*MONTH_TO_DAYS + mday + jday;
3606 /*
3607 * Note that we don't know when leap-seconds were or will be,
3608 * so we have to trust the user if we get something which looks
3609 * like a sensible leap-second. Wild values for seconds will
3610 * be rationalised, however.
3611 */
3612 if ((unsigned) ptm->tm_sec <= 60) {
3613 secs = 0;
3614 }
3615 else {
3616 secs = ptm->tm_sec;
3617 ptm->tm_sec = 0;
3618 }
3619 secs += 60 * ptm->tm_min;
3620 secs += SECS_PER_HOUR * ptm->tm_hour;
3621 if (secs < 0) {
3622 if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3623 /* got negative remainder, but need positive time */
3624 /* back off an extra day to compensate */
3625 yearday += (secs/SECS_PER_DAY)-1;
3626 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3627 }
3628 else {
3629 yearday += (secs/SECS_PER_DAY);
3630 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3631 }
3632 }
3633 else if (secs >= SECS_PER_DAY) {
3634 yearday += (secs/SECS_PER_DAY);
3635 secs %= SECS_PER_DAY;
3636 }
3637 ptm->tm_hour = secs/SECS_PER_HOUR;
3638 secs %= SECS_PER_HOUR;
3639 ptm->tm_min = secs/60;
3640 secs %= 60;
3641 ptm->tm_sec += secs;
3642 /* done with time of day effects */
3643 /*
3644 * The algorithm for yearday has (so far) left it high by 428.
3645 * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3646 * bias it by 123 while trying to figure out what year it
3647 * really represents. Even with this tweak, the reverse
3648 * translation fails for years before A.D. 0001.
3649 * It would still fail for Feb 29, but we catch that one below.
3650 */
3651 jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
3652 yearday -= YEAR_ADJUST;
3653 year = (yearday / DAYS_PER_QCENT) * 400;
3654 yearday %= DAYS_PER_QCENT;
3655 odd_cent = yearday / DAYS_PER_CENT;
3656 year += odd_cent * 100;
3657 yearday %= DAYS_PER_CENT;
3658 year += (yearday / DAYS_PER_QYEAR) * 4;
3659 yearday %= DAYS_PER_QYEAR;
3660 odd_year = yearday / DAYS_PER_YEAR;
3661 year += odd_year;
3662 yearday %= DAYS_PER_YEAR;
3663 if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3664 month = 1;
3665 yearday = 29;
3666 }
3667 else {
3668 yearday += YEAR_ADJUST; /* recover March 1st crock */
3669 month = yearday*DAYS_TO_MONTH;
3670 yearday -= month*MONTH_TO_DAYS;
3671 /* recover other leap-year adjustment */
3672 if (month > 13) {
3673 month-=14;
3674 year++;
3675 }
3676 else {
3677 month-=2;
3678 }
3679 }
3680 ptm->tm_year = year - 1900;
3681 if (yearday) {
3682 ptm->tm_mday = yearday;
3683 ptm->tm_mon = month;
3684 }
3685 else {
3686 ptm->tm_mday = 31;
3687 ptm->tm_mon = month - 1;
3688 }
3689 /* re-build yearday based on Jan 1 to get tm_yday */
3690 year--;
3691 yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
3692 yearday += 14*MONTH_TO_DAYS + 1;
3693 ptm->tm_yday = jday - yearday;
3694 /* fix tm_wday if not overridden by caller */
3695 if ((unsigned)ptm->tm_wday > 6)
3696 ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
3697}
b3c85772
JH
3698
3699char *
e1ec3a88 3700Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
b3c85772
JH
3701{
3702#ifdef HAS_STRFTIME
3703 char *buf;
3704 int buflen;
3705 struct tm mytm;
3706 int len;
3707
3708 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3709 mytm.tm_sec = sec;
3710 mytm.tm_min = min;
3711 mytm.tm_hour = hour;
3712 mytm.tm_mday = mday;
3713 mytm.tm_mon = mon;
3714 mytm.tm_year = year;
3715 mytm.tm_wday = wday;
3716 mytm.tm_yday = yday;
3717 mytm.tm_isdst = isdst;
3718 mini_mktime(&mytm);
c473feec
SR
3719 /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
3720#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
3721 STMT_START {
3722 struct tm mytm2;
3723 mytm2 = mytm;
3724 mktime(&mytm2);
3725#ifdef HAS_TM_TM_GMTOFF
3726 mytm.tm_gmtoff = mytm2.tm_gmtoff;
3727#endif
3728#ifdef HAS_TM_TM_ZONE
3729 mytm.tm_zone = mytm2.tm_zone;
3730#endif
3731 } STMT_END;
3732#endif
b3c85772 3733 buflen = 64;
a02a5408 3734 Newx(buf, buflen, char);
b3c85772
JH
3735 len = strftime(buf, buflen, fmt, &mytm);
3736 /*
877f6a72 3737 ** The following is needed to handle to the situation where
b3c85772
JH
3738 ** tmpbuf overflows. Basically we want to allocate a buffer
3739 ** and try repeatedly. The reason why it is so complicated
3740 ** is that getting a return value of 0 from strftime can indicate
3741 ** one of the following:
3742 ** 1. buffer overflowed,
3743 ** 2. illegal conversion specifier, or
3744 ** 3. the format string specifies nothing to be returned(not
3745 ** an error). This could be because format is an empty string
3746 ** or it specifies %p that yields an empty string in some locale.
3747 ** If there is a better way to make it portable, go ahead by
3748 ** all means.
3749 */
3750 if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
3751 return buf;
3752 else {
3753 /* Possibly buf overflowed - try again with a bigger buf */
e1ec3a88
AL
3754 const int fmtlen = strlen(fmt);
3755 const int bufsize = fmtlen + buflen;
877f6a72 3756
a02a5408 3757 Newx(buf, bufsize, char);
b3c85772
JH
3758 while (buf) {
3759 buflen = strftime(buf, bufsize, fmt, &mytm);
3760 if (buflen > 0 && buflen < bufsize)
3761 break;
3762 /* heuristic to prevent out-of-memory errors */
3763 if (bufsize > 100*fmtlen) {
3764 Safefree(buf);
3765 buf = NULL;
3766 break;
3767 }
e1ec3a88 3768 Renew(buf, bufsize*2, char);
b3c85772
JH
3769 }
3770 return buf;
3771 }
3772#else
3773 Perl_croak(aTHX_ "panic: no strftime");
27da23d5 3774 return NULL;
b3c85772
JH
3775#endif
3776}
3777
877f6a72
NIS
3778
3779#define SV_CWD_RETURN_UNDEF \
3780sv_setsv(sv, &PL_sv_undef); \
3781return FALSE
3782
3783#define SV_CWD_ISDOT(dp) \
3784 (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
3aed30dc 3785 (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
877f6a72
NIS
3786
3787/*
ccfc67b7
JH
3788=head1 Miscellaneous Functions
3789
89423764 3790=for apidoc getcwd_sv
877f6a72
NIS
3791
3792Fill the sv with current working directory
3793
3794=cut
3795*/
3796
3797/* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
3798 * rewritten again by dougm, optimized for use with xs TARG, and to prefer
3799 * getcwd(3) if available
3800 * Comments from the orignal:
3801 * This is a faster version of getcwd. It's also more dangerous
3802 * because you might chdir out of a directory that you can't chdir
3803 * back into. */
3804
877f6a72 3805int
89423764 3806Perl_getcwd_sv(pTHX_ register SV *sv)
877f6a72
NIS
3807{
3808#ifndef PERL_MICRO
3809
ea715489
JH
3810#ifndef INCOMPLETE_TAINTS
3811 SvTAINTED_on(sv);
3812#endif
3813
8f95b30d
JH
3814#ifdef HAS_GETCWD
3815 {
60e110a8
DM
3816 char buf[MAXPATHLEN];
3817
3aed30dc 3818 /* Some getcwd()s automatically allocate a buffer of the given
60e110a8
DM
3819 * size from the heap if they are given a NULL buffer pointer.
3820 * The problem is that this behaviour is not portable. */
3aed30dc 3821 if (getcwd(buf, sizeof(buf) - 1)) {
42d9b98d 3822 sv_setpv(sv, buf);
3aed30dc
HS
3823 return TRUE;
3824 }
3825 else {
3826 sv_setsv(sv, &PL_sv_undef);
3827 return FALSE;
3828 }
8f95b30d
JH
3829 }
3830
3831#else
3832
c623ac67 3833 Stat_t statbuf;
877f6a72 3834 int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
4373e329 3835 int pathlen=0;
877f6a72 3836 Direntry_t *dp;
877f6a72 3837
862a34c6 3838 SvUPGRADE(sv, SVt_PV);
877f6a72 3839
877f6a72 3840 if (PerlLIO_lstat(".", &statbuf) < 0) {
3aed30dc 3841 SV_CWD_RETURN_UNDEF;
877f6a72
NIS
3842 }
3843
3844 orig_cdev = statbuf.st_dev;
3845 orig_cino = statbuf.st_ino;
3846 cdev = orig_cdev;
3847 cino = orig_cino;
3848
3849 for (;;) {
4373e329 3850 DIR *dir;
3aed30dc
HS
3851 odev = cdev;
3852 oino = cino;
3853
3854 if (PerlDir_chdir("..") < 0) {
3855 SV_CWD_RETURN_UNDEF;
3856 }
3857 if (PerlLIO_stat(".", &statbuf) < 0) {
3858 SV_CWD_RETURN_UNDEF;
3859 }
3860
3861 cdev = statbuf.st_dev;
3862 cino = statbuf.st_ino;
3863
3864 if (odev == cdev && oino == cino) {
3865 break;
3866 }
3867 if (!(dir = PerlDir_open("."))) {
3868 SV_CWD_RETURN_UNDEF;
3869 }
3870
3871 while ((dp = PerlDir_read(dir)) != NULL) {
877f6a72 3872#ifdef DIRNAMLEN
4373e329 3873 const int namelen = dp->d_namlen;
877f6a72 3874#else
4373e329 3875 const int namelen = strlen(dp->d_name);
877f6a72 3876#endif
3aed30dc
HS
3877 /* skip . and .. */
3878 if (SV_CWD_ISDOT(dp)) {
3879 continue;
3880 }
3881
3882 if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
3883 SV_CWD_RETURN_UNDEF;
3884 }
3885
3886 tdev = statbuf.st_dev;
3887 tino = statbuf.st_ino;
3888 if (tino == oino && tdev == odev) {
3889 break;
3890 }
cb5953d6
JH
3891 }
3892
3aed30dc
HS
3893 if (!dp) {
3894 SV_CWD_RETURN_UNDEF;
3895 }
3896
3897 if (pathlen + namelen + 1 >= MAXPATHLEN) {
3898 SV_CWD_RETURN_UNDEF;
3899 }
877f6a72 3900
3aed30dc
HS
3901 SvGROW(sv, pathlen + namelen + 1);
3902
3903 if (pathlen) {
3904 /* shift down */
95a20fc0 3905 Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
3aed30dc 3906 }
877f6a72 3907
3aed30dc
HS
3908 /* prepend current directory to the front */
3909 *SvPVX(sv) = '/';
3910 Move(dp->d_name, SvPVX(sv)+1, namelen, char);
3911 pathlen += (namelen + 1);
877f6a72
NIS
3912
3913#ifdef VOID_CLOSEDIR
3aed30dc 3914 PerlDir_close(dir);
877f6a72 3915#else
3aed30dc
HS
3916 if (PerlDir_close(dir) < 0) {
3917 SV_CWD_RETURN_UNDEF;
3918 }
877f6a72
NIS
3919#endif
3920 }
3921
60e110a8 3922 if (pathlen) {
3aed30dc
HS
3923 SvCUR_set(sv, pathlen);
3924 *SvEND(sv) = '\0';
3925 SvPOK_only(sv);
877f6a72 3926
95a20fc0 3927 if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
3aed30dc
HS
3928 SV_CWD_RETURN_UNDEF;
3929 }
877f6a72
NIS
3930 }
3931 if (PerlLIO_stat(".", &statbuf) < 0) {
3aed30dc 3932 SV_CWD_RETURN_UNDEF;
877f6a72
NIS
3933 }
3934
3935 cdev = statbuf.st_dev;
3936 cino = statbuf.st_ino;
3937
3938 if (cdev != orig_cdev || cino != orig_cino) {
3aed30dc
HS
3939 Perl_croak(aTHX_ "Unstable directory path, "
3940 "current directory changed unexpectedly");
877f6a72 3941 }
877f6a72
NIS
3942
3943 return TRUE;
793b8d8e
JH
3944#endif
3945
877f6a72
NIS
3946#else
3947 return FALSE;
3948#endif
3949}
3950
f4758303 3951/*
b0f01acb
JP
3952=for apidoc scan_version
3953
3954Returns a pointer to the next character after the parsed
3955version string, as well as upgrading the passed in SV to
3956an RV.
3957
3958Function must be called with an already existing SV like
3959
137d6fc0
JP
3960 sv = newSV(0);
3961 s = scan_version(s,SV *sv, bool qv);
b0f01acb
JP
3962
3963Performs some preprocessing to the string to ensure that
3964it has the correct characteristics of a version. Flags the
3965object if it contains an underscore (which denotes this
137d6fc0
JP
3966is a alpha version). The boolean qv denotes that the version
3967should be interpreted as if it had multiple decimals, even if
3968it doesn't.
b0f01acb
JP
3969
3970=cut
3971*/
3972
9137345a 3973const char *
e1ec3a88 3974Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv)
b0f01acb 3975{
e0218a61 3976 const char *start;
9137345a
JP
3977 const char *pos;
3978 const char *last;
3979 int saw_period = 0;
cb5772bb 3980 int alpha = 0;
9137345a 3981 int width = 3;
7452cf6a
AL
3982 AV * const av = newAV();
3983 SV * const hv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */
9137345a 3984 (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
cb5772bb 3985
3a242bf8
NC
3986#ifndef NODEFAULT_SHAREKEYS
3987 HvSHAREKEYS_on(hv); /* key-sharing on by default */
3988#endif
9137345a 3989
e0218a61
JP
3990 while (isSPACE(*s)) /* leading whitespace is OK */
3991 s++;
3992
9137345a
JP
3993 if (*s == 'v') {
3994 s++; /* get past 'v' */
3995 qv = 1; /* force quoted version processing */
3996 }
3997
e0218a61 3998 start = last = pos = s;
9137345a
JP
3999
4000 /* pre-scan the input string to check for decimals/underbars */
ad63d80f
JP
4001 while ( *pos == '.' || *pos == '_' || isDIGIT(*pos) )
4002 {
4003 if ( *pos == '.' )
4004 {
cb5772bb 4005 if ( alpha )
5f89c282 4006 Perl_croak(aTHX_ "Invalid version format (underscores before decimal)");
ad63d80f 4007 saw_period++ ;
9137345a 4008 last = pos;
46314c13 4009 }
ad63d80f
JP
4010 else if ( *pos == '_' )
4011 {
cb5772bb 4012 if ( alpha )
5f89c282 4013 Perl_croak(aTHX_ "Invalid version format (multiple underscores)");
cb5772bb 4014 alpha = 1;
9137345a 4015 width = pos - last - 1; /* natural width of sub-version */
ad63d80f
JP
4016 }
4017 pos++;
4018 }
ad63d80f 4019
e0218a61 4020 if ( saw_period > 1 )
137d6fc0 4021 qv = 1; /* force quoted version processing */
9137345a
JP
4022
4023 pos = s;
4024
4025 if ( qv )
cb5772bb
RGS
4026 hv_store((HV *)hv, "qv", 2, newSViv(qv), 0);
4027 if ( alpha )
4028 hv_store((HV *)hv, "alpha", 5, newSViv(alpha), 0);
9137345a
JP
4029 if ( !qv && width < 3 )
4030 hv_store((HV *)hv, "width", 5, newSViv(width), 0);
4031
ad63d80f 4032 while (isDIGIT(*pos))
46314c13 4033 pos++;
ad63d80f
JP
4034 if (!isALPHA(*pos)) {
4035 I32 rev;
4036
ad63d80f
JP
4037 for (;;) {
4038 rev = 0;
4039 {
129318bd 4040 /* this is atoi() that delimits on underscores */
9137345a 4041 const char *end = pos;
129318bd
JP
4042 I32 mult = 1;
4043 I32 orev;
9137345a 4044
129318bd
JP
4045 /* the following if() will only be true after the decimal
4046 * point of a version originally created with a bare
4047 * floating point number, i.e. not quoted in any way
4048 */
e0218a61 4049 if ( !qv && s > start && saw_period == 1 ) {
c76df65e 4050 mult *= 100;
129318bd
JP
4051 while ( s < end ) {
4052 orev = rev;
4053 rev += (*s - '0') * mult;
4054 mult /= 10;
32fdb065 4055 if ( PERL_ABS(orev) > PERL_ABS(rev) )
129318bd
JP
4056 Perl_croak(aTHX_ "Integer overflow in version");
4057 s++;
9137345a
JP
4058 if ( *s == '_' )
4059 s++;
129318bd
JP
4060 }
4061 }
4062 else {
4063 while (--end >= s) {
4064 orev = rev;
4065 rev += (*end - '0') * mult;
4066 mult *= 10;
32fdb065 4067 if ( PERL_ABS(orev) > PERL_ABS(rev) )
129318bd
JP
4068 Perl_croak(aTHX_ "Integer overflow in version");
4069 }
4070 }
4071 }
9137345a 4072
129318bd 4073 /* Append revision */
9137345a
JP
4074 av_push(av, newSViv(rev));
4075 if ( *pos == '.' && isDIGIT(pos[1]) )
4076 s = ++pos;
4077 else if ( *pos == '_' && isDIGIT(pos[1]) )
ad63d80f
JP
4078 s = ++pos;
4079 else if ( isDIGIT(*pos) )
4080 s = pos;
b0f01acb 4081 else {
ad63d80f
JP
4082 s = pos;
4083 break;
4084 }
9137345a
JP
4085 if ( qv ) {
4086 while ( isDIGIT(*pos) )
4087 pos++;
4088 }
4089 else {
4090 int digits = 0;
4091 while ( ( isDIGIT(*pos) || *pos == '_' ) && digits < 3 ) {
4092 if ( *pos != '_' )
4093 digits++;
4094 pos++;
4095 }
b0f01acb
JP
4096 }
4097 }
4098 }
9137345a
JP
4099 if ( qv ) { /* quoted versions always get at least three terms*/
4100 I32 len = av_len(av);
4edfc503
NC
4101 /* This for loop appears to trigger a compiler bug on OS X, as it
4102 loops infinitely. Yes, len is negative. No, it makes no sense.
4103 Compiler in question is:
4104 gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
4105 for ( len = 2 - len; len > 0; len-- )
4106 av_push((AV *)sv, newSViv(0));
4107 */
4108 len = 2 - len;
4109 while (len-- > 0)
9137345a 4110 av_push(av, newSViv(0));
b9381830 4111 }
9137345a
JP
4112
4113 if ( av_len(av) == -1 ) /* oops, someone forgot to pass a value */
4114 av_push(av, newSViv(0));
4115
4116 /* And finally, store the AV in the hash */
cb5772bb 4117 hv_store((HV *)hv, "version", 7, newRV_noinc((SV *)av), 0);
9137345a 4118 return s;
b0f01acb
JP
4119}
4120
4121/*
4122=for apidoc new_version
4123
4124Returns a new version object based on the passed in SV:
4125
4126 SV *sv = new_version(SV *ver);
4127
4128Does not alter the passed in ver SV. See "upg_version" if you
4129want to upgrade the SV.
4130
4131=cut
4132*/
4133
4134SV *
4135Perl_new_version(pTHX_ SV *ver)
4136{
2d03de9c 4137 SV * const rv = newSV(0);
d7aa5382
JP
4138 if ( sv_derived_from(ver,"version") ) /* can just copy directly */
4139 {
4140 I32 key;
53c1dcc0 4141 AV * const av = newAV();
9137345a
JP
4142 AV *sav;
4143 /* This will get reblessed later if a derived class*/
e0218a61 4144 SV * const hv = newSVrv(rv, "version");
9137345a 4145 (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
3a242bf8
NC
4146#ifndef NODEFAULT_SHAREKEYS
4147 HvSHAREKEYS_on(hv); /* key-sharing on by default */
4148#endif
9137345a
JP
4149
4150 if ( SvROK(ver) )
4151 ver = SvRV(ver);
4152
4153 /* Begin copying all of the elements */
4154 if ( hv_exists((HV *)ver, "qv", 2) )
4155 hv_store((HV *)hv, "qv", 2, &PL_sv_yes, 0);
4156
4157 if ( hv_exists((HV *)ver, "alpha", 5) )
4158 hv_store((HV *)hv, "alpha", 5, &PL_sv_yes, 0);
4159
4160 if ( hv_exists((HV*)ver, "width", 5 ) )
d7aa5382 4161 {
53c1dcc0 4162 const I32 width = SvIV(*hv_fetch((HV*)ver, "width", 5, FALSE));
9137345a 4163 hv_store((HV *)hv, "width", 5, newSViv(width), 0);
d7aa5382 4164 }
9137345a 4165
cb5772bb 4166 sav = (AV *)SvRV(*hv_fetch((HV*)ver, "version", 7, FALSE));
9137345a
JP
4167 /* This will get reblessed later if a derived class*/
4168 for ( key = 0; key <= av_len(sav); key++ )
4169 {
4170 const I32 rev = SvIV(*av_fetch(sav, key, FALSE));
4171 av_push(av, newSViv(rev));
4172 }
4173
cb5772bb 4174 hv_store((HV *)hv, "version", 7, newRV_noinc((SV *)av), 0);
d7aa5382
JP
4175 return rv;
4176 }
ad63d80f 4177#ifdef SvVOK
137d6fc0 4178 if ( SvVOK(ver) ) { /* already a v-string */
e0218a61 4179 const MAGIC* const mg = mg_find(ver,PERL_MAGIC_vstring);
a4d60858 4180 const STRLEN len = mg->mg_len;
2d03de9c 4181 char * const version = savepvn( (const char*)mg->mg_ptr, len);
a4d60858 4182 sv_setpvn(rv,version,len);
137d6fc0 4183 Safefree(version);
b0f01acb 4184 }
137d6fc0 4185 else {
ad63d80f 4186#endif
137d6fc0
JP
4187 sv_setsv(rv,ver); /* make a duplicate */
4188#ifdef SvVOK
26ec6fc3 4189 }
137d6fc0
JP
4190#endif
4191 upg_version(rv);
b0f01acb
JP
4192 return rv;
4193}
4194
4195/*
4196=for apidoc upg_version
4197
4198In-place upgrade of the supplied SV to a version object.
4199
4200 SV *sv = upg_version(SV *sv);
4201
4202Returns a pointer to the upgraded SV.
4203
4204=cut
4205*/
4206
4207SV *
ad63d80f 4208Perl_upg_version(pTHX_ SV *ver)
b0f01acb 4209{
137d6fc0
JP
4210 char *version;
4211 bool qv = 0;
4212
4213 if ( SvNOK(ver) ) /* may get too much accuracy */
4214 {
4215 char tbuf[64];
86c11942
NC
4216 const STRLEN len = my_sprintf(tbuf,"%.9"NVgf, SvNVX(ver));
4217 version = savepvn(tbuf, len);
137d6fc0 4218 }
ad63d80f 4219#ifdef SvVOK
137d6fc0 4220 else if ( SvVOK(ver) ) { /* already a v-string */
2d03de9c 4221 const MAGIC* const mg = mg_find(ver,PERL_MAGIC_vstring);
ad63d80f 4222 version = savepvn( (const char*)mg->mg_ptr,mg->mg_len );
137d6fc0 4223 qv = 1;
b0f01acb 4224 }
ad63d80f 4225#endif
137d6fc0
JP
4226 else /* must be a string or something like a string */
4227 {
9137345a 4228 version = savepv(SvPV_nolen(ver));
137d6fc0
JP
4229 }
4230 (void)scan_version(version, ver, qv);
4231 Safefree(version);
ad63d80f 4232 return ver;
b0f01acb
JP
4233}
4234
e0218a61
JP
4235/*
4236=for apidoc vverify
4237
4238Validates that the SV contains a valid version object.
4239
4240 bool vverify(SV *vobj);
4241
4242Note that it only confirms the bare minimum structure (so as not to get
4243confused by derived classes which may contain additional hash entries):
4244
4245=over 4
4246
cb5772bb 4247=item * The SV contains a [reference to a] hash
e0218a61
JP
4248
4249=item * The hash contains a "version" key
4250
cb5772bb 4251=item * The "version" key has [a reference to] an AV as its value
e0218a61
JP
4252
4253=back
4254
4255=cut
4256*/
4257
4258bool
4259Perl_vverify(pTHX_ SV *vs)
4260{
4261 SV *sv;
4262 if ( SvROK(vs) )
4263 vs = SvRV(vs);
4264
4265 /* see if the appropriate elements exist */
4266 if ( SvTYPE(vs) == SVt_PVHV
4267 && hv_exists((HV*)vs, "version", 7)
cb5772bb 4268 && (sv = SvRV(*hv_fetch((HV*)vs, "version", 7, FALSE)))
e0218a61
JP
4269 && SvTYPE(sv) == SVt_PVAV )
4270 return TRUE;
4271 else
4272 return FALSE;
4273}
b0f01acb
JP
4274
4275/*
4276=for apidoc vnumify
4277
ad63d80f
JP
4278Accepts a version object and returns the normalized floating
4279point representation. Call like:
b0f01acb 4280
ad63d80f 4281 sv = vnumify(rv);
b0f01acb 4282
ad63d80f
JP
4283NOTE: you can pass either the object directly or the SV
4284contained within the RV.
b0f01acb
JP
4285
4286=cut
4287*/
4288
4289SV *
ad63d80f 4290Perl_vnumify(pTHX_ SV *vs)
b0f01acb 4291{
ad63d80f 4292 I32 i, len, digit;
9137345a
JP
4293 int width;
4294 bool alpha = FALSE;
53c1dcc0 4295 SV * const sv = newSV(0);
9137345a 4296 AV *av;
ad63d80f
JP
4297 if ( SvROK(vs) )
4298 vs = SvRV(vs);
9137345a 4299
e0218a61
JP
4300 if ( !vverify(vs) )
4301 Perl_croak(aTHX_ "Invalid version object");
4302
9137345a
JP
4303 /* see if various flags exist */
4304 if ( hv_exists((HV*)vs, "alpha", 5 ) )
4305 alpha = TRUE;
4306 if ( hv_exists((HV*)vs, "width", 5 ) )
4307 width = SvIV(*hv_fetch((HV*)vs, "width", 5, FALSE));
4308 else
4309 width = 3;
4310
4311
4312 /* attempt to retrieve the version array */
cb5772bb 4313 if ( !(av = (AV *)SvRV(*hv_fetch((HV*)vs, "version", 7, FALSE)) ) ) {
53c1dcc0 4314 sv_catpvn(sv,"0",1);
9137345a
JP
4315 return sv;
4316 }
4317
4318 len = av_len(av);
46314c13
JP
4319 if ( len == -1 )
4320 {
b66123c5 4321 sv_catpvn(sv,"0",1);
46314c13
JP
4322 return sv;
4323 }
9137345a
JP
4324
4325 digit = SvIV(*av_fetch(av, 0, 0));
261fcdab 4326 Perl_sv_setpvf(aTHX_ sv, "%d.", (int)PERL_ABS(digit));
13f8f398 4327 for ( i = 1 ; i < len ; i++ )
b0f01acb 4328 {
9137345a
JP
4329 digit = SvIV(*av_fetch(av, i, 0));
4330 if ( width < 3 ) {
43eaf59d 4331 const int denom = (width == 2 ? 10 : 100);
53c1dcc0 4332 const div_t term = div((int)PERL_ABS(digit),denom);
261fcdab 4333 Perl_sv_catpvf(aTHX_ sv, "%0*d_%d", width, term.quot, term.rem);
9137345a
JP
4334 }
4335 else {
261fcdab 4336 Perl_sv_catpvf(aTHX_ sv, "%0*d", width, (int)digit);
9137345a 4337 }
b0f01acb 4338 }
13f8f398
JP
4339
4340 if ( len > 0 )
4341 {
9137345a
JP
4342 digit = SvIV(*av_fetch(av, len, 0));
4343 if ( alpha && width == 3 ) /* alpha version */
e0218a61 4344 sv_catpvn(sv,"_",1);
261fcdab 4345 Perl_sv_catpvf(aTHX_ sv, "%0*d", width, (int)digit);
13f8f398 4346 }
e0218a61 4347 else /* len == 0 */
13f8f398 4348 {
e0218a61 4349 sv_catpvn(sv,"000",3);
13f8f398 4350 }
b0f01acb
JP
4351 return sv;
4352}
4353
4354/*
b9381830 4355=for apidoc vnormal
b0f01acb 4356
ad63d80f
JP
4357Accepts a version object and returns the normalized string
4358representation. Call like:
b0f01acb 4359
b9381830 4360 sv = vnormal(rv);
b0f01acb 4361
ad63d80f
JP
4362NOTE: you can pass either the object directly or the SV
4363contained within the RV.
b0f01acb
JP
4364
4365=cut
4366*/
4367
4368SV *
b9381830 4369Perl_vnormal(pTHX_ SV *vs)
b0f01acb 4370{
ad63d80f 4371 I32 i, len, digit;
9137345a 4372 bool alpha = FALSE;
2d03de9c 4373 SV * const sv = newSV(0);
9137345a 4374 AV *av;
ad63d80f
JP
4375 if ( SvROK(vs) )
4376 vs = SvRV(vs);
9137345a 4377
e0218a61
JP
4378 if ( !vverify(vs) )
4379 Perl_croak(aTHX_ "Invalid version object");
4380
9137345a
JP
4381 if ( hv_exists((HV*)vs, "alpha", 5 ) )
4382 alpha = TRUE;
cb5772bb 4383 av = (AV *)SvRV(*hv_fetch((HV*)vs, "version", 7, FALSE));
9137345a
JP
4384
4385 len = av_len(av);
e0218a61
JP
4386 if ( len == -1 )
4387 {
b66123c5 4388 sv_catpvn(sv,"",0);
46314c13
JP
4389 return sv;
4390 }
9137345a 4391 digit = SvIV(*av_fetch(av, 0, 0));
261fcdab 4392 Perl_sv_setpvf(aTHX_ sv, "v%"IVdf, (IV)digit);
cb5772bb 4393 for ( i = 1 ; i < len ; i++ ) {
9137345a 4394 digit = SvIV(*av_fetch(av, i, 0));
261fcdab 4395 Perl_sv_catpvf(aTHX_ sv, ".%"IVdf, (IV)digit);
9137345a
JP
4396 }
4397
e0218a61
JP
4398 if ( len > 0 )
4399 {
9137345a
JP
4400 /* handle last digit specially */
4401 digit = SvIV(*av_fetch(av, len, 0));
4402 if ( alpha )
261fcdab 4403 Perl_sv_catpvf(aTHX_ sv, "_%"IVdf, (IV)digit);
ad63d80f 4404 else
261fcdab 4405 Perl_sv_catpvf(aTHX_ sv, ".%"IVdf, (IV)digit);
b0f01acb 4406 }
9137345a 4407
137d6fc0
JP
4408 if ( len <= 2 ) { /* short version, must be at least three */
4409 for ( len = 2 - len; len != 0; len-- )
b66123c5 4410 sv_catpvn(sv,".0",2);
137d6fc0 4411 }
b0f01acb 4412 return sv;
9137345a 4413}
b0f01acb 4414
ad63d80f 4415/*
b9381830
JP
4416=for apidoc vstringify
4417
4418In order to maintain maximum compatibility with earlier versions
4419of Perl, this function will return either the floating point
4420notation or the multiple dotted notation, depending on whether
4421the original version contained 1 or more dots, respectively
4422
4423=cut
4424*/
4425
4426SV *
4427Perl_vstringify(pTHX_ SV *vs)
4428{
b9381830
JP
4429 if ( SvROK(vs) )
4430 vs = SvRV(vs);
e0218a61
JP
4431
4432 if ( !vverify(vs) )
4433 Perl_croak(aTHX_ "Invalid version object");
4434
9137345a 4435 if ( hv_exists((HV *)vs, "qv", 2) )
cb5772bb 4436 return vnormal(vs);
9137345a 4437 else
cb5772bb 4438 return vnumify(vs);
b9381830
JP
4439}
4440
4441/*
ad63d80f
JP
4442=for apidoc vcmp
4443
4444Version object aware cmp. Both operands must already have been
4445converted into version objects.
4446
4447=cut
4448*/
4449
4450int
9137345a 4451Perl_vcmp(pTHX_ SV *lhv, SV *rhv)
ad63d80f
JP
4452{
4453 I32 i,l,m,r,retval;
9137345a
JP
4454 bool lalpha = FALSE;
4455 bool ralpha = FALSE;
4456 I32 left = 0;
4457 I32 right = 0;
4458 AV *lav, *rav;
4459 if ( SvROK(lhv) )
4460 lhv = SvRV(lhv);
4461 if ( SvROK(rhv) )
4462 rhv = SvRV(rhv);
4463
e0218a61
JP
4464 if ( !vverify(lhv) )
4465 Perl_croak(aTHX_ "Invalid version object");
4466
4467 if ( !vverify(rhv) )
4468 Perl_croak(aTHX_ "Invalid version object");
4469
9137345a 4470 /* get the left hand term */
cb5772bb 4471 lav = (AV *)SvRV(*hv_fetch((HV*)lhv, "version", 7, FALSE));
9137345a
JP
4472 if ( hv_exists((HV*)lhv, "alpha", 5 ) )
4473 lalpha = TRUE;
4474
4475 /* and the right hand term */
cb5772bb 4476 rav = (AV *)SvRV(*hv_fetch((HV*)rhv, "version", 7, FALSE));
9137345a
JP
4477 if ( hv_exists((HV*)rhv, "alpha", 5 ) )
4478 ralpha = TRUE;
4479
4480 l = av_len(lav);
4481 r = av_len(rav);
ad63d80f
JP
4482 m = l < r ? l : r;
4483 retval = 0;
4484 i = 0;
4485 while ( i <= m && retval == 0 )
4486 {
9137345a
JP
4487 left = SvIV(*av_fetch(lav,i,0));
4488 right = SvIV(*av_fetch(rav,i,0));
4489 if ( left < right )
ad63d80f 4490 retval = -1;
9137345a 4491 if ( left > right )
ad63d80f
JP
4492 retval = +1;
4493 i++;
4494 }
4495
9137345a
JP
4496 /* tiebreaker for alpha with identical terms */
4497 if ( retval == 0 && l == r && left == right && ( lalpha || ralpha ) )
4498 {
4499 if ( lalpha && !ralpha )
4500 {
4501 retval = -1;
4502 }
4503 else if ( ralpha && !lalpha)
4504 {
4505 retval = +1;
4506 }
4507 }
4508
137d6fc0 4509 if ( l != r && retval == 0 ) /* possible match except for trailing 0's */
129318bd 4510 {
137d6fc0 4511 if ( l < r )
129318bd 4512 {
137d6fc0
JP
4513 while ( i <= r && retval == 0 )
4514 {
9137345a 4515 if ( SvIV(*av_fetch(rav,i,0)) != 0 )
137d6fc0
JP
4516 retval = -1; /* not a match after all */
4517 i++;
4518 }
4519 }
4520 else
4521 {
4522 while ( i <= l && retval == 0 )
4523 {
9137345a 4524 if ( SvIV(*av_fetch(lav,i,0)) != 0 )
137d6fc0
JP
4525 retval = +1; /* not a match after all */
4526 i++;
4527 }
129318bd
JP
4528 }
4529 }
ad63d80f
JP
4530 return retval;
4531}
4532
c95c94b1 4533#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
2bc69dc4
NIS
4534# define EMULATE_SOCKETPAIR_UDP
4535#endif
4536
4537#ifdef EMULATE_SOCKETPAIR_UDP
02fc2eee
NC
4538static int
4539S_socketpair_udp (int fd[2]) {
e10bb1e9 4540 dTHX;
02fc2eee
NC
4541 /* Fake a datagram socketpair using UDP to localhost. */
4542 int sockets[2] = {-1, -1};
4543 struct sockaddr_in addresses[2];
4544 int i;
3aed30dc 4545 Sock_size_t size = sizeof(struct sockaddr_in);
ae92b34e 4546 unsigned short port;
02fc2eee
NC
4547 int got;
4548
3aed30dc 4549 memset(&addresses, 0, sizeof(addresses));
02fc2eee
NC
4550 i = 1;
4551 do {
3aed30dc
HS
4552 sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
4553 if (sockets[i] == -1)
4554 goto tidy_up_and_fail;
4555
4556 addresses[i].sin_family = AF_INET;
4557 addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4558 addresses[i].sin_port = 0; /* kernel choses port. */
4559 if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
4560 sizeof(struct sockaddr_in)) == -1)
4561 goto tidy_up_and_fail;
02fc2eee
NC
4562 } while (i--);
4563
4564 /* Now have 2 UDP sockets. Find out which port each is connected to, and
4565 for each connect the other socket to it. */
4566 i = 1;
4567 do {
3aed30dc
HS
4568 if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
4569 &size) == -1)
4570 goto tidy_up_and_fail;
4571 if (size != sizeof(struct sockaddr_in))
4572 goto abort_tidy_up_and_fail;
4573 /* !1 is 0, !0 is 1 */
4574 if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
4575 sizeof(struct sockaddr_in)) == -1)
4576 goto tidy_up_and_fail;
02fc2eee
NC
4577 } while (i--);
4578
4579 /* Now we have 2 sockets connected to each other. I don't trust some other
4580 process not to have already sent a packet to us (by random) so send
4581 a packet from each to the other. */
4582 i = 1;
4583 do {
3aed30dc
HS
4584 /* I'm going to send my own port number. As a short.
4585 (Who knows if someone somewhere has sin_port as a bitfield and needs
4586 this routine. (I'm assuming crays have socketpair)) */
4587 port = addresses[i].sin_port;
4588 got = PerlLIO_write(sockets[i], &port, sizeof(port));
4589 if (got != sizeof(port)) {
4590 if (got == -1)
4591 goto tidy_up_and_fail;
4592 goto abort_tidy_up_and_fail;
4593 }
02fc2eee
NC
4594 } while (i--);
4595
4596 /* Packets sent. I don't trust them to have arrived though.
4597 (As I understand it Solaris TCP stack is multithreaded. Non-blocking
4598 connect to localhost will use a second kernel thread. In 2.6 the
4599 first thread running the connect() returns before the second completes,
4600 so EINPROGRESS> In 2.7 the improved stack is faster and connect()
4601 returns 0. Poor programs have tripped up. One poor program's authors'
4602 had a 50-1 reverse stock split. Not sure how connected these were.)
4603 So I don't trust someone not to have an unpredictable UDP stack.
4604 */
4605
4606 {
3aed30dc
HS
4607 struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
4608 int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
4609 fd_set rset;
4610
4611 FD_ZERO(&rset);
4612 FD_SET(sockets[0], &rset);
4613 FD_SET(sockets[1], &rset);
4614
4615 got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
4616 if (got != 2 || !FD_ISSET(sockets[0], &rset)
4617 || !FD_ISSET(sockets[1], &rset)) {
4618 /* I hope this is portable and appropriate. */
4619 if (got == -1)
4620 goto tidy_up_and_fail;
4621 goto abort_tidy_up_and_fail;
4622 }
02fc2eee 4623 }
f4758303 4624
02fc2eee
NC
4625 /* And the paranoia department even now doesn't trust it to have arrive
4626 (hence MSG_DONTWAIT). Or that what arrives was sent by us. */
4627 {
3aed30dc
HS
4628 struct sockaddr_in readfrom;
4629 unsigned short buffer[2];
02fc2eee 4630
3aed30dc
HS
4631 i = 1;
4632 do {
02fc2eee 4633#ifdef MSG_DONTWAIT
3aed30dc
HS
4634 got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4635 sizeof(buffer), MSG_DONTWAIT,
4636 (struct sockaddr *) &readfrom, &size);
02fc2eee 4637#else
3aed30dc
HS
4638 got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4639 sizeof(buffer), 0,
4640 (struct sockaddr *) &readfrom, &size);
e10bb1e9 4641#endif
02fc2eee 4642
3aed30dc
HS
4643 if (got == -1)
4644 goto tidy_up_and_fail;
4645 if (got != sizeof(port)
4646 || size != sizeof(struct sockaddr_in)
4647 /* Check other socket sent us its port. */
4648 || buffer[0] != (unsigned short) addresses[!i].sin_port
4649 /* Check kernel says we got the datagram from that socket */
4650 || readfrom.sin_family != addresses[!i].sin_family
4651 || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
4652 || readfrom.sin_port != addresses[!i].sin_port)
4653 goto abort_tidy_up_and_fail;
4654 } while (i--);
02fc2eee
NC
4655 }
4656 /* My caller (my_socketpair) has validated that this is non-NULL */
4657 fd[0] = sockets[0];
4658 fd[1] = sockets[1];
4659 /* I hereby declare this connection open. May God bless all who cross
4660 her. */
4661 return 0;
4662
4663 abort_tidy_up_and_fail:
4664 errno = ECONNABORTED;
4665 tidy_up_and_fail:
4666 {
4373e329 4667 const int save_errno = errno;
3aed30dc
HS
4668 if (sockets[0] != -1)
4669 PerlLIO_close(sockets[0]);
4670 if (sockets[1] != -1)
4671 PerlLIO_close(sockets[1]);
4672 errno = save_errno;
4673 return -1;
02fc2eee
NC
4674 }
4675}
85ca448a 4676#endif /* EMULATE_SOCKETPAIR_UDP */
02fc2eee 4677
b5ac89c3 4678#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
02fc2eee
NC
4679int
4680Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4681 /* Stevens says that family must be AF_LOCAL, protocol 0.
2948e0bd 4682 I'm going to enforce that, then ignore it, and use TCP (or UDP). */
e10bb1e9 4683 dTHX;
02fc2eee
NC
4684 int listener = -1;
4685 int connector = -1;
4686 int acceptor = -1;
4687 struct sockaddr_in listen_addr;
4688 struct sockaddr_in connect_addr;
4689 Sock_size_t size;
4690
50458334
JH
4691 if (protocol
4692#ifdef AF_UNIX
4693 || family != AF_UNIX
4694#endif
3aed30dc
HS
4695 ) {
4696 errno = EAFNOSUPPORT;
4697 return -1;
02fc2eee 4698 }
2948e0bd 4699 if (!fd) {
3aed30dc
HS
4700 errno = EINVAL;
4701 return -1;
2948e0bd 4702 }
02fc2eee 4703
2bc69dc4 4704#ifdef EMULATE_SOCKETPAIR_UDP
02fc2eee 4705 if (type == SOCK_DGRAM)
3aed30dc 4706 return S_socketpair_udp(fd);
2bc69dc4 4707#endif
02fc2eee 4708
3aed30dc 4709 listener = PerlSock_socket(AF_INET, type, 0);
02fc2eee 4710 if (listener == -1)
3aed30dc
HS
4711 return -1;
4712 memset(&listen_addr, 0, sizeof(listen_addr));
02fc2eee 4713 listen_addr.sin_family = AF_INET;
3aed30dc 4714 listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
02fc2eee 4715 listen_addr.sin_port = 0; /* kernel choses port. */
3aed30dc
HS
4716 if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
4717 sizeof(listen_addr)) == -1)
4718 goto tidy_up_and_fail;
e10bb1e9 4719 if (PerlSock_listen(listener, 1) == -1)
3aed30dc 4720 goto tidy_up_and_fail;
02fc2eee 4721
3aed30dc 4722 connector = PerlSock_socket(AF_INET, type, 0);
02fc2eee 4723 if (connector == -1)
3aed30dc 4724 goto tidy_up_and_fail;
02fc2eee 4725 /* We want to find out the port number to connect to. */
3aed30dc
HS
4726 size = sizeof(connect_addr);
4727 if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
4728 &size) == -1)
4729 goto tidy_up_and_fail;
4730 if (size != sizeof(connect_addr))
4731 goto abort_tidy_up_and_fail;
e10bb1e9 4732 if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
3aed30dc
HS
4733 sizeof(connect_addr)) == -1)
4734 goto tidy_up_and_fail;
02fc2eee 4735
3aed30dc
HS
4736 size = sizeof(listen_addr);
4737 acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
4738 &size);
02fc2eee 4739 if (acceptor == -1)
3aed30dc
HS
4740 goto tidy_up_and_fail;
4741 if (size != sizeof(listen_addr))
4742 goto abort_tidy_up_and_fail;
4743 PerlLIO_close(listener);
02fc2eee
NC
4744 /* Now check we are talking to ourself by matching port and host on the
4745 two sockets. */
3aed30dc
HS
4746 if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
4747 &size) == -1)
4748 goto tidy_up_and_fail;
4749 if (size != sizeof(connect_addr)
4750 || listen_addr.sin_family != connect_addr.sin_family
4751 || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
4752 || listen_addr.sin_port != connect_addr.sin_port) {
4753 goto abort_tidy_up_and_fail;
02fc2eee
NC
4754 }
4755 fd[0] = connector;
4756 fd[1] = acceptor;
4757 return 0;
4758
4759 abort_tidy_up_and_fail:
27da23d5
JH
4760#ifdef ECONNABORTED
4761 errno = ECONNABORTED; /* This would be the standard thing to do. */
4762#else
4763# ifdef ECONNREFUSED
4764 errno = ECONNREFUSED; /* E.g. Symbian does not have ECONNABORTED. */
4765# else
4766 errno = ETIMEDOUT; /* Desperation time. */
4767# endif
4768#endif
02fc2eee
NC
4769 tidy_up_and_fail:
4770 {
7452cf6a 4771 const int save_errno = errno;
3aed30dc
HS
4772 if (listener != -1)
4773 PerlLIO_close(listener);
4774 if (connector != -1)
4775 PerlLIO_close(connector);
4776 if (acceptor != -1)
4777 PerlLIO_close(acceptor);
4778 errno = save_errno;
4779 return -1;
02fc2eee
NC
4780 }
4781}
85ca448a 4782#else
48ea76d1
JH
4783/* In any case have a stub so that there's code corresponding
4784 * to the my_socketpair in global.sym. */
4785int
4786Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
daf16542 4787#ifdef HAS_SOCKETPAIR
48ea76d1 4788 return socketpair(family, type, protocol, fd);
daf16542
JH
4789#else
4790 return -1;
4791#endif
48ea76d1
JH
4792}
4793#endif
4794
68795e93
NIS
4795/*
4796
4797=for apidoc sv_nosharing
4798
4799Dummy routine which "shares" an SV when there is no sharing module present.
d5b2b27b
NC
4800Or "locks" it. Or "unlocks" it. In other words, ignores its single SV argument.
4801Exists to avoid test for a NULL function pointer and because it could
4802potentially warn under some level of strict-ness.
68795e93
NIS
4803
4804=cut
4805*/
4806
4807void
4808Perl_sv_nosharing(pTHX_ SV *sv)
4809{
53c1dcc0 4810 PERL_UNUSED_ARG(sv);
68795e93
NIS
4811}
4812
a05d7ebb 4813U32
e1ec3a88 4814Perl_parse_unicode_opts(pTHX_ const char **popt)
a05d7ebb 4815{
e1ec3a88 4816 const char *p = *popt;
a05d7ebb
JH
4817 U32 opt = 0;
4818
4819 if (*p) {
4820 if (isDIGIT(*p)) {
4821 opt = (U32) atoi(p);
4822 while (isDIGIT(*p)) p++;
7c91f477 4823 if (*p && *p != '\n' && *p != '\r')
a05d7ebb
JH
4824 Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
4825 }
4826 else {
4827 for (; *p; p++) {
4828 switch (*p) {
4829 case PERL_UNICODE_STDIN:
4830 opt |= PERL_UNICODE_STDIN_FLAG; break;
4831 case PERL_UNICODE_STDOUT:
4832 opt |= PERL_UNICODE_STDOUT_FLAG; break;
4833 case PERL_UNICODE_STDERR:
4834 opt |= PERL_UNICODE_STDERR_FLAG; break;
4835 case PERL_UNICODE_STD:
4836 opt |= PERL_UNICODE_STD_FLAG; break;
4837 case PERL_UNICODE_IN:
4838 opt |= PERL_UNICODE_IN_FLAG; break;
4839 case PERL_UNICODE_OUT:
4840 opt |= PERL_UNICODE_OUT_FLAG; break;
4841 case PERL_UNICODE_INOUT:
4842 opt |= PERL_UNICODE_INOUT_FLAG; break;
4843 case PERL_UNICODE_LOCALE:
4844 opt |= PERL_UNICODE_LOCALE_FLAG; break;
4845 case PERL_UNICODE_ARGV:
4846 opt |= PERL_UNICODE_ARGV_FLAG; break;
4847 default:
7c91f477
JH
4848 if (*p != '\n' && *p != '\r')
4849 Perl_croak(aTHX_
4850 "Unknown Unicode option letter '%c'", *p);
a05d7ebb
JH
4851 }
4852 }
4853 }
4854 }
4855 else
4856 opt = PERL_UNICODE_DEFAULT_FLAGS;
4857
4858 if (opt & ~PERL_UNICODE_ALL_FLAGS)
06e66572 4859 Perl_croak(aTHX_ "Unknown Unicode option value %"UVuf,
a05d7ebb
JH
4860 (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
4861
4862 *popt = p;
4863
4864 return opt;
4865}
4866
132efe8b
JH
4867U32
4868Perl_seed(pTHX)
4869{
4870 /*
4871 * This is really just a quick hack which grabs various garbage
4872 * values. It really should be a real hash algorithm which
4873 * spreads the effect of every input bit onto every output bit,
4874 * if someone who knows about such things would bother to write it.
4875 * Might be a good idea to add that function to CORE as well.
4876 * No numbers below come from careful analysis or anything here,
4877 * except they are primes and SEED_C1 > 1E6 to get a full-width
4878 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
4879 * probably be bigger too.
4880 */
4881#if RANDBITS > 16
4882# define SEED_C1 1000003
4883#define SEED_C4 73819
4884#else
4885# define SEED_C1 25747
4886#define SEED_C4 20639
4887#endif
4888#define SEED_C2 3
4889#define SEED_C3 269
4890#define SEED_C5 26107
4891
4892#ifndef PERL_NO_DEV_RANDOM
4893 int fd;
4894#endif
4895 U32 u;
4896#ifdef VMS
4897# include <starlet.h>
4898 /* when[] = (low 32 bits, high 32 bits) of time since epoch
4899 * in 100-ns units, typically incremented ever 10 ms. */
4900 unsigned int when[2];
4901#else
4902# ifdef HAS_GETTIMEOFDAY
4903 struct timeval when;
4904# else
4905 Time_t when;
4906# endif
4907#endif
4908
4909/* This test is an escape hatch, this symbol isn't set by Configure. */
4910#ifndef PERL_NO_DEV_RANDOM
4911#ifndef PERL_RANDOM_DEVICE
4912 /* /dev/random isn't used by default because reads from it will block
4913 * if there isn't enough entropy available. You can compile with
4914 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
4915 * is enough real entropy to fill the seed. */
4916# define PERL_RANDOM_DEVICE "/dev/urandom"
4917#endif
4918 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
4919 if (fd != -1) {
27da23d5 4920 if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u)
132efe8b
JH
4921 u = 0;
4922 PerlLIO_close(fd);
4923 if (u)
4924 return u;
4925 }
4926#endif
4927
4928#ifdef VMS
4929 _ckvmssts(sys$gettim(when));
4930 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
4931#else
4932# ifdef HAS_GETTIMEOFDAY
4933 PerlProc_gettimeofday(&when,NULL);
4934 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
4935# else
4936 (void)time(&when);
4937 u = (U32)SEED_C1 * when;
4938# endif
4939#endif
4940 u += SEED_C3 * (U32)PerlProc_getpid();
4941 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
4942#ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
4943 u += SEED_C5 * (U32)PTR2UV(&when);
4944#endif
4945 return u;
4946}
4947
bed60192 4948UV
a783c5f4 4949Perl_get_hash_seed(pTHX)
bed60192 4950{
e1ec3a88 4951 const char *s = PerlEnv_getenv("PERL_HASH_SEED");
bed60192
JH
4952 UV myseed = 0;
4953
4954 if (s)
4955 while (isSPACE(*s)) s++;
4956 if (s && isDIGIT(*s))
4957 myseed = (UV)Atoul(s);
4958 else
4959#ifdef USE_HASH_SEED_EXPLICIT
4960 if (s)
4961#endif
4962 {
4963 /* Compute a random seed */
4964 (void)seedDrand01((Rand_seed_t)seed());
bed60192
JH
4965 myseed = (UV)(Drand01() * (NV)UV_MAX);
4966#if RANDBITS < (UVSIZE * 8)
4967 /* Since there are not enough randbits to to reach all
4968 * the bits of a UV, the low bits might need extra
4969 * help. Sum in another random number that will
4970 * fill in the low bits. */
4971 myseed +=
4972 (UV)(Drand01() * (NV)((1 << ((UVSIZE * 8 - RANDBITS))) - 1));
4973#endif /* RANDBITS < (UVSIZE * 8) */
6cfd5ea7
JH
4974 if (myseed == 0) { /* Superparanoia. */
4975 myseed = (UV)(Drand01() * (NV)UV_MAX); /* One more chance. */
4976 if (myseed == 0)
4977 Perl_croak(aTHX_ "Your random numbers are not that random");
4978 }
bed60192 4979 }
008fb0c0 4980 PL_rehash_seed_set = TRUE;
bed60192
JH
4981
4982 return myseed;
4983}
27da23d5 4984
ed221c57
AL
4985#ifdef USE_ITHREADS
4986bool
4987Perl_stashpv_hvname_match(pTHX_ const COP *c, const HV *hv)
4988{
4989 const char * const stashpv = CopSTASHPV(c);
4990 const char * const name = HvNAME_get(hv);
4991
4992 if (stashpv == name)
4993 return TRUE;
4994 if (stashpv && name)
4995 if (strEQ(stashpv, name))
4996 return TRUE;
4997 return FALSE;
4998}
4999#endif
5000
5001
27da23d5
JH
5002#ifdef PERL_GLOBAL_STRUCT
5003
5004struct perl_vars *
5005Perl_init_global_struct(pTHX)
5006{
5007 struct perl_vars *plvarsp = NULL;
5008#ifdef PERL_GLOBAL_STRUCT
5009# define PERL_GLOBAL_STRUCT_INIT
5010# include "opcode.h" /* the ppaddr and check */
7452cf6a
AL
5011 const IV nppaddr = sizeof(Gppaddr)/sizeof(Perl_ppaddr_t);
5012 const IV ncheck = sizeof(Gcheck) /sizeof(Perl_check_t);
27da23d5
JH
5013# ifdef PERL_GLOBAL_STRUCT_PRIVATE
5014 /* PerlMem_malloc() because can't use even safesysmalloc() this early. */
5015 plvarsp = (struct perl_vars*)PerlMem_malloc(sizeof(struct perl_vars));
5016 if (!plvarsp)
5017 exit(1);
5018# else
5019 plvarsp = PL_VarsPtr;
5020# endif /* PERL_GLOBAL_STRUCT_PRIVATE */
aadb217d
JH
5021# undef PERLVAR
5022# undef PERLVARA
5023# undef PERLVARI
5024# undef PERLVARIC
5025# undef PERLVARISC
27da23d5
JH
5026# define PERLVAR(var,type) /**/
5027# define PERLVARA(var,n,type) /**/
5028# define PERLVARI(var,type,init) plvarsp->var = init;
5029# define PERLVARIC(var,type,init) plvarsp->var = init;
5030# define PERLVARISC(var,init) Copy(init, plvarsp->var, sizeof(init), char);
5031# include "perlvars.h"
5032# undef PERLVAR
5033# undef PERLVARA
5034# undef PERLVARI
5035# undef PERLVARIC
5036# undef PERLVARISC
5037# ifdef PERL_GLOBAL_STRUCT
5038 plvarsp->Gppaddr = PerlMem_malloc(nppaddr * sizeof(Perl_ppaddr_t));
5039 if (!plvarsp->Gppaddr)
5040 exit(1);
5041 plvarsp->Gcheck = PerlMem_malloc(ncheck * sizeof(Perl_check_t));
5042 if (!plvarsp->Gcheck)
5043 exit(1);
5044 Copy(Gppaddr, plvarsp->Gppaddr, nppaddr, Perl_ppaddr_t);
5045 Copy(Gcheck, plvarsp->Gcheck, ncheck, Perl_check_t);
5046# endif
5047# ifdef PERL_SET_VARS
5048 PERL_SET_VARS(plvarsp);
5049# endif
5050# undef PERL_GLOBAL_STRUCT_INIT
5051#endif
5052 return plvarsp;
5053}
5054
5055#endif /* PERL_GLOBAL_STRUCT */
5056
5057#ifdef PERL_GLOBAL_STRUCT
5058
5059void
5060Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp)
5061{
5062#ifdef PERL_GLOBAL_STRUCT
5063# ifdef PERL_UNSET_VARS
5064 PERL_UNSET_VARS(plvarsp);
5065# endif
5066 free(plvarsp->Gppaddr);
5067 free(plvarsp->Gcheck);
5068# ifdef PERL_GLOBAL_STRUCT_PRIVATE
5069 free(plvarsp);
5070# endif
5071#endif
5072}
5073
5074#endif /* PERL_GLOBAL_STRUCT */
5075
fe4f188c
JH
5076#ifdef PERL_MEM_LOG
5077
e352bcff
JH
5078#define PERL_MEM_LOG_SPRINTF_BUF_SIZE 128
5079
fe4f188c 5080Malloc_t
46c6c7e2 5081Perl_mem_log_alloc(const UV n, const UV typesize, const char *typename, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname)
fe4f188c
JH
5082{
5083#ifdef PERL_MEM_LOG_STDERR
e352bcff
JH
5084 /* We can't use PerlIO for obvious reasons. */
5085 char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
86c11942
NC
5086 const STRLEN len = my_sprintf(buf,
5087 "alloc: %s:%d:%s: %"IVdf" %"UVuf
5088 " %s = %"IVdf": %"UVxf"\n",
5089 filename, linenumber, funcname, n, typesize,
5090 typename, n * typesize, PTR2UV(newalloc));
3ecdc9a4 5091 PerlLIO_write(2, buf, len);
fe4f188c
JH
5092#endif
5093 return newalloc;
5094}
5095
5096Malloc_t
46c6c7e2 5097Perl_mem_log_realloc(const UV n, const UV typesize, const char *typename, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname)
fe4f188c
JH
5098{
5099#ifdef PERL_MEM_LOG_STDERR
e352bcff
JH
5100 /* We can't use PerlIO for obvious reasons. */
5101 char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
86c11942
NC
5102 const STRLEN len = my_sprintf(buf, "realloc: %s:%d:%s: %"IVdf" %"UVuf
5103 " %s = %"IVdf": %"UVxf" -> %"UVxf"\n",
5104 filename, linenumber, funcname, n, typesize,
5105 typename, n * typesize, PTR2UV(oldalloc),
5106 PTR2UV(newalloc));
5107 PerlLIO_write(2, buf, len);
fe4f188c
JH
5108#endif
5109 return newalloc;
5110}
5111
5112Malloc_t
46c6c7e2 5113Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname)
fe4f188c
JH
5114{
5115#ifdef PERL_MEM_LOG_STDERR
e352bcff
JH
5116 /* We can't use PerlIO for obvious reasons. */
5117 char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
86c11942
NC
5118 const STRLEN len = my_sprintf(buf, "free: %s:%d:%s: %"UVxf"\n",
5119 filename, linenumber, funcname,
5120 PTR2UV(oldalloc));
5121 PerlLIO_write(2, buf, len);
fe4f188c
JH
5122#endif
5123 return oldalloc;
5124}
5125
5126#endif /* PERL_MEM_LOG */
5127
66610fdd 5128/*
ce582cee
NC
5129=for apidoc my_sprintf
5130
5131The C library C<sprintf>, wrapped if necessary, to ensure that it will return
5132the length of the string written to the buffer. Only rare pre-ANSI systems
5133need the wrapper function - usually this is a direct call to C<sprintf>.
5134
5135=cut
5136*/
5137#ifndef SPRINTF_RETURNS_STRLEN
5138int
5139Perl_my_sprintf(char *buffer, const char* pat, ...)
5140{
5141 va_list args;
5142 va_start(args, pat);
5143 vsprintf(buffer, pat, args);
5144 va_end(args);
5145 return strlen(buffer);
5146}
5147#endif
5148
b0269e46
AB
5149void
5150Perl_my_clearenv(pTHX)
5151{
5152 dVAR;
5153#if ! defined(PERL_MICRO)
5154# if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
5155 PerlEnv_clearenv();
5156# else /* ! (PERL_IMPLICIT_SYS || WIN32) */
5157# if defined(USE_ENVIRON_ARRAY)
5158# if defined(USE_ITHREADS)
5159 /* only the parent thread can clobber the process environment */
5160 if (PL_curinterp == aTHX)
5161# endif /* USE_ITHREADS */
5162 {
5163# if ! defined(PERL_USE_SAFE_PUTENV)
5164 if ( !PL_use_safe_putenv) {
5165 I32 i;
5166 if (environ == PL_origenviron)
5167 environ = (char**)safesysmalloc(sizeof(char*));
5168 else
5169 for (i = 0; environ[i]; i++)
5170 (void)safesysfree(environ[i]);
5171 }
5172 environ[0] = NULL;
5173# else /* PERL_USE_SAFE_PUTENV */
5174# if defined(HAS_CLEARENV)
5175 (void)clearenv();
5176# elif defined(HAS_UNSETENV)
5177 int bsiz = 80; /* Most envvar names will be shorter than this. */
5178 char *buf = (char*)safesysmalloc(bsiz * sizeof(char));
5179 while (*environ != NULL) {
5180 char *e = strchr(*environ, '=');
5181 int l = e ? e - *environ : strlen(*environ);
5182 if (bsiz < l + 1) {
5183 (void)safesysfree(buf);
5184 bsiz = l + 1;
5185 buf = (char*)safesysmalloc(bsiz * sizeof(char));
5186 }
5187 strncpy(buf, *environ, l);
5188 *(buf + l) = '\0';
5189 (void)unsetenv(buf);
5190 }
5191 (void)safesysfree(buf);
5192# else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
5193 /* Just null environ and accept the leakage. */
5194 *environ = NULL;
5195# endif /* HAS_CLEARENV || HAS_UNSETENV */
5196# endif /* ! PERL_USE_SAFE_PUTENV */
5197 }
5198# endif /* USE_ENVIRON_ARRAY */
5199# endif /* PERL_IMPLICIT_SYS || WIN32 */
5200#endif /* PERL_MICRO */
5201}
5202
ce582cee 5203/*
66610fdd
RGS
5204 * Local variables:
5205 * c-indentation-style: bsd
5206 * c-basic-offset: 4
5207 * indent-tabs-mode: t
5208 * End:
5209 *
37442d52
RGS
5210 * ex: set ts=8 sts=4 sw=4 noet:
5211 */