xref: /openbsd-src/gnu/usr.bin/perl/util.c (revision 46035553bfdd96e63c94e32da0210227ec2e3cf1)
1 /*    util.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4  *    2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10 
11 /*
12  * 'Very useful, no doubt, that was to Saruman; yet it seems that he was
13  *  not content.'                                    --Gandalf to Pippin
14  *
15  *     [p.598 of _The Lord of the Rings_, III/xi: "The Palantír"]
16  */
17 
18 /* This file contains assorted utility routines.
19  * Which is a polite way of saying any stuff that people couldn't think of
20  * a better place for. Amongst other things, it includes the warning and
21  * dieing stuff, plus wrappers for malloc code.
22  */
23 
24 #include "EXTERN.h"
25 #define PERL_IN_UTIL_C
26 #include "perl.h"
27 #include "reentr.h"
28 
29 #if defined(USE_PERLIO)
30 #include "perliol.h" /* For PerlIOUnix_refcnt */
31 #endif
32 
33 #ifndef PERL_MICRO
34 #include <signal.h>
35 #ifndef SIG_ERR
36 # define SIG_ERR ((Sighandler_t) -1)
37 #endif
38 #endif
39 
40 #include <math.h>
41 #include <stdlib.h>
42 
43 #ifdef __Lynx__
44 /* Missing protos on LynxOS */
45 int putenv(char *);
46 #endif
47 
48 #ifdef __amigaos__
49 # include "amigaos4/amigaio.h"
50 #endif
51 
52 #ifdef HAS_SELECT
53 # ifdef I_SYS_SELECT
54 #  include <sys/select.h>
55 # endif
56 #endif
57 
58 #ifdef USE_C_BACKTRACE
59 #  ifdef I_BFD
60 #    define USE_BFD
61 #    ifdef PERL_DARWIN
62 #      undef USE_BFD /* BFD is useless in OS X. */
63 #    endif
64 #    ifdef USE_BFD
65 #      include <bfd.h>
66 #    endif
67 #  endif
68 #  ifdef I_DLFCN
69 #    include <dlfcn.h>
70 #  endif
71 #  ifdef I_EXECINFO
72 #    include <execinfo.h>
73 #  endif
74 #endif
75 
76 #ifdef PERL_DEBUG_READONLY_COW
77 # include <sys/mman.h>
78 #endif
79 
80 #define FLUSH
81 
82 /* NOTE:  Do not call the next three routines directly.  Use the macros
83  * in handy.h, so that we can easily redefine everything to do tracking of
84  * allocated hunks back to the original New to track down any memory leaks.
85  * XXX This advice seems to be widely ignored :-(   --AD  August 1996.
86  */
87 
88 #if defined (DEBUGGING) || defined(PERL_IMPLICIT_SYS) || defined (PERL_TRACK_MEMPOOL)
89 #  define ALWAYS_NEED_THX
90 #endif
91 
92 #if defined(PERL_TRACK_MEMPOOL) && defined(PERL_DEBUG_READONLY_COW)
93 static void
94 S_maybe_protect_rw(pTHX_ struct perl_memory_debug_header *header)
95 {
96     if (header->readonly
97      && mprotect(header, header->size, PROT_READ|PROT_WRITE))
98 	Perl_warn(aTHX_ "mprotect for COW string %p %lu failed with %d",
99 			 header, header->size, errno);
100 }
101 
102 static void
103 S_maybe_protect_ro(pTHX_ struct perl_memory_debug_header *header)
104 {
105     if (header->readonly
106      && mprotect(header, header->size, PROT_READ))
107 	Perl_warn(aTHX_ "mprotect RW for COW string %p %lu failed with %d",
108 			 header, header->size, errno);
109 }
110 # define maybe_protect_rw(foo) S_maybe_protect_rw(aTHX_ foo)
111 # define maybe_protect_ro(foo) S_maybe_protect_ro(aTHX_ foo)
112 #else
113 # define maybe_protect_rw(foo) NOOP
114 # define maybe_protect_ro(foo) NOOP
115 #endif
116 
117 #if defined(PERL_TRACK_MEMPOOL) || defined(PERL_DEBUG_READONLY_COW)
118  /* Use memory_debug_header */
119 # define USE_MDH
120 # if (defined(PERL_POISON) && defined(PERL_TRACK_MEMPOOL)) \
121    || defined(PERL_DEBUG_READONLY_COW)
122 #  define MDH_HAS_SIZE
123 # endif
124 #endif
125 
126 /* paranoid version of system's malloc() */
127 
128 Malloc_t
129 Perl_safesysmalloc(MEM_SIZE size)
130 {
131 #ifdef ALWAYS_NEED_THX
132     dTHX;
133 #endif
134     Malloc_t ptr;
135     dSAVEDERRNO;
136 
137 #ifdef USE_MDH
138     if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
139         goto out_of_memory;
140     size += PERL_MEMORY_DEBUG_HEADER_SIZE;
141 #endif
142 #ifdef DEBUGGING
143     if ((SSize_t)size < 0)
144 	Perl_croak_nocontext("panic: malloc, size=%" UVuf, (UV) size);
145 #endif
146     if (!size) size = 1;	/* malloc(0) is NASTY on our system */
147     SAVE_ERRNO;
148 #ifdef PERL_DEBUG_READONLY_COW
149     if ((ptr = mmap(0, size, PROT_READ|PROT_WRITE,
150 		    MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
151 	perror("mmap failed");
152 	abort();
153     }
154 #else
155     ptr = (Malloc_t)PerlMem_malloc(size?size:1);
156 #endif
157     PERL_ALLOC_CHECK(ptr);
158     if (ptr != NULL) {
159 #ifdef USE_MDH
160 	struct perl_memory_debug_header *const header
161 	    = (struct perl_memory_debug_header *)ptr;
162 #endif
163 
164 #ifdef PERL_POISON
165 	PoisonNew(((char *)ptr), size, char);
166 #endif
167 
168 #ifdef PERL_TRACK_MEMPOOL
169 	header->interpreter = aTHX;
170 	/* Link us into the list.  */
171 	header->prev = &PL_memory_debug_header;
172 	header->next = PL_memory_debug_header.next;
173 	PL_memory_debug_header.next = header;
174 	maybe_protect_rw(header->next);
175 	header->next->prev = header;
176 	maybe_protect_ro(header->next);
177 #  ifdef PERL_DEBUG_READONLY_COW
178 	header->readonly = 0;
179 #  endif
180 #endif
181 #ifdef MDH_HAS_SIZE
182 	header->size = size;
183 #endif
184 	ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
185 	DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
186 
187         /* malloc() can modify errno() even on success, but since someone
188 	   writing perl code doesn't have any control over when perl calls
189 	   malloc() we need to hide that.
190 	*/
191         RESTORE_ERRNO;
192     }
193     else {
194 #ifdef USE_MDH
195       out_of_memory:
196 #endif
197         {
198 #ifndef ALWAYS_NEED_THX
199             dTHX;
200 #endif
201             if (PL_nomemok)
202                 ptr =  NULL;
203             else
204                 croak_no_mem();
205         }
206     }
207     return ptr;
208 }
209 
210 /* paranoid version of system's realloc() */
211 
212 Malloc_t
213 Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
214 {
215 #ifdef ALWAYS_NEED_THX
216     dTHX;
217 #endif
218     Malloc_t ptr;
219 #ifdef PERL_DEBUG_READONLY_COW
220     const MEM_SIZE oldsize = where
221 	? ((struct perl_memory_debug_header *)((char *)where - PERL_MEMORY_DEBUG_HEADER_SIZE))->size
222 	: 0;
223 #endif
224 
225     if (!size) {
226 	safesysfree(where);
227 	ptr = NULL;
228     }
229     else if (!where) {
230 	ptr = safesysmalloc(size);
231     }
232     else {
233         dSAVE_ERRNO;
234 #ifdef USE_MDH
235 	where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
236         if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
237             goto out_of_memory;
238 	size += PERL_MEMORY_DEBUG_HEADER_SIZE;
239 	{
240 	    struct perl_memory_debug_header *const header
241 		= (struct perl_memory_debug_header *)where;
242 
243 # ifdef PERL_TRACK_MEMPOOL
244 	    if (header->interpreter != aTHX) {
245 		Perl_croak_nocontext("panic: realloc from wrong pool, %p!=%p",
246 				     header->interpreter, aTHX);
247 	    }
248 	    assert(header->next->prev == header);
249 	    assert(header->prev->next == header);
250 #  ifdef PERL_POISON
251 	    if (header->size > size) {
252 		const MEM_SIZE freed_up = header->size - size;
253 		char *start_of_freed = ((char *)where) + size;
254 		PoisonFree(start_of_freed, freed_up, char);
255 	    }
256 #  endif
257 # endif
258 # ifdef MDH_HAS_SIZE
259 	    header->size = size;
260 # endif
261 	}
262 #endif
263 #ifdef DEBUGGING
264 	if ((SSize_t)size < 0)
265 	    Perl_croak_nocontext("panic: realloc, size=%" UVuf, (UV)size);
266 #endif
267 #ifdef PERL_DEBUG_READONLY_COW
268 	if ((ptr = mmap(0, size, PROT_READ|PROT_WRITE,
269 			MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
270 	    perror("mmap failed");
271 	    abort();
272 	}
273 	Copy(where,ptr,oldsize < size ? oldsize : size,char);
274 	if (munmap(where, oldsize)) {
275 	    perror("munmap failed");
276 	    abort();
277 	}
278 #else
279 	ptr = (Malloc_t)PerlMem_realloc(where,size);
280 #endif
281 	PERL_ALLOC_CHECK(ptr);
282 
283     /* MUST do this fixup first, before doing ANYTHING else, as anything else
284        might allocate memory/free/move memory, and until we do the fixup, it
285        may well be chasing (and writing to) free memory.  */
286 	if (ptr != NULL) {
287 #ifdef PERL_TRACK_MEMPOOL
288 	    struct perl_memory_debug_header *const header
289 		= (struct perl_memory_debug_header *)ptr;
290 
291 #  ifdef PERL_POISON
292 	    if (header->size < size) {
293 		const MEM_SIZE fresh = size - header->size;
294 		char *start_of_fresh = ((char *)ptr) + size;
295 		PoisonNew(start_of_fresh, fresh, char);
296 	    }
297 #  endif
298 
299 	    maybe_protect_rw(header->next);
300 	    header->next->prev = header;
301 	    maybe_protect_ro(header->next);
302 	    maybe_protect_rw(header->prev);
303 	    header->prev->next = header;
304 	    maybe_protect_ro(header->prev);
305 #endif
306 	    ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
307 
308 	    /* realloc() can modify errno() even on success, but since someone
309 	       writing perl code doesn't have any control over when perl calls
310 	       realloc() we need to hide that.
311 	    */
312 	    RESTORE_ERRNO;
313 	}
314 
315     /* In particular, must do that fixup above before logging anything via
316      *printf(), as it can reallocate memory, which can cause SEGVs.  */
317 
318 	DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
319 	DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
320 
321 	if (ptr == NULL) {
322 #ifdef USE_MDH
323           out_of_memory:
324 #endif
325             {
326 #ifndef ALWAYS_NEED_THX
327                 dTHX;
328 #endif
329                 if (PL_nomemok)
330                     ptr = NULL;
331                 else
332                     croak_no_mem();
333             }
334 	}
335     }
336     return ptr;
337 }
338 
339 /* safe version of system's free() */
340 
341 Free_t
342 Perl_safesysfree(Malloc_t where)
343 {
344 #ifdef ALWAYS_NEED_THX
345     dTHX;
346 #endif
347     DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
348     if (where) {
349 #ifdef USE_MDH
350 	Malloc_t where_intrn = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
351 	{
352 	    struct perl_memory_debug_header *const header
353 		= (struct perl_memory_debug_header *)where_intrn;
354 
355 # ifdef MDH_HAS_SIZE
356 	    const MEM_SIZE size = header->size;
357 # endif
358 # ifdef PERL_TRACK_MEMPOOL
359 	    if (header->interpreter != aTHX) {
360 		Perl_croak_nocontext("panic: free from wrong pool, %p!=%p",
361 				     header->interpreter, aTHX);
362 	    }
363 	    if (!header->prev) {
364 		Perl_croak_nocontext("panic: duplicate free");
365 	    }
366 	    if (!(header->next))
367 		Perl_croak_nocontext("panic: bad free, header->next==NULL");
368 	    if (header->next->prev != header || header->prev->next != header) {
369 		Perl_croak_nocontext("panic: bad free, ->next->prev=%p, "
370 				     "header=%p, ->prev->next=%p",
371 				     header->next->prev, header,
372 				     header->prev->next);
373 	    }
374 	    /* Unlink us from the chain.  */
375 	    maybe_protect_rw(header->next);
376 	    header->next->prev = header->prev;
377 	    maybe_protect_ro(header->next);
378 	    maybe_protect_rw(header->prev);
379 	    header->prev->next = header->next;
380 	    maybe_protect_ro(header->prev);
381 	    maybe_protect_rw(header);
382 #  ifdef PERL_POISON
383 	    PoisonNew(where_intrn, size, char);
384 #  endif
385 	    /* Trigger the duplicate free warning.  */
386 	    header->next = NULL;
387 # endif
388 # ifdef PERL_DEBUG_READONLY_COW
389 	    if (munmap(where_intrn, size)) {
390 		perror("munmap failed");
391 		abort();
392 	    }
393 # endif
394 	}
395 #else
396 	Malloc_t where_intrn = where;
397 #endif /* USE_MDH */
398 #ifndef PERL_DEBUG_READONLY_COW
399 	PerlMem_free(where_intrn);
400 #endif
401     }
402 }
403 
404 /* safe version of system's calloc() */
405 
406 Malloc_t
407 Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
408 {
409 #ifdef ALWAYS_NEED_THX
410     dTHX;
411 #endif
412     Malloc_t ptr;
413 #if defined(USE_MDH) || defined(DEBUGGING)
414     MEM_SIZE total_size = 0;
415 #endif
416 
417     /* Even though calloc() for zero bytes is strange, be robust. */
418     if (size && (count <= MEM_SIZE_MAX / size)) {
419 #if defined(USE_MDH) || defined(DEBUGGING)
420 	total_size = size * count;
421 #endif
422     }
423     else
424 	croak_memory_wrap();
425 #ifdef USE_MDH
426     if (PERL_MEMORY_DEBUG_HEADER_SIZE <= MEM_SIZE_MAX - (MEM_SIZE)total_size)
427 	total_size += PERL_MEMORY_DEBUG_HEADER_SIZE;
428     else
429 	croak_memory_wrap();
430 #endif
431 #ifdef DEBUGGING
432     if ((SSize_t)size < 0 || (SSize_t)count < 0)
433 	Perl_croak_nocontext("panic: calloc, size=%" UVuf ", count=%" UVuf,
434 			     (UV)size, (UV)count);
435 #endif
436 #ifdef PERL_DEBUG_READONLY_COW
437     if ((ptr = mmap(0, total_size ? total_size : 1, PROT_READ|PROT_WRITE,
438 		    MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
439 	perror("mmap failed");
440 	abort();
441     }
442 #elif defined(PERL_TRACK_MEMPOOL)
443     /* Have to use malloc() because we've added some space for our tracking
444        header.  */
445     /* malloc(0) is non-portable. */
446     ptr = (Malloc_t)PerlMem_malloc(total_size ? total_size : 1);
447 #else
448     /* Use calloc() because it might save a memset() if the memory is fresh
449        and clean from the OS.  */
450     if (count && size)
451 	ptr = (Malloc_t)PerlMem_calloc(count, size);
452     else /* calloc(0) is non-portable. */
453 	ptr = (Malloc_t)PerlMem_calloc(count ? count : 1, size ? size : 1);
454 #endif
455     PERL_ALLOC_CHECK(ptr);
456     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) calloc %zu x %zu = %zu bytes\n",PTR2UV(ptr),(long)PL_an++, count, size, total_size));
457     if (ptr != NULL) {
458 #ifdef USE_MDH
459 	{
460 	    struct perl_memory_debug_header *const header
461 		= (struct perl_memory_debug_header *)ptr;
462 
463 #  ifndef PERL_DEBUG_READONLY_COW
464 	    memset((void*)ptr, 0, total_size);
465 #  endif
466 #  ifdef PERL_TRACK_MEMPOOL
467 	    header->interpreter = aTHX;
468 	    /* Link us into the list.  */
469 	    header->prev = &PL_memory_debug_header;
470 	    header->next = PL_memory_debug_header.next;
471 	    PL_memory_debug_header.next = header;
472 	    maybe_protect_rw(header->next);
473 	    header->next->prev = header;
474 	    maybe_protect_ro(header->next);
475 #    ifdef PERL_DEBUG_READONLY_COW
476 	    header->readonly = 0;
477 #    endif
478 #  endif
479 #  ifdef MDH_HAS_SIZE
480 	    header->size = total_size;
481 #  endif
482 	    ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
483 	}
484 #endif
485 	return ptr;
486     }
487     else {
488 #ifndef ALWAYS_NEED_THX
489 	dTHX;
490 #endif
491 	if (PL_nomemok)
492 	    return NULL;
493 	croak_no_mem();
494     }
495 }
496 
497 /* These must be defined when not using Perl's malloc for binary
498  * compatibility */
499 
500 #ifndef MYMALLOC
501 
502 Malloc_t Perl_malloc (MEM_SIZE nbytes)
503 {
504 #ifdef PERL_IMPLICIT_SYS
505     dTHX;
506 #endif
507     return (Malloc_t)PerlMem_malloc(nbytes);
508 }
509 
510 Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
511 {
512 #ifdef PERL_IMPLICIT_SYS
513     dTHX;
514 #endif
515     return (Malloc_t)PerlMem_calloc(elements, size);
516 }
517 
518 Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
519 {
520 #ifdef PERL_IMPLICIT_SYS
521     dTHX;
522 #endif
523     return (Malloc_t)PerlMem_realloc(where, nbytes);
524 }
525 
526 Free_t   Perl_mfree (Malloc_t where)
527 {
528 #ifdef PERL_IMPLICIT_SYS
529     dTHX;
530 #endif
531     PerlMem_free(where);
532 }
533 
534 #endif
535 
536 /* copy a string up to some (non-backslashed) delimiter, if any.
537  * With allow_escape, converts \<delimiter> to <delimiter>, while leaves
538  * \<non-delimiter> as-is.
539  * Returns the position in the src string of the closing delimiter, if
540  * any, or returns fromend otherwise.
541  * This is the internal implementation for Perl_delimcpy and
542  * Perl_delimcpy_no_escape.
543  */
544 
545 static char *
546 S_delimcpy_intern(char *to, const char *toend, const char *from,
547 	   const char *fromend, int delim, I32 *retlen,
548 	   const bool allow_escape)
549 {
550     I32 tolen;
551 
552     PERL_ARGS_ASSERT_DELIMCPY;
553 
554     for (tolen = 0; from < fromend; from++, tolen++) {
555 	if (allow_escape && *from == '\\' && from + 1 < fromend) {
556 	    if (from[1] != delim) {
557 		if (to < toend)
558 		    *to++ = *from;
559 		tolen++;
560 	    }
561 	    from++;
562 	}
563 	else if (*from == delim)
564 	    break;
565 	if (to < toend)
566 	    *to++ = *from;
567     }
568     if (to < toend)
569 	*to = '\0';
570     *retlen = tolen;
571     return (char *)from;
572 }
573 
574 char *
575 Perl_delimcpy(char *to, const char *toend, const char *from, const char *fromend, int delim, I32 *retlen)
576 {
577     PERL_ARGS_ASSERT_DELIMCPY;
578 
579     return S_delimcpy_intern(to, toend, from, fromend, delim, retlen, 1);
580 }
581 
582 char *
583 Perl_delimcpy_no_escape(char *to, const char *toend, const char *from,
584 			const char *fromend, int delim, I32 *retlen)
585 {
586     PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE;
587 
588     return S_delimcpy_intern(to, toend, from, fromend, delim, retlen, 0);
589 }
590 
591 /*
592 =head1 Miscellaneous Functions
593 
594 =for apidoc Am|char *|ninstr|char * big|char * bigend|char * little|char * little_end
595 
596 Find the first (leftmost) occurrence of a sequence of bytes within another
597 sequence.  This is the Perl version of C<strstr()>, extended to handle
598 arbitrary sequences, potentially containing embedded C<NUL> characters (C<NUL>
599 is what the initial C<n> in the function name stands for; some systems have an
600 equivalent, C<memmem()>, but with a somewhat different API).
601 
602 Another way of thinking about this function is finding a needle in a haystack.
603 C<big> points to the first byte in the haystack.  C<big_end> points to one byte
604 beyond the final byte in the haystack.  C<little> points to the first byte in
605 the needle.  C<little_end> points to one byte beyond the final byte in the
606 needle.  All the parameters must be non-C<NULL>.
607 
608 The function returns C<NULL> if there is no occurrence of C<little> within
609 C<big>.  If C<little> is the empty string, C<big> is returned.
610 
611 Because this function operates at the byte level, and because of the inherent
612 characteristics of UTF-8 (or UTF-EBCDIC), it will work properly if both the
613 needle and the haystack are strings with the same UTF-8ness, but not if the
614 UTF-8ness differs.
615 
616 =cut
617 
618 */
619 
620 char *
621 Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
622 {
623     PERL_ARGS_ASSERT_NINSTR;
624 
625 #ifdef HAS_MEMMEM
626     return ninstr(big, bigend, little, lend);
627 #else
628 
629     if (little >= lend)
630         return (char*)big;
631     {
632         const char first = *little;
633         bigend -= lend - little++;
634     OUTER:
635         while (big <= bigend) {
636             if (*big++ == first) {
637                 const char *s, *x;
638                 for (x=big,s=little; s < lend; x++,s++) {
639                     if (*s != *x)
640                         goto OUTER;
641                 }
642                 return (char*)(big-1);
643             }
644         }
645     }
646     return NULL;
647 
648 #endif
649 
650 }
651 
652 /*
653 =head1 Miscellaneous Functions
654 
655 =for apidoc Am|char *|rninstr|char * big|char * bigend|char * little|char * little_end
656 
657 Like C<L</ninstr>>, but instead finds the final (rightmost) occurrence of a
658 sequence of bytes within another sequence, returning C<NULL> if there is no
659 such occurrence.
660 
661 =cut
662 
663 */
664 
665 char *
666 Perl_rninstr(const char *big, const char *bigend, const char *little, const char *lend)
667 {
668     const char *bigbeg;
669     const I32 first = *little;
670     const char * const littleend = lend;
671 
672     PERL_ARGS_ASSERT_RNINSTR;
673 
674     if (little >= littleend)
675 	return (char*)bigend;
676     bigbeg = big;
677     big = bigend - (littleend - little++);
678     while (big >= bigbeg) {
679 	const char *s, *x;
680 	if (*big-- != first)
681 	    continue;
682 	for (x=big+2,s=little; s < littleend; /**/ ) {
683 	    if (*s != *x)
684 		break;
685 	    else {
686 		x++;
687 		s++;
688 	    }
689 	}
690 	if (s >= littleend)
691 	    return (char*)(big+1);
692     }
693     return NULL;
694 }
695 
696 /* As a space optimization, we do not compile tables for strings of length
697    0 and 1, and for strings of length 2 unless FBMcf_TAIL.  These are
698    special-cased in fbm_instr().
699 
700    If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
701 
702 /*
703 =head1 Miscellaneous Functions
704 
705 =for apidoc fbm_compile
706 
707 Analyzes the string in order to make fast searches on it using C<fbm_instr()>
708 -- the Boyer-Moore algorithm.
709 
710 =cut
711 */
712 
713 void
714 Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
715 {
716     const U8 *s;
717     STRLEN i;
718     STRLEN len;
719     U32 frequency = 256;
720     MAGIC *mg;
721     PERL_DEB( STRLEN rarest = 0 );
722 
723     PERL_ARGS_ASSERT_FBM_COMPILE;
724 
725     if (isGV_with_GP(sv) || SvROK(sv))
726 	return;
727 
728     if (SvVALID(sv))
729 	return;
730 
731     if (flags & FBMcf_TAIL) {
732 	MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
733 	sv_catpvs(sv, "\n");		/* Taken into account in fbm_instr() */
734 	if (mg && mg->mg_len >= 0)
735 	    mg->mg_len++;
736     }
737     if (!SvPOK(sv) || SvNIOKp(sv))
738 	s = (U8*)SvPV_force_mutable(sv, len);
739     else s = (U8 *)SvPV_mutable(sv, len);
740     if (len == 0)		/* TAIL might be on a zero-length string. */
741 	return;
742     SvUPGRADE(sv, SVt_PVMG);
743     SvIOK_off(sv);
744     SvNOK_off(sv);
745 
746     /* add PERL_MAGIC_bm magic holding the FBM lookup table */
747 
748     assert(!mg_find(sv, PERL_MAGIC_bm));
749     mg = sv_magicext(sv, NULL, PERL_MAGIC_bm, &PL_vtbl_bm, NULL, 0);
750     assert(mg);
751 
752     if (len > 2) {
753 	/* Shorter strings are special-cased in Perl_fbm_instr(), and don't use
754 	   the BM table.  */
755 	const U8 mlen = (len>255) ? 255 : (U8)len;
756 	const unsigned char *const sb = s + len - mlen; /* first char (maybe) */
757 	U8 *table;
758 
759 	Newx(table, 256, U8);
760 	memset((void*)table, mlen, 256);
761 	mg->mg_ptr = (char *)table;
762 	mg->mg_len = 256;
763 
764 	s += len - 1; /* last char */
765 	i = 0;
766 	while (s >= sb) {
767 	    if (table[*s] == mlen)
768 		table[*s] = (U8)i;
769 	    s--, i++;
770 	}
771     }
772 
773     s = (const unsigned char*)(SvPVX_const(sv));	/* deeper magic */
774     for (i = 0; i < len; i++) {
775 	if (PL_freq[s[i]] < frequency) {
776 	    PERL_DEB( rarest = i );
777 	    frequency = PL_freq[s[i]];
778 	}
779     }
780     BmUSEFUL(sv) = 100;			/* Initial value */
781     ((XPVNV*)SvANY(sv))->xnv_u.xnv_bm_tail = cBOOL(flags & FBMcf_TAIL);
782     DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %" UVuf "\n",
783 			  s[rarest], (UV)rarest));
784 }
785 
786 
787 /*
788 =for apidoc fbm_instr
789 
790 Returns the location of the SV in the string delimited by C<big> and
791 C<bigend> (C<bigend>) is the char following the last char).
792 It returns C<NULL> if the string can't be found.  The C<sv>
793 does not have to be C<fbm_compiled>, but the search will not be as fast
794 then.
795 
796 =cut
797 
798 If SvTAIL(littlestr) is true, a fake "\n" was appended to to the string
799 during FBM compilation due to FBMcf_TAIL in flags. It indicates that
800 the littlestr must be anchored to the end of bigstr (or to any \n if
801 FBMrf_MULTILINE).
802 
803 E.g. The regex compiler would compile /abc/ to a littlestr of "abc",
804 while /abc$/ compiles to "abc\n" with SvTAIL() true.
805 
806 A littlestr of "abc", !SvTAIL matches as /abc/;
807 a littlestr of "ab\n", SvTAIL matches as:
808    without FBMrf_MULTILINE: /ab\n?\z/
809    with    FBMrf_MULTILINE: /ab\n/ || /ab\z/;
810 
811 (According to Ilya from 1999; I don't know if this is still true, DAPM 2015):
812   "If SvTAIL is actually due to \Z or \z, this gives false positives
813   if multiline".
814 */
815 
816 
817 char *
818 Perl_fbm_instr(pTHX_ unsigned char *big, unsigned char *bigend, SV *littlestr, U32 flags)
819 {
820     unsigned char *s;
821     STRLEN l;
822     const unsigned char *little = (const unsigned char *)SvPV_const(littlestr,l);
823     STRLEN littlelen = l;
824     const I32 multiline = flags & FBMrf_MULTILINE;
825     bool valid = SvVALID(littlestr);
826     bool tail = valid ? cBOOL(SvTAIL(littlestr)) : FALSE;
827 
828     PERL_ARGS_ASSERT_FBM_INSTR;
829 
830     assert(bigend >= big);
831 
832     if ((STRLEN)(bigend - big) < littlelen) {
833 	if (     tail
834 	     && ((STRLEN)(bigend - big) == littlelen - 1)
835 	     && (littlelen == 1
836 		 || (*big == *little &&
837 		     memEQ((char *)big, (char *)little, littlelen - 1))))
838 	    return (char*)big;
839 	return NULL;
840     }
841 
842     switch (littlelen) { /* Special cases for 0, 1 and 2  */
843     case 0:
844 	return (char*)big;		/* Cannot be SvTAIL! */
845 
846     case 1:
847 	    if (tail && !multiline) /* Anchor only! */
848 		/* [-1] is safe because we know that bigend != big.  */
849 		return (char *) (bigend - (bigend[-1] == '\n'));
850 
851 	    s = (unsigned char *)memchr((void*)big, *little, bigend-big);
852             if (s)
853                 return (char *)s;
854 	    if (tail)
855 		return (char *) bigend;
856 	    return NULL;
857 
858     case 2:
859 	if (tail && !multiline) {
860             /* a littlestr with SvTAIL must be of the form "X\n" (where X
861              * is a single char). It is anchored, and can only match
862              * "....X\n"  or  "....X" */
863             if (bigend[-2] == *little && bigend[-1] == '\n')
864 		return (char*)bigend - 2;
865 	    if (bigend[-1] == *little)
866 		return (char*)bigend - 1;
867 	    return NULL;
868 	}
869 
870 	{
871             /* memchr() is likely to be very fast, possibly using whatever
872              * hardware support is available, such as checking a whole
873              * cache line in one instruction.
874              * So for a 2 char pattern, calling memchr() is likely to be
875              * faster than running FBM, or rolling our own. The previous
876              * version of this code was roll-your-own which typically
877              * only needed to read every 2nd char, which was good back in
878              * the day, but no longer.
879              */
880 	    unsigned char c1 = little[0];
881 	    unsigned char c2 = little[1];
882 
883             /* *** for all this case, bigend points to the last char,
884              * not the trailing \0: this makes the conditions slightly
885              * simpler */
886             bigend--;
887 	    s = big;
888             if (c1 != c2) {
889                 while (s < bigend) {
890                     /* do a quick test for c1 before calling memchr();
891                      * this avoids the expensive fn call overhead when
892                      * there are lots of c1's */
893                     if (LIKELY(*s != c1)) {
894                         s++;
895                         s = (unsigned char *)memchr((void*)s, c1, bigend - s);
896                         if (!s)
897                             break;
898                     }
899                     if (s[1] == c2)
900                         return (char*)s;
901 
902                     /* failed; try searching for c2 this time; that way
903                      * we don't go pathologically slow when the string
904                      * consists mostly of c1's or vice versa.
905                      */
906                     s += 2;
907                     if (s > bigend)
908                         break;
909                     s = (unsigned char *)memchr((void*)s, c2, bigend - s + 1);
910                     if (!s)
911                         break;
912                     if (s[-1] == c1)
913                         return (char*)s - 1;
914                 }
915             }
916             else {
917                 /* c1, c2 the same */
918                 while (s < bigend) {
919                     if (s[0] == c1) {
920                       got_1char:
921                         if (s[1] == c1)
922                             return (char*)s;
923                         s += 2;
924                     }
925                     else {
926                         s++;
927                         s = (unsigned char *)memchr((void*)s, c1, bigend - s);
928                         if (!s || s >= bigend)
929                             break;
930                         goto got_1char;
931                     }
932                 }
933             }
934 
935             /* failed to find 2 chars; try anchored match at end without
936              * the \n */
937             if (tail && bigend[0] == little[0])
938                 return (char *)bigend;
939             return NULL;
940         }
941 
942     default:
943 	break; /* Only lengths 0 1 and 2 have special-case code.  */
944     }
945 
946     if (tail && !multiline) {	/* tail anchored? */
947 	s = bigend - littlelen;
948 	if (s >= big && bigend[-1] == '\n' && *s == *little
949 	    /* Automatically of length > 2 */
950 	    && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
951 	{
952 	    return (char*)s;		/* how sweet it is */
953 	}
954 	if (s[1] == *little
955 	    && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
956 	{
957 	    return (char*)s + 1;	/* how sweet it is */
958 	}
959 	return NULL;
960     }
961 
962     if (!valid) {
963         /* not compiled; use Perl_ninstr() instead */
964 	char * const b = ninstr((char*)big,(char*)bigend,
965 			 (char*)little, (char*)little + littlelen);
966 
967         assert(!tail); /* valid => FBM; tail only set on SvVALID SVs */
968 	return b;
969     }
970 
971     /* Do actual FBM.  */
972     if (littlelen > (STRLEN)(bigend - big))
973 	return NULL;
974 
975     {
976 	const MAGIC *const mg = mg_find(littlestr, PERL_MAGIC_bm);
977 	const unsigned char *oldlittle;
978 
979 	assert(mg);
980 
981 	--littlelen;			/* Last char found by table lookup */
982 
983 	s = big + littlelen;
984 	little += littlelen;		/* last char */
985 	oldlittle = little;
986 	if (s < bigend) {
987 	    const unsigned char * const table = (const unsigned char *) mg->mg_ptr;
988             const unsigned char lastc = *little;
989 	    I32 tmp;
990 
991 	  top2:
992 	    if ((tmp = table[*s])) {
993                 /* *s != lastc; earliest position it could match now is
994                  * tmp slots further on */
995 		if ((s += tmp) >= bigend)
996                     goto check_end;
997                 if (LIKELY(*s != lastc)) {
998                     s++;
999                     s = (unsigned char *)memchr((void*)s, lastc, bigend - s);
1000                     if (!s) {
1001                         s = bigend;
1002                         goto check_end;
1003                     }
1004                     goto top2;
1005                 }
1006 	    }
1007 
1008 
1009             /* hand-rolled strncmp(): less expensive than calling the
1010              * real function (maybe???) */
1011 	    {
1012 		unsigned char * const olds = s;
1013 
1014 		tmp = littlelen;
1015 
1016 		while (tmp--) {
1017 		    if (*--s == *--little)
1018 			continue;
1019 		    s = olds + 1;	/* here we pay the price for failure */
1020 		    little = oldlittle;
1021 		    if (s < bigend)	/* fake up continue to outer loop */
1022 			goto top2;
1023 		    goto check_end;
1024 		}
1025 		return (char *)s;
1026 	    }
1027 	}
1028       check_end:
1029 	if ( s == bigend
1030 	     && tail
1031 	     && memEQ((char *)(bigend - littlelen),
1032 		      (char *)(oldlittle - littlelen), littlelen) )
1033 	    return (char*)bigend - littlelen;
1034 	return NULL;
1035     }
1036 }
1037 
1038 /* copy a string to a safe spot */
1039 
1040 /*
1041 =head1 Memory Management
1042 
1043 =for apidoc savepv
1044 
1045 Perl's version of C<strdup()>.  Returns a pointer to a newly allocated
1046 string which is a duplicate of C<pv>.  The size of the string is
1047 determined by C<strlen()>, which means it may not contain embedded C<NUL>
1048 characters and must have a trailing C<NUL>.  The memory allocated for the new
1049 string can be freed with the C<Safefree()> function.
1050 
1051 On some platforms, Windows for example, all allocated memory owned by a thread
1052 is deallocated when that thread ends.  So if you need that not to happen, you
1053 need to use the shared memory functions, such as C<L</savesharedpv>>.
1054 
1055 =cut
1056 */
1057 
1058 char *
1059 Perl_savepv(pTHX_ const char *pv)
1060 {
1061     PERL_UNUSED_CONTEXT;
1062     if (!pv)
1063 	return NULL;
1064     else {
1065 	char *newaddr;
1066 	const STRLEN pvlen = strlen(pv)+1;
1067 	Newx(newaddr, pvlen, char);
1068 	return (char*)memcpy(newaddr, pv, pvlen);
1069     }
1070 }
1071 
1072 /* same thing but with a known length */
1073 
1074 /*
1075 =for apidoc savepvn
1076 
1077 Perl's version of what C<strndup()> would be if it existed.  Returns a
1078 pointer to a newly allocated string which is a duplicate of the first
1079 C<len> bytes from C<pv>, plus a trailing
1080 C<NUL> byte.  The memory allocated for
1081 the new string can be freed with the C<Safefree()> function.
1082 
1083 On some platforms, Windows for example, all allocated memory owned by a thread
1084 is deallocated when that thread ends.  So if you need that not to happen, you
1085 need to use the shared memory functions, such as C<L</savesharedpvn>>.
1086 
1087 =cut
1088 */
1089 
1090 char *
1091 Perl_savepvn(pTHX_ const char *pv, I32 len)
1092 {
1093     char *newaddr;
1094     PERL_UNUSED_CONTEXT;
1095 
1096     assert(len >= 0);
1097 
1098     Newx(newaddr,len+1,char);
1099     /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
1100     if (pv) {
1101 	/* might not be null terminated */
1102     	newaddr[len] = '\0';
1103     	return (char *) CopyD(pv,newaddr,len,char);
1104     }
1105     else {
1106 	return (char *) ZeroD(newaddr,len+1,char);
1107     }
1108 }
1109 
1110 /*
1111 =for apidoc savesharedpv
1112 
1113 A version of C<savepv()> which allocates the duplicate string in memory
1114 which is shared between threads.
1115 
1116 =cut
1117 */
1118 char *
1119 Perl_savesharedpv(pTHX_ const char *pv)
1120 {
1121     char *newaddr;
1122     STRLEN pvlen;
1123 
1124     PERL_UNUSED_CONTEXT;
1125 
1126     if (!pv)
1127 	return NULL;
1128 
1129     pvlen = strlen(pv)+1;
1130     newaddr = (char*)PerlMemShared_malloc(pvlen);
1131     if (!newaddr) {
1132 	croak_no_mem();
1133     }
1134     return (char*)memcpy(newaddr, pv, pvlen);
1135 }
1136 
1137 /*
1138 =for apidoc savesharedpvn
1139 
1140 A version of C<savepvn()> which allocates the duplicate string in memory
1141 which is shared between threads.  (With the specific difference that a C<NULL>
1142 pointer is not acceptable)
1143 
1144 =cut
1145 */
1146 char *
1147 Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
1148 {
1149     char *const newaddr = (char*)PerlMemShared_malloc(len + 1);
1150 
1151     PERL_UNUSED_CONTEXT;
1152     /* PERL_ARGS_ASSERT_SAVESHAREDPVN; */
1153 
1154     if (!newaddr) {
1155 	croak_no_mem();
1156     }
1157     newaddr[len] = '\0';
1158     return (char*)memcpy(newaddr, pv, len);
1159 }
1160 
1161 /*
1162 =for apidoc savesvpv
1163 
1164 A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
1165 the passed in SV using C<SvPV()>
1166 
1167 On some platforms, Windows for example, all allocated memory owned by a thread
1168 is deallocated when that thread ends.  So if you need that not to happen, you
1169 need to use the shared memory functions, such as C<L</savesharedsvpv>>.
1170 
1171 =cut
1172 */
1173 
1174 char *
1175 Perl_savesvpv(pTHX_ SV *sv)
1176 {
1177     STRLEN len;
1178     const char * const pv = SvPV_const(sv, len);
1179     char *newaddr;
1180 
1181     PERL_ARGS_ASSERT_SAVESVPV;
1182 
1183     ++len;
1184     Newx(newaddr,len,char);
1185     return (char *) CopyD(pv,newaddr,len,char);
1186 }
1187 
1188 /*
1189 =for apidoc savesharedsvpv
1190 
1191 A version of C<savesharedpv()> which allocates the duplicate string in
1192 memory which is shared between threads.
1193 
1194 =cut
1195 */
1196 
1197 char *
1198 Perl_savesharedsvpv(pTHX_ SV *sv)
1199 {
1200     STRLEN len;
1201     const char * const pv = SvPV_const(sv, len);
1202 
1203     PERL_ARGS_ASSERT_SAVESHAREDSVPV;
1204 
1205     return savesharedpvn(pv, len);
1206 }
1207 
1208 /* the SV for Perl_form() and mess() is not kept in an arena */
1209 
1210 STATIC SV *
1211 S_mess_alloc(pTHX)
1212 {
1213     SV *sv;
1214     XPVMG *any;
1215 
1216     if (PL_phase != PERL_PHASE_DESTRUCT)
1217 	return newSVpvs_flags("", SVs_TEMP);
1218 
1219     if (PL_mess_sv)
1220 	return PL_mess_sv;
1221 
1222     /* Create as PVMG now, to avoid any upgrading later */
1223     Newx(sv, 1, SV);
1224     Newxz(any, 1, XPVMG);
1225     SvFLAGS(sv) = SVt_PVMG;
1226     SvANY(sv) = (void*)any;
1227     SvPV_set(sv, NULL);
1228     SvREFCNT(sv) = 1 << 30; /* practically infinite */
1229     PL_mess_sv = sv;
1230     return sv;
1231 }
1232 
1233 #if defined(PERL_IMPLICIT_CONTEXT)
1234 char *
1235 Perl_form_nocontext(const char* pat, ...)
1236 {
1237     dTHX;
1238     char *retval;
1239     va_list args;
1240     PERL_ARGS_ASSERT_FORM_NOCONTEXT;
1241     va_start(args, pat);
1242     retval = vform(pat, &args);
1243     va_end(args);
1244     return retval;
1245 }
1246 #endif /* PERL_IMPLICIT_CONTEXT */
1247 
1248 /*
1249 =head1 Miscellaneous Functions
1250 =for apidoc form
1251 
1252 Takes a sprintf-style format pattern and conventional
1253 (non-SV) arguments and returns the formatted string.
1254 
1255     (char *) Perl_form(pTHX_ const char* pat, ...)
1256 
1257 can be used any place a string (char *) is required:
1258 
1259     char * s = Perl_form("%d.%d",major,minor);
1260 
1261 Uses a single private buffer so if you want to format several strings you
1262 must explicitly copy the earlier strings away (and free the copies when you
1263 are done).
1264 
1265 =cut
1266 */
1267 
1268 char *
1269 Perl_form(pTHX_ const char* pat, ...)
1270 {
1271     char *retval;
1272     va_list args;
1273     PERL_ARGS_ASSERT_FORM;
1274     va_start(args, pat);
1275     retval = vform(pat, &args);
1276     va_end(args);
1277     return retval;
1278 }
1279 
1280 char *
1281 Perl_vform(pTHX_ const char *pat, va_list *args)
1282 {
1283     SV * const sv = mess_alloc();
1284     PERL_ARGS_ASSERT_VFORM;
1285     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1286     return SvPVX(sv);
1287 }
1288 
1289 /*
1290 =for apidoc Am|SV *|mess|const char *pat|...
1291 
1292 Take a sprintf-style format pattern and argument list.  These are used to
1293 generate a string message.  If the message does not end with a newline,
1294 then it will be extended with some indication of the current location
1295 in the code, as described for L</mess_sv>.
1296 
1297 Normally, the resulting message is returned in a new mortal SV.
1298 During global destruction a single SV may be shared between uses of
1299 this function.
1300 
1301 =cut
1302 */
1303 
1304 #if defined(PERL_IMPLICIT_CONTEXT)
1305 SV *
1306 Perl_mess_nocontext(const char *pat, ...)
1307 {
1308     dTHX;
1309     SV *retval;
1310     va_list args;
1311     PERL_ARGS_ASSERT_MESS_NOCONTEXT;
1312     va_start(args, pat);
1313     retval = vmess(pat, &args);
1314     va_end(args);
1315     return retval;
1316 }
1317 #endif /* PERL_IMPLICIT_CONTEXT */
1318 
1319 SV *
1320 Perl_mess(pTHX_ const char *pat, ...)
1321 {
1322     SV *retval;
1323     va_list args;
1324     PERL_ARGS_ASSERT_MESS;
1325     va_start(args, pat);
1326     retval = vmess(pat, &args);
1327     va_end(args);
1328     return retval;
1329 }
1330 
1331 const COP*
1332 Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop,
1333 		       bool opnext)
1334 {
1335     /* Look for curop starting from o.  cop is the last COP we've seen. */
1336     /* opnext means that curop is actually the ->op_next of the op we are
1337        seeking. */
1338 
1339     PERL_ARGS_ASSERT_CLOSEST_COP;
1340 
1341     if (!o || !curop || (
1342 	opnext ? o->op_next == curop && o->op_type != OP_SCOPE : o == curop
1343     ))
1344 	return cop;
1345 
1346     if (o->op_flags & OPf_KIDS) {
1347 	const OP *kid;
1348 	for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
1349 	    const COP *new_cop;
1350 
1351 	    /* If the OP_NEXTSTATE has been optimised away we can still use it
1352 	     * the get the file and line number. */
1353 
1354 	    if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
1355 		cop = (const COP *)kid;
1356 
1357 	    /* Keep searching, and return when we've found something. */
1358 
1359 	    new_cop = closest_cop(cop, kid, curop, opnext);
1360 	    if (new_cop)
1361 		return new_cop;
1362 	}
1363     }
1364 
1365     /* Nothing found. */
1366 
1367     return NULL;
1368 }
1369 
1370 /*
1371 =for apidoc Am|SV *|mess_sv|SV *basemsg|bool consume
1372 
1373 Expands a message, intended for the user, to include an indication of
1374 the current location in the code, if the message does not already appear
1375 to be complete.
1376 
1377 C<basemsg> is the initial message or object.  If it is a reference, it
1378 will be used as-is and will be the result of this function.  Otherwise it
1379 is used as a string, and if it already ends with a newline, it is taken
1380 to be complete, and the result of this function will be the same string.
1381 If the message does not end with a newline, then a segment such as C<at
1382 foo.pl line 37> will be appended, and possibly other clauses indicating
1383 the current state of execution.  The resulting message will end with a
1384 dot and a newline.
1385 
1386 Normally, the resulting message is returned in a new mortal SV.
1387 During global destruction a single SV may be shared between uses of this
1388 function.  If C<consume> is true, then the function is permitted (but not
1389 required) to modify and return C<basemsg> instead of allocating a new SV.
1390 
1391 =cut
1392 */
1393 
1394 SV *
1395 Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
1396 {
1397     SV *sv;
1398 
1399 #if defined(USE_C_BACKTRACE) && defined(USE_C_BACKTRACE_ON_ERROR)
1400     {
1401         char *ws;
1402         UV wi;
1403         /* The PERL_C_BACKTRACE_ON_WARN must be an integer of one or more. */
1404         if ((ws = PerlEnv_getenv("PERL_C_BACKTRACE_ON_ERROR"))
1405             && grok_atoUV(ws, &wi, NULL)
1406             && wi <= PERL_INT_MAX
1407         ) {
1408             Perl_dump_c_backtrace(aTHX_ Perl_debug_log, (int)wi, 1);
1409         }
1410     }
1411 #endif
1412 
1413     PERL_ARGS_ASSERT_MESS_SV;
1414 
1415     if (SvROK(basemsg)) {
1416 	if (consume) {
1417 	    sv = basemsg;
1418 	}
1419 	else {
1420 	    sv = mess_alloc();
1421 	    sv_setsv(sv, basemsg);
1422 	}
1423 	return sv;
1424     }
1425 
1426     if (SvPOK(basemsg) && consume) {
1427 	sv = basemsg;
1428     }
1429     else {
1430 	sv = mess_alloc();
1431 	sv_copypv(sv, basemsg);
1432     }
1433 
1434     if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
1435 	/*
1436 	 * Try and find the file and line for PL_op.  This will usually be
1437 	 * PL_curcop, but it might be a cop that has been optimised away.  We
1438 	 * can try to find such a cop by searching through the optree starting
1439 	 * from the sibling of PL_curcop.
1440 	 */
1441 
1442         if (PL_curcop) {
1443             const COP *cop =
1444                 closest_cop(PL_curcop, OpSIBLING(PL_curcop), PL_op, FALSE);
1445             if (!cop)
1446                 cop = PL_curcop;
1447 
1448             if (CopLINE(cop))
1449                 Perl_sv_catpvf(aTHX_ sv, " at %s line %" IVdf,
1450                                 OutCopFILE(cop), (IV)CopLINE(cop));
1451         }
1452 
1453 	/* Seems that GvIO() can be untrustworthy during global destruction. */
1454 	if (GvIO(PL_last_in_gv) && (SvTYPE(GvIOp(PL_last_in_gv)) == SVt_PVIO)
1455 		&& IoLINES(GvIOp(PL_last_in_gv)))
1456 	{
1457 	    STRLEN l;
1458 	    const bool line_mode = (RsSIMPLE(PL_rs) &&
1459 				   *SvPV_const(PL_rs,l) == '\n' && l == 1);
1460 	    Perl_sv_catpvf(aTHX_ sv, ", <%" SVf "> %s %" IVdf,
1461 			   SVfARG(PL_last_in_gv == PL_argvgv
1462                                  ? &PL_sv_no
1463                                  : sv_2mortal(newSVhek(GvNAME_HEK(PL_last_in_gv)))),
1464 			   line_mode ? "line" : "chunk",
1465 			   (IV)IoLINES(GvIOp(PL_last_in_gv)));
1466 	}
1467 	if (PL_phase == PERL_PHASE_DESTRUCT)
1468 	    sv_catpvs(sv, " during global destruction");
1469 	sv_catpvs(sv, ".\n");
1470     }
1471     return sv;
1472 }
1473 
1474 /*
1475 =for apidoc Am|SV *|vmess|const char *pat|va_list *args
1476 
1477 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1478 argument list, respectively.  These are used to generate a string message.  If
1479 the
1480 message does not end with a newline, then it will be extended with
1481 some indication of the current location in the code, as described for
1482 L</mess_sv>.
1483 
1484 Normally, the resulting message is returned in a new mortal SV.
1485 During global destruction a single SV may be shared between uses of
1486 this function.
1487 
1488 =cut
1489 */
1490 
1491 SV *
1492 Perl_vmess(pTHX_ const char *pat, va_list *args)
1493 {
1494     SV * const sv = mess_alloc();
1495 
1496     PERL_ARGS_ASSERT_VMESS;
1497 
1498     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1499     return mess_sv(sv, 1);
1500 }
1501 
1502 void
1503 Perl_write_to_stderr(pTHX_ SV* msv)
1504 {
1505     IO *io;
1506     MAGIC *mg;
1507 
1508     PERL_ARGS_ASSERT_WRITE_TO_STDERR;
1509 
1510     if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1511 	&& (io = GvIO(PL_stderrgv))
1512 	&& (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
1513 	Perl_magic_methcall(aTHX_ MUTABLE_SV(io), mg, SV_CONST(PRINT),
1514 			    G_SCALAR | G_DISCARD | G_WRITING_TO_STDERR, 1, msv);
1515     else {
1516 	PerlIO * const serr = Perl_error_log;
1517 
1518 	do_print(msv, serr);
1519 	(void)PerlIO_flush(serr);
1520     }
1521 }
1522 
1523 /*
1524 =head1 Warning and Dieing
1525 */
1526 
1527 /* Common code used in dieing and warning */
1528 
1529 STATIC SV *
1530 S_with_queued_errors(pTHX_ SV *ex)
1531 {
1532     PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS;
1533     if (PL_errors && SvCUR(PL_errors) && !SvROK(ex)) {
1534 	sv_catsv(PL_errors, ex);
1535 	ex = sv_mortalcopy(PL_errors);
1536 	SvCUR_set(PL_errors, 0);
1537     }
1538     return ex;
1539 }
1540 
1541 STATIC bool
1542 S_invoke_exception_hook(pTHX_ SV *ex, bool warn)
1543 {
1544     dVAR;
1545     HV *stash;
1546     GV *gv;
1547     CV *cv;
1548     SV **const hook = warn ? &PL_warnhook : &PL_diehook;
1549     /* sv_2cv might call Perl_croak() or Perl_warner() */
1550     SV * const oldhook = *hook;
1551 
1552     if (!oldhook || oldhook == PERL_WARNHOOK_FATAL)
1553 	return FALSE;
1554 
1555     ENTER;
1556     SAVESPTR(*hook);
1557     *hook = NULL;
1558     cv = sv_2cv(oldhook, &stash, &gv, 0);
1559     LEAVE;
1560     if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1561 	dSP;
1562 	SV *exarg;
1563 
1564 	ENTER;
1565 	save_re_context();
1566 	if (warn) {
1567 	    SAVESPTR(*hook);
1568 	    *hook = NULL;
1569 	}
1570 	exarg = newSVsv(ex);
1571 	SvREADONLY_on(exarg);
1572 	SAVEFREESV(exarg);
1573 
1574 	PUSHSTACKi(warn ? PERLSI_WARNHOOK : PERLSI_DIEHOOK);
1575 	PUSHMARK(SP);
1576 	XPUSHs(exarg);
1577 	PUTBACK;
1578 	call_sv(MUTABLE_SV(cv), G_DISCARD);
1579 	POPSTACK;
1580 	LEAVE;
1581 	return TRUE;
1582     }
1583     return FALSE;
1584 }
1585 
1586 /*
1587 =for apidoc Am|OP *|die_sv|SV *baseex
1588 
1589 Behaves the same as L</croak_sv>, except for the return type.
1590 It should be used only where the C<OP *> return type is required.
1591 The function never actually returns.
1592 
1593 =cut
1594 */
1595 
1596 /* silence __declspec(noreturn) warnings */
1597 MSVC_DIAG_IGNORE(4646 4645)
1598 OP *
1599 Perl_die_sv(pTHX_ SV *baseex)
1600 {
1601     PERL_ARGS_ASSERT_DIE_SV;
1602     croak_sv(baseex);
1603     /* NOTREACHED */
1604     NORETURN_FUNCTION_END;
1605 }
1606 MSVC_DIAG_RESTORE
1607 
1608 /*
1609 =for apidoc Am|OP *|die|const char *pat|...
1610 
1611 Behaves the same as L</croak>, except for the return type.
1612 It should be used only where the C<OP *> return type is required.
1613 The function never actually returns.
1614 
1615 =cut
1616 */
1617 
1618 #if defined(PERL_IMPLICIT_CONTEXT)
1619 
1620 /* silence __declspec(noreturn) warnings */
1621 MSVC_DIAG_IGNORE(4646 4645)
1622 OP *
1623 Perl_die_nocontext(const char* pat, ...)
1624 {
1625     dTHX;
1626     va_list args;
1627     va_start(args, pat);
1628     vcroak(pat, &args);
1629     NOT_REACHED; /* NOTREACHED */
1630     va_end(args);
1631     NORETURN_FUNCTION_END;
1632 }
1633 MSVC_DIAG_RESTORE
1634 
1635 #endif /* PERL_IMPLICIT_CONTEXT */
1636 
1637 /* silence __declspec(noreturn) warnings */
1638 MSVC_DIAG_IGNORE(4646 4645)
1639 OP *
1640 Perl_die(pTHX_ const char* pat, ...)
1641 {
1642     va_list args;
1643     va_start(args, pat);
1644     vcroak(pat, &args);
1645     NOT_REACHED; /* NOTREACHED */
1646     va_end(args);
1647     NORETURN_FUNCTION_END;
1648 }
1649 MSVC_DIAG_RESTORE
1650 
1651 /*
1652 =for apidoc Am|void|croak_sv|SV *baseex
1653 
1654 This is an XS interface to Perl's C<die> function.
1655 
1656 C<baseex> is the error message or object.  If it is a reference, it
1657 will be used as-is.  Otherwise it is used as a string, and if it does
1658 not end with a newline then it will be extended with some indication of
1659 the current location in the code, as described for L</mess_sv>.
1660 
1661 The error message or object will be used as an exception, by default
1662 returning control to the nearest enclosing C<eval>, but subject to
1663 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak_sv>
1664 function never returns normally.
1665 
1666 To die with a simple string message, the L</croak> function may be
1667 more convenient.
1668 
1669 =cut
1670 */
1671 
1672 void
1673 Perl_croak_sv(pTHX_ SV *baseex)
1674 {
1675     SV *ex = with_queued_errors(mess_sv(baseex, 0));
1676     PERL_ARGS_ASSERT_CROAK_SV;
1677     invoke_exception_hook(ex, FALSE);
1678     die_unwind(ex);
1679 }
1680 
1681 /*
1682 =for apidoc Am|void|vcroak|const char *pat|va_list *args
1683 
1684 This is an XS interface to Perl's C<die> function.
1685 
1686 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1687 argument list.  These are used to generate a string message.  If the
1688 message does not end with a newline, then it will be extended with
1689 some indication of the current location in the code, as described for
1690 L</mess_sv>.
1691 
1692 The error message will be used as an exception, by default
1693 returning control to the nearest enclosing C<eval>, but subject to
1694 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1695 function never returns normally.
1696 
1697 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1698 (C<$@>) will be used as an error message or object instead of building an
1699 error message from arguments.  If you want to throw a non-string object,
1700 or build an error message in an SV yourself, it is preferable to use
1701 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1702 
1703 =cut
1704 */
1705 
1706 void
1707 Perl_vcroak(pTHX_ const char* pat, va_list *args)
1708 {
1709     SV *ex = with_queued_errors(pat ? vmess(pat, args) : mess_sv(ERRSV, 0));
1710     invoke_exception_hook(ex, FALSE);
1711     die_unwind(ex);
1712 }
1713 
1714 /*
1715 =for apidoc Am|void|croak|const char *pat|...
1716 
1717 This is an XS interface to Perl's C<die> function.
1718 
1719 Take a sprintf-style format pattern and argument list.  These are used to
1720 generate a string message.  If the message does not end with a newline,
1721 then it will be extended with some indication of the current location
1722 in the code, as described for L</mess_sv>.
1723 
1724 The error message will be used as an exception, by default
1725 returning control to the nearest enclosing C<eval>, but subject to
1726 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1727 function never returns normally.
1728 
1729 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1730 (C<$@>) will be used as an error message or object instead of building an
1731 error message from arguments.  If you want to throw a non-string object,
1732 or build an error message in an SV yourself, it is preferable to use
1733 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1734 
1735 =cut
1736 */
1737 
1738 #if defined(PERL_IMPLICIT_CONTEXT)
1739 void
1740 Perl_croak_nocontext(const char *pat, ...)
1741 {
1742     dTHX;
1743     va_list args;
1744     va_start(args, pat);
1745     vcroak(pat, &args);
1746     NOT_REACHED; /* NOTREACHED */
1747     va_end(args);
1748 }
1749 #endif /* PERL_IMPLICIT_CONTEXT */
1750 
1751 void
1752 Perl_croak(pTHX_ const char *pat, ...)
1753 {
1754     va_list args;
1755     va_start(args, pat);
1756     vcroak(pat, &args);
1757     NOT_REACHED; /* NOTREACHED */
1758     va_end(args);
1759 }
1760 
1761 /*
1762 =for apidoc Am|void|croak_no_modify
1763 
1764 Exactly equivalent to C<Perl_croak(aTHX_ "%s", PL_no_modify)>, but generates
1765 terser object code than using C<Perl_croak>.  Less code used on exception code
1766 paths reduces CPU cache pressure.
1767 
1768 =cut
1769 */
1770 
1771 void
1772 Perl_croak_no_modify(void)
1773 {
1774     Perl_croak_nocontext( "%s", PL_no_modify);
1775 }
1776 
1777 /* does not return, used in util.c perlio.c and win32.c
1778    This is typically called when malloc returns NULL.
1779 */
1780 void
1781 Perl_croak_no_mem(void)
1782 {
1783     dTHX;
1784 
1785     int fd = PerlIO_fileno(Perl_error_log);
1786     if (fd < 0)
1787         SETERRNO(EBADF,RMS_IFI);
1788     else {
1789         /* Can't use PerlIO to write as it allocates memory */
1790         PERL_UNUSED_RESULT(PerlLIO_write(fd, PL_no_mem, sizeof(PL_no_mem)-1));
1791     }
1792     my_exit(1);
1793 }
1794 
1795 /* does not return, used only in POPSTACK */
1796 void
1797 Perl_croak_popstack(void)
1798 {
1799     dTHX;
1800     PerlIO_printf(Perl_error_log, "panic: POPSTACK\n");
1801     my_exit(1);
1802 }
1803 
1804 /*
1805 =for apidoc Am|void|warn_sv|SV *baseex
1806 
1807 This is an XS interface to Perl's C<warn> function.
1808 
1809 C<baseex> is the error message or object.  If it is a reference, it
1810 will be used as-is.  Otherwise it is used as a string, and if it does
1811 not end with a newline then it will be extended with some indication of
1812 the current location in the code, as described for L</mess_sv>.
1813 
1814 The error message or object will by default be written to standard error,
1815 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1816 
1817 To warn with a simple string message, the L</warn> function may be
1818 more convenient.
1819 
1820 =cut
1821 */
1822 
1823 void
1824 Perl_warn_sv(pTHX_ SV *baseex)
1825 {
1826     SV *ex = mess_sv(baseex, 0);
1827     PERL_ARGS_ASSERT_WARN_SV;
1828     if (!invoke_exception_hook(ex, TRUE))
1829 	write_to_stderr(ex);
1830 }
1831 
1832 /*
1833 =for apidoc Am|void|vwarn|const char *pat|va_list *args
1834 
1835 This is an XS interface to Perl's C<warn> function.
1836 
1837 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1838 argument list.  These are used to generate a string message.  If the
1839 message does not end with a newline, then it will be extended with
1840 some indication of the current location in the code, as described for
1841 L</mess_sv>.
1842 
1843 The error message or object will by default be written to standard error,
1844 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1845 
1846 Unlike with L</vcroak>, C<pat> is not permitted to be null.
1847 
1848 =cut
1849 */
1850 
1851 void
1852 Perl_vwarn(pTHX_ const char* pat, va_list *args)
1853 {
1854     SV *ex = vmess(pat, args);
1855     PERL_ARGS_ASSERT_VWARN;
1856     if (!invoke_exception_hook(ex, TRUE))
1857 	write_to_stderr(ex);
1858 }
1859 
1860 /*
1861 =for apidoc Am|void|warn|const char *pat|...
1862 
1863 This is an XS interface to Perl's C<warn> function.
1864 
1865 Take a sprintf-style format pattern and argument list.  These are used to
1866 generate a string message.  If the message does not end with a newline,
1867 then it will be extended with some indication of the current location
1868 in the code, as described for L</mess_sv>.
1869 
1870 The error message or object will by default be written to standard error,
1871 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1872 
1873 Unlike with L</croak>, C<pat> is not permitted to be null.
1874 
1875 =cut
1876 */
1877 
1878 #if defined(PERL_IMPLICIT_CONTEXT)
1879 void
1880 Perl_warn_nocontext(const char *pat, ...)
1881 {
1882     dTHX;
1883     va_list args;
1884     PERL_ARGS_ASSERT_WARN_NOCONTEXT;
1885     va_start(args, pat);
1886     vwarn(pat, &args);
1887     va_end(args);
1888 }
1889 #endif /* PERL_IMPLICIT_CONTEXT */
1890 
1891 void
1892 Perl_warn(pTHX_ const char *pat, ...)
1893 {
1894     va_list args;
1895     PERL_ARGS_ASSERT_WARN;
1896     va_start(args, pat);
1897     vwarn(pat, &args);
1898     va_end(args);
1899 }
1900 
1901 #if defined(PERL_IMPLICIT_CONTEXT)
1902 void
1903 Perl_warner_nocontext(U32 err, const char *pat, ...)
1904 {
1905     dTHX;
1906     va_list args;
1907     PERL_ARGS_ASSERT_WARNER_NOCONTEXT;
1908     va_start(args, pat);
1909     vwarner(err, pat, &args);
1910     va_end(args);
1911 }
1912 #endif /* PERL_IMPLICIT_CONTEXT */
1913 
1914 void
1915 Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
1916 {
1917     PERL_ARGS_ASSERT_CK_WARNER_D;
1918 
1919     if (Perl_ckwarn_d(aTHX_ err)) {
1920 	va_list args;
1921 	va_start(args, pat);
1922 	vwarner(err, pat, &args);
1923 	va_end(args);
1924     }
1925 }
1926 
1927 void
1928 Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
1929 {
1930     PERL_ARGS_ASSERT_CK_WARNER;
1931 
1932     if (Perl_ckwarn(aTHX_ err)) {
1933 	va_list args;
1934 	va_start(args, pat);
1935 	vwarner(err, pat, &args);
1936 	va_end(args);
1937     }
1938 }
1939 
1940 void
1941 Perl_warner(pTHX_ U32  err, const char* pat,...)
1942 {
1943     va_list args;
1944     PERL_ARGS_ASSERT_WARNER;
1945     va_start(args, pat);
1946     vwarner(err, pat, &args);
1947     va_end(args);
1948 }
1949 
1950 void
1951 Perl_vwarner(pTHX_ U32  err, const char* pat, va_list* args)
1952 {
1953     dVAR;
1954     PERL_ARGS_ASSERT_VWARNER;
1955     if (
1956         (PL_warnhook == PERL_WARNHOOK_FATAL || ckDEAD(err)) &&
1957         !(PL_in_eval & EVAL_KEEPERR)
1958     ) {
1959 	SV * const msv = vmess(pat, args);
1960 
1961 	if (PL_parser && PL_parser->error_count) {
1962 	    qerror(msv);
1963 	}
1964 	else {
1965 	    invoke_exception_hook(msv, FALSE);
1966 	    die_unwind(msv);
1967 	}
1968     }
1969     else {
1970 	Perl_vwarn(aTHX_ pat, args);
1971     }
1972 }
1973 
1974 /* implements the ckWARN? macros */
1975 
1976 bool
1977 Perl_ckwarn(pTHX_ U32 w)
1978 {
1979     /* If lexical warnings have not been set, use $^W.  */
1980     if (isLEXWARN_off)
1981 	return PL_dowarn & G_WARN_ON;
1982 
1983     return ckwarn_common(w);
1984 }
1985 
1986 /* implements the ckWARN?_d macro */
1987 
1988 bool
1989 Perl_ckwarn_d(pTHX_ U32 w)
1990 {
1991     /* If lexical warnings have not been set then default classes warn.  */
1992     if (isLEXWARN_off)
1993 	return TRUE;
1994 
1995     return ckwarn_common(w);
1996 }
1997 
1998 static bool
1999 S_ckwarn_common(pTHX_ U32 w)
2000 {
2001     if (PL_curcop->cop_warnings == pWARN_ALL)
2002 	return TRUE;
2003 
2004     if (PL_curcop->cop_warnings == pWARN_NONE)
2005 	return FALSE;
2006 
2007     /* Check the assumption that at least the first slot is non-zero.  */
2008     assert(unpackWARN1(w));
2009 
2010     /* Check the assumption that it is valid to stop as soon as a zero slot is
2011        seen.  */
2012     if (!unpackWARN2(w)) {
2013 	assert(!unpackWARN3(w));
2014 	assert(!unpackWARN4(w));
2015     } else if (!unpackWARN3(w)) {
2016 	assert(!unpackWARN4(w));
2017     }
2018 
2019     /* Right, dealt with all the special cases, which are implemented as non-
2020        pointers, so there is a pointer to a real warnings mask.  */
2021     do {
2022 	if (isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w)))
2023 	    return TRUE;
2024     } while (w >>= WARNshift);
2025 
2026     return FALSE;
2027 }
2028 
2029 /* Set buffer=NULL to get a new one.  */
2030 STRLEN *
2031 Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits,
2032 			   STRLEN size) {
2033     const MEM_SIZE len_wanted =
2034 	sizeof(STRLEN) + (size > WARNsize ? size : WARNsize);
2035     PERL_UNUSED_CONTEXT;
2036     PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD;
2037 
2038     buffer = (STRLEN*)
2039 	(specialWARN(buffer) ?
2040 	 PerlMemShared_malloc(len_wanted) :
2041 	 PerlMemShared_realloc(buffer, len_wanted));
2042     buffer[0] = size;
2043     Copy(bits, (buffer + 1), size, char);
2044     if (size < WARNsize)
2045 	Zero((char *)(buffer + 1) + size, WARNsize - size, char);
2046     return buffer;
2047 }
2048 
2049 /* since we've already done strlen() for both nam and val
2050  * we can use that info to make things faster than
2051  * sprintf(s, "%s=%s", nam, val)
2052  */
2053 #define my_setenv_format(s, nam, nlen, val, vlen) \
2054    Copy(nam, s, nlen, char); \
2055    *(s+nlen) = '='; \
2056    Copy(val, s+(nlen+1), vlen, char); \
2057    *(s+(nlen+1+vlen)) = '\0'
2058 
2059 
2060 
2061 #ifdef USE_ENVIRON_ARRAY
2062 /* NB: VMS' my_setenv() is in vms.c */
2063 
2064 /* Configure doesn't test for HAS_SETENV yet, so decide based on platform.
2065  * For Solaris, setenv() and unsetenv() were introduced in Solaris 9, so
2066  * testing for HAS UNSETENV is sufficient.
2067  */
2068 #  if defined(__CYGWIN__)|| defined(__SYMBIAN32__) || defined(__riscos__) || (defined(__sun) && defined(HAS_UNSETENV)) || defined(PERL_DARWIN)
2069 #    define MY_HAS_SETENV
2070 #  endif
2071 
2072 /* small wrapper for use by Perl_my_setenv that mallocs, or reallocs if
2073  * 'current' is non-null, with up to three sizes that are added together.
2074  * It handles integer overflow.
2075  */
2076 #  ifndef MY_HAS_SETENV
2077 static char *
2078 S_env_alloc(void *current, Size_t l1, Size_t l2, Size_t l3, Size_t size)
2079 {
2080     void *p;
2081     Size_t sl, l = l1 + l2;
2082 
2083     if (l < l2)
2084         goto panic;
2085     l += l3;
2086     if (l < l3)
2087         goto panic;
2088     sl = l * size;
2089     if (sl < l)
2090         goto panic;
2091 
2092     p = current
2093             ? safesysrealloc(current, sl)
2094             : safesysmalloc(sl);
2095     if (p)
2096         return (char*)p;
2097 
2098   panic:
2099     croak_memory_wrap();
2100 }
2101 #  endif
2102 
2103 
2104 #  if !defined(WIN32) && !defined(NETWARE)
2105 
2106 void
2107 Perl_my_setenv(pTHX_ const char *nam, const char *val)
2108 {
2109   dVAR;
2110 #    ifdef __amigaos4__
2111   amigaos4_obtain_environ(__FUNCTION__);
2112 #    endif
2113 
2114 #    ifdef USE_ITHREADS
2115   /* only parent thread can modify process environment */
2116   if (PL_curinterp == aTHX)
2117 #    endif
2118   {
2119 
2120 #    ifndef PERL_USE_SAFE_PUTENV
2121     if (!PL_use_safe_putenv) {
2122         /* most putenv()s leak, so we manipulate environ directly */
2123         UV i;
2124         Size_t vlen, nlen = strlen(nam);
2125 
2126         /* where does it go? */
2127         for (i = 0; environ[i]; i++) {
2128             if (strnEQ(environ[i], nam, nlen) && environ[i][nlen] == '=')
2129                 break;
2130         }
2131 
2132         if (environ == PL_origenviron) {   /* need we copy environment? */
2133             UV j, max;
2134             char **tmpenv;
2135 
2136             max = i;
2137             while (environ[max])
2138                 max++;
2139 
2140             /* XXX shouldn't that be max+1 rather than max+2 ??? - DAPM */
2141             tmpenv = (char**)S_env_alloc(NULL, max, 2, 0, sizeof(char*));
2142 
2143             for (j=0; j<max; j++) {         /* copy environment */
2144                 const Size_t len = strlen(environ[j]);
2145                 tmpenv[j] = S_env_alloc(NULL, len, 1, 0, 1);
2146                 Copy(environ[j], tmpenv[j], len+1, char);
2147             }
2148 
2149             tmpenv[max] = NULL;
2150             environ = tmpenv;               /* tell exec where it is now */
2151         }
2152 
2153         if (!val) {
2154             safesysfree(environ[i]);
2155             while (environ[i]) {
2156                 environ[i] = environ[i+1];
2157                 i++;
2158             }
2159 #      ifdef __amigaos4__
2160             goto my_setenv_out;
2161 #      else
2162             return;
2163 #      endif
2164         }
2165 
2166         if (!environ[i]) {                 /* does not exist yet */
2167             environ = (char**)S_env_alloc(environ, i, 2, 0, sizeof(char*));
2168             environ[i+1] = NULL;    /* make sure it's null terminated */
2169         }
2170         else
2171             safesysfree(environ[i]);
2172 
2173         vlen = strlen(val);
2174 
2175         environ[i] = S_env_alloc(NULL, nlen, vlen, 2, 1);
2176         /* all that work just for this */
2177         my_setenv_format(environ[i], nam, nlen, val, vlen);
2178     }
2179     else {
2180 
2181 #    endif /* !PERL_USE_SAFE_PUTENV */
2182 
2183 #    ifdef MY_HAS_SETENV
2184 #      if defined(HAS_UNSETENV)
2185         if (val == NULL) {
2186             (void)unsetenv(nam);
2187         } else {
2188             (void)setenv(nam, val, 1);
2189         }
2190 #      else /* ! HAS_UNSETENV */
2191         (void)setenv(nam, val, 1);
2192 #      endif /* HAS_UNSETENV */
2193 
2194 #    elif defined(HAS_UNSETENV)
2195 
2196         if (val == NULL) {
2197             if (environ) /* old glibc can crash with null environ */
2198                 (void)unsetenv(nam);
2199         } else {
2200 	    const Size_t nlen = strlen(nam);
2201 	    const Size_t vlen = strlen(val);
2202 	    char * const new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
2203             my_setenv_format(new_env, nam, nlen, val, vlen);
2204             (void)putenv(new_env);
2205         }
2206 
2207 #    else /* ! HAS_UNSETENV */
2208 
2209         char *new_env;
2210 	const Size_t nlen = strlen(nam);
2211 	Size_t vlen;
2212         if (!val) {
2213 	   val = "";
2214         }
2215         vlen = strlen(val);
2216         new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
2217         /* all that work just for this */
2218         my_setenv_format(new_env, nam, nlen, val, vlen);
2219         (void)putenv(new_env);
2220 
2221 #    endif /* MY_HAS_SETENV */
2222 
2223 #    ifndef PERL_USE_SAFE_PUTENV
2224     }
2225 #    endif
2226   }
2227 
2228 #    ifdef __amigaos4__
2229 my_setenv_out:
2230   amigaos4_release_environ(__FUNCTION__);
2231 #    endif
2232 }
2233 
2234 #  else /* WIN32 || NETWARE */
2235 
2236 void
2237 Perl_my_setenv(pTHX_ const char *nam, const char *val)
2238 {
2239     dVAR;
2240     char *envstr;
2241     const Size_t nlen = strlen(nam);
2242     Size_t vlen;
2243 
2244     if (!val) {
2245        val = "";
2246     }
2247     vlen = strlen(val);
2248     envstr = S_env_alloc(NULL, nlen, vlen, 2, 1);
2249     my_setenv_format(envstr, nam, nlen, val, vlen);
2250     (void)PerlEnv_putenv(envstr);
2251     safesysfree(envstr);
2252 }
2253 
2254 #  endif /* WIN32 || NETWARE */
2255 
2256 #endif /* USE_ENVIRON_ARRAY */
2257 
2258 
2259 
2260 
2261 #ifdef UNLINK_ALL_VERSIONS
2262 I32
2263 Perl_unlnk(pTHX_ const char *f)	/* unlink all versions of a file */
2264 {
2265     I32 retries = 0;
2266 
2267     PERL_ARGS_ASSERT_UNLNK;
2268 
2269     while (PerlLIO_unlink(f) >= 0)
2270 	retries++;
2271     return retries ? 0 : -1;
2272 }
2273 #endif
2274 
2275 PerlIO *
2276 Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
2277 {
2278 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(OS2) && !defined(VMS) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2279     int p[2];
2280     I32 This, that;
2281     Pid_t pid;
2282     SV *sv;
2283     I32 did_pipes = 0;
2284     int pp[2];
2285 
2286     PERL_ARGS_ASSERT_MY_POPEN_LIST;
2287 
2288     PERL_FLUSHALL_FOR_CHILD;
2289     This = (*mode == 'w');
2290     that = !This;
2291     if (TAINTING_get) {
2292 	taint_env();
2293 	taint_proper("Insecure %s%s", "EXEC");
2294     }
2295     if (PerlProc_pipe_cloexec(p) < 0)
2296 	return NULL;
2297     /* Try for another pipe pair for error return */
2298     if (PerlProc_pipe_cloexec(pp) >= 0)
2299 	did_pipes = 1;
2300     while ((pid = PerlProc_fork()) < 0) {
2301 	if (errno != EAGAIN) {
2302 	    PerlLIO_close(p[This]);
2303 	    PerlLIO_close(p[that]);
2304 	    if (did_pipes) {
2305 		PerlLIO_close(pp[0]);
2306 		PerlLIO_close(pp[1]);
2307 	    }
2308 	    return NULL;
2309 	}
2310 	Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2311 	sleep(5);
2312     }
2313     if (pid == 0) {
2314 	/* Child */
2315 #undef THIS
2316 #undef THAT
2317 #define THIS that
2318 #define THAT This
2319 	/* Close parent's end of error status pipe (if any) */
2320 	if (did_pipes)
2321 	    PerlLIO_close(pp[0]);
2322 	/* Now dup our end of _the_ pipe to right position */
2323 	if (p[THIS] != (*mode == 'r')) {
2324 	    PerlLIO_dup2(p[THIS], *mode == 'r');
2325 	    PerlLIO_close(p[THIS]);
2326 	    if (p[THAT] != (*mode == 'r'))	/* if dup2() didn't close it */
2327 		PerlLIO_close(p[THAT]);	/* close parent's end of _the_ pipe */
2328 	}
2329 	else {
2330 	    setfd_cloexec_or_inhexec_by_sysfdness(p[THIS]);
2331 	    PerlLIO_close(p[THAT]);	/* close parent's end of _the_ pipe */
2332         }
2333 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2334 	/* No automatic close - do it by hand */
2335 #  ifndef NOFILE
2336 #  define NOFILE 20
2337 #  endif
2338 	{
2339 	    int fd;
2340 
2341 	    for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
2342 		if (fd != pp[1])
2343 		    PerlLIO_close(fd);
2344 	    }
2345 	}
2346 #endif
2347 	do_aexec5(NULL, args-1, args-1+n, pp[1], did_pipes);
2348 	PerlProc__exit(1);
2349 #undef THIS
2350 #undef THAT
2351     }
2352     /* Parent */
2353     if (did_pipes)
2354 	PerlLIO_close(pp[1]);
2355     /* Keep the lower of the two fd numbers */
2356     if (p[that] < p[This]) {
2357 	PerlLIO_dup2_cloexec(p[This], p[that]);
2358 	PerlLIO_close(p[This]);
2359 	p[This] = p[that];
2360     }
2361     else
2362 	PerlLIO_close(p[that]);		/* close child's end of pipe */
2363 
2364     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2365     SvUPGRADE(sv,SVt_IV);
2366     SvIV_set(sv, pid);
2367     PL_forkprocess = pid;
2368     /* If we managed to get status pipe check for exec fail */
2369     if (did_pipes && pid > 0) {
2370 	int errkid;
2371 	unsigned n = 0;
2372 
2373 	while (n < sizeof(int)) {
2374             const SSize_t n1 = PerlLIO_read(pp[0],
2375 			      (void*)(((char*)&errkid)+n),
2376 			      (sizeof(int)) - n);
2377 	    if (n1 <= 0)
2378 		break;
2379 	    n += n1;
2380 	}
2381 	PerlLIO_close(pp[0]);
2382 	did_pipes = 0;
2383 	if (n) {			/* Error */
2384 	    int pid2, status;
2385 	    PerlLIO_close(p[This]);
2386 	    if (n != sizeof(int))
2387 		Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2388 	    do {
2389 		pid2 = wait4pid(pid, &status, 0);
2390 	    } while (pid2 == -1 && errno == EINTR);
2391 	    errno = errkid;		/* Propagate errno from kid */
2392 	    return NULL;
2393 	}
2394     }
2395     if (did_pipes)
2396 	 PerlLIO_close(pp[0]);
2397     return PerlIO_fdopen(p[This], mode);
2398 #else
2399 #  if defined(OS2)	/* Same, without fork()ing and all extra overhead... */
2400     return my_syspopen4(aTHX_ NULL, mode, n, args);
2401 #  elif defined(WIN32)
2402     return win32_popenlist(mode, n, args);
2403 #  else
2404     Perl_croak(aTHX_ "List form of piped open not implemented");
2405     return (PerlIO *) NULL;
2406 #  endif
2407 #endif
2408 }
2409 
2410     /* VMS' my_popen() is in VMS.c, same with OS/2 and AmigaOS 4. */
2411 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2412 PerlIO *
2413 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2414 {
2415     int p[2];
2416     I32 This, that;
2417     Pid_t pid;
2418     SV *sv;
2419     const I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
2420     I32 did_pipes = 0;
2421     int pp[2];
2422 
2423     PERL_ARGS_ASSERT_MY_POPEN;
2424 
2425     PERL_FLUSHALL_FOR_CHILD;
2426 #ifdef OS2
2427     if (doexec) {
2428 	return my_syspopen(aTHX_ cmd,mode);
2429     }
2430 #endif
2431     This = (*mode == 'w');
2432     that = !This;
2433     if (doexec && TAINTING_get) {
2434 	taint_env();
2435 	taint_proper("Insecure %s%s", "EXEC");
2436     }
2437     if (PerlProc_pipe_cloexec(p) < 0)
2438 	return NULL;
2439     if (doexec && PerlProc_pipe_cloexec(pp) >= 0)
2440 	did_pipes = 1;
2441     while ((pid = PerlProc_fork()) < 0) {
2442 	if (errno != EAGAIN) {
2443 	    PerlLIO_close(p[This]);
2444 	    PerlLIO_close(p[that]);
2445 	    if (did_pipes) {
2446 		PerlLIO_close(pp[0]);
2447 		PerlLIO_close(pp[1]);
2448 	    }
2449 	    if (!doexec)
2450 		Perl_croak(aTHX_ "Can't fork: %s", Strerror(errno));
2451 	    return NULL;
2452 	}
2453 	Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2454 	sleep(5);
2455     }
2456     if (pid == 0) {
2457 
2458 #undef THIS
2459 #undef THAT
2460 #define THIS that
2461 #define THAT This
2462 	if (did_pipes)
2463 	    PerlLIO_close(pp[0]);
2464 	if (p[THIS] != (*mode == 'r')) {
2465 	    PerlLIO_dup2(p[THIS], *mode == 'r');
2466 	    PerlLIO_close(p[THIS]);
2467 	    if (p[THAT] != (*mode == 'r'))	/* if dup2() didn't close it */
2468 		PerlLIO_close(p[THAT]);
2469 	}
2470 	else {
2471 	    setfd_cloexec_or_inhexec_by_sysfdness(p[THIS]);
2472 	    PerlLIO_close(p[THAT]);
2473 	}
2474 #ifndef OS2
2475 	if (doexec) {
2476 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2477 #ifndef NOFILE
2478 #define NOFILE 20
2479 #endif
2480 	    {
2481 		int fd;
2482 
2483 		for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2484 		    if (fd != pp[1])
2485 			PerlLIO_close(fd);
2486 	    }
2487 #endif
2488 	    /* may or may not use the shell */
2489 	    do_exec3(cmd, pp[1], did_pipes);
2490 	    PerlProc__exit(1);
2491 	}
2492 #endif	/* defined OS2 */
2493 
2494 #ifdef PERLIO_USING_CRLF
2495    /* Since we circumvent IO layers when we manipulate low-level
2496       filedescriptors directly, need to manually switch to the
2497       default, binary, low-level mode; see PerlIOBuf_open(). */
2498    PerlLIO_setmode((*mode == 'r'), O_BINARY);
2499 #endif
2500 	PL_forkprocess = 0;
2501 #ifdef PERL_USES_PL_PIDSTATUS
2502 	hv_clear(PL_pidstatus);	/* we have no children */
2503 #endif
2504 	return NULL;
2505 #undef THIS
2506 #undef THAT
2507     }
2508     if (did_pipes)
2509 	PerlLIO_close(pp[1]);
2510     if (p[that] < p[This]) {
2511 	PerlLIO_dup2_cloexec(p[This], p[that]);
2512 	PerlLIO_close(p[This]);
2513 	p[This] = p[that];
2514     }
2515     else
2516 	PerlLIO_close(p[that]);
2517 
2518     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2519     SvUPGRADE(sv,SVt_IV);
2520     SvIV_set(sv, pid);
2521     PL_forkprocess = pid;
2522     if (did_pipes && pid > 0) {
2523 	int errkid;
2524 	unsigned n = 0;
2525 
2526 	while (n < sizeof(int)) {
2527             const SSize_t n1 = PerlLIO_read(pp[0],
2528 			      (void*)(((char*)&errkid)+n),
2529 			      (sizeof(int)) - n);
2530 	    if (n1 <= 0)
2531 		break;
2532 	    n += n1;
2533 	}
2534 	PerlLIO_close(pp[0]);
2535 	did_pipes = 0;
2536 	if (n) {			/* Error */
2537 	    int pid2, status;
2538 	    PerlLIO_close(p[This]);
2539 	    if (n != sizeof(int))
2540 		Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2541 	    do {
2542 		pid2 = wait4pid(pid, &status, 0);
2543 	    } while (pid2 == -1 && errno == EINTR);
2544 	    errno = errkid;		/* Propagate errno from kid */
2545 	    return NULL;
2546 	}
2547     }
2548     if (did_pipes)
2549 	 PerlLIO_close(pp[0]);
2550     return PerlIO_fdopen(p[This], mode);
2551 }
2552 #elif defined(DJGPP)
2553 FILE *djgpp_popen();
2554 PerlIO *
2555 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2556 {
2557     PERL_FLUSHALL_FOR_CHILD;
2558     /* Call system's popen() to get a FILE *, then import it.
2559        used 0 for 2nd parameter to PerlIO_importFILE;
2560        apparently not used
2561     */
2562     return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2563 }
2564 #elif defined(__LIBCATAMOUNT__)
2565 PerlIO *
2566 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2567 {
2568     return NULL;
2569 }
2570 
2571 #endif /* !DOSISH */
2572 
2573 /* this is called in parent before the fork() */
2574 void
2575 Perl_atfork_lock(void)
2576 #if defined(USE_ITHREADS)
2577 #  ifdef USE_PERLIO
2578   PERL_TSA_ACQUIRE(PL_perlio_mutex)
2579 #  endif
2580 #  ifdef MYMALLOC
2581   PERL_TSA_ACQUIRE(PL_malloc_mutex)
2582 #  endif
2583   PERL_TSA_ACQUIRE(PL_op_mutex)
2584 #endif
2585 {
2586 #if defined(USE_ITHREADS)
2587     dVAR;
2588     /* locks must be held in locking order (if any) */
2589 #  ifdef USE_PERLIO
2590     MUTEX_LOCK(&PL_perlio_mutex);
2591 #  endif
2592 #  ifdef MYMALLOC
2593     MUTEX_LOCK(&PL_malloc_mutex);
2594 #  endif
2595     OP_REFCNT_LOCK;
2596 #endif
2597 }
2598 
2599 /* this is called in both parent and child after the fork() */
2600 void
2601 Perl_atfork_unlock(void)
2602 #if defined(USE_ITHREADS)
2603 #  ifdef USE_PERLIO
2604   PERL_TSA_RELEASE(PL_perlio_mutex)
2605 #  endif
2606 #  ifdef MYMALLOC
2607   PERL_TSA_RELEASE(PL_malloc_mutex)
2608 #  endif
2609   PERL_TSA_RELEASE(PL_op_mutex)
2610 #endif
2611 {
2612 #if defined(USE_ITHREADS)
2613     dVAR;
2614     /* locks must be released in same order as in atfork_lock() */
2615 #  ifdef USE_PERLIO
2616     MUTEX_UNLOCK(&PL_perlio_mutex);
2617 #  endif
2618 #  ifdef MYMALLOC
2619     MUTEX_UNLOCK(&PL_malloc_mutex);
2620 #  endif
2621     OP_REFCNT_UNLOCK;
2622 #endif
2623 }
2624 
2625 Pid_t
2626 Perl_my_fork(void)
2627 {
2628 #if defined(HAS_FORK)
2629     Pid_t pid;
2630 #if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
2631     atfork_lock();
2632     pid = fork();
2633     atfork_unlock();
2634 #else
2635     /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2636      * handlers elsewhere in the code */
2637     pid = fork();
2638 #endif
2639     return pid;
2640 #elif defined(__amigaos4__)
2641     return amigaos_fork();
2642 #else
2643     /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2644     Perl_croak_nocontext("fork() not available");
2645     return 0;
2646 #endif /* HAS_FORK */
2647 }
2648 
2649 #ifndef HAS_DUP2
2650 int
2651 dup2(int oldfd, int newfd)
2652 {
2653 #if defined(HAS_FCNTL) && defined(F_DUPFD)
2654     if (oldfd == newfd)
2655 	return oldfd;
2656     PerlLIO_close(newfd);
2657     return fcntl(oldfd, F_DUPFD, newfd);
2658 #else
2659 #define DUP2_MAX_FDS 256
2660     int fdtmp[DUP2_MAX_FDS];
2661     I32 fdx = 0;
2662     int fd;
2663 
2664     if (oldfd == newfd)
2665 	return oldfd;
2666     PerlLIO_close(newfd);
2667     /* good enough for low fd's... */
2668     while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
2669 	if (fdx >= DUP2_MAX_FDS) {
2670 	    PerlLIO_close(fd);
2671 	    fd = -1;
2672 	    break;
2673 	}
2674 	fdtmp[fdx++] = fd;
2675     }
2676     while (fdx > 0)
2677 	PerlLIO_close(fdtmp[--fdx]);
2678     return fd;
2679 #endif
2680 }
2681 #endif
2682 
2683 #ifndef PERL_MICRO
2684 #ifdef HAS_SIGACTION
2685 
2686 Sighandler_t
2687 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2688 {
2689     struct sigaction act, oact;
2690 
2691 #ifdef USE_ITHREADS
2692     dVAR;
2693     /* only "parent" interpreter can diddle signals */
2694     if (PL_curinterp != aTHX)
2695 	return (Sighandler_t) SIG_ERR;
2696 #endif
2697 
2698     act.sa_handler = (void(*)(int))handler;
2699     sigemptyset(&act.sa_mask);
2700     act.sa_flags = 0;
2701 #ifdef SA_RESTART
2702     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2703         act.sa_flags |= SA_RESTART;	/* SVR4, 4.3+BSD */
2704 #endif
2705 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2706     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2707 	act.sa_flags |= SA_NOCLDWAIT;
2708 #endif
2709     if (sigaction(signo, &act, &oact) == -1)
2710     	return (Sighandler_t) SIG_ERR;
2711     else
2712     	return (Sighandler_t) oact.sa_handler;
2713 }
2714 
2715 Sighandler_t
2716 Perl_rsignal_state(pTHX_ int signo)
2717 {
2718     struct sigaction oact;
2719     PERL_UNUSED_CONTEXT;
2720 
2721     if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
2722 	return (Sighandler_t) SIG_ERR;
2723     else
2724 	return (Sighandler_t) oact.sa_handler;
2725 }
2726 
2727 int
2728 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
2729 {
2730 #ifdef USE_ITHREADS
2731     dVAR;
2732 #endif
2733     struct sigaction act;
2734 
2735     PERL_ARGS_ASSERT_RSIGNAL_SAVE;
2736 
2737 #ifdef USE_ITHREADS
2738     /* only "parent" interpreter can diddle signals */
2739     if (PL_curinterp != aTHX)
2740 	return -1;
2741 #endif
2742 
2743     act.sa_handler = (void(*)(int))handler;
2744     sigemptyset(&act.sa_mask);
2745     act.sa_flags = 0;
2746 #ifdef SA_RESTART
2747     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2748         act.sa_flags |= SA_RESTART;	/* SVR4, 4.3+BSD */
2749 #endif
2750 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2751     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2752 	act.sa_flags |= SA_NOCLDWAIT;
2753 #endif
2754     return sigaction(signo, &act, save);
2755 }
2756 
2757 int
2758 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
2759 {
2760 #ifdef USE_ITHREADS
2761     dVAR;
2762 #endif
2763     PERL_UNUSED_CONTEXT;
2764 #ifdef USE_ITHREADS
2765     /* only "parent" interpreter can diddle signals */
2766     if (PL_curinterp != aTHX)
2767 	return -1;
2768 #endif
2769 
2770     return sigaction(signo, save, (struct sigaction *)NULL);
2771 }
2772 
2773 #else /* !HAS_SIGACTION */
2774 
2775 Sighandler_t
2776 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2777 {
2778 #if defined(USE_ITHREADS) && !defined(WIN32)
2779     /* only "parent" interpreter can diddle signals */
2780     if (PL_curinterp != aTHX)
2781 	return (Sighandler_t) SIG_ERR;
2782 #endif
2783 
2784     return PerlProc_signal(signo, handler);
2785 }
2786 
2787 static Signal_t
2788 sig_trap(int signo)
2789 {
2790     dVAR;
2791     PL_sig_trapped++;
2792 }
2793 
2794 Sighandler_t
2795 Perl_rsignal_state(pTHX_ int signo)
2796 {
2797     dVAR;
2798     Sighandler_t oldsig;
2799 
2800 #if defined(USE_ITHREADS) && !defined(WIN32)
2801     /* only "parent" interpreter can diddle signals */
2802     if (PL_curinterp != aTHX)
2803 	return (Sighandler_t) SIG_ERR;
2804 #endif
2805 
2806     PL_sig_trapped = 0;
2807     oldsig = PerlProc_signal(signo, sig_trap);
2808     PerlProc_signal(signo, oldsig);
2809     if (PL_sig_trapped)
2810 	PerlProc_kill(PerlProc_getpid(), signo);
2811     return oldsig;
2812 }
2813 
2814 int
2815 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
2816 {
2817 #if defined(USE_ITHREADS) && !defined(WIN32)
2818     /* only "parent" interpreter can diddle signals */
2819     if (PL_curinterp != aTHX)
2820 	return -1;
2821 #endif
2822     *save = PerlProc_signal(signo, handler);
2823     return (*save == (Sighandler_t) SIG_ERR) ? -1 : 0;
2824 }
2825 
2826 int
2827 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
2828 {
2829 #if defined(USE_ITHREADS) && !defined(WIN32)
2830     /* only "parent" interpreter can diddle signals */
2831     if (PL_curinterp != aTHX)
2832 	return -1;
2833 #endif
2834     return (PerlProc_signal(signo, *save) == (Sighandler_t) SIG_ERR) ? -1 : 0;
2835 }
2836 
2837 #endif /* !HAS_SIGACTION */
2838 #endif /* !PERL_MICRO */
2839 
2840     /* VMS' my_pclose() is in VMS.c; same with OS/2 */
2841 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2842 I32
2843 Perl_my_pclose(pTHX_ PerlIO *ptr)
2844 {
2845     int status;
2846     SV **svp;
2847     Pid_t pid;
2848     Pid_t pid2 = 0;
2849     bool close_failed;
2850     dSAVEDERRNO;
2851     const int fd = PerlIO_fileno(ptr);
2852     bool should_wait;
2853 
2854     svp = av_fetch(PL_fdpid,fd,TRUE);
2855     pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
2856     SvREFCNT_dec(*svp);
2857     *svp = NULL;
2858 
2859 #if defined(USE_PERLIO)
2860     /* Find out whether the refcount is low enough for us to wait for the
2861        child proc without blocking. */
2862     should_wait = PerlIOUnix_refcnt(fd) == 1 && pid > 0;
2863 #else
2864     should_wait = pid > 0;
2865 #endif
2866 
2867 #ifdef OS2
2868     if (pid == -1) {			/* Opened by popen. */
2869 	return my_syspclose(ptr);
2870     }
2871 #endif
2872     close_failed = (PerlIO_close(ptr) == EOF);
2873     SAVE_ERRNO;
2874     if (should_wait) do {
2875 	pid2 = wait4pid(pid, &status, 0);
2876     } while (pid2 == -1 && errno == EINTR);
2877     if (close_failed) {
2878 	RESTORE_ERRNO;
2879 	return -1;
2880     }
2881     return(
2882       should_wait
2883        ? pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status)
2884        : 0
2885     );
2886 }
2887 #elif defined(__LIBCATAMOUNT__)
2888 I32
2889 Perl_my_pclose(pTHX_ PerlIO *ptr)
2890 {
2891     return -1;
2892 }
2893 #endif /* !DOSISH */
2894 
2895 #if  (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(__LIBCATAMOUNT__)
2896 I32
2897 Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
2898 {
2899     I32 result = 0;
2900     PERL_ARGS_ASSERT_WAIT4PID;
2901 #ifdef PERL_USES_PL_PIDSTATUS
2902     if (!pid) {
2903         /* PERL_USES_PL_PIDSTATUS is only defined when neither
2904            waitpid() nor wait4() is available, or on OS/2, which
2905            doesn't appear to support waiting for a progress group
2906            member, so we can only treat a 0 pid as an unknown child.
2907         */
2908         errno = ECHILD;
2909         return -1;
2910     }
2911     {
2912 	if (pid > 0) {
2913 	    /* The keys in PL_pidstatus are now the raw 4 (or 8) bytes of the
2914 	       pid, rather than a string form.  */
2915 	    SV * const * const svp = hv_fetch(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),FALSE);
2916 	    if (svp && *svp != &PL_sv_undef) {
2917 		*statusp = SvIVX(*svp);
2918 		(void)hv_delete(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),
2919 				G_DISCARD);
2920 		return pid;
2921 	    }
2922 	}
2923 	else {
2924 	    HE *entry;
2925 
2926 	    hv_iterinit(PL_pidstatus);
2927 	    if ((entry = hv_iternext(PL_pidstatus))) {
2928 		SV * const sv = hv_iterval(PL_pidstatus,entry);
2929 		I32 len;
2930 		const char * const spid = hv_iterkey(entry,&len);
2931 
2932 		assert (len == sizeof(Pid_t));
2933 		memcpy((char *)&pid, spid, len);
2934 		*statusp = SvIVX(sv);
2935 		/* The hash iterator is currently on this entry, so simply
2936 		   calling hv_delete would trigger the lazy delete, which on
2937 		   aggregate does more work, because next call to hv_iterinit()
2938 		   would spot the flag, and have to call the delete routine,
2939 		   while in the meantime any new entries can't re-use that
2940 		   memory.  */
2941 		hv_iterinit(PL_pidstatus);
2942 		(void)hv_delete(PL_pidstatus,spid,len,G_DISCARD);
2943 		return pid;
2944 	    }
2945 	}
2946     }
2947 #endif
2948 #ifdef HAS_WAITPID
2949 #  ifdef HAS_WAITPID_RUNTIME
2950     if (!HAS_WAITPID_RUNTIME)
2951 	goto hard_way;
2952 #  endif
2953     result = PerlProc_waitpid(pid,statusp,flags);
2954     goto finish;
2955 #endif
2956 #if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
2957     result = wait4(pid,statusp,flags,NULL);
2958     goto finish;
2959 #endif
2960 #ifdef PERL_USES_PL_PIDSTATUS
2961 #if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
2962   hard_way:
2963 #endif
2964     {
2965 	if (flags)
2966 	    Perl_croak(aTHX_ "Can't do waitpid with flags");
2967 	else {
2968 	    while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
2969 		pidgone(result,*statusp);
2970 	    if (result < 0)
2971 		*statusp = -1;
2972 	}
2973     }
2974 #endif
2975 #if defined(HAS_WAITPID) || defined(HAS_WAIT4)
2976   finish:
2977 #endif
2978     if (result < 0 && errno == EINTR) {
2979 	PERL_ASYNC_CHECK();
2980 	errno = EINTR; /* reset in case a signal handler changed $! */
2981     }
2982     return result;
2983 }
2984 #endif /* !DOSISH || OS2 || WIN32 || NETWARE */
2985 
2986 #ifdef PERL_USES_PL_PIDSTATUS
2987 void
2988 S_pidgone(pTHX_ Pid_t pid, int status)
2989 {
2990     SV *sv;
2991 
2992     sv = *hv_fetch(PL_pidstatus,(const char*)&pid,sizeof(Pid_t),TRUE);
2993     SvUPGRADE(sv,SVt_IV);
2994     SvIV_set(sv, status);
2995     return;
2996 }
2997 #endif
2998 
2999 #if defined(OS2)
3000 int pclose();
3001 #ifdef HAS_FORK
3002 int					/* Cannot prototype with I32
3003 					   in os2ish.h. */
3004 my_syspclose(PerlIO *ptr)
3005 #else
3006 I32
3007 Perl_my_pclose(pTHX_ PerlIO *ptr)
3008 #endif
3009 {
3010     /* Needs work for PerlIO ! */
3011     FILE * const f = PerlIO_findFILE(ptr);
3012     const I32 result = pclose(f);
3013     PerlIO_releaseFILE(ptr,f);
3014     return result;
3015 }
3016 #endif
3017 
3018 #if defined(DJGPP)
3019 int djgpp_pclose();
3020 I32
3021 Perl_my_pclose(pTHX_ PerlIO *ptr)
3022 {
3023     /* Needs work for PerlIO ! */
3024     FILE * const f = PerlIO_findFILE(ptr);
3025     I32 result = djgpp_pclose(f);
3026     result = (result << 8) & 0xff00;
3027     PerlIO_releaseFILE(ptr,f);
3028     return result;
3029 }
3030 #endif
3031 
3032 #define PERL_REPEATCPY_LINEAR 4
3033 void
3034 Perl_repeatcpy(char *to, const char *from, I32 len, IV count)
3035 {
3036     PERL_ARGS_ASSERT_REPEATCPY;
3037 
3038     assert(len >= 0);
3039 
3040     if (count < 0)
3041 	croak_memory_wrap();
3042 
3043     if (len == 1)
3044 	memset(to, *from, count);
3045     else if (count) {
3046 	char *p = to;
3047 	IV items, linear, half;
3048 
3049 	linear = count < PERL_REPEATCPY_LINEAR ? count : PERL_REPEATCPY_LINEAR;
3050 	for (items = 0; items < linear; ++items) {
3051 	    const char *q = from;
3052 	    IV todo;
3053 	    for (todo = len; todo > 0; todo--)
3054 		*p++ = *q++;
3055         }
3056 
3057 	half = count / 2;
3058 	while (items <= half) {
3059 	    IV size = items * len;
3060 	    memcpy(p, to, size);
3061 	    p     += size;
3062 	    items *= 2;
3063 	}
3064 
3065 	if (count > items)
3066 	    memcpy(p, to, (count - items) * len);
3067     }
3068 }
3069 
3070 #ifndef HAS_RENAME
3071 I32
3072 Perl_same_dirent(pTHX_ const char *a, const char *b)
3073 {
3074     char *fa = strrchr(a,'/');
3075     char *fb = strrchr(b,'/');
3076     Stat_t tmpstatbuf1;
3077     Stat_t tmpstatbuf2;
3078     SV * const tmpsv = sv_newmortal();
3079 
3080     PERL_ARGS_ASSERT_SAME_DIRENT;
3081 
3082     if (fa)
3083 	fa++;
3084     else
3085 	fa = a;
3086     if (fb)
3087 	fb++;
3088     else
3089 	fb = b;
3090     if (strNE(a,b))
3091 	return FALSE;
3092     if (fa == a)
3093 	sv_setpvs(tmpsv, ".");
3094     else
3095 	sv_setpvn(tmpsv, a, fa - a);
3096     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
3097 	return FALSE;
3098     if (fb == b)
3099 	sv_setpvs(tmpsv, ".");
3100     else
3101 	sv_setpvn(tmpsv, b, fb - b);
3102     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
3103 	return FALSE;
3104     return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
3105 	   tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
3106 }
3107 #endif /* !HAS_RENAME */
3108 
3109 char*
3110 Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
3111 		 const char *const *const search_ext, I32 flags)
3112 {
3113     const char *xfound = NULL;
3114     char *xfailed = NULL;
3115     char tmpbuf[MAXPATHLEN];
3116     char *s;
3117     I32 len = 0;
3118     int retval;
3119     char *bufend;
3120 #if defined(DOSISH) && !defined(OS2)
3121 #  define SEARCH_EXTS ".bat", ".cmd", NULL
3122 #  define MAX_EXT_LEN 4
3123 #endif
3124 #ifdef OS2
3125 #  define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
3126 #  define MAX_EXT_LEN 4
3127 #endif
3128 #ifdef VMS
3129 #  define SEARCH_EXTS ".pl", ".com", NULL
3130 #  define MAX_EXT_LEN 4
3131 #endif
3132     /* additional extensions to try in each dir if scriptname not found */
3133 #ifdef SEARCH_EXTS
3134     static const char *const exts[] = { SEARCH_EXTS };
3135     const char *const *const ext = search_ext ? search_ext : exts;
3136     int extidx = 0, i = 0;
3137     const char *curext = NULL;
3138 #else
3139     PERL_UNUSED_ARG(search_ext);
3140 #  define MAX_EXT_LEN 0
3141 #endif
3142 
3143     PERL_ARGS_ASSERT_FIND_SCRIPT;
3144 
3145     /*
3146      * If dosearch is true and if scriptname does not contain path
3147      * delimiters, search the PATH for scriptname.
3148      *
3149      * If SEARCH_EXTS is also defined, will look for each
3150      * scriptname{SEARCH_EXTS} whenever scriptname is not found
3151      * while searching the PATH.
3152      *
3153      * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
3154      * proceeds as follows:
3155      *   If DOSISH or VMSISH:
3156      *     + look for ./scriptname{,.foo,.bar}
3157      *     + search the PATH for scriptname{,.foo,.bar}
3158      *
3159      *   If !DOSISH:
3160      *     + look *only* in the PATH for scriptname{,.foo,.bar} (note
3161      *       this will not look in '.' if it's not in the PATH)
3162      */
3163     tmpbuf[0] = '\0';
3164 
3165 #ifdef VMS
3166 #  ifdef ALWAYS_DEFTYPES
3167     len = strlen(scriptname);
3168     if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
3169 	int idx = 0, deftypes = 1;
3170 	bool seen_dot = 1;
3171 
3172 	const int hasdir = !dosearch || (strpbrk(scriptname,":[</") != NULL);
3173 #  else
3174     if (dosearch) {
3175 	int idx = 0, deftypes = 1;
3176 	bool seen_dot = 1;
3177 
3178 	const int hasdir = (strpbrk(scriptname,":[</") != NULL);
3179 #  endif
3180 	/* The first time through, just add SEARCH_EXTS to whatever we
3181 	 * already have, so we can check for default file types. */
3182 	while (deftypes ||
3183 	       (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
3184 	{
3185 	    Stat_t statbuf;
3186 	    if (deftypes) {
3187 		deftypes = 0;
3188 		*tmpbuf = '\0';
3189 	    }
3190 	    if ((strlen(tmpbuf) + strlen(scriptname)
3191 		 + MAX_EXT_LEN) >= sizeof tmpbuf)
3192 		continue;	/* don't search dir with too-long name */
3193 	    my_strlcat(tmpbuf, scriptname, sizeof(tmpbuf));
3194 #else  /* !VMS */
3195 
3196 #ifdef DOSISH
3197     if (strEQ(scriptname, "-"))
3198  	dosearch = 0;
3199     if (dosearch) {		/* Look in '.' first. */
3200 	const char *cur = scriptname;
3201 #ifdef SEARCH_EXTS
3202 	if ((curext = strrchr(scriptname,'.')))	/* possible current ext */
3203 	    while (ext[i])
3204 		if (strEQ(ext[i++],curext)) {
3205 		    extidx = -1;		/* already has an ext */
3206 		    break;
3207 		}
3208 	do {
3209 #endif
3210 	    DEBUG_p(PerlIO_printf(Perl_debug_log,
3211 				  "Looking for %s\n",cur));
3212 	    {
3213 		Stat_t statbuf;
3214 		if (PerlLIO_stat(cur,&statbuf) >= 0
3215 		    && !S_ISDIR(statbuf.st_mode)) {
3216 		    dosearch = 0;
3217 		    scriptname = cur;
3218 #ifdef SEARCH_EXTS
3219 		    break;
3220 #endif
3221 		}
3222 	    }
3223 #ifdef SEARCH_EXTS
3224 	    if (cur == scriptname) {
3225 		len = strlen(scriptname);
3226 		if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
3227 		    break;
3228 		my_strlcpy(tmpbuf, scriptname, sizeof(tmpbuf));
3229 		cur = tmpbuf;
3230 	    }
3231 	} while (extidx >= 0 && ext[extidx]	/* try an extension? */
3232 		 && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len));
3233 #endif
3234     }
3235 #endif
3236 
3237     if (dosearch && !strchr(scriptname, '/')
3238 #ifdef DOSISH
3239 		 && !strchr(scriptname, '\\')
3240 #endif
3241 		 && (s = PerlEnv_getenv("PATH")))
3242     {
3243 	bool seen_dot = 0;
3244 
3245 	bufend = s + strlen(s);
3246 	while (s < bufend) {
3247 	    Stat_t statbuf;
3248 #  ifdef DOSISH
3249 	    for (len = 0; *s
3250 		    && *s != ';'; len++, s++) {
3251 		if (len < sizeof tmpbuf)
3252 		    tmpbuf[len] = *s;
3253 	    }
3254 	    if (len < sizeof tmpbuf)
3255 		tmpbuf[len] = '\0';
3256 #  else
3257 	    s = delimcpy_no_escape(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend,
3258                                    ':', &len);
3259 #  endif
3260 	    if (s < bufend)
3261 		s++;
3262 	    if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
3263 		continue;	/* don't search dir with too-long name */
3264 	    if (len
3265 #  ifdef DOSISH
3266 		&& tmpbuf[len - 1] != '/'
3267 		&& tmpbuf[len - 1] != '\\'
3268 #  endif
3269 	       )
3270 		tmpbuf[len++] = '/';
3271 	    if (len == 2 && tmpbuf[0] == '.')
3272 		seen_dot = 1;
3273 	    (void)my_strlcpy(tmpbuf + len, scriptname, sizeof(tmpbuf) - len);
3274 #endif  /* !VMS */
3275 
3276 #ifdef SEARCH_EXTS
3277 	    len = strlen(tmpbuf);
3278 	    if (extidx > 0)	/* reset after previous loop */
3279 		extidx = 0;
3280 	    do {
3281 #endif
3282 	    	DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3283 		retval = PerlLIO_stat(tmpbuf,&statbuf);
3284 		if (S_ISDIR(statbuf.st_mode)) {
3285 		    retval = -1;
3286 		}
3287 #ifdef SEARCH_EXTS
3288 	    } while (  retval < 0		/* not there */
3289 		    && extidx>=0 && ext[extidx]	/* try an extension? */
3290 		    && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len)
3291 		);
3292 #endif
3293 	    if (retval < 0)
3294 		continue;
3295 	    if (S_ISREG(statbuf.st_mode)
3296 		&& cando(S_IRUSR,TRUE,&statbuf)
3297 #if !defined(DOSISH)
3298 		&& cando(S_IXUSR,TRUE,&statbuf)
3299 #endif
3300 		)
3301 	    {
3302 		xfound = tmpbuf;		/* bingo! */
3303 		break;
3304 	    }
3305 	    if (!xfailed)
3306 		xfailed = savepv(tmpbuf);
3307 	}
3308 #ifndef DOSISH
3309 	{
3310 	    Stat_t statbuf;
3311 	    if (!xfound && !seen_dot && !xfailed &&
3312 		(PerlLIO_stat(scriptname,&statbuf) < 0
3313 		 || S_ISDIR(statbuf.st_mode)))
3314 #endif
3315 		seen_dot = 1;			/* Disable message. */
3316 #ifndef DOSISH
3317 	}
3318 #endif
3319 	if (!xfound) {
3320 	    if (flags & 1) {			/* do or die? */
3321 		/* diag_listed_as: Can't execute %s */
3322 		Perl_croak(aTHX_ "Can't %s %s%s%s",
3323 		      (xfailed ? "execute" : "find"),
3324 		      (xfailed ? xfailed : scriptname),
3325 		      (xfailed ? "" : " on PATH"),
3326 		      (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3327 	    }
3328 	    scriptname = NULL;
3329 	}
3330 	Safefree(xfailed);
3331 	scriptname = xfound;
3332     }
3333     return (scriptname ? savepv(scriptname) : NULL);
3334 }
3335 
3336 #ifndef PERL_GET_CONTEXT_DEFINED
3337 
3338 void *
3339 Perl_get_context(void)
3340 {
3341 #if defined(USE_ITHREADS)
3342     dVAR;
3343 #  ifdef OLD_PTHREADS_API
3344     pthread_addr_t t;
3345     int error = pthread_getspecific(PL_thr_key, &t)
3346     if (error)
3347 	Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error);
3348     return (void*)t;
3349 #  elif defined(I_MACH_CTHREADS)
3350     return (void*)cthread_data(cthread_self());
3351 #  else
3352     return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
3353 #  endif
3354 #else
3355     return (void*)NULL;
3356 #endif
3357 }
3358 
3359 void
3360 Perl_set_context(void *t)
3361 {
3362 #if defined(USE_ITHREADS)
3363     dVAR;
3364 #endif
3365     PERL_ARGS_ASSERT_SET_CONTEXT;
3366 #if defined(USE_ITHREADS)
3367 #  ifdef I_MACH_CTHREADS
3368     cthread_set_data(cthread_self(), t);
3369 #  else
3370     {
3371 	const int error = pthread_setspecific(PL_thr_key, t);
3372 	if (error)
3373 	    Perl_croak_nocontext("panic: pthread_setspecific, error=%d", error);
3374     }
3375 #  endif
3376 #else
3377     PERL_UNUSED_ARG(t);
3378 #endif
3379 }
3380 
3381 #endif /* !PERL_GET_CONTEXT_DEFINED */
3382 
3383 #if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
3384 struct perl_vars *
3385 Perl_GetVars(pTHX)
3386 {
3387     PERL_UNUSED_CONTEXT;
3388     return &PL_Vars;
3389 }
3390 #endif
3391 
3392 char **
3393 Perl_get_op_names(pTHX)
3394 {
3395     PERL_UNUSED_CONTEXT;
3396     return (char **)PL_op_name;
3397 }
3398 
3399 char **
3400 Perl_get_op_descs(pTHX)
3401 {
3402     PERL_UNUSED_CONTEXT;
3403     return (char **)PL_op_desc;
3404 }
3405 
3406 const char *
3407 Perl_get_no_modify(pTHX)
3408 {
3409     PERL_UNUSED_CONTEXT;
3410     return PL_no_modify;
3411 }
3412 
3413 U32 *
3414 Perl_get_opargs(pTHX)
3415 {
3416     PERL_UNUSED_CONTEXT;
3417     return (U32 *)PL_opargs;
3418 }
3419 
3420 PPADDR_t*
3421 Perl_get_ppaddr(pTHX)
3422 {
3423     dVAR;
3424     PERL_UNUSED_CONTEXT;
3425     return (PPADDR_t*)PL_ppaddr;
3426 }
3427 
3428 #ifndef HAS_GETENV_LEN
3429 char *
3430 Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
3431 {
3432     char * const env_trans = PerlEnv_getenv(env_elem);
3433     PERL_UNUSED_CONTEXT;
3434     PERL_ARGS_ASSERT_GETENV_LEN;
3435     if (env_trans)
3436 	*len = strlen(env_trans);
3437     return env_trans;
3438 }
3439 #endif
3440 
3441 
3442 MGVTBL*
3443 Perl_get_vtbl(pTHX_ int vtbl_id)
3444 {
3445     PERL_UNUSED_CONTEXT;
3446 
3447     return (vtbl_id < 0 || vtbl_id >= magic_vtable_max)
3448 	? NULL : (MGVTBL*)PL_magic_vtables + vtbl_id;
3449 }
3450 
3451 I32
3452 Perl_my_fflush_all(pTHX)
3453 {
3454 #if defined(USE_PERLIO) || defined(FFLUSH_NULL)
3455     return PerlIO_flush(NULL);
3456 #else
3457 # if defined(HAS__FWALK)
3458     extern int fflush(FILE *);
3459     /* undocumented, unprototyped, but very useful BSDism */
3460     extern void _fwalk(int (*)(FILE *));
3461     _fwalk(&fflush);
3462     return 0;
3463 # else
3464 #  if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
3465     long open_max = -1;
3466 #   ifdef PERL_FFLUSH_ALL_FOPEN_MAX
3467     open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
3468 #   elif defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
3469     open_max = sysconf(_SC_OPEN_MAX);
3470 #   elif defined(FOPEN_MAX)
3471     open_max = FOPEN_MAX;
3472 #   elif defined(OPEN_MAX)
3473     open_max = OPEN_MAX;
3474 #   elif defined(_NFILE)
3475     open_max = _NFILE;
3476 #   endif
3477     if (open_max > 0) {
3478       long i;
3479       for (i = 0; i < open_max; i++)
3480 	    if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3481 		STDIO_STREAM_ARRAY[i]._file < open_max &&
3482 		STDIO_STREAM_ARRAY[i]._flag)
3483 		PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
3484       return 0;
3485     }
3486 #  endif
3487     SETERRNO(EBADF,RMS_IFI);
3488     return EOF;
3489 # endif
3490 #endif
3491 }
3492 
3493 void
3494 Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have)
3495 {
3496     if (ckWARN(WARN_IO)) {
3497         HEK * const name
3498            = gv && (isGV_with_GP(gv))
3499                 ? GvENAME_HEK((gv))
3500                 : NULL;
3501 	const char * const direction = have == '>' ? "out" : "in";
3502 
3503 	if (name && HEK_LEN(name))
3504 	    Perl_warner(aTHX_ packWARN(WARN_IO),
3505 			"Filehandle %" HEKf " opened only for %sput",
3506 			HEKfARG(name), direction);
3507 	else
3508 	    Perl_warner(aTHX_ packWARN(WARN_IO),
3509 			"Filehandle opened only for %sput", direction);
3510     }
3511 }
3512 
3513 void
3514 Perl_report_evil_fh(pTHX_ const GV *gv)
3515 {
3516     const IO *io = gv ? GvIO(gv) : NULL;
3517     const PERL_BITFIELD16 op = PL_op->op_type;
3518     const char *vile;
3519     I32 warn_type;
3520 
3521     if (io && IoTYPE(io) == IoTYPE_CLOSED) {
3522 	vile = "closed";
3523 	warn_type = WARN_CLOSED;
3524     }
3525     else {
3526 	vile = "unopened";
3527 	warn_type = WARN_UNOPENED;
3528     }
3529 
3530     if (ckWARN(warn_type)) {
3531         SV * const name
3532             = gv && isGV_with_GP(gv) && GvENAMELEN(gv) ?
3533                                      sv_2mortal(newSVhek(GvENAME_HEK(gv))) : NULL;
3534 	const char * const pars =
3535 	    (const char *)(OP_IS_FILETEST(op) ? "" : "()");
3536 	const char * const func =
3537 	    (const char *)
3538 	    (op == OP_READLINE || op == OP_RCATLINE
3539 				 ? "readline"  :	/* "<HANDLE>" not nice */
3540 	     op == OP_LEAVEWRITE ? "write" :		/* "write exit" not nice */
3541 	     PL_op_desc[op]);
3542 	const char * const type =
3543 	    (const char *)
3544 	    (OP_IS_SOCKET(op) || (io && IoTYPE(io) == IoTYPE_SOCKET)
3545 	     ? "socket" : "filehandle");
3546 	const bool have_name = name && SvCUR(name);
3547 	Perl_warner(aTHX_ packWARN(warn_type),
3548 		   "%s%s on %s %s%s%" SVf, func, pars, vile, type,
3549 		    have_name ? " " : "",
3550 		    SVfARG(have_name ? name : &PL_sv_no));
3551 	if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3552 		Perl_warner(
3553 			    aTHX_ packWARN(warn_type),
3554 			"\t(Are you trying to call %s%s on dirhandle%s%" SVf "?)\n",
3555 			func, pars, have_name ? " " : "",
3556 			SVfARG(have_name ? name : &PL_sv_no)
3557 			    );
3558     }
3559 }
3560 
3561 /* To workaround core dumps from the uninitialised tm_zone we get the
3562  * system to give us a reasonable struct to copy.  This fix means that
3563  * strftime uses the tm_zone and tm_gmtoff values returned by
3564  * localtime(time()). That should give the desired result most of the
3565  * time. But probably not always!
3566  *
3567  * This does not address tzname aspects of NETaa14816.
3568  *
3569  */
3570 
3571 #ifdef __GLIBC__
3572 # ifndef STRUCT_TM_HASZONE
3573 #    define STRUCT_TM_HASZONE
3574 # endif
3575 #endif
3576 
3577 #ifdef STRUCT_TM_HASZONE /* Backward compat */
3578 # ifndef HAS_TM_TM_ZONE
3579 #    define HAS_TM_TM_ZONE
3580 # endif
3581 #endif
3582 
3583 void
3584 Perl_init_tm(pTHX_ struct tm *ptm)	/* see mktime, strftime and asctime */
3585 {
3586 #ifdef HAS_TM_TM_ZONE
3587     Time_t now;
3588     const struct tm* my_tm;
3589     PERL_UNUSED_CONTEXT;
3590     PERL_ARGS_ASSERT_INIT_TM;
3591     (void)time(&now);
3592     my_tm = localtime(&now);
3593     if (my_tm)
3594         Copy(my_tm, ptm, 1, struct tm);
3595 #else
3596     PERL_UNUSED_CONTEXT;
3597     PERL_ARGS_ASSERT_INIT_TM;
3598     PERL_UNUSED_ARG(ptm);
3599 #endif
3600 }
3601 
3602 /*
3603  * mini_mktime - normalise struct tm values without the localtime()
3604  * semantics (and overhead) of mktime().
3605  */
3606 void
3607 Perl_mini_mktime(struct tm *ptm)
3608 {
3609     int yearday;
3610     int secs;
3611     int month, mday, year, jday;
3612     int odd_cent, odd_year;
3613 
3614     PERL_ARGS_ASSERT_MINI_MKTIME;
3615 
3616 #define	DAYS_PER_YEAR	365
3617 #define	DAYS_PER_QYEAR	(4*DAYS_PER_YEAR+1)
3618 #define	DAYS_PER_CENT	(25*DAYS_PER_QYEAR-1)
3619 #define	DAYS_PER_QCENT	(4*DAYS_PER_CENT+1)
3620 #define	SECS_PER_HOUR	(60*60)
3621 #define	SECS_PER_DAY	(24*SECS_PER_HOUR)
3622 /* parentheses deliberately absent on these two, otherwise they don't work */
3623 #define	MONTH_TO_DAYS	153/5
3624 #define	DAYS_TO_MONTH	5/153
3625 /* offset to bias by March (month 4) 1st between month/mday & year finding */
3626 #define	YEAR_ADJUST	(4*MONTH_TO_DAYS+1)
3627 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3628 #define	WEEKDAY_BIAS	6	/* (1+6)%7 makes Sunday 0 again */
3629 
3630 /*
3631  * Year/day algorithm notes:
3632  *
3633  * With a suitable offset for numeric value of the month, one can find
3634  * an offset into the year by considering months to have 30.6 (153/5) days,
3635  * using integer arithmetic (i.e., with truncation).  To avoid too much
3636  * messing about with leap days, we consider January and February to be
3637  * the 13th and 14th month of the previous year.  After that transformation,
3638  * we need the month index we use to be high by 1 from 'normal human' usage,
3639  * so the month index values we use run from 4 through 15.
3640  *
3641  * Given that, and the rules for the Gregorian calendar (leap years are those
3642  * divisible by 4 unless also divisible by 100, when they must be divisible
3643  * by 400 instead), we can simply calculate the number of days since some
3644  * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3645  * the days we derive from our month index, and adding in the day of the
3646  * month.  The value used here is not adjusted for the actual origin which
3647  * it normally would use (1 January A.D. 1), since we're not exposing it.
3648  * We're only building the value so we can turn around and get the
3649  * normalised values for the year, month, day-of-month, and day-of-year.
3650  *
3651  * For going backward, we need to bias the value we're using so that we find
3652  * the right year value.  (Basically, we don't want the contribution of
3653  * March 1st to the number to apply while deriving the year).  Having done
3654  * that, we 'count up' the contribution to the year number by accounting for
3655  * full quadracenturies (400-year periods) with their extra leap days, plus
3656  * the contribution from full centuries (to avoid counting in the lost leap
3657  * days), plus the contribution from full quad-years (to count in the normal
3658  * leap days), plus the leftover contribution from any non-leap years.
3659  * At this point, if we were working with an actual leap day, we'll have 0
3660  * days left over.  This is also true for March 1st, however.  So, we have
3661  * to special-case that result, and (earlier) keep track of the 'odd'
3662  * century and year contributions.  If we got 4 extra centuries in a qcent,
3663  * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3664  * Otherwise, we add back in the earlier bias we removed (the 123 from
3665  * figuring in March 1st), find the month index (integer division by 30.6),
3666  * and the remainder is the day-of-month.  We then have to convert back to
3667  * 'real' months (including fixing January and February from being 14/15 in
3668  * the previous year to being in the proper year).  After that, to get
3669  * tm_yday, we work with the normalised year and get a new yearday value for
3670  * January 1st, which we subtract from the yearday value we had earlier,
3671  * representing the date we've re-built.  This is done from January 1
3672  * because tm_yday is 0-origin.
3673  *
3674  * Since POSIX time routines are only guaranteed to work for times since the
3675  * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3676  * applies Gregorian calendar rules even to dates before the 16th century
3677  * doesn't bother me.  Besides, you'd need cultural context for a given
3678  * date to know whether it was Julian or Gregorian calendar, and that's
3679  * outside the scope for this routine.  Since we convert back based on the
3680  * same rules we used to build the yearday, you'll only get strange results
3681  * for input which needed normalising, or for the 'odd' century years which
3682  * were leap years in the Julian calendar but not in the Gregorian one.
3683  * I can live with that.
3684  *
3685  * This algorithm also fails to handle years before A.D. 1 gracefully, but
3686  * that's still outside the scope for POSIX time manipulation, so I don't
3687  * care.
3688  *
3689  * - lwall
3690  */
3691 
3692     year = 1900 + ptm->tm_year;
3693     month = ptm->tm_mon;
3694     mday = ptm->tm_mday;
3695     jday = 0;
3696     if (month >= 2)
3697 	month+=2;
3698     else
3699 	month+=14, year--;
3700     yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3701     yearday += month*MONTH_TO_DAYS + mday + jday;
3702     /*
3703      * Note that we don't know when leap-seconds were or will be,
3704      * so we have to trust the user if we get something which looks
3705      * like a sensible leap-second.  Wild values for seconds will
3706      * be rationalised, however.
3707      */
3708     if ((unsigned) ptm->tm_sec <= 60) {
3709 	secs = 0;
3710     }
3711     else {
3712 	secs = ptm->tm_sec;
3713 	ptm->tm_sec = 0;
3714     }
3715     secs += 60 * ptm->tm_min;
3716     secs += SECS_PER_HOUR * ptm->tm_hour;
3717     if (secs < 0) {
3718 	if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3719 	    /* got negative remainder, but need positive time */
3720 	    /* back off an extra day to compensate */
3721 	    yearday += (secs/SECS_PER_DAY)-1;
3722 	    secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3723 	}
3724 	else {
3725 	    yearday += (secs/SECS_PER_DAY);
3726 	    secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3727 	}
3728     }
3729     else if (secs >= SECS_PER_DAY) {
3730 	yearday += (secs/SECS_PER_DAY);
3731 	secs %= SECS_PER_DAY;
3732     }
3733     ptm->tm_hour = secs/SECS_PER_HOUR;
3734     secs %= SECS_PER_HOUR;
3735     ptm->tm_min = secs/60;
3736     secs %= 60;
3737     ptm->tm_sec += secs;
3738     /* done with time of day effects */
3739     /*
3740      * The algorithm for yearday has (so far) left it high by 428.
3741      * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3742      * bias it by 123 while trying to figure out what year it
3743      * really represents.  Even with this tweak, the reverse
3744      * translation fails for years before A.D. 0001.
3745      * It would still fail for Feb 29, but we catch that one below.
3746      */
3747     jday = yearday;	/* save for later fixup vis-a-vis Jan 1 */
3748     yearday -= YEAR_ADJUST;
3749     year = (yearday / DAYS_PER_QCENT) * 400;
3750     yearday %= DAYS_PER_QCENT;
3751     odd_cent = yearday / DAYS_PER_CENT;
3752     year += odd_cent * 100;
3753     yearday %= DAYS_PER_CENT;
3754     year += (yearday / DAYS_PER_QYEAR) * 4;
3755     yearday %= DAYS_PER_QYEAR;
3756     odd_year = yearday / DAYS_PER_YEAR;
3757     year += odd_year;
3758     yearday %= DAYS_PER_YEAR;
3759     if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3760 	month = 1;
3761 	yearday = 29;
3762     }
3763     else {
3764 	yearday += YEAR_ADJUST;	/* recover March 1st crock */
3765 	month = yearday*DAYS_TO_MONTH;
3766 	yearday -= month*MONTH_TO_DAYS;
3767 	/* recover other leap-year adjustment */
3768 	if (month > 13) {
3769 	    month-=14;
3770 	    year++;
3771 	}
3772 	else {
3773 	    month-=2;
3774 	}
3775     }
3776     ptm->tm_year = year - 1900;
3777     if (yearday) {
3778       ptm->tm_mday = yearday;
3779       ptm->tm_mon = month;
3780     }
3781     else {
3782       ptm->tm_mday = 31;
3783       ptm->tm_mon = month - 1;
3784     }
3785     /* re-build yearday based on Jan 1 to get tm_yday */
3786     year--;
3787     yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
3788     yearday += 14*MONTH_TO_DAYS + 1;
3789     ptm->tm_yday = jday - yearday;
3790     ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
3791 }
3792 
3793 char *
3794 Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
3795 {
3796 #ifdef HAS_STRFTIME
3797 
3798   /* strftime(), but with a different API so that the return value is a pointer
3799    * to the formatted result (which MUST be arranged to be FREED BY THE
3800    * CALLER).  This allows this function to increase the buffer size as needed,
3801    * so that the caller doesn't have to worry about that.
3802    *
3803    * Note that yday and wday effectively are ignored by this function, as
3804    * mini_mktime() overwrites them */
3805 
3806   char *buf;
3807   int buflen;
3808   struct tm mytm;
3809   int len;
3810 
3811   PERL_ARGS_ASSERT_MY_STRFTIME;
3812 
3813   init_tm(&mytm);	/* XXX workaround - see init_tm() above */
3814   mytm.tm_sec = sec;
3815   mytm.tm_min = min;
3816   mytm.tm_hour = hour;
3817   mytm.tm_mday = mday;
3818   mytm.tm_mon = mon;
3819   mytm.tm_year = year;
3820   mytm.tm_wday = wday;
3821   mytm.tm_yday = yday;
3822   mytm.tm_isdst = isdst;
3823   mini_mktime(&mytm);
3824   /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
3825 #if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
3826   STMT_START {
3827     struct tm mytm2;
3828     mytm2 = mytm;
3829     mktime(&mytm2);
3830 #ifdef HAS_TM_TM_GMTOFF
3831     mytm.tm_gmtoff = mytm2.tm_gmtoff;
3832 #endif
3833 #ifdef HAS_TM_TM_ZONE
3834     mytm.tm_zone = mytm2.tm_zone;
3835 #endif
3836   } STMT_END;
3837 #endif
3838   buflen = 64;
3839   Newx(buf, buflen, char);
3840 
3841   GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */
3842   len = strftime(buf, buflen, fmt, &mytm);
3843   GCC_DIAG_RESTORE_STMT;
3844 
3845   /*
3846   ** The following is needed to handle to the situation where
3847   ** tmpbuf overflows.  Basically we want to allocate a buffer
3848   ** and try repeatedly.  The reason why it is so complicated
3849   ** is that getting a return value of 0 from strftime can indicate
3850   ** one of the following:
3851   ** 1. buffer overflowed,
3852   ** 2. illegal conversion specifier, or
3853   ** 3. the format string specifies nothing to be returned(not
3854   **	  an error).  This could be because format is an empty string
3855   **    or it specifies %p that yields an empty string in some locale.
3856   ** If there is a better way to make it portable, go ahead by
3857   ** all means.
3858   */
3859   if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
3860     return buf;
3861   else {
3862     /* Possibly buf overflowed - try again with a bigger buf */
3863     const int fmtlen = strlen(fmt);
3864     int bufsize = fmtlen + buflen;
3865 
3866     Renew(buf, bufsize, char);
3867     while (buf) {
3868 
3869       GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */
3870       buflen = strftime(buf, bufsize, fmt, &mytm);
3871       GCC_DIAG_RESTORE_STMT;
3872 
3873       if (buflen > 0 && buflen < bufsize)
3874 	break;
3875       /* heuristic to prevent out-of-memory errors */
3876       if (bufsize > 100*fmtlen) {
3877 	Safefree(buf);
3878 	buf = NULL;
3879 	break;
3880       }
3881       bufsize *= 2;
3882       Renew(buf, bufsize, char);
3883     }
3884     return buf;
3885   }
3886 #else
3887   Perl_croak(aTHX_ "panic: no strftime");
3888   return NULL;
3889 #endif
3890 }
3891 
3892 
3893 #define SV_CWD_RETURN_UNDEF \
3894     sv_set_undef(sv); \
3895     return FALSE
3896 
3897 #define SV_CWD_ISDOT(dp) \
3898     (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
3899 	(dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
3900 
3901 /*
3902 =head1 Miscellaneous Functions
3903 
3904 =for apidoc getcwd_sv
3905 
3906 Fill C<sv> with current working directory
3907 
3908 =cut
3909 */
3910 
3911 /* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
3912  * rewritten again by dougm, optimized for use with xs TARG, and to prefer
3913  * getcwd(3) if available
3914  * Comments from the original:
3915  *     This is a faster version of getcwd.  It's also more dangerous
3916  *     because you might chdir out of a directory that you can't chdir
3917  *     back into. */
3918 
3919 int
3920 Perl_getcwd_sv(pTHX_ SV *sv)
3921 {
3922 #ifndef PERL_MICRO
3923     SvTAINTED_on(sv);
3924 
3925     PERL_ARGS_ASSERT_GETCWD_SV;
3926 
3927 #ifdef HAS_GETCWD
3928     {
3929 	char buf[MAXPATHLEN];
3930 
3931 	/* Some getcwd()s automatically allocate a buffer of the given
3932 	 * size from the heap if they are given a NULL buffer pointer.
3933 	 * The problem is that this behaviour is not portable. */
3934 	if (getcwd(buf, sizeof(buf) - 1)) {
3935 	    sv_setpv(sv, buf);
3936 	    return TRUE;
3937 	}
3938 	else {
3939 	    SV_CWD_RETURN_UNDEF;
3940 	}
3941     }
3942 
3943 #else
3944 
3945     Stat_t statbuf;
3946     int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
3947     int pathlen=0;
3948     Direntry_t *dp;
3949 
3950     SvUPGRADE(sv, SVt_PV);
3951 
3952     if (PerlLIO_lstat(".", &statbuf) < 0) {
3953 	SV_CWD_RETURN_UNDEF;
3954     }
3955 
3956     orig_cdev = statbuf.st_dev;
3957     orig_cino = statbuf.st_ino;
3958     cdev = orig_cdev;
3959     cino = orig_cino;
3960 
3961     for (;;) {
3962 	DIR *dir;
3963 	int namelen;
3964 	odev = cdev;
3965 	oino = cino;
3966 
3967 	if (PerlDir_chdir("..") < 0) {
3968 	    SV_CWD_RETURN_UNDEF;
3969 	}
3970 	if (PerlLIO_stat(".", &statbuf) < 0) {
3971 	    SV_CWD_RETURN_UNDEF;
3972 	}
3973 
3974 	cdev = statbuf.st_dev;
3975 	cino = statbuf.st_ino;
3976 
3977 	if (odev == cdev && oino == cino) {
3978 	    break;
3979 	}
3980 	if (!(dir = PerlDir_open("."))) {
3981 	    SV_CWD_RETURN_UNDEF;
3982 	}
3983 
3984 	while ((dp = PerlDir_read(dir)) != NULL) {
3985 #ifdef DIRNAMLEN
3986 	    namelen = dp->d_namlen;
3987 #else
3988 	    namelen = strlen(dp->d_name);
3989 #endif
3990 	    /* skip . and .. */
3991 	    if (SV_CWD_ISDOT(dp)) {
3992 		continue;
3993 	    }
3994 
3995 	    if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
3996 		SV_CWD_RETURN_UNDEF;
3997 	    }
3998 
3999 	    tdev = statbuf.st_dev;
4000 	    tino = statbuf.st_ino;
4001 	    if (tino == oino && tdev == odev) {
4002 		break;
4003 	    }
4004 	}
4005 
4006 	if (!dp) {
4007 	    SV_CWD_RETURN_UNDEF;
4008 	}
4009 
4010 	if (pathlen + namelen + 1 >= MAXPATHLEN) {
4011 	    SV_CWD_RETURN_UNDEF;
4012 	}
4013 
4014 	SvGROW(sv, pathlen + namelen + 1);
4015 
4016 	if (pathlen) {
4017 	    /* shift down */
4018 	    Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
4019 	}
4020 
4021 	/* prepend current directory to the front */
4022 	*SvPVX(sv) = '/';
4023 	Move(dp->d_name, SvPVX(sv)+1, namelen, char);
4024 	pathlen += (namelen + 1);
4025 
4026 #ifdef VOID_CLOSEDIR
4027 	PerlDir_close(dir);
4028 #else
4029 	if (PerlDir_close(dir) < 0) {
4030 	    SV_CWD_RETURN_UNDEF;
4031 	}
4032 #endif
4033     }
4034 
4035     if (pathlen) {
4036 	SvCUR_set(sv, pathlen);
4037 	*SvEND(sv) = '\0';
4038 	SvPOK_only(sv);
4039 
4040 	if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
4041 	    SV_CWD_RETURN_UNDEF;
4042 	}
4043     }
4044     if (PerlLIO_stat(".", &statbuf) < 0) {
4045 	SV_CWD_RETURN_UNDEF;
4046     }
4047 
4048     cdev = statbuf.st_dev;
4049     cino = statbuf.st_ino;
4050 
4051     if (cdev != orig_cdev || cino != orig_cino) {
4052 	Perl_croak(aTHX_ "Unstable directory path, "
4053 		   "current directory changed unexpectedly");
4054     }
4055 
4056     return TRUE;
4057 #endif
4058 
4059 #else
4060     return FALSE;
4061 #endif
4062 }
4063 
4064 #include "vutil.c"
4065 
4066 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
4067 #   define EMULATE_SOCKETPAIR_UDP
4068 #endif
4069 
4070 #ifdef EMULATE_SOCKETPAIR_UDP
4071 static int
4072 S_socketpair_udp (int fd[2]) {
4073     dTHX;
4074     /* Fake a datagram socketpair using UDP to localhost.  */
4075     int sockets[2] = {-1, -1};
4076     struct sockaddr_in addresses[2];
4077     int i;
4078     Sock_size_t size = sizeof(struct sockaddr_in);
4079     unsigned short port;
4080     int got;
4081 
4082     memset(&addresses, 0, sizeof(addresses));
4083     i = 1;
4084     do {
4085 	sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
4086 	if (sockets[i] == -1)
4087 	    goto tidy_up_and_fail;
4088 
4089 	addresses[i].sin_family = AF_INET;
4090 	addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4091 	addresses[i].sin_port = 0;	/* kernel choses port.  */
4092 	if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
4093 		sizeof(struct sockaddr_in)) == -1)
4094 	    goto tidy_up_and_fail;
4095     } while (i--);
4096 
4097     /* Now have 2 UDP sockets. Find out which port each is connected to, and
4098        for each connect the other socket to it.  */
4099     i = 1;
4100     do {
4101 	if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
4102 		&size) == -1)
4103 	    goto tidy_up_and_fail;
4104 	if (size != sizeof(struct sockaddr_in))
4105 	    goto abort_tidy_up_and_fail;
4106 	/* !1 is 0, !0 is 1 */
4107 	if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
4108 		sizeof(struct sockaddr_in)) == -1)
4109 	    goto tidy_up_and_fail;
4110     } while (i--);
4111 
4112     /* Now we have 2 sockets connected to each other. I don't trust some other
4113        process not to have already sent a packet to us (by random) so send
4114        a packet from each to the other.  */
4115     i = 1;
4116     do {
4117 	/* I'm going to send my own port number.  As a short.
4118 	   (Who knows if someone somewhere has sin_port as a bitfield and needs
4119 	   this routine. (I'm assuming crays have socketpair)) */
4120 	port = addresses[i].sin_port;
4121 	got = PerlLIO_write(sockets[i], &port, sizeof(port));
4122 	if (got != sizeof(port)) {
4123 	    if (got == -1)
4124 		goto tidy_up_and_fail;
4125 	    goto abort_tidy_up_and_fail;
4126 	}
4127     } while (i--);
4128 
4129     /* Packets sent. I don't trust them to have arrived though.
4130        (As I understand it Solaris TCP stack is multithreaded. Non-blocking
4131        connect to localhost will use a second kernel thread. In 2.6 the
4132        first thread running the connect() returns before the second completes,
4133        so EINPROGRESS> In 2.7 the improved stack is faster and connect()
4134        returns 0. Poor programs have tripped up. One poor program's authors'
4135        had a 50-1 reverse stock split. Not sure how connected these were.)
4136        So I don't trust someone not to have an unpredictable UDP stack.
4137     */
4138 
4139     {
4140 	struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
4141 	int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
4142 	fd_set rset;
4143 
4144 	FD_ZERO(&rset);
4145 	FD_SET((unsigned int)sockets[0], &rset);
4146 	FD_SET((unsigned int)sockets[1], &rset);
4147 
4148 	got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
4149 	if (got != 2 || !FD_ISSET(sockets[0], &rset)
4150 		|| !FD_ISSET(sockets[1], &rset)) {
4151 	    /* I hope this is portable and appropriate.  */
4152 	    if (got == -1)
4153 		goto tidy_up_and_fail;
4154 	    goto abort_tidy_up_and_fail;
4155 	}
4156     }
4157 
4158     /* And the paranoia department even now doesn't trust it to have arrive
4159        (hence MSG_DONTWAIT). Or that what arrives was sent by us.  */
4160     {
4161 	struct sockaddr_in readfrom;
4162 	unsigned short buffer[2];
4163 
4164 	i = 1;
4165 	do {
4166 #ifdef MSG_DONTWAIT
4167 	    got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4168 		    sizeof(buffer), MSG_DONTWAIT,
4169 		    (struct sockaddr *) &readfrom, &size);
4170 #else
4171 	    got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4172 		    sizeof(buffer), 0,
4173 		    (struct sockaddr *) &readfrom, &size);
4174 #endif
4175 
4176 	    if (got == -1)
4177 		goto tidy_up_and_fail;
4178 	    if (got != sizeof(port)
4179 		    || size != sizeof(struct sockaddr_in)
4180 		    /* Check other socket sent us its port.  */
4181 		    || buffer[0] != (unsigned short) addresses[!i].sin_port
4182 		    /* Check kernel says we got the datagram from that socket */
4183 		    || readfrom.sin_family != addresses[!i].sin_family
4184 		    || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
4185 		    || readfrom.sin_port != addresses[!i].sin_port)
4186 		goto abort_tidy_up_and_fail;
4187 	} while (i--);
4188     }
4189     /* My caller (my_socketpair) has validated that this is non-NULL  */
4190     fd[0] = sockets[0];
4191     fd[1] = sockets[1];
4192     /* I hereby declare this connection open.  May God bless all who cross
4193        her.  */
4194     return 0;
4195 
4196   abort_tidy_up_and_fail:
4197     errno = ECONNABORTED;
4198   tidy_up_and_fail:
4199     {
4200 	dSAVE_ERRNO;
4201 	if (sockets[0] != -1)
4202 	    PerlLIO_close(sockets[0]);
4203 	if (sockets[1] != -1)
4204 	    PerlLIO_close(sockets[1]);
4205 	RESTORE_ERRNO;
4206 	return -1;
4207     }
4208 }
4209 #endif /*  EMULATE_SOCKETPAIR_UDP */
4210 
4211 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
4212 int
4213 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4214     /* Stevens says that family must be AF_LOCAL, protocol 0.
4215        I'm going to enforce that, then ignore it, and use TCP (or UDP).  */
4216     dTHXa(NULL);
4217     int listener = -1;
4218     int connector = -1;
4219     int acceptor = -1;
4220     struct sockaddr_in listen_addr;
4221     struct sockaddr_in connect_addr;
4222     Sock_size_t size;
4223 
4224     if (protocol
4225 #ifdef AF_UNIX
4226 	|| family != AF_UNIX
4227 #endif
4228     ) {
4229 	errno = EAFNOSUPPORT;
4230 	return -1;
4231     }
4232     if (!fd) {
4233 	errno = EINVAL;
4234 	return -1;
4235     }
4236 
4237 #ifdef SOCK_CLOEXEC
4238     type &= ~SOCK_CLOEXEC;
4239 #endif
4240 
4241 #ifdef EMULATE_SOCKETPAIR_UDP
4242     if (type == SOCK_DGRAM)
4243 	return S_socketpair_udp(fd);
4244 #endif
4245 
4246     aTHXa(PERL_GET_THX);
4247     listener = PerlSock_socket(AF_INET, type, 0);
4248     if (listener == -1)
4249 	return -1;
4250     memset(&listen_addr, 0, sizeof(listen_addr));
4251     listen_addr.sin_family = AF_INET;
4252     listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4253     listen_addr.sin_port = 0;	/* kernel choses port.  */
4254     if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
4255 	    sizeof(listen_addr)) == -1)
4256 	goto tidy_up_and_fail;
4257     if (PerlSock_listen(listener, 1) == -1)
4258 	goto tidy_up_and_fail;
4259 
4260     connector = PerlSock_socket(AF_INET, type, 0);
4261     if (connector == -1)
4262 	goto tidy_up_and_fail;
4263     /* We want to find out the port number to connect to.  */
4264     size = sizeof(connect_addr);
4265     if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
4266 	    &size) == -1)
4267 	goto tidy_up_and_fail;
4268     if (size != sizeof(connect_addr))
4269 	goto abort_tidy_up_and_fail;
4270     if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
4271 	    sizeof(connect_addr)) == -1)
4272 	goto tidy_up_and_fail;
4273 
4274     size = sizeof(listen_addr);
4275     acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
4276 	    &size);
4277     if (acceptor == -1)
4278 	goto tidy_up_and_fail;
4279     if (size != sizeof(listen_addr))
4280 	goto abort_tidy_up_and_fail;
4281     PerlLIO_close(listener);
4282     /* Now check we are talking to ourself by matching port and host on the
4283        two sockets.  */
4284     if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
4285 	    &size) == -1)
4286 	goto tidy_up_and_fail;
4287     if (size != sizeof(connect_addr)
4288 	    || listen_addr.sin_family != connect_addr.sin_family
4289 	    || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
4290 	    || listen_addr.sin_port != connect_addr.sin_port) {
4291 	goto abort_tidy_up_and_fail;
4292     }
4293     fd[0] = connector;
4294     fd[1] = acceptor;
4295     return 0;
4296 
4297   abort_tidy_up_and_fail:
4298 #ifdef ECONNABORTED
4299   errno = ECONNABORTED;	/* This would be the standard thing to do. */
4300 #elif defined(ECONNREFUSED)
4301   errno = ECONNREFUSED;	/* E.g. Symbian does not have ECONNABORTED. */
4302 #else
4303   errno = ETIMEDOUT;	/* Desperation time. */
4304 #endif
4305   tidy_up_and_fail:
4306     {
4307 	dSAVE_ERRNO;
4308 	if (listener != -1)
4309 	    PerlLIO_close(listener);
4310 	if (connector != -1)
4311 	    PerlLIO_close(connector);
4312 	if (acceptor != -1)
4313 	    PerlLIO_close(acceptor);
4314 	RESTORE_ERRNO;
4315 	return -1;
4316     }
4317 }
4318 #else
4319 /* In any case have a stub so that there's code corresponding
4320  * to the my_socketpair in embed.fnc. */
4321 int
4322 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4323 #ifdef HAS_SOCKETPAIR
4324     return socketpair(family, type, protocol, fd);
4325 #else
4326     return -1;
4327 #endif
4328 }
4329 #endif
4330 
4331 /*
4332 
4333 =for apidoc sv_nosharing
4334 
4335 Dummy routine which "shares" an SV when there is no sharing module present.
4336 Or "locks" it.  Or "unlocks" it.  In other
4337 words, ignores its single SV argument.
4338 Exists to avoid test for a C<NULL> function pointer and because it could
4339 potentially warn under some level of strict-ness.
4340 
4341 =cut
4342 */
4343 
4344 void
4345 Perl_sv_nosharing(pTHX_ SV *sv)
4346 {
4347     PERL_UNUSED_CONTEXT;
4348     PERL_UNUSED_ARG(sv);
4349 }
4350 
4351 /*
4352 
4353 =for apidoc sv_destroyable
4354 
4355 Dummy routine which reports that object can be destroyed when there is no
4356 sharing module present.  It ignores its single SV argument, and returns
4357 'true'.  Exists to avoid test for a C<NULL> function pointer and because it
4358 could potentially warn under some level of strict-ness.
4359 
4360 =cut
4361 */
4362 
4363 bool
4364 Perl_sv_destroyable(pTHX_ SV *sv)
4365 {
4366     PERL_UNUSED_CONTEXT;
4367     PERL_UNUSED_ARG(sv);
4368     return TRUE;
4369 }
4370 
4371 U32
4372 Perl_parse_unicode_opts(pTHX_ const char **popt)
4373 {
4374   const char *p = *popt;
4375   U32 opt = 0;
4376 
4377   PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS;
4378 
4379   if (*p) {
4380        if (isDIGIT(*p)) {
4381             const char* endptr = p + strlen(p);
4382             UV uv;
4383             if (grok_atoUV(p, &uv, &endptr) && uv <= U32_MAX) {
4384                 opt = (U32)uv;
4385                 p = endptr;
4386                 if (p && *p && *p != '\n' && *p != '\r') {
4387                     if (isSPACE(*p))
4388                         goto the_end_of_the_opts_parser;
4389                     else
4390                         Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
4391                 }
4392             }
4393             else {
4394                 Perl_croak(aTHX_ "Invalid number '%s' for -C option.\n", p);
4395             }
4396         }
4397         else {
4398 	    for (; *p; p++) {
4399 		 switch (*p) {
4400 		 case PERL_UNICODE_STDIN:
4401 		      opt |= PERL_UNICODE_STDIN_FLAG;	break;
4402 		 case PERL_UNICODE_STDOUT:
4403 		      opt |= PERL_UNICODE_STDOUT_FLAG;	break;
4404 		 case PERL_UNICODE_STDERR:
4405 		      opt |= PERL_UNICODE_STDERR_FLAG;	break;
4406 		 case PERL_UNICODE_STD:
4407 		      opt |= PERL_UNICODE_STD_FLAG;    	break;
4408 		 case PERL_UNICODE_IN:
4409 		      opt |= PERL_UNICODE_IN_FLAG;	break;
4410 		 case PERL_UNICODE_OUT:
4411 		      opt |= PERL_UNICODE_OUT_FLAG;	break;
4412 		 case PERL_UNICODE_INOUT:
4413 		      opt |= PERL_UNICODE_INOUT_FLAG;	break;
4414 		 case PERL_UNICODE_LOCALE:
4415 		      opt |= PERL_UNICODE_LOCALE_FLAG;	break;
4416 		 case PERL_UNICODE_ARGV:
4417 		      opt |= PERL_UNICODE_ARGV_FLAG;	break;
4418 		 case PERL_UNICODE_UTF8CACHEASSERT:
4419 		      opt |= PERL_UNICODE_UTF8CACHEASSERT_FLAG; break;
4420 		 default:
4421 		      if (*p != '\n' && *p != '\r') {
4422 			if(isSPACE(*p)) goto the_end_of_the_opts_parser;
4423 			else
4424 			  Perl_croak(aTHX_
4425 				     "Unknown Unicode option letter '%c'", *p);
4426 		      }
4427 		 }
4428 	    }
4429        }
4430   }
4431   else
4432        opt = PERL_UNICODE_DEFAULT_FLAGS;
4433 
4434   the_end_of_the_opts_parser:
4435 
4436   if (opt & ~PERL_UNICODE_ALL_FLAGS)
4437        Perl_croak(aTHX_ "Unknown Unicode option value %" UVuf,
4438 		  (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
4439 
4440   *popt = p;
4441 
4442   return opt;
4443 }
4444 
4445 #ifdef VMS
4446 #  include <starlet.h>
4447 #endif
4448 
4449 U32
4450 Perl_seed(pTHX)
4451 {
4452 #if defined(__OpenBSD__)
4453 	return arc4random();
4454 #else
4455     /*
4456      * This is really just a quick hack which grabs various garbage
4457      * values.  It really should be a real hash algorithm which
4458      * spreads the effect of every input bit onto every output bit,
4459      * if someone who knows about such things would bother to write it.
4460      * Might be a good idea to add that function to CORE as well.
4461      * No numbers below come from careful analysis or anything here,
4462      * except they are primes and SEED_C1 > 1E6 to get a full-width
4463      * value from (tv_sec * SEED_C1 + tv_usec).  The multipliers should
4464      * probably be bigger too.
4465      */
4466 #if RANDBITS > 16
4467 #  define SEED_C1	1000003
4468 #define   SEED_C4	73819
4469 #else
4470 #  define SEED_C1	25747
4471 #define   SEED_C4	20639
4472 #endif
4473 #define   SEED_C2	3
4474 #define   SEED_C3	269
4475 #define   SEED_C5	26107
4476 
4477 #ifndef PERL_NO_DEV_RANDOM
4478     int fd;
4479 #endif
4480     U32 u;
4481 #ifdef HAS_GETTIMEOFDAY
4482     struct timeval when;
4483 #else
4484     Time_t when;
4485 #endif
4486 
4487 /* This test is an escape hatch, this symbol isn't set by Configure. */
4488 #ifndef PERL_NO_DEV_RANDOM
4489 #ifndef PERL_RANDOM_DEVICE
4490    /* /dev/random isn't used by default because reads from it will block
4491     * if there isn't enough entropy available.  You can compile with
4492     * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
4493     * is enough real entropy to fill the seed. */
4494 #  ifdef __amigaos4__
4495 #    define PERL_RANDOM_DEVICE "RANDOM:SIZE=4"
4496 #  else
4497 #    define PERL_RANDOM_DEVICE "/dev/urandom"
4498 #  endif
4499 #endif
4500     fd = PerlLIO_open_cloexec(PERL_RANDOM_DEVICE, 0);
4501     if (fd != -1) {
4502     	if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u)
4503 	    u = 0;
4504 	PerlLIO_close(fd);
4505 	if (u)
4506 	    return u;
4507     }
4508 #endif
4509 
4510 #ifdef HAS_GETTIMEOFDAY
4511     PerlProc_gettimeofday(&when,NULL);
4512     u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
4513 #else
4514     (void)time(&when);
4515     u = (U32)SEED_C1 * when;
4516 #endif
4517     u += SEED_C3 * (U32)PerlProc_getpid();
4518     u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
4519 #ifndef PLAN9           /* XXX Plan9 assembler chokes on this; fix needed  */
4520     u += SEED_C5 * (U32)PTR2UV(&when);
4521 #endif
4522     return u;
4523 #endif
4524 }
4525 
4526 void
4527 Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer)
4528 {
4529 #ifndef NO_PERL_HASH_ENV
4530     const char *env_pv;
4531 #endif
4532     unsigned long i;
4533 
4534     PERL_ARGS_ASSERT_GET_HASH_SEED;
4535 
4536 #ifndef NO_PERL_HASH_ENV
4537     env_pv= PerlEnv_getenv("PERL_HASH_SEED");
4538 
4539     if ( env_pv )
4540     {
4541         /* ignore leading spaces */
4542         while (isSPACE(*env_pv))
4543             env_pv++;
4544 #    ifdef USE_PERL_PERTURB_KEYS
4545         /* if they set it to "0" we disable key traversal randomization completely */
4546         if (strEQ(env_pv,"0")) {
4547             PL_hash_rand_bits_enabled= 0;
4548         } else {
4549             /* otherwise switch to deterministic mode */
4550             PL_hash_rand_bits_enabled= 2;
4551         }
4552 #    endif
4553         /* ignore a leading 0x... if it is there */
4554         if (env_pv[0] == '0' && env_pv[1] == 'x')
4555             env_pv += 2;
4556 
4557         for( i = 0; isXDIGIT(*env_pv) && i < PERL_HASH_SEED_BYTES; i++ ) {
4558             seed_buffer[i] = READ_XDIGIT(env_pv) << 4;
4559             if ( isXDIGIT(*env_pv)) {
4560                 seed_buffer[i] |= READ_XDIGIT(env_pv);
4561             }
4562         }
4563         while (isSPACE(*env_pv))
4564             env_pv++;
4565 
4566         if (*env_pv && !isXDIGIT(*env_pv)) {
4567             Perl_warn(aTHX_ "perl: warning: Non hex character in '$ENV{PERL_HASH_SEED}', seed only partially set\n");
4568         }
4569         /* should we check for unparsed crap? */
4570         /* should we warn about unused hex? */
4571         /* should we warn about insufficient hex? */
4572     }
4573     else
4574 #endif /* NO_PERL_HASH_ENV */
4575     {
4576         for( i = 0; i < PERL_HASH_SEED_BYTES; i++ ) {
4577             seed_buffer[i] = (unsigned char)(Perl_internal_drand48() * (U8_MAX+1));
4578         }
4579     }
4580 #ifdef USE_PERL_PERTURB_KEYS
4581     {   /* initialize PL_hash_rand_bits from the hash seed.
4582          * This value is highly volatile, it is updated every
4583          * hash insert, and is used as part of hash bucket chain
4584          * randomization and hash iterator randomization. */
4585         PL_hash_rand_bits= 0xbe49d17f; /* I just picked a number */
4586         for( i = 0; i < sizeof(UV) ; i++ ) {
4587             PL_hash_rand_bits += seed_buffer[i % PERL_HASH_SEED_BYTES];
4588             PL_hash_rand_bits = ROTL_UV(PL_hash_rand_bits,8);
4589         }
4590     }
4591 #  ifndef NO_PERL_HASH_ENV
4592     env_pv= PerlEnv_getenv("PERL_PERTURB_KEYS");
4593     if (env_pv) {
4594         if (strEQ(env_pv,"0") || strEQ(env_pv,"NO")) {
4595             PL_hash_rand_bits_enabled= 0;
4596         } else if (strEQ(env_pv,"1") || strEQ(env_pv,"RANDOM")) {
4597             PL_hash_rand_bits_enabled= 1;
4598         } else if (strEQ(env_pv,"2") || strEQ(env_pv,"DETERMINISTIC")) {
4599             PL_hash_rand_bits_enabled= 2;
4600         } else {
4601             Perl_warn(aTHX_ "perl: warning: strange setting in '$ENV{PERL_PERTURB_KEYS}': '%s'\n", env_pv);
4602         }
4603     }
4604 #  endif
4605 #endif
4606 }
4607 
4608 #ifdef PERL_GLOBAL_STRUCT
4609 
4610 #define PERL_GLOBAL_STRUCT_INIT
4611 #include "opcode.h" /* the ppaddr and check */
4612 
4613 struct perl_vars *
4614 Perl_init_global_struct(pTHX)
4615 {
4616     struct perl_vars *plvarsp = NULL;
4617 # ifdef PERL_GLOBAL_STRUCT
4618     const IV nppaddr = C_ARRAY_LENGTH(Gppaddr);
4619     const IV ncheck  = C_ARRAY_LENGTH(Gcheck);
4620     PERL_UNUSED_CONTEXT;
4621 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
4622     /* PerlMem_malloc() because can't use even safesysmalloc() this early. */
4623     plvarsp = (struct perl_vars*)PerlMem_malloc(sizeof(struct perl_vars));
4624     if (!plvarsp)
4625         exit(1);
4626 #  else
4627     plvarsp = PL_VarsPtr;
4628 #  endif /* PERL_GLOBAL_STRUCT_PRIVATE */
4629 #  undef PERLVAR
4630 #  undef PERLVARA
4631 #  undef PERLVARI
4632 #  undef PERLVARIC
4633 #  define PERLVAR(prefix,var,type) /**/
4634 #  define PERLVARA(prefix,var,n,type) /**/
4635 #  define PERLVARI(prefix,var,type,init) plvarsp->prefix##var = init;
4636 #  define PERLVARIC(prefix,var,type,init) plvarsp->prefix##var = init;
4637 #  include "perlvars.h"
4638 #  undef PERLVAR
4639 #  undef PERLVARA
4640 #  undef PERLVARI
4641 #  undef PERLVARIC
4642 #  ifdef PERL_GLOBAL_STRUCT
4643     plvarsp->Gppaddr =
4644 	(Perl_ppaddr_t*)
4645 	PerlMem_malloc(nppaddr * sizeof(Perl_ppaddr_t));
4646     if (!plvarsp->Gppaddr)
4647         exit(1);
4648     plvarsp->Gcheck  =
4649 	(Perl_check_t*)
4650 	PerlMem_malloc(ncheck  * sizeof(Perl_check_t));
4651     if (!plvarsp->Gcheck)
4652         exit(1);
4653     Copy(Gppaddr, plvarsp->Gppaddr, nppaddr, Perl_ppaddr_t);
4654     Copy(Gcheck,  plvarsp->Gcheck,  ncheck,  Perl_check_t);
4655 #  endif
4656 #  ifdef PERL_SET_VARS
4657     PERL_SET_VARS(plvarsp);
4658 #  endif
4659 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
4660     plvarsp->Gsv_placeholder.sv_flags = 0;
4661     memset(plvarsp->Ghash_seed, 0, sizeof(plvarsp->Ghash_seed));
4662 #  endif
4663 # undef PERL_GLOBAL_STRUCT_INIT
4664 # endif
4665     return plvarsp;
4666 }
4667 
4668 #endif /* PERL_GLOBAL_STRUCT */
4669 
4670 #ifdef PERL_GLOBAL_STRUCT
4671 
4672 void
4673 Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp)
4674 {
4675     int veto = plvarsp->Gveto_cleanup;
4676 
4677     PERL_ARGS_ASSERT_FREE_GLOBAL_STRUCT;
4678     PERL_UNUSED_CONTEXT;
4679 # ifdef PERL_GLOBAL_STRUCT
4680 #  ifdef PERL_UNSET_VARS
4681     PERL_UNSET_VARS(plvarsp);
4682 #  endif
4683     if (veto)
4684         return;
4685     free(plvarsp->Gppaddr);
4686     free(plvarsp->Gcheck);
4687 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
4688     free(plvarsp);
4689 #  endif
4690 # endif
4691 }
4692 
4693 #endif /* PERL_GLOBAL_STRUCT */
4694 
4695 #ifdef PERL_MEM_LOG
4696 
4697 /* -DPERL_MEM_LOG: the Perl_mem_log_..() is compiled, including
4698  * the default implementation, unless -DPERL_MEM_LOG_NOIMPL is also
4699  * given, and you supply your own implementation.
4700  *
4701  * The default implementation reads a single env var, PERL_MEM_LOG,
4702  * expecting one or more of the following:
4703  *
4704  *    \d+ - fd		fd to write to		: must be 1st (grok_atoUV)
4705  *    'm' - memlog	was PERL_MEM_LOG=1
4706  *    's' - svlog	was PERL_SV_LOG=1
4707  *    't' - timestamp	was PERL_MEM_LOG_TIMESTAMP=1
4708  *
4709  * This makes the logger controllable enough that it can reasonably be
4710  * added to the system perl.
4711  */
4712 
4713 /* -DPERL_MEM_LOG_SPRINTF_BUF_SIZE=X: size of a (stack-allocated) buffer
4714  * the Perl_mem_log_...() will use (either via sprintf or snprintf).
4715  */
4716 #define PERL_MEM_LOG_SPRINTF_BUF_SIZE 128
4717 
4718 /* -DPERL_MEM_LOG_FD=N: the file descriptor the Perl_mem_log_...()
4719  * writes to.  In the default logger, this is settable at runtime.
4720  */
4721 #ifndef PERL_MEM_LOG_FD
4722 #  define PERL_MEM_LOG_FD 2 /* If STDERR is too boring for you. */
4723 #endif
4724 
4725 #ifndef PERL_MEM_LOG_NOIMPL
4726 
4727 # ifdef DEBUG_LEAKING_SCALARS
4728 #   define SV_LOG_SERIAL_FMT	    " [%lu]"
4729 #   define _SV_LOG_SERIAL_ARG(sv)   , (unsigned long) (sv)->sv_debug_serial
4730 # else
4731 #   define SV_LOG_SERIAL_FMT
4732 #   define _SV_LOG_SERIAL_ARG(sv)
4733 # endif
4734 
4735 static void
4736 S_mem_log_common(enum mem_log_type mlt, const UV n,
4737 		 const UV typesize, const char *type_name, const SV *sv,
4738 		 Malloc_t oldalloc, Malloc_t newalloc,
4739 		 const char *filename, const int linenumber,
4740 		 const char *funcname)
4741 {
4742     const char *pmlenv;
4743 
4744     PERL_ARGS_ASSERT_MEM_LOG_COMMON;
4745 
4746     pmlenv = PerlEnv_getenv("PERL_MEM_LOG");
4747     if (!pmlenv)
4748 	return;
4749     if (mlt < MLT_NEW_SV ? strchr(pmlenv,'m') : strchr(pmlenv,'s'))
4750     {
4751 	/* We can't use SVs or PerlIO for obvious reasons,
4752 	 * so we'll use stdio and low-level IO instead. */
4753 	char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
4754 
4755 #   ifdef HAS_GETTIMEOFDAY
4756 #     define MEM_LOG_TIME_FMT	"%10d.%06d: "
4757 #     define MEM_LOG_TIME_ARG	(int)tv.tv_sec, (int)tv.tv_usec
4758 	struct timeval tv;
4759 	gettimeofday(&tv, 0);
4760 #   else
4761 #     define MEM_LOG_TIME_FMT	"%10d: "
4762 #     define MEM_LOG_TIME_ARG	(int)when
4763         Time_t when;
4764         (void)time(&when);
4765 #   endif
4766 	/* If there are other OS specific ways of hires time than
4767 	 * gettimeofday() (see dist/Time-HiRes), the easiest way is
4768 	 * probably that they would be used to fill in the struct
4769 	 * timeval. */
4770 	{
4771 	    STRLEN len;
4772             const char* endptr = pmlenv + strlen(pmlenv);
4773 	    int fd;
4774             UV uv;
4775             if (grok_atoUV(pmlenv, &uv, &endptr) /* Ignore endptr. */
4776                 && uv && uv <= PERL_INT_MAX
4777             ) {
4778                 fd = (int)uv;
4779             } else {
4780 		fd = PERL_MEM_LOG_FD;
4781             }
4782 
4783 	    if (strchr(pmlenv, 't')) {
4784 		len = my_snprintf(buf, sizeof(buf),
4785 				MEM_LOG_TIME_FMT, MEM_LOG_TIME_ARG);
4786 		PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
4787 	    }
4788 	    switch (mlt) {
4789 	    case MLT_ALLOC:
4790 		len = my_snprintf(buf, sizeof(buf),
4791 			"alloc: %s:%d:%s: %" IVdf " %" UVuf
4792 			" %s = %" IVdf ": %" UVxf "\n",
4793 			filename, linenumber, funcname, n, typesize,
4794 			type_name, n * typesize, PTR2UV(newalloc));
4795 		break;
4796 	    case MLT_REALLOC:
4797 		len = my_snprintf(buf, sizeof(buf),
4798 			"realloc: %s:%d:%s: %" IVdf " %" UVuf
4799 			" %s = %" IVdf ": %" UVxf " -> %" UVxf "\n",
4800 			filename, linenumber, funcname, n, typesize,
4801 			type_name, n * typesize, PTR2UV(oldalloc),
4802 			PTR2UV(newalloc));
4803 		break;
4804 	    case MLT_FREE:
4805 		len = my_snprintf(buf, sizeof(buf),
4806 			"free: %s:%d:%s: %" UVxf "\n",
4807 			filename, linenumber, funcname,
4808 			PTR2UV(oldalloc));
4809 		break;
4810 	    case MLT_NEW_SV:
4811 	    case MLT_DEL_SV:
4812 		len = my_snprintf(buf, sizeof(buf),
4813 			"%s_SV: %s:%d:%s: %" UVxf SV_LOG_SERIAL_FMT "\n",
4814 			mlt == MLT_NEW_SV ? "new" : "del",
4815 			filename, linenumber, funcname,
4816 			PTR2UV(sv) _SV_LOG_SERIAL_ARG(sv));
4817 		break;
4818 	    default:
4819 		len = 0;
4820 	    }
4821 	    PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
4822 	}
4823     }
4824 }
4825 #endif /* !PERL_MEM_LOG_NOIMPL */
4826 
4827 #ifndef PERL_MEM_LOG_NOIMPL
4828 # define \
4829     mem_log_common_if(alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm) \
4830     mem_log_common   (alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm)
4831 #else
4832 /* this is suboptimal, but bug compatible.  User is providing their
4833    own implementation, but is getting these functions anyway, and they
4834    do nothing. But _NOIMPL users should be able to cope or fix */
4835 # define \
4836     mem_log_common_if(alty, num, tysz, tynm, u, oal, nal, flnm, ln, fnnm) \
4837     /* mem_log_common_if_PERL_MEM_LOG_NOIMPL */
4838 #endif
4839 
4840 Malloc_t
4841 Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name,
4842 		   Malloc_t newalloc,
4843 		   const char *filename, const int linenumber,
4844 		   const char *funcname)
4845 {
4846     PERL_ARGS_ASSERT_MEM_LOG_ALLOC;
4847 
4848     mem_log_common_if(MLT_ALLOC, n, typesize, type_name,
4849 		      NULL, NULL, newalloc,
4850 		      filename, linenumber, funcname);
4851     return newalloc;
4852 }
4853 
4854 Malloc_t
4855 Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name,
4856 		     Malloc_t oldalloc, Malloc_t newalloc,
4857 		     const char *filename, const int linenumber,
4858 		     const char *funcname)
4859 {
4860     PERL_ARGS_ASSERT_MEM_LOG_REALLOC;
4861 
4862     mem_log_common_if(MLT_REALLOC, n, typesize, type_name,
4863 		      NULL, oldalloc, newalloc,
4864 		      filename, linenumber, funcname);
4865     return newalloc;
4866 }
4867 
4868 Malloc_t
4869 Perl_mem_log_free(Malloc_t oldalloc,
4870 		  const char *filename, const int linenumber,
4871 		  const char *funcname)
4872 {
4873     PERL_ARGS_ASSERT_MEM_LOG_FREE;
4874 
4875     mem_log_common_if(MLT_FREE, 0, 0, "", NULL, oldalloc, NULL,
4876 		      filename, linenumber, funcname);
4877     return oldalloc;
4878 }
4879 
4880 void
4881 Perl_mem_log_new_sv(const SV *sv,
4882 		    const char *filename, const int linenumber,
4883 		    const char *funcname)
4884 {
4885     mem_log_common_if(MLT_NEW_SV, 0, 0, "", sv, NULL, NULL,
4886 		      filename, linenumber, funcname);
4887 }
4888 
4889 void
4890 Perl_mem_log_del_sv(const SV *sv,
4891 		    const char *filename, const int linenumber,
4892 		    const char *funcname)
4893 {
4894     mem_log_common_if(MLT_DEL_SV, 0, 0, "", sv, NULL, NULL,
4895 		      filename, linenumber, funcname);
4896 }
4897 
4898 #endif /* PERL_MEM_LOG */
4899 
4900 /*
4901 =for apidoc quadmath_format_single
4902 
4903 C<quadmath_snprintf()> is very strict about its C<format> string and will
4904 fail, returning -1, if the format is invalid.  It accepts exactly
4905 one format spec.
4906 
4907 C<quadmath_format_single()> checks that the intended single spec looks
4908 sane: begins with C<%>, has only one C<%>, ends with C<[efgaEFGA]>,
4909 and has C<Q> before it.  This is not a full "printf syntax check",
4910 just the basics.
4911 
4912 Returns the format if it is valid, NULL if not.
4913 
4914 C<quadmath_format_single()> can and will actually patch in the missing
4915 C<Q>, if necessary.  In this case it will return the modified copy of
4916 the format, B<which the caller will need to free.>
4917 
4918 See also L</quadmath_format_needed>.
4919 
4920 =cut
4921 */
4922 #ifdef USE_QUADMATH
4923 const char*
4924 Perl_quadmath_format_single(const char* format)
4925 {
4926     STRLEN len;
4927 
4928     PERL_ARGS_ASSERT_QUADMATH_FORMAT_SINGLE;
4929 
4930     if (format[0] != '%' || strchr(format + 1, '%'))
4931         return NULL;
4932     len = strlen(format);
4933     /* minimum length three: %Qg */
4934     if (len < 3 || strchr("efgaEFGA", format[len - 1]) == NULL)
4935         return NULL;
4936     if (format[len - 2] != 'Q') {
4937         char* fixed;
4938         Newx(fixed, len + 1, char);
4939         memcpy(fixed, format, len - 1);
4940         fixed[len - 1] = 'Q';
4941         fixed[len    ] = format[len - 1];
4942         fixed[len + 1] = 0;
4943         return (const char*)fixed;
4944     }
4945     return format;
4946 }
4947 #endif
4948 
4949 /*
4950 =for apidoc quadmath_format_needed
4951 
4952 C<quadmath_format_needed()> returns true if the C<format> string seems to
4953 contain at least one non-Q-prefixed C<%[efgaEFGA]> format specifier,
4954 or returns false otherwise.
4955 
4956 The format specifier detection is not complete printf-syntax detection,
4957 but it should catch most common cases.
4958 
4959 If true is returned, those arguments B<should> in theory be processed
4960 with C<quadmath_snprintf()>, but in case there is more than one such
4961 format specifier (see L</quadmath_format_single>), and if there is
4962 anything else beyond that one (even just a single byte), they
4963 B<cannot> be processed because C<quadmath_snprintf()> is very strict,
4964 accepting only one format spec, and nothing else.
4965 In this case, the code should probably fail.
4966 
4967 =cut
4968 */
4969 #ifdef USE_QUADMATH
4970 bool
4971 Perl_quadmath_format_needed(const char* format)
4972 {
4973   const char *p = format;
4974   const char *q;
4975 
4976   PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED;
4977 
4978   while ((q = strchr(p, '%'))) {
4979     q++;
4980     if (*q == '+') /* plus */
4981       q++;
4982     if (*q == '#') /* alt */
4983       q++;
4984     if (*q == '*') /* width */
4985       q++;
4986     else {
4987       if (isDIGIT(*q)) {
4988         while (isDIGIT(*q)) q++;
4989       }
4990     }
4991     if (*q == '.' && (q[1] == '*' || isDIGIT(q[1]))) { /* prec */
4992       q++;
4993       if (*q == '*')
4994         q++;
4995       else
4996         while (isDIGIT(*q)) q++;
4997     }
4998     if (strchr("efgaEFGA", *q)) /* Would have needed 'Q' in front. */
4999       return TRUE;
5000     p = q + 1;
5001   }
5002   return FALSE;
5003 }
5004 #endif
5005 
5006 /*
5007 =for apidoc my_snprintf
5008 
5009 The C library C<snprintf> functionality, if available and
5010 standards-compliant (uses C<vsnprintf>, actually).  However, if the
5011 C<vsnprintf> is not available, will unfortunately use the unsafe
5012 C<vsprintf> which can overrun the buffer (there is an overrun check,
5013 but that may be too late).  Consider using C<sv_vcatpvf> instead, or
5014 getting C<vsnprintf>.
5015 
5016 =cut
5017 */
5018 int
5019 Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
5020 {
5021     int retval = -1;
5022     va_list ap;
5023     PERL_ARGS_ASSERT_MY_SNPRINTF;
5024 #ifndef HAS_VSNPRINTF
5025     PERL_UNUSED_VAR(len);
5026 #endif
5027     va_start(ap, format);
5028 #ifdef USE_QUADMATH
5029     {
5030         const char* qfmt = quadmath_format_single(format);
5031         bool quadmath_valid = FALSE;
5032         if (qfmt) {
5033             /* If the format looked promising, use it as quadmath. */
5034             retval = quadmath_snprintf(buffer, len, qfmt, va_arg(ap, NV));
5035             if (retval == -1) {
5036                 if (qfmt != format) {
5037                     dTHX;
5038                     SAVEFREEPV(qfmt);
5039                 }
5040                 Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", qfmt);
5041             }
5042             quadmath_valid = TRUE;
5043             if (qfmt != format)
5044                 Safefree(qfmt);
5045             qfmt = NULL;
5046         }
5047         assert(qfmt == NULL);
5048         /* quadmath_format_single() will return false for example for
5049          * "foo = %g", or simply "%g".  We could handle the %g by
5050          * using quadmath for the NV args.  More complex cases of
5051          * course exist: "foo = %g, bar = %g", or "foo=%Qg" (otherwise
5052          * quadmath-valid but has stuff in front).
5053          *
5054          * Handling the "Q-less" cases right would require walking
5055          * through the va_list and rewriting the format, calling
5056          * quadmath for the NVs, building a new va_list, and then
5057          * letting vsnprintf/vsprintf to take care of the other
5058          * arguments.  This may be doable.
5059          *
5060          * We do not attempt that now.  But for paranoia, we here try
5061          * to detect some common (but not all) cases where the
5062          * "Q-less" %[efgaEFGA] formats are present, and die if
5063          * detected.  This doesn't fix the problem, but it stops the
5064          * vsnprintf/vsprintf pulling doubles off the va_list when
5065          * __float128 NVs should be pulled off instead.
5066          *
5067          * If quadmath_format_needed() returns false, we are reasonably
5068          * certain that we can call vnsprintf() or vsprintf() safely. */
5069         if (!quadmath_valid && quadmath_format_needed(format))
5070           Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", format);
5071 
5072     }
5073 #endif
5074     if (retval == -1)
5075 #ifdef HAS_VSNPRINTF
5076         retval = vsnprintf(buffer, len, format, ap);
5077 #else
5078         retval = vsprintf(buffer, format, ap);
5079 #endif
5080     va_end(ap);
5081     /* vsprintf() shows failure with < 0 */
5082     if (retval < 0
5083 #ifdef HAS_VSNPRINTF
5084     /* vsnprintf() shows failure with >= len */
5085         ||
5086         (len > 0 && (Size_t)retval >= len)
5087 #endif
5088     )
5089 	Perl_croak_nocontext("panic: my_snprintf buffer overflow");
5090     return retval;
5091 }
5092 
5093 /*
5094 =for apidoc my_vsnprintf
5095 
5096 The C library C<vsnprintf> if available and standards-compliant.
5097 However, if if the C<vsnprintf> is not available, will unfortunately
5098 use the unsafe C<vsprintf> which can overrun the buffer (there is an
5099 overrun check, but that may be too late).  Consider using
5100 C<sv_vcatpvf> instead, or getting C<vsnprintf>.
5101 
5102 =cut
5103 */
5104 int
5105 Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
5106 {
5107 #ifdef USE_QUADMATH
5108     PERL_UNUSED_ARG(buffer);
5109     PERL_UNUSED_ARG(len);
5110     PERL_UNUSED_ARG(format);
5111     /* the cast is to avoid gcc -Wsizeof-array-argument complaining */
5112     PERL_UNUSED_ARG((void*)ap);
5113     Perl_croak_nocontext("panic: my_vsnprintf not available with quadmath");
5114     return 0;
5115 #else
5116     int retval;
5117 #ifdef NEED_VA_COPY
5118     va_list apc;
5119 
5120     PERL_ARGS_ASSERT_MY_VSNPRINTF;
5121     Perl_va_copy(ap, apc);
5122 # ifdef HAS_VSNPRINTF
5123     retval = vsnprintf(buffer, len, format, apc);
5124 # else
5125     PERL_UNUSED_ARG(len);
5126     retval = vsprintf(buffer, format, apc);
5127 # endif
5128     va_end(apc);
5129 #else
5130 # ifdef HAS_VSNPRINTF
5131     retval = vsnprintf(buffer, len, format, ap);
5132 # else
5133     PERL_UNUSED_ARG(len);
5134     retval = vsprintf(buffer, format, ap);
5135 # endif
5136 #endif /* #ifdef NEED_VA_COPY */
5137     /* vsprintf() shows failure with < 0 */
5138     if (retval < 0
5139 #ifdef HAS_VSNPRINTF
5140     /* vsnprintf() shows failure with >= len */
5141         ||
5142         (len > 0 && (Size_t)retval >= len)
5143 #endif
5144     )
5145 	Perl_croak_nocontext("panic: my_vsnprintf buffer overflow");
5146     return retval;
5147 #endif
5148 }
5149 
5150 void
5151 Perl_my_clearenv(pTHX)
5152 {
5153     dVAR;
5154 #if ! defined(PERL_MICRO)
5155 #  if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
5156     PerlEnv_clearenv();
5157 #  else /* ! (PERL_IMPLICIT_SYS || WIN32) */
5158 #    if defined(USE_ENVIRON_ARRAY)
5159 #      if defined(USE_ITHREADS)
5160     /* only the parent thread can clobber the process environment */
5161     if (PL_curinterp == aTHX)
5162 #      endif /* USE_ITHREADS */
5163     {
5164 #      if ! defined(PERL_USE_SAFE_PUTENV)
5165     if ( !PL_use_safe_putenv) {
5166       I32 i;
5167       if (environ == PL_origenviron)
5168         environ = (char**)safesysmalloc(sizeof(char*));
5169       else
5170         for (i = 0; environ[i]; i++)
5171           (void)safesysfree(environ[i]);
5172     }
5173     environ[0] = NULL;
5174 #      else /* PERL_USE_SAFE_PUTENV */
5175 #        if defined(HAS_CLEARENV)
5176     (void)clearenv();
5177 #        elif defined(HAS_UNSETENV)
5178     int bsiz = 80; /* Most envvar names will be shorter than this. */
5179     char *buf = (char*)safesysmalloc(bsiz);
5180     while (*environ != NULL) {
5181       char *e = strchr(*environ, '=');
5182       int l = e ? e - *environ : (int)strlen(*environ);
5183       if (bsiz < l + 1) {
5184         (void)safesysfree(buf);
5185         bsiz = l + 1; /* + 1 for the \0. */
5186         buf = (char*)safesysmalloc(bsiz);
5187       }
5188       memcpy(buf, *environ, l);
5189       buf[l] = '\0';
5190       (void)unsetenv(buf);
5191     }
5192     (void)safesysfree(buf);
5193 #        else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
5194     /* Just null environ and accept the leakage. */
5195     *environ = NULL;
5196 #        endif /* HAS_CLEARENV || HAS_UNSETENV */
5197 #      endif /* ! PERL_USE_SAFE_PUTENV */
5198     }
5199 #    endif /* USE_ENVIRON_ARRAY */
5200 #  endif /* PERL_IMPLICIT_SYS || WIN32 */
5201 #endif /* PERL_MICRO */
5202 }
5203 
5204 #ifdef PERL_IMPLICIT_CONTEXT
5205 
5206 
5207 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5208 
5209 /* rather than each module having a static var holding its index,
5210  * use a global array of name to index mappings
5211  */
5212 int
5213 Perl_my_cxt_index(pTHX_ const char *my_cxt_key)
5214 {
5215     dVAR;
5216     int index;
5217 
5218     PERL_ARGS_ASSERT_MY_CXT_INDEX;
5219 
5220     for (index = 0; index < PL_my_cxt_index; index++) {
5221 	const char *key = PL_my_cxt_keys[index];
5222 	/* try direct pointer compare first - there are chances to success,
5223 	 * and it's much faster.
5224 	 */
5225 	if ((key == my_cxt_key) || strEQ(key, my_cxt_key))
5226 	    return index;
5227     }
5228     return -1;
5229 }
5230 #  endif
5231 
5232 
5233 /* Implements the MY_CXT_INIT macro. The first time a module is loaded,
5234 the global PL_my_cxt_index is incremented, and that value is assigned to
5235 that module's static my_cxt_index (who's address is passed as an arg).
5236 Then, for each interpreter this function is called for, it makes sure a
5237 void* slot is available to hang the static data off, by allocating or
5238 extending the interpreter's PL_my_cxt_list array */
5239 
5240 void *
5241 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5242 Perl_my_cxt_init(pTHX_ const char *my_cxt_key, size_t size)
5243 #  else
5244 Perl_my_cxt_init(pTHX_ int *indexp, size_t size)
5245 #  endif
5246 {
5247     dVAR;
5248     void *p;
5249     int index;
5250 
5251     PERL_ARGS_ASSERT_MY_CXT_INIT;
5252 
5253 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5254     index = Perl_my_cxt_index(aTHX_ my_cxt_key);
5255 #  else
5256     index = *indexp;
5257 #  endif
5258     /* do initial check without locking.
5259      * -1:    not allocated or another thread currently allocating
5260      *  other: already allocated by another thread
5261      */
5262     if (index == -1) {
5263 	MUTEX_LOCK(&PL_my_ctx_mutex);
5264         /*now a stricter check with locking */
5265 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5266         index = Perl_my_cxt_index(aTHX_ my_cxt_key);
5267 #  else
5268         index = *indexp;
5269 #  endif
5270         if (index == -1)
5271             /* this module hasn't been allocated an index yet */
5272 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5273             index = PL_my_cxt_index++;
5274 
5275         /* Store the index in a global MY_CXT_KEY string to index mapping
5276          * table. This emulates the perl-module static my_cxt_index var on
5277          * builds which don't allow static vars */
5278         if (PL_my_cxt_keys_size <= index) {
5279             int old_size = PL_my_cxt_keys_size;
5280             int i;
5281             if (PL_my_cxt_keys_size) {
5282                 IV new_size = PL_my_cxt_keys_size;
5283                 while (new_size <= index)
5284                     new_size *= 2;
5285                 PL_my_cxt_keys = (const char **)PerlMemShared_realloc(
5286                                         PL_my_cxt_keys,
5287                                         new_size * sizeof(const char *));
5288                 PL_my_cxt_keys_size = new_size;
5289             }
5290             else {
5291                 PL_my_cxt_keys_size = 16;
5292                 PL_my_cxt_keys = (const char **)PerlMemShared_malloc(
5293                             PL_my_cxt_keys_size * sizeof(const char *));
5294             }
5295             for (i = old_size; i < PL_my_cxt_keys_size; i++) {
5296                 PL_my_cxt_keys[i] = 0;
5297             }
5298         }
5299         PL_my_cxt_keys[index] = my_cxt_key;
5300 #  else
5301             *indexp = PL_my_cxt_index++;
5302         index = *indexp;
5303 #  endif
5304 	MUTEX_UNLOCK(&PL_my_ctx_mutex);
5305     }
5306 
5307     /* make sure the array is big enough */
5308     if (PL_my_cxt_size <= index) {
5309 	if (PL_my_cxt_size) {
5310             IV new_size = PL_my_cxt_size;
5311 	    while (new_size <= index)
5312 		new_size *= 2;
5313 	    Renew(PL_my_cxt_list, new_size, void *);
5314             PL_my_cxt_size = new_size;
5315 	}
5316 	else {
5317 	    PL_my_cxt_size = 16;
5318 	    Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
5319 	}
5320     }
5321     /* newSV() allocates one more than needed */
5322     p = (void*)SvPVX(newSV(size-1));
5323     PL_my_cxt_list[index] = p;
5324     Zero(p, size, char);
5325     return p;
5326 }
5327 
5328 #endif /* PERL_IMPLICIT_CONTEXT */
5329 
5330 
5331 /* Perl_xs_handshake():
5332    implement the various XS_*_BOOTCHECK macros, which are added to .c
5333    files by ExtUtils::ParseXS, to check that the perl the module was built
5334    with is binary compatible with the running perl.
5335 
5336    usage:
5337        Perl_xs_handshake(U32 key, void * v_my_perl, const char * file,
5338             [U32 items, U32 ax], [char * api_version], [char * xs_version])
5339 
5340    The meaning of the varargs is determined the U32 key arg (which is not
5341    a format string). The fields of key are assembled by using HS_KEY().
5342 
5343    Under PERL_IMPLICIT_CONTEX, the v_my_perl arg is of type
5344    "PerlInterpreter *" and represents the callers context; otherwise it is
5345    of type "CV *", and is the boot xsub's CV.
5346 
5347    v_my_perl will catch where a threaded future perl526.dll calling IO.dll
5348    for example, and IO.dll was linked with threaded perl524.dll, and both
5349    perl526.dll and perl524.dll are in %PATH and the Win32 DLL loader
5350    successfully can load IO.dll into the process but simultaneously it
5351    loaded an interpreter of a different version into the process, and XS
5352    code will naturally pass SV*s created by perl524.dll for perl526.dll to
5353    use through perl526.dll's my_perl->Istack_base.
5354 
5355    v_my_perl cannot be the first arg, since then 'key' will be out of
5356    place in a threaded vs non-threaded mixup; and analyzing the key
5357    number's bitfields won't reveal the problem, since it will be a valid
5358    key (unthreaded perl) on interp side, but croak will report the XS mod's
5359    key as gibberish (it is really a my_perl ptr) (threaded XS mod); or if
5360    it's a threaded perl and an unthreaded XS module, threaded perl will
5361    look at an uninit C stack or an uninit register to get 'key'
5362    (remember that it assumes that the 1st arg is the interp cxt).
5363 
5364    'file' is the source filename of the caller.
5365 */
5366 
5367 I32
5368 Perl_xs_handshake(const U32 key, void * v_my_perl, const char * file, ...)
5369 {
5370     va_list args;
5371     U32 items, ax;
5372     void * got;
5373     void * need;
5374 #ifdef PERL_IMPLICIT_CONTEXT
5375     dTHX;
5376     tTHX xs_interp;
5377 #else
5378     CV* cv;
5379     SV *** xs_spp;
5380 #endif
5381     PERL_ARGS_ASSERT_XS_HANDSHAKE;
5382     va_start(args, file);
5383 
5384     got = INT2PTR(void*, (UV)(key & HSm_KEY_MATCH));
5385     need = (void *)(HS_KEY(FALSE, FALSE, "", "") & HSm_KEY_MATCH);
5386     if (UNLIKELY(got != need))
5387 	goto bad_handshake;
5388 /* try to catch where a 2nd threaded perl interp DLL is loaded into a process
5389    by a XS DLL compiled against the wrong interl DLL b/c of bad @INC, and the
5390    2nd threaded perl interp DLL never initialized its TLS/PERL_SYS_INIT3 so
5391    dTHX call from 2nd interp DLL can't return the my_perl that pp_entersub
5392    passed to the XS DLL */
5393 #ifdef PERL_IMPLICIT_CONTEXT
5394     xs_interp = (tTHX)v_my_perl;
5395     got = xs_interp;
5396     need = my_perl;
5397 #else
5398 /* try to catch where an unthreaded perl interp DLL (for ex. perl522.dll) is
5399    loaded into a process by a XS DLL built by an unthreaded perl522.dll perl,
5400    but the DynaLoder/Perl that started the process and loaded the XS DLL is
5401    unthreaded perl524.dll, since unthreadeds don't pass my_perl (a unique *)
5402    through pp_entersub, use a unique value (which is a pointer to PL_stack_sp's
5403    location in the unthreaded perl binary) stored in CV * to figure out if this
5404    Perl_xs_handshake was called by the same pp_entersub */
5405     cv = (CV*)v_my_perl;
5406     xs_spp = (SV***)CvHSCXT(cv);
5407     got = xs_spp;
5408     need = &PL_stack_sp;
5409 #endif
5410     if(UNLIKELY(got != need)) {
5411 	bad_handshake:/* recycle branch and string from above */
5412 	if(got != (void *)HSf_NOCHK)
5413 	    noperl_die("%s: loadable library and perl binaries are mismatched"
5414                        " (got handshake key %p, needed %p)\n",
5415 		file, got, need);
5416     }
5417 
5418     if(key & HSf_SETXSUBFN) {     /* this might be called from a module bootstrap */
5419 	SAVEPPTR(PL_xsubfilename);/* which was require'd from a XSUB BEGIN */
5420 	PL_xsubfilename = file;   /* so the old name must be restored for
5421 				     additional XSUBs to register themselves */
5422 	/* XSUBs can't be perl lang/perl5db.pl debugged
5423 	if (PERLDB_LINE_OR_SAVESRC)
5424 	    (void)gv_fetchfile(file); */
5425     }
5426 
5427     if(key & HSf_POPMARK) {
5428 	ax = POPMARK;
5429 	{   SV **mark = PL_stack_base + ax++;
5430 	    {   dSP;
5431 		items = (I32)(SP - MARK);
5432 	    }
5433 	}
5434     } else {
5435 	items = va_arg(args, U32);
5436 	ax = va_arg(args, U32);
5437     }
5438     {
5439 	U32 apiverlen;
5440 	assert(HS_GETAPIVERLEN(key) <= UCHAR_MAX);
5441 	if((apiverlen = HS_GETAPIVERLEN(key))) {
5442 	    char * api_p = va_arg(args, char*);
5443 	    if(apiverlen != sizeof("v" PERL_API_VERSION_STRING)-1
5444 		|| memNE(api_p, "v" PERL_API_VERSION_STRING,
5445 			 sizeof("v" PERL_API_VERSION_STRING)-1))
5446 		Perl_croak_nocontext("Perl API version %s of %" SVf " does not match %s",
5447 				    api_p, SVfARG(PL_stack_base[ax + 0]),
5448 				    "v" PERL_API_VERSION_STRING);
5449 	}
5450     }
5451     {
5452 	U32 xsverlen;
5453 	assert(HS_GETXSVERLEN(key) <= UCHAR_MAX && HS_GETXSVERLEN(key) <= HS_APIVERLEN_MAX);
5454 	if((xsverlen = HS_GETXSVERLEN(key)))
5455 	    S_xs_version_bootcheck(aTHX_
5456 		items, ax, va_arg(args, char*), xsverlen);
5457     }
5458     va_end(args);
5459     return ax;
5460 }
5461 
5462 
5463 STATIC void
5464 S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p,
5465 			  STRLEN xs_len)
5466 {
5467     SV *sv;
5468     const char *vn = NULL;
5469     SV *const module = PL_stack_base[ax];
5470 
5471     PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK;
5472 
5473     if (items >= 2)	 /* version supplied as bootstrap arg */
5474 	sv = PL_stack_base[ax + 1];
5475     else {
5476 	/* XXX GV_ADDWARN */
5477 	vn = "XS_VERSION";
5478 	sv = get_sv(Perl_form(aTHX_ "%" SVf "::%s", SVfARG(module), vn), 0);
5479 	if (!sv || !SvOK(sv)) {
5480 	    vn = "VERSION";
5481 	    sv = get_sv(Perl_form(aTHX_ "%" SVf "::%s", SVfARG(module), vn), 0);
5482 	}
5483     }
5484     if (sv) {
5485 	SV *xssv = Perl_newSVpvn_flags(aTHX_ xs_p, xs_len, SVs_TEMP);
5486 	SV *pmsv = sv_isobject(sv) && sv_derived_from(sv, "version")
5487 	    ? sv : sv_2mortal(new_version(sv));
5488 	xssv = upg_version(xssv, 0);
5489 	if ( vcmp(pmsv,xssv) ) {
5490 	    SV *string = vstringify(xssv);
5491 	    SV *xpt = Perl_newSVpvf(aTHX_ "%" SVf " object version %" SVf
5492 				    " does not match ", SVfARG(module), SVfARG(string));
5493 
5494 	    SvREFCNT_dec(string);
5495 	    string = vstringify(pmsv);
5496 
5497 	    if (vn) {
5498 		Perl_sv_catpvf(aTHX_ xpt, "$%" SVf "::%s %" SVf, SVfARG(module), vn,
5499 			       SVfARG(string));
5500 	    } else {
5501 		Perl_sv_catpvf(aTHX_ xpt, "bootstrap parameter %" SVf, SVfARG(string));
5502 	    }
5503 	    SvREFCNT_dec(string);
5504 
5505 	    Perl_sv_2mortal(aTHX_ xpt);
5506 	    Perl_croak_sv(aTHX_ xpt);
5507 	}
5508     }
5509 }
5510 
5511 /*
5512 =for apidoc my_strlcat
5513 
5514 The C library C<strlcat> if available, or a Perl implementation of it.
5515 This operates on C C<NUL>-terminated strings.
5516 
5517 C<my_strlcat()> appends string C<src> to the end of C<dst>.  It will append at
5518 most S<C<size - strlen(dst) - 1>> characters.  It will then C<NUL>-terminate,
5519 unless C<size> is 0 or the original C<dst> string was longer than C<size> (in
5520 practice this should not happen as it means that either C<size> is incorrect or
5521 that C<dst> is not a proper C<NUL>-terminated string).
5522 
5523 Note that C<size> is the full size of the destination buffer and
5524 the result is guaranteed to be C<NUL>-terminated if there is room.  Note that
5525 room for the C<NUL> should be included in C<size>.
5526 
5527 The return value is the total length that C<dst> would have if C<size> is
5528 sufficiently large.  Thus it is the initial length of C<dst> plus the length of
5529 C<src>.  If C<size> is smaller than the return, the excess was not appended.
5530 
5531 =cut
5532 
5533 Description stolen from http://man.openbsd.org/strlcat.3
5534 */
5535 #ifndef HAS_STRLCAT
5536 Size_t
5537 Perl_my_strlcat(char *dst, const char *src, Size_t size)
5538 {
5539     Size_t used, length, copy;
5540 
5541     used = strlen(dst);
5542     length = strlen(src);
5543     if (size > 0 && used < size - 1) {
5544         copy = (length >= size - used) ? size - used - 1 : length;
5545         memcpy(dst + used, src, copy);
5546         dst[used + copy] = '\0';
5547     }
5548     return used + length;
5549 }
5550 #endif
5551 
5552 
5553 /*
5554 =for apidoc my_strlcpy
5555 
5556 The C library C<strlcpy> if available, or a Perl implementation of it.
5557 This operates on C C<NUL>-terminated strings.
5558 
5559 C<my_strlcpy()> copies up to S<C<size - 1>> characters from the string C<src>
5560 to C<dst>, C<NUL>-terminating the result if C<size> is not 0.
5561 
5562 The return value is the total length C<src> would be if the copy completely
5563 succeeded.  If it is larger than C<size>, the excess was not copied.
5564 
5565 =cut
5566 
5567 Description stolen from http://man.openbsd.org/strlcpy.3
5568 */
5569 #ifndef HAS_STRLCPY
5570 Size_t
5571 Perl_my_strlcpy(char *dst, const char *src, Size_t size)
5572 {
5573     Size_t length, copy;
5574 
5575     length = strlen(src);
5576     if (size > 0) {
5577         copy = (length >= size) ? size - 1 : length;
5578         memcpy(dst, src, copy);
5579         dst[copy] = '\0';
5580     }
5581     return length;
5582 }
5583 #endif
5584 
5585 /*
5586 =for apidoc my_strnlen
5587 
5588 The C library C<strnlen> if available, or a Perl implementation of it.
5589 
5590 C<my_strnlen()> computes the length of the string, up to C<maxlen>
5591 characters.  It will will never attempt to address more than C<maxlen>
5592 characters, making it suitable for use with strings that are not
5593 guaranteed to be NUL-terminated.
5594 
5595 =cut
5596 
5597 Description stolen from http://man.openbsd.org/strnlen.3,
5598 implementation stolen from PostgreSQL.
5599 */
5600 #ifndef HAS_STRNLEN
5601 Size_t
5602 Perl_my_strnlen(const char *str, Size_t maxlen)
5603 {
5604     const char *p = str;
5605 
5606     PERL_ARGS_ASSERT_MY_STRNLEN;
5607 
5608     while(maxlen-- && *p)
5609         p++;
5610 
5611     return p - str;
5612 }
5613 #endif
5614 
5615 #if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_MSC_VER < 1400) && (WINVER < 0x0500)
5616 /* VC7 or 7.1, building with pre-VC7 runtime libraries. */
5617 long _ftol( double ); /* Defined by VC6 C libs. */
5618 long _ftol2( double dblSource ) { return _ftol( dblSource ); }
5619 #endif
5620 
5621 PERL_STATIC_INLINE bool
5622 S_gv_has_usable_name(pTHX_ GV *gv)
5623 {
5624     GV **gvp;
5625     return GvSTASH(gv)
5626 	&& HvENAME(GvSTASH(gv))
5627 	&& (gvp = (GV **)hv_fetchhek(
5628 			GvSTASH(gv), GvNAME_HEK(gv), 0
5629 	   ))
5630 	&& *gvp == gv;
5631 }
5632 
5633 void
5634 Perl_get_db_sub(pTHX_ SV **svp, CV *cv)
5635 {
5636     SV * const dbsv = GvSVn(PL_DBsub);
5637     const bool save_taint = TAINT_get;
5638 
5639     /* When we are called from pp_goto (svp is null),
5640      * we do not care about using dbsv to call CV;
5641      * it's for informational purposes only.
5642      */
5643 
5644     PERL_ARGS_ASSERT_GET_DB_SUB;
5645 
5646     TAINT_set(FALSE);
5647     save_item(dbsv);
5648     if (!PERLDB_SUB_NN) {
5649 	GV *gv = CvGV(cv);
5650 
5651 	if (!svp && !CvLEXICAL(cv)) {
5652 	    gv_efullname3(dbsv, gv, NULL);
5653 	}
5654 	else if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED)) || CvLEXICAL(cv)
5655 	     || strEQ(GvNAME(gv), "END")
5656 	     || ( /* Could be imported, and old sub redefined. */
5657 		 (GvCV(gv) != cv || !S_gv_has_usable_name(aTHX_ gv))
5658 		 &&
5659 		 !( (SvTYPE(*svp) == SVt_PVGV)
5660 		    && (GvCV((const GV *)*svp) == cv)
5661 		    /* Use GV from the stack as a fallback. */
5662 		    && S_gv_has_usable_name(aTHX_ gv = (GV *)*svp)
5663 		  )
5664 		)
5665 	) {
5666 	    /* GV is potentially non-unique, or contain different CV. */
5667 	    SV * const tmp = newRV(MUTABLE_SV(cv));
5668 	    sv_setsv(dbsv, tmp);
5669 	    SvREFCNT_dec(tmp);
5670 	}
5671 	else {
5672 	    sv_sethek(dbsv, HvENAME_HEK(GvSTASH(gv)));
5673 	    sv_catpvs(dbsv, "::");
5674 	    sv_cathek(dbsv, GvNAME_HEK(gv));
5675 	}
5676     }
5677     else {
5678 	const int type = SvTYPE(dbsv);
5679 	if (type < SVt_PVIV && type != SVt_IV)
5680 	    sv_upgrade(dbsv, SVt_PVIV);
5681 	(void)SvIOK_on(dbsv);
5682 	SvIV_set(dbsv, PTR2IV(cv));	/* Do it the quickest way  */
5683     }
5684     SvSETMAGIC(dbsv);
5685     TAINT_IF(save_taint);
5686 #ifdef NO_TAINT_SUPPORT
5687     PERL_UNUSED_VAR(save_taint);
5688 #endif
5689 }
5690 
5691 int
5692 Perl_my_dirfd(DIR * dir) {
5693 
5694     /* Most dirfd implementations have problems when passed NULL. */
5695     if(!dir)
5696         return -1;
5697 #ifdef HAS_DIRFD
5698     return dirfd(dir);
5699 #elif defined(HAS_DIR_DD_FD)
5700     return dir->dd_fd;
5701 #else
5702     Perl_croak_nocontext(PL_no_func, "dirfd");
5703     NOT_REACHED; /* NOTREACHED */
5704     return 0;
5705 #endif
5706 }
5707 
5708 #if !defined(HAS_MKOSTEMP) || !defined(HAS_MKSTEMP)
5709 
5710 #define TEMP_FILE_CH "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789"
5711 #define TEMP_FILE_CH_COUNT (sizeof(TEMP_FILE_CH)-1)
5712 
5713 static int
5714 S_my_mkostemp(char *templte, int flags) {
5715     dTHX;
5716     STRLEN len = strlen(templte);
5717     int fd;
5718     int attempts = 0;
5719 
5720     if (len < 6 ||
5721         templte[len-1] != 'X' || templte[len-2] != 'X' || templte[len-3] != 'X' ||
5722         templte[len-4] != 'X' || templte[len-5] != 'X' || templte[len-6] != 'X') {
5723         SETERRNO(EINVAL, LIB_INVARG);
5724         return -1;
5725     }
5726 
5727     do {
5728         int i;
5729         for (i = 1; i <= 6; ++i) {
5730             templte[len-i] = TEMP_FILE_CH[(int)(Perl_internal_drand48() * TEMP_FILE_CH_COUNT)];
5731         }
5732         fd = PerlLIO_open3(templte, O_RDWR | O_CREAT | O_EXCL | flags, 0600);
5733     } while (fd == -1 && errno == EEXIST && ++attempts <= 100);
5734 
5735     return fd;
5736 }
5737 
5738 #endif
5739 
5740 #ifndef HAS_MKOSTEMP
5741 int
5742 Perl_my_mkostemp(char *templte, int flags)
5743 {
5744     PERL_ARGS_ASSERT_MY_MKOSTEMP;
5745     return S_my_mkostemp(templte, flags);
5746 }
5747 #endif
5748 
5749 #ifndef HAS_MKSTEMP
5750 int
5751 Perl_my_mkstemp(char *templte)
5752 {
5753     PERL_ARGS_ASSERT_MY_MKSTEMP;
5754     return S_my_mkostemp(templte, 0);
5755 }
5756 #endif
5757 
5758 REGEXP *
5759 Perl_get_re_arg(pTHX_ SV *sv) {
5760 
5761     if (sv) {
5762         if (SvMAGICAL(sv))
5763             mg_get(sv);
5764         if (SvROK(sv))
5765 	    sv = MUTABLE_SV(SvRV(sv));
5766         if (SvTYPE(sv) == SVt_REGEXP)
5767             return (REGEXP*) sv;
5768     }
5769 
5770     return NULL;
5771 }
5772 
5773 /*
5774  * This code is derived from drand48() implementation from FreeBSD,
5775  * found in lib/libc/gen/_rand48.c.
5776  *
5777  * The U64 implementation is original, based on the POSIX
5778  * specification for drand48().
5779  */
5780 
5781 /*
5782 * Copyright (c) 1993 Martin Birgmeier
5783 * All rights reserved.
5784 *
5785 * You may redistribute unmodified or modified versions of this source
5786 * code provided that the above copyright notice and this and the
5787 * following conditions are retained.
5788 *
5789 * This software is provided ``as is'', and comes with no warranties
5790 * of any kind. I shall in no event be liable for anything that happens
5791 * to anyone/anything when using this software.
5792 */
5793 
5794 #define FREEBSD_DRAND48_SEED_0   (0x330e)
5795 
5796 #ifdef PERL_DRAND48_QUAD
5797 
5798 #define DRAND48_MULT UINT64_C(0x5deece66d)
5799 #define DRAND48_ADD  0xb
5800 #define DRAND48_MASK UINT64_C(0xffffffffffff)
5801 
5802 #else
5803 
5804 #define FREEBSD_DRAND48_SEED_1   (0xabcd)
5805 #define FREEBSD_DRAND48_SEED_2   (0x1234)
5806 #define FREEBSD_DRAND48_MULT_0   (0xe66d)
5807 #define FREEBSD_DRAND48_MULT_1   (0xdeec)
5808 #define FREEBSD_DRAND48_MULT_2   (0x0005)
5809 #define FREEBSD_DRAND48_ADD      (0x000b)
5810 
5811 const unsigned short _rand48_mult[3] = {
5812                 FREEBSD_DRAND48_MULT_0,
5813                 FREEBSD_DRAND48_MULT_1,
5814                 FREEBSD_DRAND48_MULT_2
5815 };
5816 const unsigned short _rand48_add = FREEBSD_DRAND48_ADD;
5817 
5818 #endif
5819 
5820 void
5821 Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed)
5822 {
5823     PERL_ARGS_ASSERT_DRAND48_INIT_R;
5824 
5825 #ifdef PERL_DRAND48_QUAD
5826     *random_state = FREEBSD_DRAND48_SEED_0 + ((U64)seed << 16);
5827 #else
5828     random_state->seed[0] = FREEBSD_DRAND48_SEED_0;
5829     random_state->seed[1] = (U16) seed;
5830     random_state->seed[2] = (U16) (seed >> 16);
5831 #endif
5832 }
5833 
5834 double
5835 Perl_drand48_r(perl_drand48_t *random_state)
5836 {
5837     PERL_ARGS_ASSERT_DRAND48_R;
5838 
5839 #ifdef PERL_DRAND48_QUAD
5840     *random_state = (*random_state * DRAND48_MULT + DRAND48_ADD)
5841         & DRAND48_MASK;
5842 
5843     return ldexp((double)*random_state, -48);
5844 #else
5845     {
5846     U32 accu;
5847     U16 temp[2];
5848 
5849     accu = (U32) _rand48_mult[0] * (U32) random_state->seed[0]
5850          + (U32) _rand48_add;
5851     temp[0] = (U16) accu;        /* lower 16 bits */
5852     accu >>= sizeof(U16) * 8;
5853     accu += (U32) _rand48_mult[0] * (U32) random_state->seed[1]
5854           + (U32) _rand48_mult[1] * (U32) random_state->seed[0];
5855     temp[1] = (U16) accu;        /* middle 16 bits */
5856     accu >>= sizeof(U16) * 8;
5857     accu += _rand48_mult[0] * random_state->seed[2]
5858           + _rand48_mult[1] * random_state->seed[1]
5859           + _rand48_mult[2] * random_state->seed[0];
5860     random_state->seed[0] = temp[0];
5861     random_state->seed[1] = temp[1];
5862     random_state->seed[2] = (U16) accu;
5863 
5864     return ldexp((double) random_state->seed[0], -48) +
5865            ldexp((double) random_state->seed[1], -32) +
5866            ldexp((double) random_state->seed[2], -16);
5867     }
5868 #endif
5869 }
5870 
5871 #ifdef USE_C_BACKTRACE
5872 
5873 /* Possibly move all this USE_C_BACKTRACE code into a new file. */
5874 
5875 #ifdef USE_BFD
5876 
5877 typedef struct {
5878     /* abfd is the BFD handle. */
5879     bfd* abfd;
5880     /* bfd_syms is the BFD symbol table. */
5881     asymbol** bfd_syms;
5882     /* bfd_text is handle to the the ".text" section of the object file. */
5883     asection* bfd_text;
5884     /* Since opening the executable and scanning its symbols is quite
5885      * heavy operation, we remember the filename we used the last time,
5886      * and do the opening and scanning only if the filename changes.
5887      * This removes most (but not all) open+scan cycles. */
5888     const char* fname_prev;
5889 } bfd_context;
5890 
5891 /* Given a dl_info, update the BFD context if necessary. */
5892 static void bfd_update(bfd_context* ctx, Dl_info* dl_info)
5893 {
5894     /* BFD open and scan only if the filename changed. */
5895     if (ctx->fname_prev == NULL ||
5896         strNE(dl_info->dli_fname, ctx->fname_prev)) {
5897         if (ctx->abfd) {
5898             bfd_close(ctx->abfd);
5899         }
5900         ctx->abfd = bfd_openr(dl_info->dli_fname, 0);
5901         if (ctx->abfd) {
5902             if (bfd_check_format(ctx->abfd, bfd_object)) {
5903                 IV symbol_size = bfd_get_symtab_upper_bound(ctx->abfd);
5904                 if (symbol_size > 0) {
5905                     Safefree(ctx->bfd_syms);
5906                     Newx(ctx->bfd_syms, symbol_size, asymbol*);
5907                     ctx->bfd_text =
5908                         bfd_get_section_by_name(ctx->abfd, ".text");
5909                 }
5910                 else
5911                     ctx->abfd = NULL;
5912             }
5913             else
5914                 ctx->abfd = NULL;
5915         }
5916         ctx->fname_prev = dl_info->dli_fname;
5917     }
5918 }
5919 
5920 /* Given a raw frame, try to symbolize it and store
5921  * symbol information (source file, line number) away. */
5922 static void bfd_symbolize(bfd_context* ctx,
5923                           void* raw_frame,
5924                           char** symbol_name,
5925                           STRLEN* symbol_name_size,
5926                           char** source_name,
5927                           STRLEN* source_name_size,
5928                           STRLEN* source_line)
5929 {
5930     *symbol_name = NULL;
5931     *symbol_name_size = 0;
5932     if (ctx->abfd) {
5933         IV offset = PTR2IV(raw_frame) - PTR2IV(ctx->bfd_text->vma);
5934         if (offset > 0 &&
5935             bfd_canonicalize_symtab(ctx->abfd, ctx->bfd_syms) > 0) {
5936             const char *file;
5937             const char *func;
5938             unsigned int line = 0;
5939             if (bfd_find_nearest_line(ctx->abfd, ctx->bfd_text,
5940                                       ctx->bfd_syms, offset,
5941                                       &file, &func, &line) &&
5942                 file && func && line > 0) {
5943                 /* Size and copy the source file, use only
5944                  * the basename of the source file.
5945                  *
5946                  * NOTE: the basenames are fine for the
5947                  * Perl source files, but may not always
5948                  * be the best idea for XS files. */
5949                 const char *p, *b = NULL;
5950                 /* Look for the last slash. */
5951                 for (p = file; *p; p++) {
5952                     if (*p == '/')
5953                         b = p + 1;
5954                 }
5955                 if (b == NULL || *b == 0) {
5956                     b = file;
5957                 }
5958                 *source_name_size = p - b + 1;
5959                 Newx(*source_name, *source_name_size + 1, char);
5960                 Copy(b, *source_name, *source_name_size + 1, char);
5961 
5962                 *symbol_name_size = strlen(func);
5963                 Newx(*symbol_name, *symbol_name_size + 1, char);
5964                 Copy(func, *symbol_name, *symbol_name_size + 1, char);
5965 
5966                 *source_line = line;
5967             }
5968         }
5969     }
5970 }
5971 
5972 #endif /* #ifdef USE_BFD */
5973 
5974 #ifdef PERL_DARWIN
5975 
5976 /* OS X has no public API for for 'symbolicating' (Apple official term)
5977  * stack addresses to {function_name, source_file, line_number}.
5978  * Good news: there is command line utility atos(1) which does that.
5979  * Bad news 1: it's a command line utility.
5980  * Bad news 2: one needs to have the Developer Tools installed.
5981  * Bad news 3: in newer releases it needs to be run as 'xcrun atos'.
5982  *
5983  * To recap: we need to open a pipe for reading for a utility which
5984  * might not exist, or exists in different locations, and then parse
5985  * the output.  And since this is all for a low-level API, we cannot
5986  * use high-level stuff.  Thanks, Apple. */
5987 
5988 typedef struct {
5989     /* tool is set to the absolute pathname of the tool to use:
5990      * xcrun or atos. */
5991     const char* tool;
5992     /* format is set to a printf format string used for building
5993      * the external command to run. */
5994     const char* format;
5995     /* unavail is set if e.g. xcrun cannot be found, or something
5996      * else happens that makes getting the backtrace dubious.  Note,
5997      * however, that the context isn't persistent, the next call to
5998      * get_c_backtrace() will start from scratch. */
5999     bool unavail;
6000     /* fname is the current object file name. */
6001     const char* fname;
6002     /* object_base_addr is the base address of the shared object. */
6003     void* object_base_addr;
6004 } atos_context;
6005 
6006 /* Given |dl_info|, updates the context.  If the context has been
6007  * marked unavailable, return immediately.  If not but the tool has
6008  * not been set, set it to either "xcrun atos" or "atos" (also set the
6009  * format to use for creating commands for piping), or if neither is
6010  * unavailable (one needs the Developer Tools installed), mark the context
6011  * an unavailable.  Finally, update the filename (object name),
6012  * and its base address. */
6013 
6014 static void atos_update(atos_context* ctx,
6015                         Dl_info* dl_info)
6016 {
6017     if (ctx->unavail)
6018         return;
6019     if (ctx->tool == NULL) {
6020         const char* tools[] = {
6021             "/usr/bin/xcrun",
6022             "/usr/bin/atos"
6023         };
6024         const char* formats[] = {
6025             "/usr/bin/xcrun atos -o '%s' -l %08x %08x 2>&1",
6026             "/usr/bin/atos -d -o '%s' -l %08x %08x 2>&1"
6027         };
6028         struct stat st;
6029         UV i;
6030         for (i = 0; i < C_ARRAY_LENGTH(tools); i++) {
6031             if (stat(tools[i], &st) == 0 && S_ISREG(st.st_mode)) {
6032                 ctx->tool = tools[i];
6033                 ctx->format = formats[i];
6034                 break;
6035             }
6036         }
6037         if (ctx->tool == NULL) {
6038             ctx->unavail = TRUE;
6039             return;
6040         }
6041     }
6042     if (ctx->fname == NULL ||
6043         strNE(dl_info->dli_fname, ctx->fname)) {
6044         ctx->fname = dl_info->dli_fname;
6045         ctx->object_base_addr = dl_info->dli_fbase;
6046     }
6047 }
6048 
6049 /* Given an output buffer end |p| and its |start|, matches
6050  * for the atos output, extracting the source code location
6051  * and returning non-NULL if possible, returning NULL otherwise. */
6052 static const char* atos_parse(const char* p,
6053                               const char* start,
6054                               STRLEN* source_name_size,
6055                               STRLEN* source_line) {
6056     /* atos() output is something like:
6057      * perl_parse (in miniperl) (perl.c:2314)\n\n".
6058      * We cannot use Perl regular expressions, because we need to
6059      * stay low-level.  Therefore here we have a rolled-out version
6060      * of a state machine which matches _backwards_from_the_end_ and
6061      * if there's a success, returns the starts of the filename,
6062      * also setting the filename size and the source line number.
6063      * The matched regular expression is roughly "\(.*:\d+\)\s*$" */
6064     const char* source_number_start;
6065     const char* source_name_end;
6066     const char* source_line_end = start;
6067     const char* close_paren;
6068     UV uv;
6069 
6070     /* Skip trailing whitespace. */
6071     while (p > start && isSPACE(*p)) p--;
6072     /* Now we should be at the close paren. */
6073     if (p == start || *p != ')')
6074         return NULL;
6075     close_paren = p;
6076     p--;
6077     /* Now we should be in the line number. */
6078     if (p == start || !isDIGIT(*p))
6079         return NULL;
6080     /* Skip over the digits. */
6081     while (p > start && isDIGIT(*p))
6082         p--;
6083     /* Now we should be at the colon. */
6084     if (p == start || *p != ':')
6085         return NULL;
6086     source_number_start = p + 1;
6087     source_name_end = p; /* Just beyond the end. */
6088     p--;
6089     /* Look for the open paren. */
6090     while (p > start && *p != '(')
6091         p--;
6092     if (p == start)
6093         return NULL;
6094     p++;
6095     *source_name_size = source_name_end - p;
6096     if (grok_atoUV(source_number_start, &uv,  &source_line_end)
6097         && source_line_end == close_paren
6098         && uv <= PERL_INT_MAX
6099     ) {
6100         *source_line = (STRLEN)uv;
6101         return p;
6102     }
6103     return NULL;
6104 }
6105 
6106 /* Given a raw frame, read a pipe from the symbolicator (that's the
6107  * technical term) atos, reads the result, and parses the source code
6108  * location.  We must stay low-level, so we use snprintf(), pipe(),
6109  * and fread(), and then also parse the output ourselves. */
6110 static void atos_symbolize(atos_context* ctx,
6111                            void* raw_frame,
6112                            char** source_name,
6113                            STRLEN* source_name_size,
6114                            STRLEN* source_line)
6115 {
6116     char cmd[1024];
6117     const char* p;
6118     Size_t cnt;
6119 
6120     if (ctx->unavail)
6121         return;
6122     /* Simple security measure: if there's any funny business with
6123      * the object name (used as "-o '%s'" ), leave since at least
6124      * partially the user controls it. */
6125     for (p = ctx->fname; *p; p++) {
6126         if (*p == '\'' || isCNTRL(*p)) {
6127             ctx->unavail = TRUE;
6128             return;
6129         }
6130     }
6131     cnt = snprintf(cmd, sizeof(cmd), ctx->format,
6132                    ctx->fname, ctx->object_base_addr, raw_frame);
6133     if (cnt < sizeof(cmd)) {
6134         /* Undo nostdio.h #defines that disable stdio.
6135          * This is somewhat naughty, but is used elsewhere
6136          * in the core, and affects only OS X. */
6137 #undef FILE
6138 #undef popen
6139 #undef fread
6140 #undef pclose
6141         FILE* fp = popen(cmd, "r");
6142         /* At the moment we open a new pipe for each stack frame.
6143          * This is naturally somewhat slow, but hopefully generating
6144          * stack traces is never going to in a performance critical path.
6145          *
6146          * We could play tricks with atos by batching the stack
6147          * addresses to be resolved: atos can either take multiple
6148          * addresses from the command line, or read addresses from
6149          * a file (though the mess of creating temporary files would
6150          * probably negate much of any possible speedup).
6151          *
6152          * Normally there are only two objects present in the backtrace:
6153          * perl itself, and the libdyld.dylib.  (Note that the object
6154          * filenames contain the full pathname, so perl may not always
6155          * be in the same place.)  Whenever the object in the
6156          * backtrace changes, the base address also changes.
6157          *
6158          * The problem with batching the addresses, though, would be
6159          * matching the results with the addresses: the parsing of
6160          * the results is already painful enough with a single address. */
6161         if (fp) {
6162             char out[1024];
6163             UV cnt = fread(out, 1, sizeof(out), fp);
6164             if (cnt < sizeof(out)) {
6165                 const char* p = atos_parse(out + cnt - 1, out,
6166                                            source_name_size,
6167                                            source_line);
6168                 if (p) {
6169                     Newx(*source_name,
6170                          *source_name_size, char);
6171                     Copy(p, *source_name,
6172                          *source_name_size,  char);
6173                 }
6174             }
6175             pclose(fp);
6176         }
6177     }
6178 }
6179 
6180 #endif /* #ifdef PERL_DARWIN */
6181 
6182 /*
6183 =for apidoc get_c_backtrace
6184 
6185 Collects the backtrace (aka "stacktrace") into a single linear
6186 malloced buffer, which the caller B<must> C<Perl_free_c_backtrace()>.
6187 
6188 Scans the frames back by S<C<depth + skip>>, then drops the C<skip> innermost,
6189 returning at most C<depth> frames.
6190 
6191 =cut
6192 */
6193 
6194 Perl_c_backtrace*
6195 Perl_get_c_backtrace(pTHX_ int depth, int skip)
6196 {
6197     /* Note that here we must stay as low-level as possible: Newx(),
6198      * Copy(), Safefree(); since we may be called from anywhere,
6199      * so we should avoid higher level constructs like SVs or AVs.
6200      *
6201      * Since we are using safesysmalloc() via Newx(), don't try
6202      * getting backtrace() there, unless you like deep recursion. */
6203 
6204     /* Currently only implemented with backtrace() and dladdr(),
6205      * for other platforms NULL is returned. */
6206 
6207 #if defined(HAS_BACKTRACE) && defined(HAS_DLADDR)
6208     /* backtrace() is available via <execinfo.h> in glibc and in most
6209      * modern BSDs; dladdr() is available via <dlfcn.h>. */
6210 
6211     /* We try fetching this many frames total, but then discard
6212      * the |skip| first ones.  For the remaining ones we will try
6213      * retrieving more information with dladdr(). */
6214     int try_depth = skip +  depth;
6215 
6216     /* The addresses (program counters) returned by backtrace(). */
6217     void** raw_frames;
6218 
6219     /* Retrieved with dladdr() from the addresses returned by backtrace(). */
6220     Dl_info* dl_infos;
6221 
6222     /* Sizes _including_ the terminating \0 of the object name
6223      * and symbol name strings. */
6224     STRLEN* object_name_sizes;
6225     STRLEN* symbol_name_sizes;
6226 
6227 #ifdef USE_BFD
6228     /* The symbol names comes either from dli_sname,
6229      * or if using BFD, they can come from BFD. */
6230     char** symbol_names;
6231 #endif
6232 
6233     /* The source code location information.  Dug out with e.g. BFD. */
6234     char** source_names;
6235     STRLEN* source_name_sizes;
6236     STRLEN* source_lines;
6237 
6238     Perl_c_backtrace* bt = NULL;  /* This is what will be returned. */
6239     int got_depth; /* How many frames were returned from backtrace(). */
6240     UV frame_count = 0; /* How many frames we return. */
6241     UV total_bytes = 0; /* The size of the whole returned backtrace. */
6242 
6243 #ifdef USE_BFD
6244     bfd_context bfd_ctx;
6245 #endif
6246 #ifdef PERL_DARWIN
6247     atos_context atos_ctx;
6248 #endif
6249 
6250     /* Here are probably possibilities for optimizing.  We could for
6251      * example have a struct that contains most of these and then
6252      * allocate |try_depth| of them, saving a bunch of malloc calls.
6253      * Note, however, that |frames| could not be part of that struct
6254      * because backtrace() will want an array of just them.  Also be
6255      * careful about the name strings. */
6256     Newx(raw_frames, try_depth, void*);
6257     Newx(dl_infos, try_depth, Dl_info);
6258     Newx(object_name_sizes, try_depth, STRLEN);
6259     Newx(symbol_name_sizes, try_depth, STRLEN);
6260     Newx(source_names, try_depth, char*);
6261     Newx(source_name_sizes, try_depth, STRLEN);
6262     Newx(source_lines, try_depth, STRLEN);
6263 #ifdef USE_BFD
6264     Newx(symbol_names, try_depth, char*);
6265 #endif
6266 
6267     /* Get the raw frames. */
6268     got_depth = (int)backtrace(raw_frames, try_depth);
6269 
6270     /* We use dladdr() instead of backtrace_symbols() because we want
6271      * the full details instead of opaque strings.  This is useful for
6272      * two reasons: () the details are needed for further symbolic
6273      * digging, for example in OS X (2) by having the details we fully
6274      * control the output, which in turn is useful when more platforms
6275      * are added: we can keep out output "portable". */
6276 
6277     /* We want a single linear allocation, which can then be freed
6278      * with a single swoop.  We will do the usual trick of first
6279      * walking over the structure and seeing how much we need to
6280      * allocate, then allocating, and then walking over the structure
6281      * the second time and populating it. */
6282 
6283     /* First we must compute the total size of the buffer. */
6284     total_bytes = sizeof(Perl_c_backtrace_header);
6285     if (got_depth > skip) {
6286         int i;
6287 #ifdef USE_BFD
6288         bfd_init(); /* Is this safe to call multiple times? */
6289         Zero(&bfd_ctx, 1, bfd_context);
6290 #endif
6291 #ifdef PERL_DARWIN
6292         Zero(&atos_ctx, 1, atos_context);
6293 #endif
6294         for (i = skip; i < try_depth; i++) {
6295             Dl_info* dl_info = &dl_infos[i];
6296 
6297             object_name_sizes[i] = 0;
6298             source_names[i] = NULL;
6299             source_name_sizes[i] = 0;
6300             source_lines[i] = 0;
6301 
6302             /* Yes, zero from dladdr() is failure. */
6303             if (dladdr(raw_frames[i], dl_info)) {
6304                 total_bytes += sizeof(Perl_c_backtrace_frame);
6305 
6306                 object_name_sizes[i] =
6307                     dl_info->dli_fname ? strlen(dl_info->dli_fname) : 0;
6308                 symbol_name_sizes[i] =
6309                     dl_info->dli_sname ? strlen(dl_info->dli_sname) : 0;
6310 #ifdef USE_BFD
6311                 bfd_update(&bfd_ctx, dl_info);
6312                 bfd_symbolize(&bfd_ctx, raw_frames[i],
6313                               &symbol_names[i],
6314                               &symbol_name_sizes[i],
6315                               &source_names[i],
6316                               &source_name_sizes[i],
6317                               &source_lines[i]);
6318 #endif
6319 #if PERL_DARWIN
6320                 atos_update(&atos_ctx, dl_info);
6321                 atos_symbolize(&atos_ctx,
6322                                raw_frames[i],
6323                                &source_names[i],
6324                                &source_name_sizes[i],
6325                                &source_lines[i]);
6326 #endif
6327 
6328                 /* Plus ones for the terminating \0. */
6329                 total_bytes += object_name_sizes[i] + 1;
6330                 total_bytes += symbol_name_sizes[i] + 1;
6331                 total_bytes += source_name_sizes[i] + 1;
6332 
6333                 frame_count++;
6334             } else {
6335                 break;
6336             }
6337         }
6338 #ifdef USE_BFD
6339         Safefree(bfd_ctx.bfd_syms);
6340 #endif
6341     }
6342 
6343     /* Now we can allocate and populate the result buffer. */
6344     Newxc(bt, total_bytes, char, Perl_c_backtrace);
6345     Zero(bt, total_bytes, char);
6346     bt->header.frame_count = frame_count;
6347     bt->header.total_bytes = total_bytes;
6348     if (frame_count > 0) {
6349         Perl_c_backtrace_frame* frame = bt->frame_info;
6350         char* name_base = (char *)(frame + frame_count);
6351         char* name_curr = name_base; /* Outputting the name strings here. */
6352         UV i;
6353         for (i = skip; i < skip + frame_count; i++) {
6354             Dl_info* dl_info = &dl_infos[i];
6355 
6356             frame->addr = raw_frames[i];
6357             frame->object_base_addr = dl_info->dli_fbase;
6358             frame->symbol_addr = dl_info->dli_saddr;
6359 
6360             /* Copies a string, including the \0, and advances the name_curr.
6361              * Also copies the start and the size to the frame. */
6362 #define PERL_C_BACKTRACE_STRCPY(frame, doffset, src, dsize, size) \
6363             if (size && src) \
6364                 Copy(src, name_curr, size, char); \
6365             frame->doffset = name_curr - (char*)bt; \
6366             frame->dsize = size; \
6367             name_curr += size; \
6368             *name_curr++ = 0;
6369 
6370             PERL_C_BACKTRACE_STRCPY(frame, object_name_offset,
6371                                     dl_info->dli_fname,
6372                                     object_name_size, object_name_sizes[i]);
6373 
6374 #ifdef USE_BFD
6375             PERL_C_BACKTRACE_STRCPY(frame, symbol_name_offset,
6376                                     symbol_names[i],
6377                                     symbol_name_size, symbol_name_sizes[i]);
6378             Safefree(symbol_names[i]);
6379 #else
6380             PERL_C_BACKTRACE_STRCPY(frame, symbol_name_offset,
6381                                     dl_info->dli_sname,
6382                                     symbol_name_size, symbol_name_sizes[i]);
6383 #endif
6384 
6385             PERL_C_BACKTRACE_STRCPY(frame, source_name_offset,
6386                                     source_names[i],
6387                                     source_name_size, source_name_sizes[i]);
6388             Safefree(source_names[i]);
6389 
6390 #undef PERL_C_BACKTRACE_STRCPY
6391 
6392             frame->source_line_number = source_lines[i];
6393 
6394             frame++;
6395         }
6396         assert(total_bytes ==
6397                (UV)(sizeof(Perl_c_backtrace_header) +
6398                     frame_count * sizeof(Perl_c_backtrace_frame) +
6399                     name_curr - name_base));
6400     }
6401 #ifdef USE_BFD
6402     Safefree(symbol_names);
6403     if (bfd_ctx.abfd) {
6404         bfd_close(bfd_ctx.abfd);
6405     }
6406 #endif
6407     Safefree(source_lines);
6408     Safefree(source_name_sizes);
6409     Safefree(source_names);
6410     Safefree(symbol_name_sizes);
6411     Safefree(object_name_sizes);
6412     /* Assuming the strings returned by dladdr() are pointers
6413      * to read-only static memory (the object file), so that
6414      * they do not need freeing (and cannot be). */
6415     Safefree(dl_infos);
6416     Safefree(raw_frames);
6417     return bt;
6418 #else
6419     PERL_UNUSED_ARGV(depth);
6420     PERL_UNUSED_ARGV(skip);
6421     return NULL;
6422 #endif
6423 }
6424 
6425 /*
6426 =for apidoc free_c_backtrace
6427 
6428 Deallocates a backtrace received from get_c_bracktrace.
6429 
6430 =cut
6431 */
6432 
6433 /*
6434 =for apidoc get_c_backtrace_dump
6435 
6436 Returns a SV containing a dump of C<depth> frames of the call stack, skipping
6437 the C<skip> innermost ones.  C<depth> of 20 is usually enough.
6438 
6439 The appended output looks like:
6440 
6441 ...
6442 1   10e004812:0082   Perl_croak   util.c:1716    /usr/bin/perl
6443 2   10df8d6d2:1d72   perl_parse   perl.c:3975    /usr/bin/perl
6444 ...
6445 
6446 The fields are tab-separated.  The first column is the depth (zero
6447 being the innermost non-skipped frame).  In the hex:offset, the hex is
6448 where the program counter was in C<S_parse_body>, and the :offset (might
6449 be missing) tells how much inside the C<S_parse_body> the program counter was.
6450 
6451 The C<util.c:1716> is the source code file and line number.
6452 
6453 The F</usr/bin/perl> is obvious (hopefully).
6454 
6455 Unknowns are C<"-">.  Unknowns can happen unfortunately quite easily:
6456 if the platform doesn't support retrieving the information;
6457 if the binary is missing the debug information;
6458 if the optimizer has transformed the code by for example inlining.
6459 
6460 =cut
6461 */
6462 
6463 SV*
6464 Perl_get_c_backtrace_dump(pTHX_ int depth, int skip)
6465 {
6466     Perl_c_backtrace* bt;
6467 
6468     bt = get_c_backtrace(depth, skip + 1 /* Hide ourselves. */);
6469     if (bt) {
6470         Perl_c_backtrace_frame* frame;
6471         SV* dsv = newSVpvs("");
6472         UV i;
6473         for (i = 0, frame = bt->frame_info;
6474              i < bt->header.frame_count; i++, frame++) {
6475             Perl_sv_catpvf(aTHX_ dsv, "%d", (int)i);
6476             Perl_sv_catpvf(aTHX_ dsv, "\t%p", frame->addr ? frame->addr : "-");
6477             /* Symbol (function) names might disappear without debug info.
6478              *
6479              * The source code location might disappear in case of the
6480              * optimizer inlining or otherwise rearranging the code. */
6481             if (frame->symbol_addr) {
6482                 Perl_sv_catpvf(aTHX_ dsv, ":%04x",
6483                                (int)
6484                                ((char*)frame->addr - (char*)frame->symbol_addr));
6485             }
6486             Perl_sv_catpvf(aTHX_ dsv, "\t%s",
6487                            frame->symbol_name_size &&
6488                            frame->symbol_name_offset ?
6489                            (char*)bt + frame->symbol_name_offset : "-");
6490             if (frame->source_name_size &&
6491                 frame->source_name_offset &&
6492                 frame->source_line_number) {
6493                 Perl_sv_catpvf(aTHX_ dsv, "\t%s:%" UVuf,
6494                                (char*)bt + frame->source_name_offset,
6495                                (UV)frame->source_line_number);
6496             } else {
6497                 Perl_sv_catpvf(aTHX_ dsv, "\t-");
6498             }
6499             Perl_sv_catpvf(aTHX_ dsv, "\t%s",
6500                            frame->object_name_size &&
6501                            frame->object_name_offset ?
6502                            (char*)bt + frame->object_name_offset : "-");
6503             /* The frame->object_base_addr is not output,
6504              * but it is used for symbolizing/symbolicating. */
6505             sv_catpvs(dsv, "\n");
6506         }
6507 
6508         Perl_free_c_backtrace(bt);
6509 
6510         return dsv;
6511     }
6512 
6513     return NULL;
6514 }
6515 
6516 /*
6517 =for apidoc dump_c_backtrace
6518 
6519 Dumps the C backtrace to the given C<fp>.
6520 
6521 Returns true if a backtrace could be retrieved, false if not.
6522 
6523 =cut
6524 */
6525 
6526 bool
6527 Perl_dump_c_backtrace(pTHX_ PerlIO* fp, int depth, int skip)
6528 {
6529     SV* sv;
6530 
6531     PERL_ARGS_ASSERT_DUMP_C_BACKTRACE;
6532 
6533     sv = Perl_get_c_backtrace_dump(aTHX_ depth, skip);
6534     if (sv) {
6535         sv_2mortal(sv);
6536         PerlIO_printf(fp, "%s", SvPV_nolen(sv));
6537         return TRUE;
6538     }
6539     return FALSE;
6540 }
6541 
6542 #endif /* #ifdef USE_C_BACKTRACE */
6543 
6544 #ifdef PERL_TSA_ACTIVE
6545 
6546 /* pthread_mutex_t and perl_mutex are typedef equivalent
6547  * so casting the pointers is fine. */
6548 
6549 int perl_tsa_mutex_lock(perl_mutex* mutex)
6550 {
6551     return pthread_mutex_lock((pthread_mutex_t *) mutex);
6552 }
6553 
6554 int perl_tsa_mutex_unlock(perl_mutex* mutex)
6555 {
6556     return pthread_mutex_unlock((pthread_mutex_t *) mutex);
6557 }
6558 
6559 int perl_tsa_mutex_destroy(perl_mutex* mutex)
6560 {
6561     return pthread_mutex_destroy((pthread_mutex_t *) mutex);
6562 }
6563 
6564 #endif
6565 
6566 
6567 #ifdef USE_DTRACE
6568 
6569 /* log a sub call or return */
6570 
6571 void
6572 Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call)
6573 {
6574     const char *func;
6575     const char *file;
6576     const char *stash;
6577     const COP  *start;
6578     line_t      line;
6579 
6580     PERL_ARGS_ASSERT_DTRACE_PROBE_CALL;
6581 
6582     if (CvNAMED(cv)) {
6583         HEK *hek = CvNAME_HEK(cv);
6584         func = HEK_KEY(hek);
6585     }
6586     else {
6587         GV  *gv = CvGV(cv);
6588         func = GvENAME(gv);
6589     }
6590     start = (const COP *)CvSTART(cv);
6591     file  = CopFILE(start);
6592     line  = CopLINE(start);
6593     stash = CopSTASHPV(start);
6594 
6595     if (is_call) {
6596         PERL_SUB_ENTRY(func, file, line, stash);
6597     }
6598     else {
6599         PERL_SUB_RETURN(func, file, line, stash);
6600     }
6601 }
6602 
6603 
6604 /* log a require file loading/loaded  */
6605 
6606 void
6607 Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading)
6608 {
6609     PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD;
6610 
6611     if (is_loading) {
6612 	PERL_LOADING_FILE(name);
6613     }
6614     else {
6615 	PERL_LOADED_FILE(name);
6616     }
6617 }
6618 
6619 
6620 /* log an op execution */
6621 
6622 void
6623 Perl_dtrace_probe_op(pTHX_ const OP *op)
6624 {
6625     PERL_ARGS_ASSERT_DTRACE_PROBE_OP;
6626 
6627     PERL_OP_ENTRY(OP_NAME(op));
6628 }
6629 
6630 
6631 /* log a compile/run phase change */
6632 
6633 void
6634 Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase)
6635 {
6636     const char *ph_old = PL_phase_names[PL_phase];
6637     const char *ph_new = PL_phase_names[phase];
6638 
6639     PERL_PHASE_CHANGE(ph_new, ph_old);
6640 }
6641 
6642 #endif
6643 
6644 /*
6645  * ex: set ts=8 sts=4 sw=4 et:
6646  */
6647