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