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