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