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