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