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