This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Mention (un)?pack byte-order modifiers in perldelta
[perl5.git] / util.c
CommitLineData
a0d0e21e 1/* util.c
a687059c 2 *
4bb101f2 3 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
770526c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 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/*
12 * "Very useful, no doubt, that was to Saruman; yet it seems that he was
13 * not content." --Gandalf
14 */
8d063cd8 15
166f8a29
DM
16/* This file contains assorted utility routines.
17 * Which is a polite way of saying any stuff that people couldn't think of
18 * a better place for. Amongst other things, it includes the warning and
19 * dieing stuff, plus wrappers for malloc code.
20 */
21
8d063cd8 22#include "EXTERN.h"
864dbfa3 23#define PERL_IN_UTIL_C
8d063cd8 24#include "perl.h"
62b28dd9 25
64ca3a65 26#ifndef PERL_MICRO
a687059c 27#include <signal.h>
36477c24 28#ifndef SIG_ERR
29# define SIG_ERR ((Sighandler_t) -1)
30#endif
64ca3a65 31#endif
36477c24 32
ff68c719 33#ifdef I_SYS_WAIT
34# include <sys/wait.h>
35#endif
36
868439a2
JH
37#ifdef HAS_SELECT
38# ifdef I_SYS_SELECT
39# include <sys/select.h>
40# endif
41#endif
42
8d063cd8 43#define FLUSH
8d063cd8 44
16cebae2
GS
45#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
46# define FD_CLOEXEC 1 /* NeXT needs this */
47#endif
48
a687059c
LW
49/* NOTE: Do not call the next three routines directly. Use the macros
50 * in handy.h, so that we can easily redefine everything to do tracking of
51 * allocated hunks back to the original New to track down any memory leaks.
20cec16a 52 * XXX This advice seems to be widely ignored :-( --AD August 1996.
a687059c
LW
53 */
54
26fa51c3
AMS
55/* paranoid version of system's malloc() */
56
bd4080b3 57Malloc_t
4f63d024 58Perl_safesysmalloc(MEM_SIZE size)
8d063cd8 59{
54aff467 60 dTHX;
bd4080b3 61 Malloc_t ptr;
55497cff 62#ifdef HAS_64K_LIMIT
62b28dd9 63 if (size > 0xffff) {
bf49b057 64 PerlIO_printf(Perl_error_log,
16cebae2 65 "Allocation too large: %lx\n", size) FLUSH;
54aff467 66 my_exit(1);
62b28dd9 67 }
55497cff 68#endif /* HAS_64K_LIMIT */
34de22dd
LW
69#ifdef DEBUGGING
70 if ((long)size < 0)
4f63d024 71 Perl_croak_nocontext("panic: malloc");
34de22dd 72#endif
12ae5dfc 73 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
da927450 74 PERL_ALLOC_CHECK(ptr);
97835f67 75 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
8d063cd8
LW
76 if (ptr != Nullch)
77 return ptr;
3280af22 78 else if (PL_nomemok)
7c0587c8 79 return Nullch;
8d063cd8 80 else {
e0767201
GA
81 /* Can't use PerlIO to write as it allocates memory */
82 PerlLIO_write(PerlIO_fileno(Perl_error_log),
83 PL_no_mem, strlen(PL_no_mem));
54aff467 84 my_exit(1);
3aed30dc 85 return Nullch;
8d063cd8
LW
86 }
87 /*NOTREACHED*/
88}
89
f2517201 90/* paranoid version of system's realloc() */
8d063cd8 91
bd4080b3 92Malloc_t
4f63d024 93Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
8d063cd8 94{
54aff467 95 dTHX;
bd4080b3 96 Malloc_t ptr;
9a34ef1d 97#if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
6ad3d225 98 Malloc_t PerlMem_realloc();
ecfc5424 99#endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
8d063cd8 100
a1d180c4 101#ifdef HAS_64K_LIMIT
5f05dabc 102 if (size > 0xffff) {
bf49b057 103 PerlIO_printf(Perl_error_log,
5f05dabc 104 "Reallocation too large: %lx\n", size) FLUSH;
54aff467 105 my_exit(1);
5f05dabc 106 }
55497cff 107#endif /* HAS_64K_LIMIT */
7614df0c 108 if (!size) {
f2517201 109 safesysfree(where);
7614df0c
JD
110 return NULL;
111 }
112
378cc40b 113 if (!where)
f2517201 114 return safesysmalloc(size);
34de22dd
LW
115#ifdef DEBUGGING
116 if ((long)size < 0)
4f63d024 117 Perl_croak_nocontext("panic: realloc");
34de22dd 118#endif
12ae5dfc 119 ptr = (Malloc_t)PerlMem_realloc(where,size);
da927450 120 PERL_ALLOC_CHECK(ptr);
a1d180c4 121
97835f67
JH
122 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
123 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
79072805 124
8d063cd8
LW
125 if (ptr != Nullch)
126 return ptr;
3280af22 127 else if (PL_nomemok)
7c0587c8 128 return Nullch;
8d063cd8 129 else {
e0767201
GA
130 /* Can't use PerlIO to write as it allocates memory */
131 PerlLIO_write(PerlIO_fileno(Perl_error_log),
132 PL_no_mem, strlen(PL_no_mem));
54aff467 133 my_exit(1);
4e35701f 134 return Nullch;
8d063cd8
LW
135 }
136 /*NOTREACHED*/
137}
138
f2517201 139/* safe version of system's free() */
8d063cd8 140
54310121 141Free_t
4f63d024 142Perl_safesysfree(Malloc_t where)
8d063cd8 143{
155aba94 144#ifdef PERL_IMPLICIT_SYS
54aff467 145 dTHX;
155aba94 146#endif
97835f67 147 DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
378cc40b 148 if (where) {
de3bb511 149 /*SUPPRESS 701*/
6ad3d225 150 PerlMem_free(where);
378cc40b 151 }
8d063cd8
LW
152}
153
f2517201 154/* safe version of system's calloc() */
1050c9ca 155
bd4080b3 156Malloc_t
4f63d024 157Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
1050c9ca 158{
54aff467 159 dTHX;
bd4080b3 160 Malloc_t ptr;
1050c9ca 161
55497cff 162#ifdef HAS_64K_LIMIT
5f05dabc 163 if (size * count > 0xffff) {
bf49b057 164 PerlIO_printf(Perl_error_log,
5f05dabc 165 "Allocation too large: %lx\n", size * count) FLUSH;
54aff467 166 my_exit(1);
5f05dabc 167 }
55497cff 168#endif /* HAS_64K_LIMIT */
1050c9ca 169#ifdef DEBUGGING
170 if ((long)size < 0 || (long)count < 0)
4f63d024 171 Perl_croak_nocontext("panic: calloc");
1050c9ca 172#endif
0b7c1c42 173 size *= count;
12ae5dfc 174 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
da927450 175 PERL_ALLOC_CHECK(ptr);
97835f67 176 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) calloc %ld x %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)count,(long)size));
1050c9ca 177 if (ptr != Nullch) {
178 memset((void*)ptr, 0, size);
179 return ptr;
180 }
3280af22 181 else if (PL_nomemok)
1050c9ca 182 return Nullch;
183 else {
e0767201
GA
184 /* Can't use PerlIO to write as it allocates memory */
185 PerlLIO_write(PerlIO_fileno(Perl_error_log),
186 PL_no_mem, strlen(PL_no_mem));
54aff467 187 my_exit(1);
4e35701f 188 return Nullch;
1050c9ca 189 }
190 /*NOTREACHED*/
191}
192
cae6d0e5
GS
193/* These must be defined when not using Perl's malloc for binary
194 * compatibility */
195
196#ifndef MYMALLOC
197
198Malloc_t Perl_malloc (MEM_SIZE nbytes)
199{
200 dTHXs;
077a72a9 201 return (Malloc_t)PerlMem_malloc(nbytes);
cae6d0e5
GS
202}
203
204Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
205{
206 dTHXs;
077a72a9 207 return (Malloc_t)PerlMem_calloc(elements, size);
cae6d0e5
GS
208}
209
210Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
211{
212 dTHXs;
077a72a9 213 return (Malloc_t)PerlMem_realloc(where, nbytes);
cae6d0e5
GS
214}
215
216Free_t Perl_mfree (Malloc_t where)
217{
218 dTHXs;
219 PerlMem_free(where);
220}
221
222#endif
223
8d063cd8
LW
224/* copy a string up to some (non-backslashed) delimiter, if any */
225
226char *
864dbfa3 227Perl_delimcpy(pTHX_ register char *to, register char *toend, register char *from, register char *fromend, register int delim, I32 *retlen)
8d063cd8 228{
fc36a67e 229 register I32 tolen;
230 for (tolen = 0; from < fromend; from++, tolen++) {
378cc40b
LW
231 if (*from == '\\') {
232 if (from[1] == delim)
233 from++;
fc36a67e 234 else {
235 if (to < toend)
236 *to++ = *from;
237 tolen++;
238 from++;
239 }
378cc40b 240 }
bedebaa5 241 else if (*from == delim)
8d063cd8 242 break;
fc36a67e 243 if (to < toend)
244 *to++ = *from;
8d063cd8 245 }
bedebaa5
CS
246 if (to < toend)
247 *to = '\0';
fc36a67e 248 *retlen = tolen;
8d063cd8
LW
249 return from;
250}
251
252/* return ptr to little string in big string, NULL if not found */
378cc40b 253/* This routine was donated by Corey Satten. */
8d063cd8
LW
254
255char *
864dbfa3 256Perl_instr(pTHX_ register const char *big, register const char *little)
378cc40b 257{
08105a92 258 register const char *s, *x;
79072805 259 register I32 first;
378cc40b 260
a687059c 261 if (!little)
08105a92 262 return (char*)big;
a687059c 263 first = *little++;
378cc40b 264 if (!first)
08105a92 265 return (char*)big;
378cc40b
LW
266 while (*big) {
267 if (*big++ != first)
268 continue;
269 for (x=big,s=little; *s; /**/ ) {
270 if (!*x)
271 return Nullch;
272 if (*s++ != *x++) {
273 s--;
274 break;
275 }
276 }
277 if (!*s)
08105a92 278 return (char*)(big-1);
378cc40b
LW
279 }
280 return Nullch;
281}
8d063cd8 282
a687059c
LW
283/* same as instr but allow embedded nulls */
284
285char *
864dbfa3 286Perl_ninstr(pTHX_ register const char *big, register const char *bigend, const char *little, const char *lend)
8d063cd8 287{
08105a92 288 register const char *s, *x;
79072805 289 register I32 first = *little;
08105a92 290 register const char *littleend = lend;
378cc40b 291
a0d0e21e 292 if (!first && little >= littleend)
08105a92 293 return (char*)big;
de3bb511
LW
294 if (bigend - big < littleend - little)
295 return Nullch;
a687059c
LW
296 bigend -= littleend - little++;
297 while (big <= bigend) {
298 if (*big++ != first)
299 continue;
300 for (x=big,s=little; s < littleend; /**/ ) {
301 if (*s++ != *x++) {
302 s--;
303 break;
304 }
305 }
306 if (s >= littleend)
08105a92 307 return (char*)(big-1);
378cc40b 308 }
a687059c
LW
309 return Nullch;
310}
311
312/* reverse of the above--find last substring */
313
314char *
864dbfa3 315Perl_rninstr(pTHX_ register const char *big, const char *bigend, const char *little, const char *lend)
a687059c 316{
08105a92
GS
317 register const char *bigbeg;
318 register const char *s, *x;
79072805 319 register I32 first = *little;
08105a92 320 register const char *littleend = lend;
a687059c 321
a0d0e21e 322 if (!first && little >= littleend)
08105a92 323 return (char*)bigend;
a687059c
LW
324 bigbeg = big;
325 big = bigend - (littleend - little++);
326 while (big >= bigbeg) {
327 if (*big-- != first)
328 continue;
329 for (x=big+2,s=little; s < littleend; /**/ ) {
330 if (*s++ != *x++) {
331 s--;
332 break;
333 }
334 }
335 if (s >= littleend)
08105a92 336 return (char*)(big+1);
378cc40b 337 }
a687059c 338 return Nullch;
378cc40b 339}
a687059c 340
cf93c79d
IZ
341#define FBM_TABLE_OFFSET 2 /* Number of bytes between EOS and table*/
342
343/* As a space optimization, we do not compile tables for strings of length
344 0 and 1, and for strings of length 2 unless FBMcf_TAIL. These are
345 special-cased in fbm_instr().
346
347 If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
348
954c1994 349/*
ccfc67b7
JH
350=head1 Miscellaneous Functions
351
954c1994
GS
352=for apidoc fbm_compile
353
354Analyses the string in order to make fast searches on it using fbm_instr()
355-- the Boyer-Moore algorithm.
356
357=cut
358*/
359
378cc40b 360void
7506f9c3 361Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
378cc40b 362{
942e002e
GS
363 register U8 *s;
364 register U8 *table;
79072805 365 register U32 i;
0b71040e 366 STRLEN len;
79072805
LW
367 I32 rarest = 0;
368 U32 frequency = 256;
369
c517dc2b
JH
370 if (flags & FBMcf_TAIL) {
371 MAGIC *mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
cf93c79d 372 sv_catpvn(sv, "\n", 1); /* Taken into account in fbm_instr() */
c517dc2b
JH
373 if (mg && mg->mg_len >= 0)
374 mg->mg_len++;
375 }
942e002e 376 s = (U8*)SvPV_force(sv, len);
07f14f54 377 (void)SvUPGRADE(sv, SVt_PVBM);
d1be9408 378 if (len == 0) /* TAIL might be on a zero-length string. */
cf93c79d 379 return;
02128f11 380 if (len > 2) {
7506f9c3 381 U8 mlen;
cf93c79d
IZ
382 unsigned char *sb;
383
7506f9c3 384 if (len > 255)
cf93c79d 385 mlen = 255;
7506f9c3
GS
386 else
387 mlen = (U8)len;
388 Sv_Grow(sv, len + 256 + FBM_TABLE_OFFSET);
cf93c79d 389 table = (unsigned char*)(SvPVX(sv) + len + FBM_TABLE_OFFSET);
7506f9c3
GS
390 s = table - 1 - FBM_TABLE_OFFSET; /* last char */
391 memset((void*)table, mlen, 256);
392 table[-1] = (U8)flags;
02128f11 393 i = 0;
7506f9c3 394 sb = s - mlen + 1; /* first char (maybe) */
cf93c79d
IZ
395 while (s >= sb) {
396 if (table[*s] == mlen)
7506f9c3 397 table[*s] = (U8)i;
cf93c79d
IZ
398 s--, i++;
399 }
378cc40b 400 }
14befaf4 401 sv_magic(sv, Nullsv, PERL_MAGIC_bm, Nullch, 0); /* deep magic */
79072805 402 SvVALID_on(sv);
378cc40b 403
463ee0b2 404 s = (unsigned char*)(SvPVX(sv)); /* deeper magic */
bbce6d69 405 for (i = 0; i < len; i++) {
22c35a8c 406 if (PL_freq[s[i]] < frequency) {
bbce6d69 407 rarest = i;
22c35a8c 408 frequency = PL_freq[s[i]];
378cc40b
LW
409 }
410 }
79072805 411 BmRARE(sv) = s[rarest];
eb160463 412 BmPREVIOUS(sv) = (U16)rarest;
cf93c79d
IZ
413 BmUSEFUL(sv) = 100; /* Initial value */
414 if (flags & FBMcf_TAIL)
415 SvTAIL_on(sv);
7506f9c3
GS
416 DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %d\n",
417 BmRARE(sv),BmPREVIOUS(sv)));
378cc40b
LW
418}
419
cf93c79d
IZ
420/* If SvTAIL(littlestr), it has a fake '\n' at end. */
421/* If SvTAIL is actually due to \Z or \z, this gives false positives
422 if multiline */
423
954c1994
GS
424/*
425=for apidoc fbm_instr
426
427Returns the location of the SV in the string delimited by C<str> and
428C<strend>. It returns C<Nullch> if the string can't be found. The C<sv>
429does not have to be fbm_compiled, but the search will not be as fast
430then.
431
432=cut
433*/
434
378cc40b 435char *
864dbfa3 436Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
378cc40b 437{
a687059c 438 register unsigned char *s;
cf93c79d
IZ
439 STRLEN l;
440 register unsigned char *little = (unsigned char *)SvPV(littlestr,l);
441 register STRLEN littlelen = l;
442 register I32 multiline = flags & FBMrf_MULTILINE;
443
eb160463 444 if ((STRLEN)(bigend - big) < littlelen) {
a1d180c4 445 if ( SvTAIL(littlestr)
eb160463 446 && ((STRLEN)(bigend - big) == littlelen - 1)
a1d180c4 447 && (littlelen == 1
12ae5dfc
JH
448 || (*big == *little &&
449 memEQ((char *)big, (char *)little, littlelen - 1))))
cf93c79d
IZ
450 return (char*)big;
451 return Nullch;
452 }
378cc40b 453
cf93c79d 454 if (littlelen <= 2) { /* Special-cased */
cf93c79d
IZ
455
456 if (littlelen == 1) {
457 if (SvTAIL(littlestr) && !multiline) { /* Anchor only! */
458 /* Know that bigend != big. */
459 if (bigend[-1] == '\n')
460 return (char *)(bigend - 1);
461 return (char *) bigend;
462 }
463 s = big;
464 while (s < bigend) {
465 if (*s == *little)
466 return (char *)s;
467 s++;
468 }
469 if (SvTAIL(littlestr))
470 return (char *) bigend;
471 return Nullch;
472 }
473 if (!littlelen)
474 return (char*)big; /* Cannot be SvTAIL! */
475
476 /* littlelen is 2 */
477 if (SvTAIL(littlestr) && !multiline) {
478 if (bigend[-1] == '\n' && bigend[-2] == *little)
479 return (char*)bigend - 2;
480 if (bigend[-1] == *little)
481 return (char*)bigend - 1;
482 return Nullch;
483 }
484 {
485 /* This should be better than FBM if c1 == c2, and almost
486 as good otherwise: maybe better since we do less indirection.
487 And we save a lot of memory by caching no table. */
488 register unsigned char c1 = little[0];
489 register unsigned char c2 = little[1];
490
491 s = big + 1;
492 bigend--;
493 if (c1 != c2) {
494 while (s <= bigend) {
495 if (s[0] == c2) {
496 if (s[-1] == c1)
497 return (char*)s - 1;
498 s += 2;
499 continue;
3fe6f2dc 500 }
cf93c79d
IZ
501 next_chars:
502 if (s[0] == c1) {
503 if (s == bigend)
504 goto check_1char_anchor;
505 if (s[1] == c2)
506 return (char*)s;
507 else {
508 s++;
509 goto next_chars;
510 }
511 }
512 else
513 s += 2;
514 }
515 goto check_1char_anchor;
516 }
517 /* Now c1 == c2 */
518 while (s <= bigend) {
519 if (s[0] == c1) {
520 if (s[-1] == c1)
521 return (char*)s - 1;
522 if (s == bigend)
523 goto check_1char_anchor;
524 if (s[1] == c1)
525 return (char*)s;
526 s += 3;
02128f11 527 }
c277df42 528 else
cf93c79d 529 s += 2;
c277df42 530 }
c277df42 531 }
cf93c79d
IZ
532 check_1char_anchor: /* One char and anchor! */
533 if (SvTAIL(littlestr) && (*bigend == *little))
534 return (char *)bigend; /* bigend is already decremented. */
535 return Nullch;
d48672a2 536 }
cf93c79d 537 if (SvTAIL(littlestr) && !multiline) { /* tail anchored? */
bbce6d69 538 s = bigend - littlelen;
a1d180c4 539 if (s >= big && bigend[-1] == '\n' && *s == *little
cf93c79d
IZ
540 /* Automatically of length > 2 */
541 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
7506f9c3 542 {
bbce6d69 543 return (char*)s; /* how sweet it is */
7506f9c3
GS
544 }
545 if (s[1] == *little
546 && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
547 {
cf93c79d 548 return (char*)s + 1; /* how sweet it is */
7506f9c3 549 }
02128f11
IZ
550 return Nullch;
551 }
cf93c79d
IZ
552 if (SvTYPE(littlestr) != SVt_PVBM || !SvVALID(littlestr)) {
553 char *b = ninstr((char*)big,(char*)bigend,
554 (char*)little, (char*)little + littlelen);
555
556 if (!b && SvTAIL(littlestr)) { /* Automatically multiline! */
557 /* Chop \n from littlestr: */
558 s = bigend - littlelen + 1;
7506f9c3
GS
559 if (*s == *little
560 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
561 {
3fe6f2dc 562 return (char*)s;
7506f9c3 563 }
cf93c79d 564 return Nullch;
a687059c 565 }
cf93c79d 566 return b;
a687059c 567 }
a1d180c4 568
cf93c79d
IZ
569 { /* Do actual FBM. */
570 register unsigned char *table = little + littlelen + FBM_TABLE_OFFSET;
571 register unsigned char *oldlittle;
572
eb160463 573 if (littlelen > (STRLEN)(bigend - big))
cf93c79d
IZ
574 return Nullch;
575 --littlelen; /* Last char found by table lookup */
576
577 s = big + littlelen;
578 little += littlelen; /* last char */
579 oldlittle = little;
580 if (s < bigend) {
581 register I32 tmp;
582
583 top2:
584 /*SUPPRESS 560*/
7506f9c3 585 if ((tmp = table[*s])) {
cf93c79d 586 if ((s += tmp) < bigend)
62b28dd9 587 goto top2;
cf93c79d
IZ
588 goto check_end;
589 }
590 else { /* less expensive than calling strncmp() */
591 register unsigned char *olds = s;
592
593 tmp = littlelen;
594
595 while (tmp--) {
596 if (*--s == *--little)
597 continue;
cf93c79d
IZ
598 s = olds + 1; /* here we pay the price for failure */
599 little = oldlittle;
600 if (s < bigend) /* fake up continue to outer loop */
601 goto top2;
602 goto check_end;
603 }
604 return (char *)s;
a687059c 605 }
378cc40b 606 }
cf93c79d
IZ
607 check_end:
608 if ( s == bigend && (table[-1] & FBMcf_TAIL)
12ae5dfc
JH
609 && memEQ((char *)(bigend - littlelen),
610 (char *)(oldlittle - littlelen), littlelen) )
cf93c79d
IZ
611 return (char*)bigend - littlelen;
612 return Nullch;
378cc40b 613 }
378cc40b
LW
614}
615
c277df42
IZ
616/* start_shift, end_shift are positive quantities which give offsets
617 of ends of some substring of bigstr.
fb8eeed8 618 If `last' we want the last occurrence.
c277df42 619 old_posp is the way of communication between consequent calls if
a1d180c4 620 the next call needs to find the .
c277df42 621 The initial *old_posp should be -1.
cf93c79d
IZ
622
623 Note that we take into account SvTAIL, so one can get extra
624 optimizations if _ALL flag is set.
c277df42
IZ
625 */
626
cf93c79d 627/* If SvTAIL is actually due to \Z or \z, this gives false positives
26fa51c3 628 if PL_multiline. In fact if !PL_multiline the authoritative answer
cf93c79d
IZ
629 is not supported yet. */
630
378cc40b 631char *
864dbfa3 632Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
378cc40b 633{
a687059c
LW
634 register unsigned char *s, *x;
635 register unsigned char *big;
79072805
LW
636 register I32 pos;
637 register I32 previous;
638 register I32 first;
a687059c 639 register unsigned char *little;
c277df42 640 register I32 stop_pos;
a687059c 641 register unsigned char *littleend;
c277df42 642 I32 found = 0;
378cc40b 643
c277df42 644 if (*old_posp == -1
3280af22 645 ? (pos = PL_screamfirst[BmRARE(littlestr)]) < 0
cf93c79d
IZ
646 : (((pos = *old_posp), pos += PL_screamnext[pos]) == 0)) {
647 cant_find:
a1d180c4 648 if ( BmRARE(littlestr) == '\n'
cf93c79d
IZ
649 && BmPREVIOUS(littlestr) == SvCUR(littlestr) - 1) {
650 little = (unsigned char *)(SvPVX(littlestr));
651 littleend = little + SvCUR(littlestr);
652 first = *little++;
653 goto check_tail;
654 }
378cc40b 655 return Nullch;
cf93c79d
IZ
656 }
657
463ee0b2 658 little = (unsigned char *)(SvPVX(littlestr));
79072805 659 littleend = little + SvCUR(littlestr);
378cc40b 660 first = *little++;
c277df42 661 /* The value of pos we can start at: */
79072805 662 previous = BmPREVIOUS(littlestr);
463ee0b2 663 big = (unsigned char *)(SvPVX(bigstr));
c277df42
IZ
664 /* The value of pos we can stop at: */
665 stop_pos = SvCUR(bigstr) - end_shift - (SvCUR(littlestr) - 1 - previous);
cf93c79d 666 if (previous + start_shift > stop_pos) {
0fe87f7c
HS
667/*
668 stop_pos does not include SvTAIL in the count, so this check is incorrect
669 (I think) - see [ID 20010618.006] and t/op/study.t. HVDS 2001/06/19
670*/
671#if 0
cf93c79d
IZ
672 if (previous + start_shift == stop_pos + 1) /* A fake '\n'? */
673 goto check_tail;
0fe87f7c 674#endif
cf93c79d
IZ
675 return Nullch;
676 }
c277df42 677 while (pos < previous + start_shift) {
3280af22 678 if (!(pos += PL_screamnext[pos]))
cf93c79d 679 goto cant_find;
378cc40b 680 }
de3bb511 681 big -= previous;
bbce6d69 682 do {
ef64f398 683 if (pos >= stop_pos) break;
bbce6d69 684 if (big[pos] != first)
685 continue;
686 for (x=big+pos+1,s=little; s < littleend; /**/ ) {
bbce6d69 687 if (*s++ != *x++) {
688 s--;
689 break;
378cc40b 690 }
bbce6d69 691 }
c277df42
IZ
692 if (s == littleend) {
693 *old_posp = pos;
694 if (!last) return (char *)(big+pos);
695 found = 1;
696 }
3280af22 697 } while ( pos += PL_screamnext[pos] );
a1d180c4 698 if (last && found)
cf93c79d 699 return (char *)(big+(*old_posp));
cf93c79d
IZ
700 check_tail:
701 if (!SvTAIL(littlestr) || (end_shift > 0))
702 return Nullch;
703 /* Ignore the trailing "\n". This code is not microoptimized */
704 big = (unsigned char *)(SvPVX(bigstr) + SvCUR(bigstr));
705 stop_pos = littleend - little; /* Actual littlestr len */
706 if (stop_pos == 0)
707 return (char*)big;
708 big -= stop_pos;
709 if (*big == first
12ae5dfc
JH
710 && ((stop_pos == 1) ||
711 memEQ((char *)(big + 1), (char *)little, stop_pos - 1)))
cf93c79d
IZ
712 return (char*)big;
713 return Nullch;
8d063cd8
LW
714}
715
79072805 716I32
864dbfa3 717Perl_ibcmp(pTHX_ const char *s1, const char *s2, register I32 len)
79072805 718{
bbce6d69 719 register U8 *a = (U8 *)s1;
720 register U8 *b = (U8 *)s2;
79072805 721 while (len--) {
22c35a8c 722 if (*a != *b && *a != PL_fold[*b])
bbce6d69 723 return 1;
724 a++,b++;
725 }
726 return 0;
727}
728
729I32
864dbfa3 730Perl_ibcmp_locale(pTHX_ const char *s1, const char *s2, register I32 len)
bbce6d69 731{
732 register U8 *a = (U8 *)s1;
733 register U8 *b = (U8 *)s2;
734 while (len--) {
22c35a8c 735 if (*a != *b && *a != PL_fold_locale[*b])
bbce6d69 736 return 1;
737 a++,b++;
79072805
LW
738 }
739 return 0;
740}
741
8d063cd8
LW
742/* copy a string to a safe spot */
743
954c1994 744/*
ccfc67b7
JH
745=head1 Memory Management
746
954c1994
GS
747=for apidoc savepv
748
61a925ed
AMS
749Perl's version of C<strdup()>. Returns a pointer to a newly allocated
750string which is a duplicate of C<pv>. The size of the string is
751determined by C<strlen()>. The memory allocated for the new string can
752be freed with the C<Safefree()> function.
954c1994
GS
753
754=cut
755*/
756
8d063cd8 757char *
efdfce31 758Perl_savepv(pTHX_ const char *pv)
8d063cd8 759{
e90e2364 760 register char *newaddr;
fbbafa6d
RGS
761#ifdef PERL_MALLOC_WRAP
762 STRLEN pvlen;
763#endif
e90e2364
NC
764 if (!pv)
765 return Nullch;
766
fbbafa6d
RGS
767#ifdef PERL_MALLOC_WRAP
768 pvlen = strlen(pv)+1;
769 New(902,newaddr,pvlen,char);
770#else
e90e2364 771 New(902,newaddr,strlen(pv)+1,char);
fbbafa6d 772#endif
e90e2364 773 return strcpy(newaddr,pv);
8d063cd8
LW
774}
775
a687059c
LW
776/* same thing but with a known length */
777
954c1994
GS
778/*
779=for apidoc savepvn
780
61a925ed
AMS
781Perl's version of what C<strndup()> would be if it existed. Returns a
782pointer to a newly allocated string which is a duplicate of the first
783C<len> bytes from C<pv>. The memory allocated for the new string can be
784freed with the C<Safefree()> function.
954c1994
GS
785
786=cut
787*/
788
a687059c 789char *
efdfce31 790Perl_savepvn(pTHX_ const char *pv, register I32 len)
a687059c
LW
791{
792 register char *newaddr;
793
794 New(903,newaddr,len+1,char);
92110913 795 /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
efdfce31 796 if (pv) {
e90e2364
NC
797 /* might not be null terminated */
798 newaddr[len] = '\0';
799 return CopyD(pv,newaddr,len,char);
92110913
NIS
800 }
801 else {
e90e2364 802 return ZeroD(newaddr,len+1,char);
92110913 803 }
a687059c
LW
804}
805
05ec9bb3
NIS
806/*
807=for apidoc savesharedpv
808
61a925ed
AMS
809A version of C<savepv()> which allocates the duplicate string in memory
810which is shared between threads.
05ec9bb3
NIS
811
812=cut
813*/
814char *
efdfce31 815Perl_savesharedpv(pTHX_ const char *pv)
05ec9bb3 816{
e90e2364
NC
817 register char *newaddr;
818 if (!pv)
819 return Nullch;
820
821 newaddr = (char*)PerlMemShared_malloc(strlen(pv)+1);
822 if (!newaddr) {
823 PerlLIO_write(PerlIO_fileno(Perl_error_log),
824 PL_no_mem, strlen(PL_no_mem));
825 my_exit(1);
05ec9bb3 826 }
e90e2364 827 return strcpy(newaddr,pv);
05ec9bb3
NIS
828}
829
2e0de35c
NC
830/*
831=for apidoc savesvpv
832
6832267f 833A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
2e0de35c
NC
834the passed in SV using C<SvPV()>
835
836=cut
837*/
838
839char *
840Perl_savesvpv(pTHX_ SV *sv)
841{
842 STRLEN len;
843 const char *pv = SvPV(sv, len);
844 register char *newaddr;
845
26866f99
NC
846 ++len;
847 New(903,newaddr,len,char);
2e0de35c
NC
848 return CopyD(pv,newaddr,len,char);
849}
05ec9bb3
NIS
850
851
cea2e8a9 852/* the SV for Perl_form() and mess() is not kept in an arena */
fc36a67e 853
76e3520e 854STATIC SV *
cea2e8a9 855S_mess_alloc(pTHX)
fc36a67e 856{
857 SV *sv;
858 XPVMG *any;
859
e72dc28c
GS
860 if (!PL_dirty)
861 return sv_2mortal(newSVpvn("",0));
862
0372dbb6
GS
863 if (PL_mess_sv)
864 return PL_mess_sv;
865
fc36a67e 866 /* Create as PVMG now, to avoid any upgrading later */
867 New(905, sv, 1, SV);
868 Newz(905, any, 1, XPVMG);
869 SvFLAGS(sv) = SVt_PVMG;
870 SvANY(sv) = (void*)any;
871 SvREFCNT(sv) = 1 << 30; /* practically infinite */
e72dc28c 872 PL_mess_sv = sv;
fc36a67e 873 return sv;
874}
875
c5be433b 876#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
877char *
878Perl_form_nocontext(const char* pat, ...)
879{
880 dTHX;
c5be433b 881 char *retval;
cea2e8a9
GS
882 va_list args;
883 va_start(args, pat);
c5be433b 884 retval = vform(pat, &args);
cea2e8a9 885 va_end(args);
c5be433b 886 return retval;
cea2e8a9 887}
c5be433b 888#endif /* PERL_IMPLICIT_CONTEXT */
cea2e8a9 889
7c9e965c 890/*
ccfc67b7 891=head1 Miscellaneous Functions
7c9e965c
JP
892=for apidoc form
893
894Takes a sprintf-style format pattern and conventional
895(non-SV) arguments and returns the formatted string.
896
897 (char *) Perl_form(pTHX_ const char* pat, ...)
898
899can be used any place a string (char *) is required:
900
901 char * s = Perl_form("%d.%d",major,minor);
902
903Uses a single private buffer so if you want to format several strings you
904must explicitly copy the earlier strings away (and free the copies when you
905are done).
906
907=cut
908*/
909
8990e307 910char *
864dbfa3 911Perl_form(pTHX_ const char* pat, ...)
8990e307 912{
c5be433b 913 char *retval;
46fc3d4c 914 va_list args;
46fc3d4c 915 va_start(args, pat);
c5be433b 916 retval = vform(pat, &args);
46fc3d4c 917 va_end(args);
c5be433b
GS
918 return retval;
919}
920
921char *
922Perl_vform(pTHX_ const char *pat, va_list *args)
923{
924 SV *sv = mess_alloc();
925 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
e72dc28c 926 return SvPVX(sv);
46fc3d4c 927}
a687059c 928
5a844595
GS
929#if defined(PERL_IMPLICIT_CONTEXT)
930SV *
931Perl_mess_nocontext(const char *pat, ...)
932{
933 dTHX;
934 SV *retval;
935 va_list args;
936 va_start(args, pat);
937 retval = vmess(pat, &args);
938 va_end(args);
939 return retval;
940}
941#endif /* PERL_IMPLICIT_CONTEXT */
942
06bf62c7 943SV *
5a844595
GS
944Perl_mess(pTHX_ const char *pat, ...)
945{
946 SV *retval;
947 va_list args;
948 va_start(args, pat);
949 retval = vmess(pat, &args);
950 va_end(args);
951 return retval;
952}
953
ae7d165c
PJ
954STATIC COP*
955S_closest_cop(pTHX_ COP *cop, OP *o)
956{
957 /* Look for PL_op starting from o. cop is the last COP we've seen. */
958
959 if (!o || o == PL_op) return cop;
960
961 if (o->op_flags & OPf_KIDS) {
962 OP *kid;
963 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
964 {
965 COP *new_cop;
966
967 /* If the OP_NEXTSTATE has been optimised away we can still use it
968 * the get the file and line number. */
969
970 if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
971 cop = (COP *)kid;
972
973 /* Keep searching, and return when we've found something. */
974
975 new_cop = closest_cop(cop, kid);
976 if (new_cop) return new_cop;
977 }
978 }
979
980 /* Nothing found. */
981
982 return 0;
983}
984
5a844595
GS
985SV *
986Perl_vmess(pTHX_ const char *pat, va_list *args)
46fc3d4c 987{
e72dc28c 988 SV *sv = mess_alloc();
46fc3d4c 989 static char dgd[] = " during global destruction.\n";
ae7d165c 990 COP *cop;
46fc3d4c 991
fc36a67e 992 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
46fc3d4c 993 if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
ae7d165c
PJ
994
995 /*
996 * Try and find the file and line for PL_op. This will usually be
997 * PL_curcop, but it might be a cop that has been optimised away. We
998 * can try to find such a cop by searching through the optree starting
999 * from the sibling of PL_curcop.
1000 */
1001
1002 cop = closest_cop(PL_curcop, PL_curcop->op_sibling);
1003 if (!cop) cop = PL_curcop;
1004
1005 if (CopLINE(cop))
ed094faf 1006 Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
3aed30dc 1007 OutCopFILE(cop), (IV)CopLINE(cop));
2035c5e8 1008 if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
515f54a1 1009 bool line_mode = (RsSIMPLE(PL_rs) &&
7c1e0849 1010 SvCUR(PL_rs) == 1 && *SvPVX(PL_rs) == '\n');
57def98f 1011 Perl_sv_catpvf(aTHX_ sv, ", <%s> %s %"IVdf,
edc2eac3
JH
1012 PL_last_in_gv == PL_argvgv ?
1013 "" : GvNAME(PL_last_in_gv),
1014 line_mode ? "line" : "chunk",
1015 (IV)IoLINES(GvIOp(PL_last_in_gv)));
a687059c 1016 }
515f54a1 1017 sv_catpv(sv, PL_dirty ? dgd : ".\n");
a687059c 1018 }
06bf62c7 1019 return sv;
a687059c
LW
1020}
1021
7ff03255
SG
1022void
1023Perl_write_to_stderr(pTHX_ const char* message, int msglen)
1024{
1025 IO *io;
1026 MAGIC *mg;
1027
1028 if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1029 && (io = GvIO(PL_stderrgv))
1030 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
1031 {
1032 dSP;
1033 ENTER;
1034 SAVETMPS;
1035
1036 save_re_context();
1037 SAVESPTR(PL_stderrgv);
1038 PL_stderrgv = Nullgv;
1039
1040 PUSHSTACKi(PERLSI_MAGIC);
1041
1042 PUSHMARK(SP);
1043 EXTEND(SP,2);
1044 PUSHs(SvTIED_obj((SV*)io, mg));
1045 PUSHs(sv_2mortal(newSVpvn(message, msglen)));
1046 PUTBACK;
1047 call_method("PRINT", G_SCALAR);
1048
1049 POPSTACK;
1050 FREETMPS;
1051 LEAVE;
1052 }
1053 else {
1054#ifdef USE_SFIO
1055 /* SFIO can really mess with your errno */
1056 int e = errno;
1057#endif
1058 PerlIO *serr = Perl_error_log;
1059
1060 PERL_WRITE_MSG_TO_CONSOLE(serr, message, msglen);
1061 (void)PerlIO_flush(serr);
1062#ifdef USE_SFIO
1063 errno = e;
1064#endif
1065 }
1066}
1067
3ab1ac99
NC
1068/* Common code used by vcroak, vdie and vwarner */
1069
1070void S_vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8);
1071
1072char *
1073S_vdie_croak_common(pTHX_ const char* pat, va_list* args, STRLEN* msglen,
1074 I32* utf8)
1075{
1076 char *message;
1077
1078 if (pat) {
1079 SV *msv = vmess(pat, args);
1080 if (PL_errors && SvCUR(PL_errors)) {
1081 sv_catsv(PL_errors, msv);
1082 message = SvPV(PL_errors, *msglen);
1083 SvCUR_set(PL_errors, 0);
1084 }
1085 else
1086 message = SvPV(msv,*msglen);
1087 *utf8 = SvUTF8(msv);
1088 }
1089 else {
1090 message = Nullch;
1091 }
1092
1093 DEBUG_S(PerlIO_printf(Perl_debug_log,
1094 "%p: die/croak: message = %s\ndiehook = %p\n",
1095 thr, message, PL_diehook));
1096 if (PL_diehook) {
1097 S_vdie_common(aTHX_ message, *msglen, *utf8);
1098 }
1099 return message;
1100}
1101
63315e18
NC
1102void
1103S_vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8)
1104{
1105 HV *stash;
1106 GV *gv;
1107 CV *cv;
1108 /* sv_2cv might call Perl_croak() */
1109 SV *olddiehook = PL_diehook;
1110
1111 assert(PL_diehook);
1112 ENTER;
1113 SAVESPTR(PL_diehook);
1114 PL_diehook = Nullsv;
1115 cv = sv_2cv(olddiehook, &stash, &gv, 0);
1116 LEAVE;
1117 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1118 dSP;
1119 SV *msg;
1120
1121 ENTER;
1122 save_re_context();
1123 if (message) {
1124 msg = newSVpvn(message, msglen);
1125 SvFLAGS(msg) |= utf8;
1126 SvREADONLY_on(msg);
1127 SAVEFREESV(msg);
1128 }
1129 else {
1130 msg = ERRSV;
1131 }
1132
1133 PUSHSTACKi(PERLSI_DIEHOOK);
1134 PUSHMARK(SP);
1135 XPUSHs(msg);
1136 PUTBACK;
1137 call_sv((SV*)cv, G_DISCARD);
1138 POPSTACK;
1139 LEAVE;
1140 }
1141}
1142
c5be433b
GS
1143OP *
1144Perl_vdie(pTHX_ const char* pat, va_list *args)
36477c24 1145{
36477c24 1146 char *message;
3280af22 1147 int was_in_eval = PL_in_eval;
06bf62c7 1148 STRLEN msglen;
ff882698 1149 I32 utf8 = 0;
36477c24 1150
bf49b057 1151 DEBUG_S(PerlIO_printf(Perl_debug_log,
199100c8 1152 "%p: die: curstack = %p, mainstack = %p\n",
533c011a 1153 thr, PL_curstack, PL_mainstack));
36477c24 1154
3ab1ac99 1155 message = S_vdie_croak_common(aTHX_ pat, args, &msglen, &utf8);
36477c24 1156
06bf62c7 1157 PL_restartop = die_where(message, msglen);
ff882698 1158 SvFLAGS(ERRSV) |= utf8;
bf49b057 1159 DEBUG_S(PerlIO_printf(Perl_debug_log,
7c06b590 1160 "%p: die: restartop = %p, was_in_eval = %d, top_env = %p\n",
533c011a 1161 thr, PL_restartop, was_in_eval, PL_top_env));
3280af22 1162 if ((!PL_restartop && was_in_eval) || PL_top_env->je_prev)
6224f72b 1163 JMPENV_JUMP(3);
3280af22 1164 return PL_restartop;
36477c24 1165}
1166
c5be433b 1167#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
1168OP *
1169Perl_die_nocontext(const char* pat, ...)
a687059c 1170{
cea2e8a9
GS
1171 dTHX;
1172 OP *o;
a687059c 1173 va_list args;
cea2e8a9 1174 va_start(args, pat);
c5be433b 1175 o = vdie(pat, &args);
cea2e8a9
GS
1176 va_end(args);
1177 return o;
1178}
c5be433b 1179#endif /* PERL_IMPLICIT_CONTEXT */
cea2e8a9
GS
1180
1181OP *
1182Perl_die(pTHX_ const char* pat, ...)
1183{
1184 OP *o;
1185 va_list args;
1186 va_start(args, pat);
c5be433b 1187 o = vdie(pat, &args);
cea2e8a9
GS
1188 va_end(args);
1189 return o;
1190}
1191
c5be433b
GS
1192void
1193Perl_vcroak(pTHX_ const char* pat, va_list *args)
cea2e8a9 1194{
de3bb511 1195 char *message;
06bf62c7 1196 STRLEN msglen;
ff882698 1197 I32 utf8 = 0;
a687059c 1198
3ab1ac99 1199 message = S_vdie_croak_common(aTHX_ pat, args, &msglen, &utf8);
5a844595 1200
3280af22 1201 if (PL_in_eval) {
06bf62c7 1202 PL_restartop = die_where(message, msglen);
ff882698 1203 SvFLAGS(ERRSV) |= utf8;
6224f72b 1204 JMPENV_JUMP(3);
a0d0e21e 1205 }
84414e3e
JH
1206 else if (!message)
1207 message = SvPVx(ERRSV, msglen);
1208
7ff03255 1209 write_to_stderr(message, msglen);
f86702cc 1210 my_failure_exit();
a687059c
LW
1211}
1212
c5be433b 1213#if defined(PERL_IMPLICIT_CONTEXT)
8990e307 1214void
cea2e8a9 1215Perl_croak_nocontext(const char *pat, ...)
a687059c 1216{
cea2e8a9 1217 dTHX;
a687059c 1218 va_list args;
cea2e8a9 1219 va_start(args, pat);
c5be433b 1220 vcroak(pat, &args);
cea2e8a9
GS
1221 /* NOTREACHED */
1222 va_end(args);
1223}
1224#endif /* PERL_IMPLICIT_CONTEXT */
1225
954c1994 1226/*
ccfc67b7
JH
1227=head1 Warning and Dieing
1228
954c1994
GS
1229=for apidoc croak
1230
9983fa3c 1231This is the XSUB-writer's interface to Perl's C<die> function.
966353fd
MF
1232Normally call this function the same way you call the C C<printf>
1233function. Calling C<croak> returns control directly to Perl,
1234sidestepping the normal C order of execution. See C<warn>.
9983fa3c
GS
1235
1236If you want to throw an exception object, assign the object to
1237C<$@> and then pass C<Nullch> to croak():
1238
1239 errsv = get_sv("@", TRUE);
1240 sv_setsv(errsv, exception_object);
1241 croak(Nullch);
954c1994
GS
1242
1243=cut
1244*/
1245
cea2e8a9
GS
1246void
1247Perl_croak(pTHX_ const char *pat, ...)
1248{
1249 va_list args;
1250 va_start(args, pat);
c5be433b 1251 vcroak(pat, &args);
cea2e8a9
GS
1252 /* NOTREACHED */
1253 va_end(args);
1254}
1255
c5be433b
GS
1256void
1257Perl_vwarn(pTHX_ const char* pat, va_list *args)
cea2e8a9 1258{
de3bb511 1259 char *message;
748a9306
LW
1260 HV *stash;
1261 GV *gv;
1262 CV *cv;
06bf62c7
GS
1263 SV *msv;
1264 STRLEN msglen;
ff882698 1265 I32 utf8 = 0;
a687059c 1266
5a844595 1267 msv = vmess(pat, args);
ff882698 1268 utf8 = SvUTF8(msv);
06bf62c7 1269 message = SvPV(msv, msglen);
a687059c 1270
3280af22 1271 if (PL_warnhook) {
cea2e8a9 1272 /* sv_2cv might call Perl_warn() */
3280af22 1273 SV *oldwarnhook = PL_warnhook;
1738f5c4 1274 ENTER;
3280af22
NIS
1275 SAVESPTR(PL_warnhook);
1276 PL_warnhook = Nullsv;
20cec16a 1277 cv = sv_2cv(oldwarnhook, &stash, &gv, 0);
1738f5c4
CS
1278 LEAVE;
1279 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
20cec16a 1280 dSP;
774d564b 1281 SV *msg;
1282
1283 ENTER;
3a1f2dc9 1284 save_re_context();
06bf62c7 1285 msg = newSVpvn(message, msglen);
ff882698 1286 SvFLAGS(msg) |= utf8;
774d564b 1287 SvREADONLY_on(msg);
1288 SAVEFREESV(msg);
1289
e788e7d3 1290 PUSHSTACKi(PERLSI_WARNHOOK);
924508f0 1291 PUSHMARK(SP);
774d564b 1292 XPUSHs(msg);
20cec16a 1293 PUTBACK;
864dbfa3 1294 call_sv((SV*)cv, G_DISCARD);
d3acc0f7 1295 POPSTACK;
774d564b 1296 LEAVE;
20cec16a 1297 return;
1298 }
748a9306 1299 }
87582a92 1300
7ff03255 1301 write_to_stderr(message, msglen);
a687059c 1302}
8d063cd8 1303
c5be433b 1304#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
1305void
1306Perl_warn_nocontext(const char *pat, ...)
1307{
1308 dTHX;
1309 va_list args;
1310 va_start(args, pat);
c5be433b 1311 vwarn(pat, &args);
cea2e8a9
GS
1312 va_end(args);
1313}
1314#endif /* PERL_IMPLICIT_CONTEXT */
1315
954c1994
GS
1316/*
1317=for apidoc warn
1318
966353fd
MF
1319This is the XSUB-writer's interface to Perl's C<warn> function. Call this
1320function the same way you call the C C<printf> function. See C<croak>.
954c1994
GS
1321
1322=cut
1323*/
1324
cea2e8a9
GS
1325void
1326Perl_warn(pTHX_ const char *pat, ...)
1327{
1328 va_list args;
1329 va_start(args, pat);
c5be433b 1330 vwarn(pat, &args);
cea2e8a9
GS
1331 va_end(args);
1332}
1333
c5be433b
GS
1334#if defined(PERL_IMPLICIT_CONTEXT)
1335void
1336Perl_warner_nocontext(U32 err, const char *pat, ...)
1337{
1338 dTHX;
1339 va_list args;
1340 va_start(args, pat);
1341 vwarner(err, pat, &args);
1342 va_end(args);
1343}
1344#endif /* PERL_IMPLICIT_CONTEXT */
1345
599cee73 1346void
864dbfa3 1347Perl_warner(pTHX_ U32 err, const char* pat,...)
599cee73
PM
1348{
1349 va_list args;
c5be433b
GS
1350 va_start(args, pat);
1351 vwarner(err, pat, &args);
1352 va_end(args);
1353}
1354
1355void
1356Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args)
1357{
d13b0d77 1358 if (ckDEAD(err)) {
63315e18 1359 SV *msv = vmess(pat, args);
d13b0d77 1360 STRLEN msglen;
63315e18
NC
1361 char *message = SvPV(msv, msglen);
1362 I32 utf8 = SvUTF8(msv);
599cee73 1363
3aed30dc 1364 if (PL_diehook) {
63315e18
NC
1365 assert(message);
1366 S_vdie_common(aTHX_ message, msglen, utf8);
3aed30dc
HS
1367 }
1368 if (PL_in_eval) {
1369 PL_restartop = die_where(message, msglen);
ff882698 1370 SvFLAGS(ERRSV) |= utf8;
3aed30dc
HS
1371 JMPENV_JUMP(3);
1372 }
7ff03255 1373 write_to_stderr(message, msglen);
3aed30dc 1374 my_failure_exit();
599cee73
PM
1375 }
1376 else {
d13b0d77 1377 Perl_vwarn(aTHX_ pat, args);
599cee73
PM
1378 }
1379}
1380
e6587932
DM
1381/* since we've already done strlen() for both nam and val
1382 * we can use that info to make things faster than
1383 * sprintf(s, "%s=%s", nam, val)
1384 */
1385#define my_setenv_format(s, nam, nlen, val, vlen) \
1386 Copy(nam, s, nlen, char); \
1387 *(s+nlen) = '='; \
1388 Copy(val, s+(nlen+1), vlen, char); \
1389 *(s+(nlen+1+vlen)) = '\0'
1390
13b6e58c 1391#ifdef USE_ENVIRON_ARRAY
eccd403f 1392 /* VMS' my_setenv() is in vms.c */
2986a63f 1393#if !defined(WIN32) && !defined(NETWARE)
8d063cd8 1394void
864dbfa3 1395Perl_my_setenv(pTHX_ char *nam, char *val)
8d063cd8 1396{
4efc5df6
GS
1397#ifdef USE_ITHREADS
1398 /* only parent thread can modify process environment */
1399 if (PL_curinterp == aTHX)
1400#endif
1401 {
f2517201 1402#ifndef PERL_USE_SAFE_PUTENV
50acdf95 1403 if (!PL_use_safe_putenv) {
f2517201 1404 /* most putenv()s leak, so we manipulate environ directly */
79072805 1405 register I32 i=setenv_getix(nam); /* where does it go? */
e6587932 1406 int nlen, vlen;
8d063cd8 1407
3280af22 1408 if (environ == PL_origenviron) { /* need we copy environment? */
79072805
LW
1409 I32 j;
1410 I32 max;
fe14fcc3
LW
1411 char **tmpenv;
1412
de3bb511 1413 /*SUPPRESS 530*/
fe14fcc3 1414 for (max = i; environ[max]; max++) ;
f2517201
GS
1415 tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
1416 for (j=0; j<max; j++) { /* copy environment */
3aed30dc
HS
1417 int len = strlen(environ[j]);
1418 tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char));
1419 Copy(environ[j], tmpenv[j], len+1, char);
f2517201 1420 }
fe14fcc3
LW
1421 tmpenv[max] = Nullch;
1422 environ = tmpenv; /* tell exec where it is now */
1423 }
a687059c 1424 if (!val) {
f2517201 1425 safesysfree(environ[i]);
a687059c
LW
1426 while (environ[i]) {
1427 environ[i] = environ[i+1];
1428 i++;
1429 }
1430 return;
1431 }
8d063cd8 1432 if (!environ[i]) { /* does not exist yet */
f2517201 1433 environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
8d063cd8
LW
1434 environ[i+1] = Nullch; /* make sure it's null terminated */
1435 }
fe14fcc3 1436 else
f2517201 1437 safesysfree(environ[i]);
e6587932
DM
1438 nlen = strlen(nam);
1439 vlen = strlen(val);
f2517201 1440
e6587932
DM
1441 environ[i] = (char*)safesysmalloc((nlen+vlen+2) * sizeof(char));
1442 /* all that work just for this */
1443 my_setenv_format(environ[i], nam, nlen, val, vlen);
50acdf95
MS
1444 } else {
1445# endif
eccd403f 1446# if defined(__CYGWIN__) || defined( EPOC)
47dafe4d
EF
1447 setenv(nam, val, 1);
1448# else
f2517201 1449 char *new_env;
e6587932
DM
1450 int nlen = strlen(nam), vlen;
1451 if (!val) {
3aed30dc 1452 val = "";
e6587932
DM
1453 }
1454 vlen = strlen(val);
1455 new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
1456 /* all that work just for this */
1457 my_setenv_format(new_env, nam, nlen, val, vlen);
f2517201 1458 (void)putenv(new_env);
47dafe4d 1459# endif /* __CYGWIN__ */
50acdf95
MS
1460#ifndef PERL_USE_SAFE_PUTENV
1461 }
1462#endif
4efc5df6 1463 }
8d063cd8
LW
1464}
1465
2986a63f 1466#else /* WIN32 || NETWARE */
68dc0745 1467
1468void
864dbfa3 1469Perl_my_setenv(pTHX_ char *nam,char *val)
68dc0745 1470{
ac5c734f 1471 register char *envstr;
e6587932
DM
1472 int nlen = strlen(nam), vlen;
1473
ac5c734f
GS
1474 if (!val) {
1475 val = "";
1476 }
e6587932
DM
1477 vlen = strlen(val);
1478 New(904, envstr, nlen+vlen+2, char);
1479 my_setenv_format(envstr, nam, nlen, val, vlen);
ac5c734f
GS
1480 (void)PerlEnv_putenv(envstr);
1481 Safefree(envstr);
3e3baf6d
TB
1482}
1483
2986a63f 1484#endif /* WIN32 || NETWARE */
3e3baf6d 1485
2f42fcb0 1486#ifndef PERL_MICRO
3e3baf6d 1487I32
864dbfa3 1488Perl_setenv_getix(pTHX_ char *nam)
3e3baf6d
TB
1489{
1490 register I32 i, len = strlen(nam);
1491
1492 for (i = 0; environ[i]; i++) {
1493 if (
1494#ifdef WIN32
1495 strnicmp(environ[i],nam,len) == 0
1496#else
1497 strnEQ(environ[i],nam,len)
1498#endif
1499 && environ[i][len] == '=')
1500 break; /* strnEQ must come first to avoid */
1501 } /* potential SEGV's */
1502 return i;
68dc0745 1503}
2f42fcb0 1504#endif /* !PERL_MICRO */
68dc0745 1505
ed79a026 1506#endif /* !VMS && !EPOC*/
378cc40b 1507
16d20bd9 1508#ifdef UNLINK_ALL_VERSIONS
79072805 1509I32
864dbfa3 1510Perl_unlnk(pTHX_ char *f) /* unlink all versions of a file */
378cc40b 1511{
79072805 1512 I32 i;
378cc40b 1513
6ad3d225 1514 for (i = 0; PerlLIO_unlink(f) >= 0; i++) ;
378cc40b
LW
1515 return i ? 0 : -1;
1516}
1517#endif
1518
7a3f2258 1519/* this is a drop-in replacement for bcopy() */
2253333f 1520#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
378cc40b 1521char *
7a3f2258 1522Perl_my_bcopy(register const char *from,register char *to,register I32 len)
378cc40b
LW
1523{
1524 char *retval = to;
1525
7c0587c8
LW
1526 if (from - to >= 0) {
1527 while (len--)
1528 *to++ = *from++;
1529 }
1530 else {
1531 to += len;
1532 from += len;
1533 while (len--)
faf8582f 1534 *(--to) = *(--from);
7c0587c8 1535 }
378cc40b
LW
1536 return retval;
1537}
ffed7fef 1538#endif
378cc40b 1539
7a3f2258 1540/* this is a drop-in replacement for memset() */
fc36a67e 1541#ifndef HAS_MEMSET
1542void *
7a3f2258 1543Perl_my_memset(register char *loc, register I32 ch, register I32 len)
fc36a67e 1544{
1545 char *retval = loc;
1546
1547 while (len--)
1548 *loc++ = ch;
1549 return retval;
1550}
1551#endif
1552
7a3f2258 1553/* this is a drop-in replacement for bzero() */
7c0587c8 1554#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
378cc40b 1555char *
7a3f2258 1556Perl_my_bzero(register char *loc, register I32 len)
378cc40b
LW
1557{
1558 char *retval = loc;
1559
1560 while (len--)
1561 *loc++ = 0;
1562 return retval;
1563}
1564#endif
7c0587c8 1565
7a3f2258 1566/* this is a drop-in replacement for memcmp() */
36477c24 1567#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
79072805 1568I32
7a3f2258 1569Perl_my_memcmp(const char *s1, const char *s2, register I32 len)
7c0587c8 1570{
36477c24 1571 register U8 *a = (U8 *)s1;
1572 register U8 *b = (U8 *)s2;
79072805 1573 register I32 tmp;
7c0587c8
LW
1574
1575 while (len--) {
36477c24 1576 if (tmp = *a++ - *b++)
7c0587c8
LW
1577 return tmp;
1578 }
1579 return 0;
1580}
36477c24 1581#endif /* !HAS_MEMCMP || !HAS_SANE_MEMCMP */
a687059c 1582
fe14fcc3 1583#ifndef HAS_VPRINTF
a687059c 1584
85e6fe83 1585#ifdef USE_CHAR_VSPRINTF
a687059c
LW
1586char *
1587#else
1588int
1589#endif
08105a92 1590vsprintf(char *dest, const char *pat, char *args)
a687059c
LW
1591{
1592 FILE fakebuf;
1593
1594 fakebuf._ptr = dest;
1595 fakebuf._cnt = 32767;
35c8bce7
LW
1596#ifndef _IOSTRG
1597#define _IOSTRG 0
1598#endif
a687059c
LW
1599 fakebuf._flag = _IOWRT|_IOSTRG;
1600 _doprnt(pat, args, &fakebuf); /* what a kludge */
1601 (void)putc('\0', &fakebuf);
85e6fe83 1602#ifdef USE_CHAR_VSPRINTF
a687059c
LW
1603 return(dest);
1604#else
1605 return 0; /* perl doesn't use return value */
1606#endif
1607}
1608
fe14fcc3 1609#endif /* HAS_VPRINTF */
a687059c
LW
1610
1611#ifdef MYSWAP
ffed7fef 1612#if BYTEORDER != 0x4321
a687059c 1613short
864dbfa3 1614Perl_my_swap(pTHX_ short s)
a687059c
LW
1615{
1616#if (BYTEORDER & 1) == 0
1617 short result;
1618
1619 result = ((s & 255) << 8) + ((s >> 8) & 255);
1620 return result;
1621#else
1622 return s;
1623#endif
1624}
1625
1626long
864dbfa3 1627Perl_my_htonl(pTHX_ long l)
a687059c
LW
1628{
1629 union {
1630 long result;
ffed7fef 1631 char c[sizeof(long)];
a687059c
LW
1632 } u;
1633
ffed7fef 1634#if BYTEORDER == 0x1234
a687059c
LW
1635 u.c[0] = (l >> 24) & 255;
1636 u.c[1] = (l >> 16) & 255;
1637 u.c[2] = (l >> 8) & 255;
1638 u.c[3] = l & 255;
1639 return u.result;
1640#else
ffed7fef 1641#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
cea2e8a9 1642 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
a687059c 1643#else
79072805
LW
1644 register I32 o;
1645 register I32 s;
a687059c 1646
ffed7fef
LW
1647 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
1648 u.c[o & 0xf] = (l >> s) & 255;
a687059c
LW
1649 }
1650 return u.result;
1651#endif
1652#endif
1653}
1654
1655long
864dbfa3 1656Perl_my_ntohl(pTHX_ long l)
a687059c
LW
1657{
1658 union {
1659 long l;
ffed7fef 1660 char c[sizeof(long)];
a687059c
LW
1661 } u;
1662
ffed7fef 1663#if BYTEORDER == 0x1234
a687059c
LW
1664 u.c[0] = (l >> 24) & 255;
1665 u.c[1] = (l >> 16) & 255;
1666 u.c[2] = (l >> 8) & 255;
1667 u.c[3] = l & 255;
1668 return u.l;
1669#else
ffed7fef 1670#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
cea2e8a9 1671 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
a687059c 1672#else
79072805
LW
1673 register I32 o;
1674 register I32 s;
a687059c
LW
1675
1676 u.l = l;
1677 l = 0;
ffed7fef
LW
1678 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
1679 l |= (u.c[o & 0xf] & 255) << s;
a687059c
LW
1680 }
1681 return l;
1682#endif
1683#endif
1684}
1685
ffed7fef 1686#endif /* BYTEORDER != 0x4321 */
988174c1
LW
1687#endif /* MYSWAP */
1688
1689/*
1690 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1691 * If these functions are defined,
1692 * the BYTEORDER is neither 0x1234 nor 0x4321.
1693 * However, this is not assumed.
1694 * -DWS
1695 */
1696
1109a392 1697#define HTOLE(name,type) \
988174c1 1698 type \
ba106d47 1699 name (register type n) \
988174c1
LW
1700 { \
1701 union { \
1702 type value; \
1703 char c[sizeof(type)]; \
1704 } u; \
79072805 1705 register I32 i; \
1109a392
MHM
1706 register I32 s = 0; \
1707 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
988174c1
LW
1708 u.c[i] = (n >> s) & 0xFF; \
1709 } \
1710 return u.value; \
1711 }
1712
1109a392 1713#define LETOH(name,type) \
988174c1 1714 type \
ba106d47 1715 name (register type n) \
988174c1
LW
1716 { \
1717 union { \
1718 type value; \
1719 char c[sizeof(type)]; \
1720 } u; \
79072805 1721 register I32 i; \
1109a392 1722 register I32 s = 0; \
988174c1
LW
1723 u.value = n; \
1724 n = 0; \
1109a392
MHM
1725 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
1726 n |= ((type)(u.c[i] & 0xFF)) << s; \
988174c1
LW
1727 } \
1728 return n; \
1729 }
1730
1109a392
MHM
1731/*
1732 * Big-endian byte order functions.
1733 */
1734
1735#define HTOBE(name,type) \
1736 type \
1737 name (register type n) \
1738 { \
1739 union { \
1740 type value; \
1741 char c[sizeof(type)]; \
1742 } u; \
1743 register I32 i; \
1744 register I32 s = 8*(sizeof(u.c)-1); \
1745 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
1746 u.c[i] = (n >> s) & 0xFF; \
1747 } \
1748 return u.value; \
1749 }
1750
1751#define BETOH(name,type) \
1752 type \
1753 name (register type n) \
1754 { \
1755 union { \
1756 type value; \
1757 char c[sizeof(type)]; \
1758 } u; \
1759 register I32 i; \
1760 register I32 s = 8*(sizeof(u.c)-1); \
1761 u.value = n; \
1762 n = 0; \
1763 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
1764 n |= ((type)(u.c[i] & 0xFF)) << s; \
1765 } \
1766 return n; \
1767 }
1768
1769/*
1770 * If we just can't do it...
1771 */
1772
1773#define NOT_AVAIL(name,type) \
1774 type \
1775 name (register type n) \
1776 { \
1777 Perl_croak_nocontext(#name "() not available"); \
1778 return n; /* not reached */ \
1779 }
1780
1781
988174c1 1782#if defined(HAS_HTOVS) && !defined(htovs)
1109a392 1783HTOLE(htovs,short)
988174c1
LW
1784#endif
1785#if defined(HAS_HTOVL) && !defined(htovl)
1109a392 1786HTOLE(htovl,long)
988174c1
LW
1787#endif
1788#if defined(HAS_VTOHS) && !defined(vtohs)
1109a392 1789LETOH(vtohs,short)
988174c1
LW
1790#endif
1791#if defined(HAS_VTOHL) && !defined(vtohl)
1109a392
MHM
1792LETOH(vtohl,long)
1793#endif
1794
1795#ifdef PERL_NEED_MY_HTOLE16
1796# if U16SIZE == 2
1797HTOLE(Perl_my_htole16,U16)
1798# else
1799NOT_AVAIL(Perl_my_htole16,U16)
1800# endif
1801#endif
1802#ifdef PERL_NEED_MY_LETOH16
1803# if U16SIZE == 2
1804LETOH(Perl_my_letoh16,U16)
1805# else
1806NOT_AVAIL(Perl_my_letoh16,U16)
1807# endif
1808#endif
1809#ifdef PERL_NEED_MY_HTOBE16
1810# if U16SIZE == 2
1811HTOBE(Perl_my_htobe16,U16)
1812# else
1813NOT_AVAIL(Perl_my_htobe16,U16)
1814# endif
1815#endif
1816#ifdef PERL_NEED_MY_BETOH16
1817# if U16SIZE == 2
1818BETOH(Perl_my_betoh16,U16)
1819# else
1820NOT_AVAIL(Perl_my_betoh16,U16)
1821# endif
1822#endif
1823
1824#ifdef PERL_NEED_MY_HTOLE32
1825# if U32SIZE == 4
1826HTOLE(Perl_my_htole32,U32)
1827# else
1828NOT_AVAIL(Perl_my_htole32,U32)
1829# endif
1830#endif
1831#ifdef PERL_NEED_MY_LETOH32
1832# if U32SIZE == 4
1833LETOH(Perl_my_letoh32,U32)
1834# else
1835NOT_AVAIL(Perl_my_letoh32,U32)
1836# endif
1837#endif
1838#ifdef PERL_NEED_MY_HTOBE32
1839# if U32SIZE == 4
1840HTOBE(Perl_my_htobe32,U32)
1841# else
1842NOT_AVAIL(Perl_my_htobe32,U32)
1843# endif
1844#endif
1845#ifdef PERL_NEED_MY_BETOH32
1846# if U32SIZE == 4
1847BETOH(Perl_my_betoh32,U32)
1848# else
1849NOT_AVAIL(Perl_my_betoh32,U32)
1850# endif
1851#endif
1852
1853#ifdef PERL_NEED_MY_HTOLE64
1854# if U64SIZE == 8
1855HTOLE(Perl_my_htole64,U64)
1856# else
1857NOT_AVAIL(Perl_my_htole64,U64)
1858# endif
1859#endif
1860#ifdef PERL_NEED_MY_LETOH64
1861# if U64SIZE == 8
1862LETOH(Perl_my_letoh64,U64)
1863# else
1864NOT_AVAIL(Perl_my_letoh64,U64)
1865# endif
1866#endif
1867#ifdef PERL_NEED_MY_HTOBE64
1868# if U64SIZE == 8
1869HTOBE(Perl_my_htobe64,U64)
1870# else
1871NOT_AVAIL(Perl_my_htobe64,U64)
1872# endif
1873#endif
1874#ifdef PERL_NEED_MY_BETOH64
1875# if U64SIZE == 8
1876BETOH(Perl_my_betoh64,U64)
1877# else
1878NOT_AVAIL(Perl_my_betoh64,U64)
1879# endif
988174c1 1880#endif
a687059c 1881
1109a392
MHM
1882#ifdef PERL_NEED_MY_HTOLES
1883HTOLE(Perl_my_htoles,short)
1884#endif
1885#ifdef PERL_NEED_MY_LETOHS
1886LETOH(Perl_my_letohs,short)
1887#endif
1888#ifdef PERL_NEED_MY_HTOBES
1889HTOBE(Perl_my_htobes,short)
1890#endif
1891#ifdef PERL_NEED_MY_BETOHS
1892BETOH(Perl_my_betohs,short)
1893#endif
1894
1895#ifdef PERL_NEED_MY_HTOLEI
1896HTOLE(Perl_my_htolei,int)
1897#endif
1898#ifdef PERL_NEED_MY_LETOHI
1899LETOH(Perl_my_letohi,int)
1900#endif
1901#ifdef PERL_NEED_MY_HTOBEI
1902HTOBE(Perl_my_htobei,int)
1903#endif
1904#ifdef PERL_NEED_MY_BETOHI
1905BETOH(Perl_my_betohi,int)
1906#endif
1907
1908#ifdef PERL_NEED_MY_HTOLEL
1909HTOLE(Perl_my_htolel,long)
1910#endif
1911#ifdef PERL_NEED_MY_LETOHL
1912LETOH(Perl_my_letohl,long)
1913#endif
1914#ifdef PERL_NEED_MY_HTOBEL
1915HTOBE(Perl_my_htobel,long)
1916#endif
1917#ifdef PERL_NEED_MY_BETOHL
1918BETOH(Perl_my_betohl,long)
1919#endif
1920
1921void
1922Perl_my_swabn(void *ptr, int n)
1923{
1924 register char *s = (char *)ptr;
1925 register char *e = s + (n-1);
1926 register char tc;
1927
1928 for (n /= 2; n > 0; s++, e--, n--) {
1929 tc = *s;
1930 *s = *e;
1931 *e = tc;
1932 }
1933}
1934
4a7d1889
NIS
1935PerlIO *
1936Perl_my_popen_list(pTHX_ char *mode, int n, SV **args)
1937{
2986a63f 1938#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(NETWARE)
1f852d0d
NIS
1939 int p[2];
1940 register I32 This, that;
1941 register Pid_t pid;
1942 SV *sv;
1943 I32 did_pipes = 0;
1944 int pp[2];
1945
1946 PERL_FLUSHALL_FOR_CHILD;
1947 This = (*mode == 'w');
1948 that = !This;
1949 if (PL_tainting) {
1950 taint_env();
1951 taint_proper("Insecure %s%s", "EXEC");
1952 }
1953 if (PerlProc_pipe(p) < 0)
1954 return Nullfp;
1955 /* Try for another pipe pair for error return */
1956 if (PerlProc_pipe(pp) >= 0)
1957 did_pipes = 1;
52e18b1f 1958 while ((pid = PerlProc_fork()) < 0) {
1f852d0d
NIS
1959 if (errno != EAGAIN) {
1960 PerlLIO_close(p[This]);
4e6dfe71 1961 PerlLIO_close(p[that]);
1f852d0d
NIS
1962 if (did_pipes) {
1963 PerlLIO_close(pp[0]);
1964 PerlLIO_close(pp[1]);
1965 }
1966 return Nullfp;
1967 }
1968 sleep(5);
1969 }
1970 if (pid == 0) {
1971 /* Child */
1f852d0d
NIS
1972#undef THIS
1973#undef THAT
1974#define THIS that
1975#define THAT This
1f852d0d
NIS
1976 /* Close parent's end of error status pipe (if any) */
1977 if (did_pipes) {
1978 PerlLIO_close(pp[0]);
1979#if defined(HAS_FCNTL) && defined(F_SETFD)
1980 /* Close error pipe automatically if exec works */
1981 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
1982#endif
1983 }
1984 /* Now dup our end of _the_ pipe to right position */
1985 if (p[THIS] != (*mode == 'r')) {
1986 PerlLIO_dup2(p[THIS], *mode == 'r');
1987 PerlLIO_close(p[THIS]);
4e6dfe71
GS
1988 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
1989 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
1f852d0d 1990 }
4e6dfe71
GS
1991 else
1992 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
1f852d0d
NIS
1993#if !defined(HAS_FCNTL) || !defined(F_SETFD)
1994 /* No automatic close - do it by hand */
b7953727
JH
1995# ifndef NOFILE
1996# define NOFILE 20
1997# endif
a080fe3d
NIS
1998 {
1999 int fd;
2000
2001 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
3aed30dc 2002 if (fd != pp[1])
a080fe3d
NIS
2003 PerlLIO_close(fd);
2004 }
1f852d0d
NIS
2005 }
2006#endif
2007 do_aexec5(Nullsv, args-1, args-1+n, pp[1], did_pipes);
2008 PerlProc__exit(1);
2009#undef THIS
2010#undef THAT
2011 }
2012 /* Parent */
52e18b1f 2013 do_execfree(); /* free any memory malloced by child on fork */
1f852d0d
NIS
2014 if (did_pipes)
2015 PerlLIO_close(pp[1]);
2016 /* Keep the lower of the two fd numbers */
2017 if (p[that] < p[This]) {
2018 PerlLIO_dup2(p[This], p[that]);
2019 PerlLIO_close(p[This]);
2020 p[This] = p[that];
2021 }
4e6dfe71
GS
2022 else
2023 PerlLIO_close(p[that]); /* close child's end of pipe */
2024
1f852d0d
NIS
2025 LOCK_FDPID_MUTEX;
2026 sv = *av_fetch(PL_fdpid,p[This],TRUE);
2027 UNLOCK_FDPID_MUTEX;
2028 (void)SvUPGRADE(sv,SVt_IV);
2029 SvIVX(sv) = pid;
2030 PL_forkprocess = pid;
2031 /* If we managed to get status pipe check for exec fail */
2032 if (did_pipes && pid > 0) {
2033 int errkid;
2034 int n = 0, n1;
2035
2036 while (n < sizeof(int)) {
2037 n1 = PerlLIO_read(pp[0],
2038 (void*)(((char*)&errkid)+n),
2039 (sizeof(int)) - n);
2040 if (n1 <= 0)
2041 break;
2042 n += n1;
2043 }
2044 PerlLIO_close(pp[0]);
2045 did_pipes = 0;
2046 if (n) { /* Error */
2047 int pid2, status;
8c51524e 2048 PerlLIO_close(p[This]);
1f852d0d
NIS
2049 if (n != sizeof(int))
2050 Perl_croak(aTHX_ "panic: kid popen errno read");
2051 do {
2052 pid2 = wait4pid(pid, &status, 0);
2053 } while (pid2 == -1 && errno == EINTR);
2054 errno = errkid; /* Propagate errno from kid */
2055 return Nullfp;
2056 }
2057 }
2058 if (did_pipes)
2059 PerlLIO_close(pp[0]);
2060 return PerlIO_fdopen(p[This], mode);
2061#else
4a7d1889
NIS
2062 Perl_croak(aTHX_ "List form of piped open not implemented");
2063 return (PerlIO *) NULL;
1f852d0d 2064#endif
4a7d1889
NIS
2065}
2066
5f05dabc 2067 /* VMS' my_popen() is in VMS.c, same with OS/2. */
cd39f2b6 2068#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
760ac839 2069PerlIO *
864dbfa3 2070Perl_my_popen(pTHX_ char *cmd, char *mode)
a687059c
LW
2071{
2072 int p[2];
8ac85365 2073 register I32 This, that;
d8a83dd3 2074 register Pid_t pid;
79072805 2075 SV *sv;
770526c1 2076 I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
e446cec8
IZ
2077 I32 did_pipes = 0;
2078 int pp[2];
a687059c 2079
45bc9206 2080 PERL_FLUSHALL_FOR_CHILD;
ddcf38b7
IZ
2081#ifdef OS2
2082 if (doexec) {
23da6c43 2083 return my_syspopen(aTHX_ cmd,mode);
ddcf38b7 2084 }
a1d180c4 2085#endif
8ac85365
NIS
2086 This = (*mode == 'w');
2087 that = !This;
3280af22 2088 if (doexec && PL_tainting) {
bbce6d69 2089 taint_env();
2090 taint_proper("Insecure %s%s", "EXEC");
d48672a2 2091 }
c2267164
IZ
2092 if (PerlProc_pipe(p) < 0)
2093 return Nullfp;
e446cec8
IZ
2094 if (doexec && PerlProc_pipe(pp) >= 0)
2095 did_pipes = 1;
52e18b1f 2096 while ((pid = PerlProc_fork()) < 0) {
a687059c 2097 if (errno != EAGAIN) {
6ad3d225 2098 PerlLIO_close(p[This]);
b5ac89c3 2099 PerlLIO_close(p[that]);
e446cec8
IZ
2100 if (did_pipes) {
2101 PerlLIO_close(pp[0]);
2102 PerlLIO_close(pp[1]);
2103 }
a687059c 2104 if (!doexec)
cea2e8a9 2105 Perl_croak(aTHX_ "Can't fork");
a687059c
LW
2106 return Nullfp;
2107 }
2108 sleep(5);
2109 }
2110 if (pid == 0) {
79072805
LW
2111 GV* tmpgv;
2112
30ac6d9b
GS
2113#undef THIS
2114#undef THAT
a687059c 2115#define THIS that
8ac85365 2116#define THAT This
e446cec8
IZ
2117 if (did_pipes) {
2118 PerlLIO_close(pp[0]);
2119#if defined(HAS_FCNTL) && defined(F_SETFD)
2120 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2121#endif
2122 }
a687059c 2123 if (p[THIS] != (*mode == 'r')) {
6ad3d225
GS
2124 PerlLIO_dup2(p[THIS], *mode == 'r');
2125 PerlLIO_close(p[THIS]);
b5ac89c3
NIS
2126 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2127 PerlLIO_close(p[THAT]);
a687059c 2128 }
b5ac89c3
NIS
2129 else
2130 PerlLIO_close(p[THAT]);
4435c477 2131#ifndef OS2
a687059c 2132 if (doexec) {
a0d0e21e 2133#if !defined(HAS_FCNTL) || !defined(F_SETFD)
ae986130
LW
2134 int fd;
2135
2136#ifndef NOFILE
2137#define NOFILE 20
2138#endif
a080fe3d 2139 {
3aed30dc 2140 int fd;
a080fe3d
NIS
2141
2142 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2143 if (fd != pp[1])
3aed30dc 2144 PerlLIO_close(fd);
a080fe3d 2145 }
ae986130 2146#endif
a080fe3d
NIS
2147 /* may or may not use the shell */
2148 do_exec3(cmd, pp[1], did_pipes);
6ad3d225 2149 PerlProc__exit(1);
a687059c 2150 }
4435c477 2151#endif /* defined OS2 */
de3bb511 2152 /*SUPPRESS 560*/
306196c3 2153 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
4d76a344 2154 SvREADONLY_off(GvSV(tmpgv));
7766f137 2155 sv_setiv(GvSV(tmpgv), PerlProc_getpid());
4d76a344
RGS
2156 SvREADONLY_on(GvSV(tmpgv));
2157 }
2158#ifdef THREADS_HAVE_PIDS
2159 PL_ppid = (IV)getppid();
2160#endif
3280af22
NIS
2161 PL_forkprocess = 0;
2162 hv_clear(PL_pidstatus); /* we have no children */
a687059c
LW
2163 return Nullfp;
2164#undef THIS
2165#undef THAT
2166 }
b5ac89c3 2167 do_execfree(); /* free any memory malloced by child on vfork */
e446cec8
IZ
2168 if (did_pipes)
2169 PerlLIO_close(pp[1]);
8ac85365 2170 if (p[that] < p[This]) {
6ad3d225
GS
2171 PerlLIO_dup2(p[This], p[that]);
2172 PerlLIO_close(p[This]);
8ac85365 2173 p[This] = p[that];
62b28dd9 2174 }
b5ac89c3
NIS
2175 else
2176 PerlLIO_close(p[that]);
2177
4755096e 2178 LOCK_FDPID_MUTEX;
3280af22 2179 sv = *av_fetch(PL_fdpid,p[This],TRUE);
4755096e 2180 UNLOCK_FDPID_MUTEX;
a0d0e21e 2181 (void)SvUPGRADE(sv,SVt_IV);
463ee0b2 2182 SvIVX(sv) = pid;
3280af22 2183 PL_forkprocess = pid;
e446cec8
IZ
2184 if (did_pipes && pid > 0) {
2185 int errkid;
2186 int n = 0, n1;
2187
2188 while (n < sizeof(int)) {
2189 n1 = PerlLIO_read(pp[0],
2190 (void*)(((char*)&errkid)+n),
2191 (sizeof(int)) - n);
2192 if (n1 <= 0)
2193 break;
2194 n += n1;
2195 }
2f96c702
IZ
2196 PerlLIO_close(pp[0]);
2197 did_pipes = 0;
e446cec8 2198 if (n) { /* Error */
faa466a7 2199 int pid2, status;
8c51524e 2200 PerlLIO_close(p[This]);
e446cec8 2201 if (n != sizeof(int))
cea2e8a9 2202 Perl_croak(aTHX_ "panic: kid popen errno read");
faa466a7
RG
2203 do {
2204 pid2 = wait4pid(pid, &status, 0);
2205 } while (pid2 == -1 && errno == EINTR);
e446cec8
IZ
2206 errno = errkid; /* Propagate errno from kid */
2207 return Nullfp;
2208 }
2209 }
2210 if (did_pipes)
2211 PerlLIO_close(pp[0]);
8ac85365 2212 return PerlIO_fdopen(p[This], mode);
a687059c 2213}
7c0587c8 2214#else
85ca448a 2215#if defined(atarist) || defined(EPOC)
7c0587c8 2216FILE *popen();
760ac839 2217PerlIO *
864dbfa3 2218Perl_my_popen(pTHX_ char *cmd, char *mode)
7c0587c8 2219{
45bc9206 2220 PERL_FLUSHALL_FOR_CHILD;
a1d180c4
NIS
2221 /* Call system's popen() to get a FILE *, then import it.
2222 used 0 for 2nd parameter to PerlIO_importFILE;
2223 apparently not used
2224 */
2225 return PerlIO_importFILE(popen(cmd, mode), 0);
7c0587c8 2226}
2b96b0a5
JH
2227#else
2228#if defined(DJGPP)
2229FILE *djgpp_popen();
2230PerlIO *
2231Perl_my_popen(pTHX_ char *cmd, char *mode)
2232{
2233 PERL_FLUSHALL_FOR_CHILD;
2234 /* Call system's popen() to get a FILE *, then import it.
2235 used 0 for 2nd parameter to PerlIO_importFILE;
2236 apparently not used
2237 */
2238 return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2239}
2240#endif
7c0587c8
LW
2241#endif
2242
2243#endif /* !DOSISH */
a687059c 2244
52e18b1f
GS
2245/* this is called in parent before the fork() */
2246void
2247Perl_atfork_lock(void)
2248{
3db8f154 2249#if defined(USE_ITHREADS)
52e18b1f
GS
2250 /* locks must be held in locking order (if any) */
2251# ifdef MYMALLOC
2252 MUTEX_LOCK(&PL_malloc_mutex);
2253# endif
2254 OP_REFCNT_LOCK;
2255#endif
2256}
2257
2258/* this is called in both parent and child after the fork() */
2259void
2260Perl_atfork_unlock(void)
2261{
3db8f154 2262#if defined(USE_ITHREADS)
52e18b1f
GS
2263 /* locks must be released in same order as in atfork_lock() */
2264# ifdef MYMALLOC
2265 MUTEX_UNLOCK(&PL_malloc_mutex);
2266# endif
2267 OP_REFCNT_UNLOCK;
2268#endif
2269}
2270
2271Pid_t
2272Perl_my_fork(void)
2273{
2274#if defined(HAS_FORK)
2275 Pid_t pid;
3db8f154 2276#if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
52e18b1f
GS
2277 atfork_lock();
2278 pid = fork();
2279 atfork_unlock();
2280#else
2281 /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2282 * handlers elsewhere in the code */
2283 pid = fork();
2284#endif
2285 return pid;
2286#else
2287 /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2288 Perl_croak_nocontext("fork() not available");
b961a566 2289 return 0;
52e18b1f
GS
2290#endif /* HAS_FORK */
2291}
2292
748a9306 2293#ifdef DUMP_FDS
35ff7856 2294void
864dbfa3 2295Perl_dump_fds(pTHX_ char *s)
ae986130
LW
2296{
2297 int fd;
c623ac67 2298 Stat_t tmpstatbuf;
ae986130 2299
bf49b057 2300 PerlIO_printf(Perl_debug_log,"%s", s);
ae986130 2301 for (fd = 0; fd < 32; fd++) {
6ad3d225 2302 if (PerlLIO_fstat(fd,&tmpstatbuf) >= 0)
bf49b057 2303 PerlIO_printf(Perl_debug_log," %d",fd);
ae986130 2304 }
bf49b057 2305 PerlIO_printf(Perl_debug_log,"\n");
ae986130 2306}
35ff7856 2307#endif /* DUMP_FDS */
ae986130 2308
fe14fcc3 2309#ifndef HAS_DUP2
fec02dd3 2310int
ba106d47 2311dup2(int oldfd, int newfd)
a687059c 2312{
a0d0e21e 2313#if defined(HAS_FCNTL) && defined(F_DUPFD)
fec02dd3
AD
2314 if (oldfd == newfd)
2315 return oldfd;
6ad3d225 2316 PerlLIO_close(newfd);
fec02dd3 2317 return fcntl(oldfd, F_DUPFD, newfd);
62b28dd9 2318#else
fc36a67e 2319#define DUP2_MAX_FDS 256
2320 int fdtmp[DUP2_MAX_FDS];
79072805 2321 I32 fdx = 0;
ae986130
LW
2322 int fd;
2323
fe14fcc3 2324 if (oldfd == newfd)
fec02dd3 2325 return oldfd;
6ad3d225 2326 PerlLIO_close(newfd);
fc36a67e 2327 /* good enough for low fd's... */
6ad3d225 2328 while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
fc36a67e 2329 if (fdx >= DUP2_MAX_FDS) {
6ad3d225 2330 PerlLIO_close(fd);
fc36a67e 2331 fd = -1;
2332 break;
2333 }
ae986130 2334 fdtmp[fdx++] = fd;
fc36a67e 2335 }
ae986130 2336 while (fdx > 0)
6ad3d225 2337 PerlLIO_close(fdtmp[--fdx]);
fec02dd3 2338 return fd;
62b28dd9 2339#endif
a687059c
LW
2340}
2341#endif
2342
64ca3a65 2343#ifndef PERL_MICRO
ff68c719 2344#ifdef HAS_SIGACTION
2345
abea2c45
HS
2346#ifdef MACOS_TRADITIONAL
2347/* We don't want restart behavior on MacOS */
2348#undef SA_RESTART
2349#endif
2350
ff68c719 2351Sighandler_t
864dbfa3 2352Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
ff68c719 2353{
2354 struct sigaction act, oact;
2355
a10b1e10
JH
2356#ifdef USE_ITHREADS
2357 /* only "parent" interpreter can diddle signals */
2358 if (PL_curinterp != aTHX)
2359 return SIG_ERR;
2360#endif
2361
ff68c719 2362 act.sa_handler = handler;
2363 sigemptyset(&act.sa_mask);
2364 act.sa_flags = 0;
2365#ifdef SA_RESTART
4ffa73a3
JH
2366 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2367 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
0a8e0eff 2368#endif
358837b8 2369#if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
85264bed
CS
2370 if (signo == SIGCHLD && handler == (Sighandler_t)SIG_IGN)
2371 act.sa_flags |= SA_NOCLDWAIT;
2372#endif
ff68c719 2373 if (sigaction(signo, &act, &oact) == -1)
36477c24 2374 return SIG_ERR;
ff68c719 2375 else
36477c24 2376 return oact.sa_handler;
ff68c719 2377}
2378
2379Sighandler_t
864dbfa3 2380Perl_rsignal_state(pTHX_ int signo)
ff68c719 2381{
2382 struct sigaction oact;
2383
2384 if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
3aed30dc 2385 return SIG_ERR;
ff68c719 2386 else
3aed30dc 2387 return oact.sa_handler;
ff68c719 2388}
2389
2390int
864dbfa3 2391Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
ff68c719 2392{
2393 struct sigaction act;
2394
a10b1e10
JH
2395#ifdef USE_ITHREADS
2396 /* only "parent" interpreter can diddle signals */
2397 if (PL_curinterp != aTHX)
2398 return -1;
2399#endif
2400
ff68c719 2401 act.sa_handler = handler;
2402 sigemptyset(&act.sa_mask);
2403 act.sa_flags = 0;
2404#ifdef SA_RESTART
4ffa73a3
JH
2405 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2406 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
0a8e0eff 2407#endif
36b5d377 2408#if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
85264bed
CS
2409 if (signo == SIGCHLD && handler == (Sighandler_t)SIG_IGN)
2410 act.sa_flags |= SA_NOCLDWAIT;
2411#endif
ff68c719 2412 return sigaction(signo, &act, save);
2413}
2414
2415int
864dbfa3 2416Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
ff68c719 2417{
a10b1e10
JH
2418#ifdef USE_ITHREADS
2419 /* only "parent" interpreter can diddle signals */
2420 if (PL_curinterp != aTHX)
2421 return -1;
2422#endif
2423
ff68c719 2424 return sigaction(signo, save, (struct sigaction *)NULL);
2425}
2426
2427#else /* !HAS_SIGACTION */
2428
2429Sighandler_t
864dbfa3 2430Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
ff68c719 2431{
39f1703b 2432#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2433 /* only "parent" interpreter can diddle signals */
2434 if (PL_curinterp != aTHX)
2435 return SIG_ERR;
2436#endif
2437
6ad3d225 2438 return PerlProc_signal(signo, handler);
ff68c719 2439}
2440
df3728a2
JH
2441static int sig_trapped; /* XXX signals are process-wide anyway, so we
2442 ignore the implications of this for threading */
ff68c719 2443
2444static
2445Signal_t
4e35701f 2446sig_trap(int signo)
ff68c719 2447{
2448 sig_trapped++;
2449}
2450
2451Sighandler_t
864dbfa3 2452Perl_rsignal_state(pTHX_ int signo)
ff68c719 2453{
2454 Sighandler_t oldsig;
2455
39f1703b 2456#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2457 /* only "parent" interpreter can diddle signals */
2458 if (PL_curinterp != aTHX)
2459 return SIG_ERR;
2460#endif
2461
ff68c719 2462 sig_trapped = 0;
6ad3d225
GS
2463 oldsig = PerlProc_signal(signo, sig_trap);
2464 PerlProc_signal(signo, oldsig);
ff68c719 2465 if (sig_trapped)
3aed30dc 2466 PerlProc_kill(PerlProc_getpid(), signo);
ff68c719 2467 return oldsig;
2468}
2469
2470int
864dbfa3 2471Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
ff68c719 2472{
39f1703b 2473#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2474 /* only "parent" interpreter can diddle signals */
2475 if (PL_curinterp != aTHX)
2476 return -1;
2477#endif
6ad3d225 2478 *save = PerlProc_signal(signo, handler);
ff68c719 2479 return (*save == SIG_ERR) ? -1 : 0;
2480}
2481
2482int
864dbfa3 2483Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
ff68c719 2484{
39f1703b 2485#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2486 /* only "parent" interpreter can diddle signals */
2487 if (PL_curinterp != aTHX)
2488 return -1;
2489#endif
6ad3d225 2490 return (PerlProc_signal(signo, *save) == SIG_ERR) ? -1 : 0;
ff68c719 2491}
2492
2493#endif /* !HAS_SIGACTION */
64ca3a65 2494#endif /* !PERL_MICRO */
ff68c719 2495
5f05dabc 2496 /* VMS' my_pclose() is in VMS.c; same with OS/2 */
cd39f2b6 2497#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
79072805 2498I32
864dbfa3 2499Perl_my_pclose(pTHX_ PerlIO *ptr)
a687059c 2500{
ff68c719 2501 Sigsave_t hstat, istat, qstat;
a687059c 2502 int status;
a0d0e21e 2503 SV **svp;
d8a83dd3
JH
2504 Pid_t pid;
2505 Pid_t pid2;
03136e13 2506 bool close_failed;
b7953727 2507 int saved_errno = 0;
03136e13
CS
2508#ifdef VMS
2509 int saved_vaxc_errno;
2510#endif
22fae026
TM
2511#ifdef WIN32
2512 int saved_win32_errno;
2513#endif
a687059c 2514
4755096e 2515 LOCK_FDPID_MUTEX;
3280af22 2516 svp = av_fetch(PL_fdpid,PerlIO_fileno(ptr),TRUE);
4755096e 2517 UNLOCK_FDPID_MUTEX;
25d92023 2518 pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
a0d0e21e 2519 SvREFCNT_dec(*svp);
3280af22 2520 *svp = &PL_sv_undef;
ddcf38b7
IZ
2521#ifdef OS2
2522 if (pid == -1) { /* Opened by popen. */
2523 return my_syspclose(ptr);
2524 }
a1d180c4 2525#endif
03136e13
CS
2526 if ((close_failed = (PerlIO_close(ptr) == EOF))) {
2527 saved_errno = errno;
2528#ifdef VMS
2529 saved_vaxc_errno = vaxc$errno;
2530#endif
22fae026
TM
2531#ifdef WIN32
2532 saved_win32_errno = GetLastError();
2533#endif
03136e13 2534 }
7c0587c8 2535#ifdef UTS
6ad3d225 2536 if(PerlProc_kill(pid, 0) < 0) { return(pid); } /* HOM 12/23/91 */
7c0587c8 2537#endif
64ca3a65 2538#ifndef PERL_MICRO
ff68c719 2539 rsignal_save(SIGHUP, SIG_IGN, &hstat);
2540 rsignal_save(SIGINT, SIG_IGN, &istat);
2541 rsignal_save(SIGQUIT, SIG_IGN, &qstat);
64ca3a65 2542#endif
748a9306 2543 do {
1d3434b8
GS
2544 pid2 = wait4pid(pid, &status, 0);
2545 } while (pid2 == -1 && errno == EINTR);
64ca3a65 2546#ifndef PERL_MICRO
ff68c719 2547 rsignal_restore(SIGHUP, &hstat);
2548 rsignal_restore(SIGINT, &istat);
2549 rsignal_restore(SIGQUIT, &qstat);
64ca3a65 2550#endif
03136e13
CS
2551 if (close_failed) {
2552 SETERRNO(saved_errno, saved_vaxc_errno);
2553 return -1;
2554 }
1d3434b8 2555 return(pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status));
20188a90 2556}
4633a7c4
LW
2557#endif /* !DOSISH */
2558
2986a63f 2559#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(MACOS_TRADITIONAL)
79072805 2560I32
d8a83dd3 2561Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
20188a90 2562{
cddd4526 2563 I32 result;
b7953727
JH
2564 if (!pid)
2565 return -1;
2566#if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME)
2567 {
3aed30dc
HS
2568 SV *sv;
2569 SV** svp;
cf28e18a 2570 char spid[TYPE_CHARS(IV)];
20188a90 2571
3aed30dc 2572 if (pid > 0) {
7b0972df 2573 sprintf(spid, "%"IVdf, (IV)pid);
3aed30dc
HS
2574 svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE);
2575 if (svp && *svp != &PL_sv_undef) {
2576 *statusp = SvIVX(*svp);
2577 (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD);
2578 return pid;
2579 }
2580 }
2581 else {
2582 HE *entry;
2583
2584 hv_iterinit(PL_pidstatus);
2585 if ((entry = hv_iternext(PL_pidstatus))) {
3aed30dc
HS
2586 pid = atoi(hv_iterkey(entry,(I32*)statusp));
2587 sv = hv_iterval(PL_pidstatus,entry);
2588 *statusp = SvIVX(sv);
2589 sprintf(spid, "%"IVdf, (IV)pid);
2590 (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD);
2591 return pid;
2592 }
20188a90
LW
2593 }
2594 }
68a29c53 2595#endif
79072805 2596#ifdef HAS_WAITPID
367f3c24
IZ
2597# ifdef HAS_WAITPID_RUNTIME
2598 if (!HAS_WAITPID_RUNTIME)
2599 goto hard_way;
2600# endif
cddd4526 2601 result = PerlProc_waitpid(pid,statusp,flags);
dfcfdb64 2602 goto finish;
367f3c24
IZ
2603#endif
2604#if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
cddd4526 2605 result = wait4((pid==-1)?0:pid,statusp,flags,Null(struct rusage *));
dfcfdb64 2606 goto finish;
367f3c24
IZ
2607#endif
2608#if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME)
2609 hard_way:
a0d0e21e 2610 {
a0d0e21e 2611 if (flags)
cea2e8a9 2612 Perl_croak(aTHX_ "Can't do waitpid with flags");
a0d0e21e 2613 else {
76e3520e 2614 while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
a0d0e21e
LW
2615 pidgone(result,*statusp);
2616 if (result < 0)
2617 *statusp = -1;
2618 }
a687059c
LW
2619 }
2620#endif
dfcfdb64 2621 finish:
cddd4526
NIS
2622 if (result < 0 && errno == EINTR) {
2623 PERL_ASYNC_CHECK();
2624 }
2625 return result;
a687059c 2626}
2986a63f 2627#endif /* !DOSISH || OS2 || WIN32 || NETWARE */
a687059c 2628
7c0587c8 2629void
de3bb511 2630/*SUPPRESS 590*/
d8a83dd3 2631Perl_pidgone(pTHX_ Pid_t pid, int status)
a687059c 2632{
79072805 2633 register SV *sv;
cf28e18a 2634 char spid[TYPE_CHARS(IV)];
a687059c 2635
7b0972df 2636 sprintf(spid, "%"IVdf, (IV)pid);
3280af22 2637 sv = *hv_fetch(PL_pidstatus,spid,strlen(spid),TRUE);
a0d0e21e 2638 (void)SvUPGRADE(sv,SVt_IV);
463ee0b2 2639 SvIVX(sv) = status;
20188a90 2640 return;
a687059c
LW
2641}
2642
85ca448a 2643#if defined(atarist) || defined(OS2) || defined(EPOC)
7c0587c8 2644int pclose();
ddcf38b7
IZ
2645#ifdef HAS_FORK
2646int /* Cannot prototype with I32
2647 in os2ish.h. */
ba106d47 2648my_syspclose(PerlIO *ptr)
ddcf38b7 2649#else
79072805 2650I32
864dbfa3 2651Perl_my_pclose(pTHX_ PerlIO *ptr)
a1d180c4 2652#endif
a687059c 2653{
760ac839
LW
2654 /* Needs work for PerlIO ! */
2655 FILE *f = PerlIO_findFILE(ptr);
2656 I32 result = pclose(f);
2b96b0a5
JH
2657 PerlIO_releaseFILE(ptr,f);
2658 return result;
2659}
2660#endif
2661
933fea7f 2662#if defined(DJGPP)
2b96b0a5
JH
2663int djgpp_pclose();
2664I32
2665Perl_my_pclose(pTHX_ PerlIO *ptr)
2666{
2667 /* Needs work for PerlIO ! */
2668 FILE *f = PerlIO_findFILE(ptr);
2669 I32 result = djgpp_pclose(f);
933fea7f 2670 result = (result << 8) & 0xff00;
760ac839
LW
2671 PerlIO_releaseFILE(ptr,f);
2672 return result;
a687059c 2673}
7c0587c8 2674#endif
9f68db38
LW
2675
2676void
864dbfa3 2677Perl_repeatcpy(pTHX_ register char *to, register const char *from, I32 len, register I32 count)
9f68db38 2678{
79072805 2679 register I32 todo;
08105a92 2680 register const char *frombase = from;
9f68db38
LW
2681
2682 if (len == 1) {
08105a92 2683 register const char c = *from;
9f68db38 2684 while (count-- > 0)
5926133d 2685 *to++ = c;
9f68db38
LW
2686 return;
2687 }
2688 while (count-- > 0) {
2689 for (todo = len; todo > 0; todo--) {
2690 *to++ = *from++;
2691 }
2692 from = frombase;
2693 }
2694}
0f85fab0 2695
fe14fcc3 2696#ifndef HAS_RENAME
79072805 2697I32
864dbfa3 2698Perl_same_dirent(pTHX_ char *a, char *b)
62b28dd9 2699{
93a17b20
LW
2700 char *fa = strrchr(a,'/');
2701 char *fb = strrchr(b,'/');
c623ac67
GS
2702 Stat_t tmpstatbuf1;
2703 Stat_t tmpstatbuf2;
46fc3d4c 2704 SV *tmpsv = sv_newmortal();
62b28dd9
LW
2705
2706 if (fa)
2707 fa++;
2708 else
2709 fa = a;
2710 if (fb)
2711 fb++;
2712 else
2713 fb = b;
2714 if (strNE(a,b))
2715 return FALSE;
2716 if (fa == a)
46fc3d4c 2717 sv_setpv(tmpsv, ".");
62b28dd9 2718 else
46fc3d4c 2719 sv_setpvn(tmpsv, a, fa - a);
c6ed36e1 2720 if (PerlLIO_stat(SvPVX(tmpsv), &tmpstatbuf1) < 0)
62b28dd9
LW
2721 return FALSE;
2722 if (fb == b)
46fc3d4c 2723 sv_setpv(tmpsv, ".");
62b28dd9 2724 else
46fc3d4c 2725 sv_setpvn(tmpsv, b, fb - b);
c6ed36e1 2726 if (PerlLIO_stat(SvPVX(tmpsv), &tmpstatbuf2) < 0)
62b28dd9
LW
2727 return FALSE;
2728 return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
2729 tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
2730}
fe14fcc3
LW
2731#endif /* !HAS_RENAME */
2732
491527d0 2733char*
864dbfa3 2734Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 flags)
491527d0 2735{
491527d0
GS
2736 char *xfound = Nullch;
2737 char *xfailed = Nullch;
0f31cffe 2738 char tmpbuf[MAXPATHLEN];
491527d0 2739 register char *s;
5f74f29c 2740 I32 len = 0;
491527d0
GS
2741 int retval;
2742#if defined(DOSISH) && !defined(OS2) && !defined(atarist)
2743# define SEARCH_EXTS ".bat", ".cmd", NULL
2744# define MAX_EXT_LEN 4
2745#endif
2746#ifdef OS2
2747# define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
2748# define MAX_EXT_LEN 4
2749#endif
2750#ifdef VMS
2751# define SEARCH_EXTS ".pl", ".com", NULL
2752# define MAX_EXT_LEN 4
2753#endif
2754 /* additional extensions to try in each dir if scriptname not found */
2755#ifdef SEARCH_EXTS
2756 char *exts[] = { SEARCH_EXTS };
2757 char **ext = search_ext ? search_ext : exts;
2758 int extidx = 0, i = 0;
2759 char *curext = Nullch;
2760#else
2761# define MAX_EXT_LEN 0
2762#endif
2763
2764 /*
2765 * If dosearch is true and if scriptname does not contain path
2766 * delimiters, search the PATH for scriptname.
2767 *
2768 * If SEARCH_EXTS is also defined, will look for each
2769 * scriptname{SEARCH_EXTS} whenever scriptname is not found
2770 * while searching the PATH.
2771 *
2772 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
2773 * proceeds as follows:
2774 * If DOSISH or VMSISH:
2775 * + look for ./scriptname{,.foo,.bar}
2776 * + search the PATH for scriptname{,.foo,.bar}
2777 *
2778 * If !DOSISH:
2779 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
2780 * this will not look in '.' if it's not in the PATH)
2781 */
84486fc6 2782 tmpbuf[0] = '\0';
491527d0
GS
2783
2784#ifdef VMS
2785# ifdef ALWAYS_DEFTYPES
2786 len = strlen(scriptname);
2787 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
2788 int hasdir, idx = 0, deftypes = 1;
2789 bool seen_dot = 1;
2790
2791 hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
2792# else
2793 if (dosearch) {
2794 int hasdir, idx = 0, deftypes = 1;
2795 bool seen_dot = 1;
2796
2797 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
2798# endif
2799 /* The first time through, just add SEARCH_EXTS to whatever we
2800 * already have, so we can check for default file types. */
2801 while (deftypes ||
84486fc6 2802 (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
491527d0
GS
2803 {
2804 if (deftypes) {
2805 deftypes = 0;
84486fc6 2806 *tmpbuf = '\0';
491527d0 2807 }
84486fc6
GS
2808 if ((strlen(tmpbuf) + strlen(scriptname)
2809 + MAX_EXT_LEN) >= sizeof tmpbuf)
491527d0 2810 continue; /* don't search dir with too-long name */
84486fc6 2811 strcat(tmpbuf, scriptname);
491527d0
GS
2812#else /* !VMS */
2813
2814#ifdef DOSISH
2815 if (strEQ(scriptname, "-"))
2816 dosearch = 0;
2817 if (dosearch) { /* Look in '.' first. */
2818 char *cur = scriptname;
2819#ifdef SEARCH_EXTS
2820 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
2821 while (ext[i])
2822 if (strEQ(ext[i++],curext)) {
2823 extidx = -1; /* already has an ext */
2824 break;
2825 }
2826 do {
2827#endif
2828 DEBUG_p(PerlIO_printf(Perl_debug_log,
2829 "Looking for %s\n",cur));
017f25f1
IZ
2830 if (PerlLIO_stat(cur,&PL_statbuf) >= 0
2831 && !S_ISDIR(PL_statbuf.st_mode)) {
491527d0
GS
2832 dosearch = 0;
2833 scriptname = cur;
2834#ifdef SEARCH_EXTS
2835 break;
2836#endif
2837 }
2838#ifdef SEARCH_EXTS
2839 if (cur == scriptname) {
2840 len = strlen(scriptname);
84486fc6 2841 if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
491527d0 2842 break;
84486fc6 2843 cur = strcpy(tmpbuf, scriptname);
491527d0
GS
2844 }
2845 } while (extidx >= 0 && ext[extidx] /* try an extension? */
84486fc6 2846 && strcpy(tmpbuf+len, ext[extidx++]));
491527d0
GS
2847#endif
2848 }
2849#endif
2850
cd39f2b6
JH
2851#ifdef MACOS_TRADITIONAL
2852 if (dosearch && !strchr(scriptname, ':') &&
2853 (s = PerlEnv_getenv("Commands")))
2854#else
491527d0
GS
2855 if (dosearch && !strchr(scriptname, '/')
2856#ifdef DOSISH
2857 && !strchr(scriptname, '\\')
2858#endif
cd39f2b6
JH
2859 && (s = PerlEnv_getenv("PATH")))
2860#endif
2861 {
491527d0 2862 bool seen_dot = 0;
92f0c265 2863
3280af22
NIS
2864 PL_bufend = s + strlen(s);
2865 while (s < PL_bufend) {
cd39f2b6
JH
2866#ifdef MACOS_TRADITIONAL
2867 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
2868 ',',
2869 &len);
2870#else
491527d0
GS
2871#if defined(atarist) || defined(DOSISH)
2872 for (len = 0; *s
2873# ifdef atarist
2874 && *s != ','
2875# endif
2876 && *s != ';'; len++, s++) {
84486fc6
GS
2877 if (len < sizeof tmpbuf)
2878 tmpbuf[len] = *s;
491527d0 2879 }
84486fc6
GS
2880 if (len < sizeof tmpbuf)
2881 tmpbuf[len] = '\0';
491527d0 2882#else /* ! (atarist || DOSISH) */
3280af22 2883 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
491527d0
GS
2884 ':',
2885 &len);
2886#endif /* ! (atarist || DOSISH) */
cd39f2b6 2887#endif /* MACOS_TRADITIONAL */
3280af22 2888 if (s < PL_bufend)
491527d0 2889 s++;
84486fc6 2890 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
491527d0 2891 continue; /* don't search dir with too-long name */
cd39f2b6
JH
2892#ifdef MACOS_TRADITIONAL
2893 if (len && tmpbuf[len - 1] != ':')
2894 tmpbuf[len++] = ':';
2895#else
491527d0 2896 if (len
61ae2fbf 2897#if defined(atarist) || defined(__MINT__) || defined(DOSISH)
84486fc6
GS
2898 && tmpbuf[len - 1] != '/'
2899 && tmpbuf[len - 1] != '\\'
491527d0
GS
2900#endif
2901 )
84486fc6
GS
2902 tmpbuf[len++] = '/';
2903 if (len == 2 && tmpbuf[0] == '.')
491527d0 2904 seen_dot = 1;
cd39f2b6 2905#endif
84486fc6 2906 (void)strcpy(tmpbuf + len, scriptname);
491527d0
GS
2907#endif /* !VMS */
2908
2909#ifdef SEARCH_EXTS
84486fc6 2910 len = strlen(tmpbuf);
491527d0
GS
2911 if (extidx > 0) /* reset after previous loop */
2912 extidx = 0;
2913 do {
2914#endif
84486fc6 2915 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3280af22 2916 retval = PerlLIO_stat(tmpbuf,&PL_statbuf);
017f25f1
IZ
2917 if (S_ISDIR(PL_statbuf.st_mode)) {
2918 retval = -1;
2919 }
491527d0
GS
2920#ifdef SEARCH_EXTS
2921 } while ( retval < 0 /* not there */
2922 && extidx>=0 && ext[extidx] /* try an extension? */
84486fc6 2923 && strcpy(tmpbuf+len, ext[extidx++])
491527d0
GS
2924 );
2925#endif
2926 if (retval < 0)
2927 continue;
3280af22
NIS
2928 if (S_ISREG(PL_statbuf.st_mode)
2929 && cando(S_IRUSR,TRUE,&PL_statbuf)
73811745 2930#if !defined(DOSISH) && !defined(MACOS_TRADITIONAL)
3280af22 2931 && cando(S_IXUSR,TRUE,&PL_statbuf)
491527d0
GS
2932#endif
2933 )
2934 {
3aed30dc 2935 xfound = tmpbuf; /* bingo! */
491527d0
GS
2936 break;
2937 }
2938 if (!xfailed)
84486fc6 2939 xfailed = savepv(tmpbuf);
491527d0
GS
2940 }
2941#ifndef DOSISH
017f25f1 2942 if (!xfound && !seen_dot && !xfailed &&
a1d180c4 2943 (PerlLIO_stat(scriptname,&PL_statbuf) < 0
017f25f1 2944 || S_ISDIR(PL_statbuf.st_mode)))
491527d0
GS
2945#endif
2946 seen_dot = 1; /* Disable message. */
9ccb31f9
GS
2947 if (!xfound) {
2948 if (flags & 1) { /* do or die? */
3aed30dc 2949 Perl_croak(aTHX_ "Can't %s %s%s%s",
9ccb31f9
GS
2950 (xfailed ? "execute" : "find"),
2951 (xfailed ? xfailed : scriptname),
2952 (xfailed ? "" : " on PATH"),
2953 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
2954 }
2955 scriptname = Nullch;
2956 }
491527d0
GS
2957 if (xfailed)
2958 Safefree(xfailed);
2959 scriptname = xfound;
2960 }
9ccb31f9 2961 return (scriptname ? savepv(scriptname) : Nullch);
491527d0
GS
2962}
2963
ba869deb
GS
2964#ifndef PERL_GET_CONTEXT_DEFINED
2965
2966void *
2967Perl_get_context(void)
2968{
3db8f154 2969#if defined(USE_ITHREADS)
ba869deb
GS
2970# ifdef OLD_PTHREADS_API
2971 pthread_addr_t t;
2972 if (pthread_getspecific(PL_thr_key, &t))
2973 Perl_croak_nocontext("panic: pthread_getspecific");
2974 return (void*)t;
2975# else
bce813aa 2976# ifdef I_MACH_CTHREADS
8b8b35ab 2977 return (void*)cthread_data(cthread_self());
bce813aa 2978# else
8b8b35ab
JH
2979 return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
2980# endif
c44d3fdb 2981# endif
ba869deb
GS
2982#else
2983 return (void*)NULL;
2984#endif
2985}
2986
2987void
2988Perl_set_context(void *t)
2989{
3db8f154 2990#if defined(USE_ITHREADS)
c44d3fdb
GS
2991# ifdef I_MACH_CTHREADS
2992 cthread_set_data(cthread_self(), t);
2993# else
ba869deb
GS
2994 if (pthread_setspecific(PL_thr_key, t))
2995 Perl_croak_nocontext("panic: pthread_setspecific");
c44d3fdb 2996# endif
ba869deb
GS
2997#endif
2998}
2999
3000#endif /* !PERL_GET_CONTEXT_DEFINED */
491527d0 3001
22239a37
NIS
3002#ifdef PERL_GLOBAL_STRUCT
3003struct perl_vars *
864dbfa3 3004Perl_GetVars(pTHX)
22239a37 3005{
533c011a 3006 return &PL_Vars;
22239a37 3007}
31fb1209
NIS
3008#endif
3009
3010char **
864dbfa3 3011Perl_get_op_names(pTHX)
31fb1209 3012{
22c35a8c 3013 return PL_op_name;
31fb1209
NIS
3014}
3015
3016char **
864dbfa3 3017Perl_get_op_descs(pTHX)
31fb1209 3018{
22c35a8c 3019 return PL_op_desc;
31fb1209 3020}
9e6b2b00
GS
3021
3022char *
864dbfa3 3023Perl_get_no_modify(pTHX)
9e6b2b00 3024{
22c35a8c 3025 return (char*)PL_no_modify;
9e6b2b00
GS
3026}
3027
3028U32 *
864dbfa3 3029Perl_get_opargs(pTHX)
9e6b2b00 3030{
22c35a8c 3031 return PL_opargs;
9e6b2b00 3032}
51aa15f3 3033
0cb96387
GS
3034PPADDR_t*
3035Perl_get_ppaddr(pTHX)
3036{
12ae5dfc 3037 return (PPADDR_t*)PL_ppaddr;
0cb96387
GS
3038}
3039
a6c40364
GS
3040#ifndef HAS_GETENV_LEN
3041char *
bf4acbe4 3042Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
a6c40364
GS
3043{
3044 char *env_trans = PerlEnv_getenv(env_elem);
3045 if (env_trans)
3046 *len = strlen(env_trans);
3047 return env_trans;
f675dbe5
CB
3048}
3049#endif
3050
dc9e4912
GS
3051
3052MGVTBL*
864dbfa3 3053Perl_get_vtbl(pTHX_ int vtbl_id)
dc9e4912
GS
3054{
3055 MGVTBL* result = Null(MGVTBL*);
3056
3057 switch(vtbl_id) {
3058 case want_vtbl_sv:
3059 result = &PL_vtbl_sv;
3060 break;
3061 case want_vtbl_env:
3062 result = &PL_vtbl_env;
3063 break;
3064 case want_vtbl_envelem:
3065 result = &PL_vtbl_envelem;
3066 break;
3067 case want_vtbl_sig:
3068 result = &PL_vtbl_sig;
3069 break;
3070 case want_vtbl_sigelem:
3071 result = &PL_vtbl_sigelem;
3072 break;
3073 case want_vtbl_pack:
3074 result = &PL_vtbl_pack;
3075 break;
3076 case want_vtbl_packelem:
3077 result = &PL_vtbl_packelem;
3078 break;
3079 case want_vtbl_dbline:
3080 result = &PL_vtbl_dbline;
3081 break;
3082 case want_vtbl_isa:
3083 result = &PL_vtbl_isa;
3084 break;
3085 case want_vtbl_isaelem:
3086 result = &PL_vtbl_isaelem;
3087 break;
3088 case want_vtbl_arylen:
3089 result = &PL_vtbl_arylen;
3090 break;
3091 case want_vtbl_glob:
3092 result = &PL_vtbl_glob;
3093 break;
3094 case want_vtbl_mglob:
3095 result = &PL_vtbl_mglob;
3096 break;
3097 case want_vtbl_nkeys:
3098 result = &PL_vtbl_nkeys;
3099 break;
3100 case want_vtbl_taint:
3101 result = &PL_vtbl_taint;
3102 break;
3103 case want_vtbl_substr:
3104 result = &PL_vtbl_substr;
3105 break;
3106 case want_vtbl_vec:
3107 result = &PL_vtbl_vec;
3108 break;
3109 case want_vtbl_pos:
3110 result = &PL_vtbl_pos;
3111 break;
3112 case want_vtbl_bm:
3113 result = &PL_vtbl_bm;
3114 break;
3115 case want_vtbl_fm:
3116 result = &PL_vtbl_fm;
3117 break;
3118 case want_vtbl_uvar:
3119 result = &PL_vtbl_uvar;
3120 break;
dc9e4912
GS
3121 case want_vtbl_defelem:
3122 result = &PL_vtbl_defelem;
3123 break;
3124 case want_vtbl_regexp:
3125 result = &PL_vtbl_regexp;
3126 break;
3127 case want_vtbl_regdata:
3128 result = &PL_vtbl_regdata;
3129 break;
3130 case want_vtbl_regdatum:
3131 result = &PL_vtbl_regdatum;
3132 break;
3c90161d 3133#ifdef USE_LOCALE_COLLATE
dc9e4912
GS
3134 case want_vtbl_collxfrm:
3135 result = &PL_vtbl_collxfrm;
3136 break;
3c90161d 3137#endif
dc9e4912
GS
3138 case want_vtbl_amagic:
3139 result = &PL_vtbl_amagic;
3140 break;
3141 case want_vtbl_amagicelem:
3142 result = &PL_vtbl_amagicelem;
3143 break;
810b8aa5
GS
3144 case want_vtbl_backref:
3145 result = &PL_vtbl_backref;
3146 break;
7e8c5dac
HS
3147 case want_vtbl_utf8:
3148 result = &PL_vtbl_utf8;
3149 break;
dc9e4912
GS
3150 }
3151 return result;
3152}
3153
767df6a1 3154I32
864dbfa3 3155Perl_my_fflush_all(pTHX)
767df6a1 3156{
f800e14d 3157#if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
ce720889 3158 return PerlIO_flush(NULL);
767df6a1 3159#else
8fbdfb7c 3160# if defined(HAS__FWALK)
f13a2bc0 3161 extern int fflush(FILE *);
74cac757
JH
3162 /* undocumented, unprototyped, but very useful BSDism */
3163 extern void _fwalk(int (*)(FILE *));
8fbdfb7c 3164 _fwalk(&fflush);
74cac757 3165 return 0;
8fa7f367 3166# else
8fbdfb7c 3167# if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
8fa7f367 3168 long open_max = -1;
8fbdfb7c 3169# ifdef PERL_FFLUSH_ALL_FOPEN_MAX
d2201af2 3170 open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
8fbdfb7c 3171# else
8fa7f367 3172# if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
767df6a1 3173 open_max = sysconf(_SC_OPEN_MAX);
8fa7f367
JH
3174# else
3175# ifdef FOPEN_MAX
74cac757 3176 open_max = FOPEN_MAX;
8fa7f367
JH
3177# else
3178# ifdef OPEN_MAX
74cac757 3179 open_max = OPEN_MAX;
8fa7f367
JH
3180# else
3181# ifdef _NFILE
d2201af2 3182 open_max = _NFILE;
8fa7f367
JH
3183# endif
3184# endif
74cac757 3185# endif
767df6a1
JH
3186# endif
3187# endif
767df6a1
JH
3188 if (open_max > 0) {
3189 long i;
3190 for (i = 0; i < open_max; i++)
d2201af2
AD
3191 if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3192 STDIO_STREAM_ARRAY[i]._file < open_max &&
3193 STDIO_STREAM_ARRAY[i]._flag)
3194 PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
767df6a1
JH
3195 return 0;
3196 }
8fbdfb7c 3197# endif
93189314 3198 SETERRNO(EBADF,RMS_IFI);
767df6a1 3199 return EOF;
74cac757 3200# endif
767df6a1
JH
3201#endif
3202}
097ee67d 3203
69282e91 3204void
bc37a18f
RG
3205Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op)
3206{
bc37a18f 3207 char *func =
66fc2fa5
JH
3208 op == OP_READLINE ? "readline" : /* "<HANDLE>" not nice */
3209 op == OP_LEAVEWRITE ? "write" : /* "write exit" not nice */
bc37a18f
RG
3210 PL_op_desc[op];
3211 char *pars = OP_IS_FILETEST(op) ? "" : "()";
3aed30dc
HS
3212 char *type = OP_IS_SOCKET(op)
3213 || (gv && io && IoTYPE(io) == IoTYPE_SOCKET)
3214 ? "socket" : "filehandle";
9c0fcd4f 3215 char *name = NULL;
bc37a18f 3216
66fc2fa5 3217 if (gv && isGV(gv)) {
f62cb720 3218 name = GvENAME(gv);
66fc2fa5
JH
3219 }
3220
4c80c0b2 3221 if (op == OP_phoney_OUTPUT_ONLY || op == OP_phoney_INPUT_ONLY) {
3aed30dc 3222 if (ckWARN(WARN_IO)) {
fd322ea4 3223 const char *direction = (op == OP_phoney_INPUT_ONLY) ? "in" : "out";
3aed30dc
HS
3224 if (name && *name)
3225 Perl_warner(aTHX_ packWARN(WARN_IO),
3226 "Filehandle %s opened only for %sput",
fd322ea4 3227 name, direction);
3aed30dc
HS
3228 else
3229 Perl_warner(aTHX_ packWARN(WARN_IO),
fd322ea4 3230 "Filehandle opened only for %sput", direction);
3aed30dc 3231 }
2dd78f96
JH
3232 }
3233 else {
3aed30dc
HS
3234 char *vile;
3235 I32 warn_type;
3236
3237 if (gv && io && IoTYPE(io) == IoTYPE_CLOSED) {
3238 vile = "closed";
3239 warn_type = WARN_CLOSED;
3240 }
3241 else {
3242 vile = "unopened";
3243 warn_type = WARN_UNOPENED;
3244 }
3245
3246 if (ckWARN(warn_type)) {
3247 if (name && *name) {
3248 Perl_warner(aTHX_ packWARN(warn_type),
3249 "%s%s on %s %s %s", func, pars, vile, type, name);
3250 if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3251 Perl_warner(
3252 aTHX_ packWARN(warn_type),
3253 "\t(Are you trying to call %s%s on dirhandle %s?)\n",
3254 func, pars, name
3255 );
3256 }
3257 else {
3258 Perl_warner(aTHX_ packWARN(warn_type),
3259 "%s%s on %s %s", func, pars, vile, type);
3260 if (gv && io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3261 Perl_warner(
3262 aTHX_ packWARN(warn_type),
3263 "\t(Are you trying to call %s%s on dirhandle?)\n",
3264 func, pars
3265 );
3266 }
3267 }
bc37a18f 3268 }
69282e91 3269}
a926ef6b
JH
3270
3271#ifdef EBCDIC
cbebf344
JH
3272/* in ASCII order, not that it matters */
3273static const char controllablechars[] = "?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
3274
a926ef6b
JH
3275int
3276Perl_ebcdic_control(pTHX_ int ch)
3277{
3aed30dc
HS
3278 if (ch > 'a') {
3279 char *ctlp;
3280
3281 if (islower(ch))
3282 ch = toupper(ch);
3283
3284 if ((ctlp = strchr(controllablechars, ch)) == 0) {
3285 Perl_die(aTHX_ "unrecognised control character '%c'\n", ch);
a926ef6b 3286 }
3aed30dc
HS
3287
3288 if (ctlp == controllablechars)
3289 return('\177'); /* DEL */
3290 else
3291 return((unsigned char)(ctlp - controllablechars - 1));
3292 } else { /* Want uncontrol */
3293 if (ch == '\177' || ch == -1)
3294 return('?');
3295 else if (ch == '\157')
3296 return('\177');
3297 else if (ch == '\174')
3298 return('\000');
3299 else if (ch == '^') /* '\137' in 1047, '\260' in 819 */
3300 return('\036');
3301 else if (ch == '\155')
3302 return('\037');
3303 else if (0 < ch && ch < (sizeof(controllablechars) - 1))
3304 return(controllablechars[ch+1]);
3305 else
3306 Perl_die(aTHX_ "invalid control request: '\\%03o'\n", ch & 0xFF);
3307 }
a926ef6b
JH
3308}
3309#endif
e72cf795 3310
f6adc668 3311/* To workaround core dumps from the uninitialised tm_zone we get the
e72cf795
JH
3312 * system to give us a reasonable struct to copy. This fix means that
3313 * strftime uses the tm_zone and tm_gmtoff values returned by
3314 * localtime(time()). That should give the desired result most of the
3315 * time. But probably not always!
3316 *
f6adc668
JH
3317 * This does not address tzname aspects of NETaa14816.
3318 *
e72cf795 3319 */
f6adc668 3320
e72cf795
JH
3321#ifdef HAS_GNULIBC
3322# ifndef STRUCT_TM_HASZONE
3323# define STRUCT_TM_HASZONE
3324# endif
3325#endif
3326
f6adc668
JH
3327#ifdef STRUCT_TM_HASZONE /* Backward compat */
3328# ifndef HAS_TM_TM_ZONE
3329# define HAS_TM_TM_ZONE
3330# endif
3331#endif
3332
e72cf795 3333void
f1208910 3334Perl_init_tm(pTHX_ struct tm *ptm) /* see mktime, strftime and asctime */
e72cf795 3335{
f6adc668 3336#ifdef HAS_TM_TM_ZONE
e72cf795
JH
3337 Time_t now;
3338 (void)time(&now);
3339 Copy(localtime(&now), ptm, 1, struct tm);
3340#endif
3341}
3342
3343/*
3344 * mini_mktime - normalise struct tm values without the localtime()
3345 * semantics (and overhead) of mktime().
3346 */
3347void
f1208910 3348Perl_mini_mktime(pTHX_ struct tm *ptm)
e72cf795
JH
3349{
3350 int yearday;
3351 int secs;
3352 int month, mday, year, jday;
3353 int odd_cent, odd_year;
3354
3355#define DAYS_PER_YEAR 365
3356#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
3357#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
3358#define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
3359#define SECS_PER_HOUR (60*60)
3360#define SECS_PER_DAY (24*SECS_PER_HOUR)
3361/* parentheses deliberately absent on these two, otherwise they don't work */
3362#define MONTH_TO_DAYS 153/5
3363#define DAYS_TO_MONTH 5/153
3364/* offset to bias by March (month 4) 1st between month/mday & year finding */
3365#define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
3366/* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3367#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
3368
3369/*
3370 * Year/day algorithm notes:
3371 *
3372 * With a suitable offset for numeric value of the month, one can find
3373 * an offset into the year by considering months to have 30.6 (153/5) days,
3374 * using integer arithmetic (i.e., with truncation). To avoid too much
3375 * messing about with leap days, we consider January and February to be
3376 * the 13th and 14th month of the previous year. After that transformation,
3377 * we need the month index we use to be high by 1 from 'normal human' usage,
3378 * so the month index values we use run from 4 through 15.
3379 *
3380 * Given that, and the rules for the Gregorian calendar (leap years are those
3381 * divisible by 4 unless also divisible by 100, when they must be divisible
3382 * by 400 instead), we can simply calculate the number of days since some
3383 * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3384 * the days we derive from our month index, and adding in the day of the
3385 * month. The value used here is not adjusted for the actual origin which
3386 * it normally would use (1 January A.D. 1), since we're not exposing it.
3387 * We're only building the value so we can turn around and get the
3388 * normalised values for the year, month, day-of-month, and day-of-year.
3389 *
3390 * For going backward, we need to bias the value we're using so that we find
3391 * the right year value. (Basically, we don't want the contribution of
3392 * March 1st to the number to apply while deriving the year). Having done
3393 * that, we 'count up' the contribution to the year number by accounting for
3394 * full quadracenturies (400-year periods) with their extra leap days, plus
3395 * the contribution from full centuries (to avoid counting in the lost leap
3396 * days), plus the contribution from full quad-years (to count in the normal
3397 * leap days), plus the leftover contribution from any non-leap years.
3398 * At this point, if we were working with an actual leap day, we'll have 0
3399 * days left over. This is also true for March 1st, however. So, we have
3400 * to special-case that result, and (earlier) keep track of the 'odd'
3401 * century and year contributions. If we got 4 extra centuries in a qcent,
3402 * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3403 * Otherwise, we add back in the earlier bias we removed (the 123 from
3404 * figuring in March 1st), find the month index (integer division by 30.6),
3405 * and the remainder is the day-of-month. We then have to convert back to
3406 * 'real' months (including fixing January and February from being 14/15 in
3407 * the previous year to being in the proper year). After that, to get
3408 * tm_yday, we work with the normalised year and get a new yearday value for
3409 * January 1st, which we subtract from the yearday value we had earlier,
3410 * representing the date we've re-built. This is done from January 1
3411 * because tm_yday is 0-origin.
3412 *
3413 * Since POSIX time routines are only guaranteed to work for times since the
3414 * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3415 * applies Gregorian calendar rules even to dates before the 16th century
3416 * doesn't bother me. Besides, you'd need cultural context for a given
3417 * date to know whether it was Julian or Gregorian calendar, and that's
3418 * outside the scope for this routine. Since we convert back based on the
3419 * same rules we used to build the yearday, you'll only get strange results
3420 * for input which needed normalising, or for the 'odd' century years which
3421 * were leap years in the Julian calander but not in the Gregorian one.
3422 * I can live with that.
3423 *
3424 * This algorithm also fails to handle years before A.D. 1 gracefully, but
3425 * that's still outside the scope for POSIX time manipulation, so I don't
3426 * care.
3427 */
3428
3429 year = 1900 + ptm->tm_year;
3430 month = ptm->tm_mon;
3431 mday = ptm->tm_mday;
3432 /* allow given yday with no month & mday to dominate the result */
3433 if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
3434 month = 0;
3435 mday = 0;
3436 jday = 1 + ptm->tm_yday;
3437 }
3438 else {
3439 jday = 0;
3440 }
3441 if (month >= 2)
3442 month+=2;
3443 else
3444 month+=14, year--;
3445 yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3446 yearday += month*MONTH_TO_DAYS + mday + jday;
3447 /*
3448 * Note that we don't know when leap-seconds were or will be,
3449 * so we have to trust the user if we get something which looks
3450 * like a sensible leap-second. Wild values for seconds will
3451 * be rationalised, however.
3452 */
3453 if ((unsigned) ptm->tm_sec <= 60) {
3454 secs = 0;
3455 }
3456 else {
3457 secs = ptm->tm_sec;
3458 ptm->tm_sec = 0;
3459 }
3460 secs += 60 * ptm->tm_min;
3461 secs += SECS_PER_HOUR * ptm->tm_hour;
3462 if (secs < 0) {
3463 if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3464 /* got negative remainder, but need positive time */
3465 /* back off an extra day to compensate */
3466 yearday += (secs/SECS_PER_DAY)-1;
3467 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3468 }
3469 else {
3470 yearday += (secs/SECS_PER_DAY);
3471 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3472 }
3473 }
3474 else if (secs >= SECS_PER_DAY) {
3475 yearday += (secs/SECS_PER_DAY);
3476 secs %= SECS_PER_DAY;
3477 }
3478 ptm->tm_hour = secs/SECS_PER_HOUR;
3479 secs %= SECS_PER_HOUR;
3480 ptm->tm_min = secs/60;
3481 secs %= 60;
3482 ptm->tm_sec += secs;
3483 /* done with time of day effects */
3484 /*
3485 * The algorithm for yearday has (so far) left it high by 428.
3486 * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3487 * bias it by 123 while trying to figure out what year it
3488 * really represents. Even with this tweak, the reverse
3489 * translation fails for years before A.D. 0001.
3490 * It would still fail for Feb 29, but we catch that one below.
3491 */
3492 jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
3493 yearday -= YEAR_ADJUST;
3494 year = (yearday / DAYS_PER_QCENT) * 400;
3495 yearday %= DAYS_PER_QCENT;
3496 odd_cent = yearday / DAYS_PER_CENT;
3497 year += odd_cent * 100;
3498 yearday %= DAYS_PER_CENT;
3499 year += (yearday / DAYS_PER_QYEAR) * 4;
3500 yearday %= DAYS_PER_QYEAR;
3501 odd_year = yearday / DAYS_PER_YEAR;
3502 year += odd_year;
3503 yearday %= DAYS_PER_YEAR;
3504 if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3505 month = 1;
3506 yearday = 29;
3507 }
3508 else {
3509 yearday += YEAR_ADJUST; /* recover March 1st crock */
3510 month = yearday*DAYS_TO_MONTH;
3511 yearday -= month*MONTH_TO_DAYS;
3512 /* recover other leap-year adjustment */
3513 if (month > 13) {
3514 month-=14;
3515 year++;
3516 }
3517 else {
3518 month-=2;
3519 }
3520 }
3521 ptm->tm_year = year - 1900;
3522 if (yearday) {
3523 ptm->tm_mday = yearday;
3524 ptm->tm_mon = month;
3525 }
3526 else {
3527 ptm->tm_mday = 31;
3528 ptm->tm_mon = month - 1;
3529 }
3530 /* re-build yearday based on Jan 1 to get tm_yday */
3531 year--;
3532 yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
3533 yearday += 14*MONTH_TO_DAYS + 1;
3534 ptm->tm_yday = jday - yearday;
3535 /* fix tm_wday if not overridden by caller */
3536 if ((unsigned)ptm->tm_wday > 6)
3537 ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
3538}
b3c85772
JH
3539
3540char *
f1208910 3541Perl_my_strftime(pTHX_ char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
b3c85772
JH
3542{
3543#ifdef HAS_STRFTIME
3544 char *buf;
3545 int buflen;
3546 struct tm mytm;
3547 int len;
3548
3549 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3550 mytm.tm_sec = sec;
3551 mytm.tm_min = min;
3552 mytm.tm_hour = hour;
3553 mytm.tm_mday = mday;
3554 mytm.tm_mon = mon;
3555 mytm.tm_year = year;
3556 mytm.tm_wday = wday;
3557 mytm.tm_yday = yday;
3558 mytm.tm_isdst = isdst;
3559 mini_mktime(&mytm);
c473feec
SR
3560 /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
3561#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
3562 STMT_START {
3563 struct tm mytm2;
3564 mytm2 = mytm;
3565 mktime(&mytm2);
3566#ifdef HAS_TM_TM_GMTOFF
3567 mytm.tm_gmtoff = mytm2.tm_gmtoff;
3568#endif
3569#ifdef HAS_TM_TM_ZONE
3570 mytm.tm_zone = mytm2.tm_zone;
3571#endif
3572 } STMT_END;
3573#endif
b3c85772
JH
3574 buflen = 64;
3575 New(0, buf, buflen, char);
3576 len = strftime(buf, buflen, fmt, &mytm);
3577 /*
877f6a72 3578 ** The following is needed to handle to the situation where
b3c85772
JH
3579 ** tmpbuf overflows. Basically we want to allocate a buffer
3580 ** and try repeatedly. The reason why it is so complicated
3581 ** is that getting a return value of 0 from strftime can indicate
3582 ** one of the following:
3583 ** 1. buffer overflowed,
3584 ** 2. illegal conversion specifier, or
3585 ** 3. the format string specifies nothing to be returned(not
3586 ** an error). This could be because format is an empty string
3587 ** or it specifies %p that yields an empty string in some locale.
3588 ** If there is a better way to make it portable, go ahead by
3589 ** all means.
3590 */
3591 if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
3592 return buf;
3593 else {
3594 /* Possibly buf overflowed - try again with a bigger buf */
3595 int fmtlen = strlen(fmt);
3596 int bufsize = fmtlen + buflen;
877f6a72 3597
b3c85772
JH
3598 New(0, buf, bufsize, char);
3599 while (buf) {
3600 buflen = strftime(buf, bufsize, fmt, &mytm);
3601 if (buflen > 0 && buflen < bufsize)
3602 break;
3603 /* heuristic to prevent out-of-memory errors */
3604 if (bufsize > 100*fmtlen) {
3605 Safefree(buf);
3606 buf = NULL;
3607 break;
3608 }
3609 bufsize *= 2;
3610 Renew(buf, bufsize, char);
3611 }
3612 return buf;
3613 }
3614#else
3615 Perl_croak(aTHX_ "panic: no strftime");
3616#endif
3617}
3618
877f6a72
NIS
3619
3620#define SV_CWD_RETURN_UNDEF \
3621sv_setsv(sv, &PL_sv_undef); \
3622return FALSE
3623
3624#define SV_CWD_ISDOT(dp) \
3625 (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
3aed30dc 3626 (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
877f6a72
NIS
3627
3628/*
ccfc67b7
JH
3629=head1 Miscellaneous Functions
3630
89423764 3631=for apidoc getcwd_sv
877f6a72
NIS
3632
3633Fill the sv with current working directory
3634
3635=cut
3636*/
3637
3638/* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
3639 * rewritten again by dougm, optimized for use with xs TARG, and to prefer
3640 * getcwd(3) if available
3641 * Comments from the orignal:
3642 * This is a faster version of getcwd. It's also more dangerous
3643 * because you might chdir out of a directory that you can't chdir
3644 * back into. */
3645
877f6a72 3646int
89423764 3647Perl_getcwd_sv(pTHX_ register SV *sv)
877f6a72
NIS
3648{
3649#ifndef PERL_MICRO
3650
ea715489
JH
3651#ifndef INCOMPLETE_TAINTS
3652 SvTAINTED_on(sv);
3653#endif
3654
8f95b30d
JH
3655#ifdef HAS_GETCWD
3656 {
60e110a8
DM
3657 char buf[MAXPATHLEN];
3658
3aed30dc 3659 /* Some getcwd()s automatically allocate a buffer of the given
60e110a8
DM
3660 * size from the heap if they are given a NULL buffer pointer.
3661 * The problem is that this behaviour is not portable. */
3aed30dc
HS
3662 if (getcwd(buf, sizeof(buf) - 1)) {
3663 STRLEN len = strlen(buf);
3664 sv_setpvn(sv, buf, len);
3665 return TRUE;
3666 }
3667 else {
3668 sv_setsv(sv, &PL_sv_undef);
3669 return FALSE;
3670 }
8f95b30d
JH
3671 }
3672
3673#else
3674
c623ac67 3675 Stat_t statbuf;
877f6a72
NIS
3676 int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
3677 int namelen, pathlen=0;
3678 DIR *dir;
3679 Direntry_t *dp;
877f6a72
NIS
3680
3681 (void)SvUPGRADE(sv, SVt_PV);
3682
877f6a72 3683 if (PerlLIO_lstat(".", &statbuf) < 0) {
3aed30dc 3684 SV_CWD_RETURN_UNDEF;
877f6a72
NIS
3685 }
3686
3687 orig_cdev = statbuf.st_dev;
3688 orig_cino = statbuf.st_ino;
3689 cdev = orig_cdev;
3690 cino = orig_cino;
3691
3692 for (;;) {
3aed30dc
HS
3693 odev = cdev;
3694 oino = cino;
3695
3696 if (PerlDir_chdir("..") < 0) {
3697 SV_CWD_RETURN_UNDEF;
3698 }
3699 if (PerlLIO_stat(".", &statbuf) < 0) {
3700 SV_CWD_RETURN_UNDEF;
3701 }
3702
3703 cdev = statbuf.st_dev;
3704 cino = statbuf.st_ino;
3705
3706 if (odev == cdev && oino == cino) {
3707 break;
3708 }
3709 if (!(dir = PerlDir_open("."))) {
3710 SV_CWD_RETURN_UNDEF;
3711 }
3712
3713 while ((dp = PerlDir_read(dir)) != NULL) {
877f6a72 3714#ifdef DIRNAMLEN
3aed30dc 3715 namelen = dp->d_namlen;
877f6a72 3716#else
3aed30dc 3717 namelen = strlen(dp->d_name);
877f6a72 3718#endif
3aed30dc
HS
3719 /* skip . and .. */
3720 if (SV_CWD_ISDOT(dp)) {
3721 continue;
3722 }
3723
3724 if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
3725 SV_CWD_RETURN_UNDEF;
3726 }
3727
3728 tdev = statbuf.st_dev;
3729 tino = statbuf.st_ino;
3730 if (tino == oino && tdev == odev) {
3731 break;
3732 }
cb5953d6
JH
3733 }
3734
3aed30dc
HS
3735 if (!dp) {
3736 SV_CWD_RETURN_UNDEF;
3737 }
3738
3739 if (pathlen + namelen + 1 >= MAXPATHLEN) {
3740 SV_CWD_RETURN_UNDEF;
3741 }
877f6a72 3742
3aed30dc
HS
3743 SvGROW(sv, pathlen + namelen + 1);
3744
3745 if (pathlen) {
3746 /* shift down */
3747 Move(SvPVX(sv), SvPVX(sv) + namelen + 1, pathlen, char);
3748 }
877f6a72 3749
3aed30dc
HS
3750 /* prepend current directory to the front */
3751 *SvPVX(sv) = '/';
3752 Move(dp->d_name, SvPVX(sv)+1, namelen, char);
3753 pathlen += (namelen + 1);
877f6a72
NIS
3754
3755#ifdef VOID_CLOSEDIR
3aed30dc 3756 PerlDir_close(dir);
877f6a72 3757#else
3aed30dc
HS
3758 if (PerlDir_close(dir) < 0) {
3759 SV_CWD_RETURN_UNDEF;
3760 }
877f6a72
NIS
3761#endif
3762 }
3763
60e110a8 3764 if (pathlen) {
3aed30dc
HS
3765 SvCUR_set(sv, pathlen);
3766 *SvEND(sv) = '\0';
3767 SvPOK_only(sv);
877f6a72 3768
2a45baea 3769 if (PerlDir_chdir(SvPVX(sv)) < 0) {
3aed30dc
HS
3770 SV_CWD_RETURN_UNDEF;
3771 }
877f6a72
NIS
3772 }
3773 if (PerlLIO_stat(".", &statbuf) < 0) {
3aed30dc 3774 SV_CWD_RETURN_UNDEF;
877f6a72
NIS
3775 }
3776
3777 cdev = statbuf.st_dev;
3778 cino = statbuf.st_ino;
3779
3780 if (cdev != orig_cdev || cino != orig_cino) {
3aed30dc
HS
3781 Perl_croak(aTHX_ "Unstable directory path, "
3782 "current directory changed unexpectedly");
877f6a72 3783 }
877f6a72
NIS
3784
3785 return TRUE;
793b8d8e
JH
3786#endif
3787
877f6a72
NIS
3788#else
3789 return FALSE;
3790#endif
3791}
3792
f4758303 3793/*
b0f01acb
JP
3794=for apidoc scan_version
3795
3796Returns a pointer to the next character after the parsed
3797version string, as well as upgrading the passed in SV to
3798an RV.
3799
3800Function must be called with an already existing SV like
3801
137d6fc0
JP
3802 sv = newSV(0);
3803 s = scan_version(s,SV *sv, bool qv);
b0f01acb
JP
3804
3805Performs some preprocessing to the string to ensure that
3806it has the correct characteristics of a version. Flags the
3807object if it contains an underscore (which denotes this
137d6fc0
JP
3808is a alpha version). The boolean qv denotes that the version
3809should be interpreted as if it had multiple decimals, even if
3810it doesn't.
b0f01acb
JP
3811
3812=cut
3813*/
3814
3815char *
137d6fc0 3816Perl_scan_version(pTHX_ char *s, SV *rv, bool qv)
b0f01acb 3817{
e568f1a0 3818 const char *start = s;
ad63d80f
JP
3819 char *pos = s;
3820 I32 saw_period = 0;
3821 bool saw_under = 0;
be2ebcad 3822 SV* sv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */
ad63d80f 3823 (void)sv_upgrade(sv, SVt_PVAV); /* needs to be an AV type */
f9be5ac8 3824 AvREAL_on((AV*)sv);
ad63d80f
JP
3825
3826 /* pre-scan the imput string to check for decimals */
3827 while ( *pos == '.' || *pos == '_' || isDIGIT(*pos) )
3828 {
3829 if ( *pos == '.' )
3830 {
3831 if ( saw_under )
5f89c282 3832 Perl_croak(aTHX_ "Invalid version format (underscores before decimal)");
ad63d80f 3833 saw_period++ ;
46314c13 3834 }
ad63d80f
JP
3835 else if ( *pos == '_' )
3836 {
3837 if ( saw_under )
5f89c282 3838 Perl_croak(aTHX_ "Invalid version format (multiple underscores)");
ad63d80f
JP
3839 saw_under = 1;
3840 }
3841 pos++;
3842 }
3843 pos = s;
3844
137d6fc0
JP
3845 if (*pos == 'v') {
3846 pos++; /* get past 'v' */
3847 qv = 1; /* force quoted version processing */
3848 }
ad63d80f 3849 while (isDIGIT(*pos))
46314c13 3850 pos++;
ad63d80f
JP
3851 if (!isALPHA(*pos)) {
3852 I32 rev;
3853
3854 if (*s == 'v') s++; /* get past 'v' */
3855
3856 for (;;) {
3857 rev = 0;
3858 {
129318bd
JP
3859 /* this is atoi() that delimits on underscores */
3860 char *end = pos;
3861 I32 mult = 1;
3862 I32 orev;
3863 if ( s < pos && s > start && *(s-1) == '_' ) {
137d6fc0 3864 mult *= -1; /* alpha version */
129318bd
JP
3865 }
3866 /* the following if() will only be true after the decimal
3867 * point of a version originally created with a bare
3868 * floating point number, i.e. not quoted in any way
3869 */
13f8f398 3870 if ( !qv && s > start+1 && saw_period == 1 ) {
c76df65e 3871 mult *= 100;
129318bd
JP
3872 while ( s < end ) {
3873 orev = rev;
3874 rev += (*s - '0') * mult;
3875 mult /= 10;
32fdb065 3876 if ( PERL_ABS(orev) > PERL_ABS(rev) )
129318bd
JP
3877 Perl_croak(aTHX_ "Integer overflow in version");
3878 s++;
3879 }
3880 }
3881 else {
3882 while (--end >= s) {
3883 orev = rev;
3884 rev += (*end - '0') * mult;
3885 mult *= 10;
32fdb065 3886 if ( PERL_ABS(orev) > PERL_ABS(rev) )
129318bd
JP
3887 Perl_croak(aTHX_ "Integer overflow in version");
3888 }
3889 }
3890 }
3891
3892 /* Append revision */
ad63d80f
JP
3893 av_push((AV *)sv, newSViv(rev));
3894 if ( (*pos == '.' || *pos == '_') && isDIGIT(pos[1]))
3895 s = ++pos;
3896 else if ( isDIGIT(*pos) )
3897 s = pos;
b0f01acb 3898 else {
ad63d80f
JP
3899 s = pos;
3900 break;
3901 }
3902 while ( isDIGIT(*pos) ) {
13f8f398 3903 if ( saw_period == 1 && pos-s == 3 )
ad63d80f
JP
3904 break;
3905 pos++;
b0f01acb
JP
3906 }
3907 }
3908 }
b9381830
JP
3909 if ( qv ) { /* quoted versions always become full version objects */
3910 I32 len = av_len((AV *)sv);
4edfc503
NC
3911 /* This for loop appears to trigger a compiler bug on OS X, as it
3912 loops infinitely. Yes, len is negative. No, it makes no sense.
3913 Compiler in question is:
3914 gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
3915 for ( len = 2 - len; len > 0; len-- )
3916 av_push((AV *)sv, newSViv(0));
3917 */
3918 len = 2 - len;
3919 while (len-- > 0)
c76df65e 3920 av_push((AV *)sv, newSViv(0));
b9381830 3921 }
ad63d80f 3922 return s;
b0f01acb
JP
3923}
3924
3925/*
3926=for apidoc new_version
3927
3928Returns a new version object based on the passed in SV:
3929
3930 SV *sv = new_version(SV *ver);
3931
3932Does not alter the passed in ver SV. See "upg_version" if you
3933want to upgrade the SV.
3934
3935=cut
3936*/
3937
3938SV *
3939Perl_new_version(pTHX_ SV *ver)
3940{
129318bd 3941 SV *rv = newSV(0);
d7aa5382
JP
3942 if ( sv_derived_from(ver,"version") ) /* can just copy directly */
3943 {
3944 I32 key;
3945 AV *av = (AV *)SvRV(ver);
3946 SV* sv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */
3947 (void)sv_upgrade(sv, SVt_PVAV); /* needs to be an AV type */
f9be5ac8 3948 AvREAL_on((AV*)sv);
d7aa5382
JP
3949 for ( key = 0; key <= av_len(av); key++ )
3950 {
3951 I32 rev = SvIV(*av_fetch(av, key, FALSE));
3952 av_push((AV *)sv, newSViv(rev));
3953 }
3954 return rv;
3955 }
ad63d80f 3956#ifdef SvVOK
137d6fc0
JP
3957 if ( SvVOK(ver) ) { /* already a v-string */
3958 char *version;
b0f01acb
JP
3959 MAGIC* mg = mg_find(ver,PERL_MAGIC_vstring);
3960 version = savepvn( (const char*)mg->mg_ptr,mg->mg_len );
137d6fc0
JP
3961 sv_setpv(rv,version);
3962 Safefree(version);
b0f01acb 3963 }
137d6fc0 3964 else {
ad63d80f 3965#endif
137d6fc0
JP
3966 sv_setsv(rv,ver); /* make a duplicate */
3967#ifdef SvVOK
26ec6fc3 3968 }
137d6fc0
JP
3969#endif
3970 upg_version(rv);
b0f01acb
JP
3971 return rv;
3972}
3973
3974/*
3975=for apidoc upg_version
3976
3977In-place upgrade of the supplied SV to a version object.
3978
3979 SV *sv = upg_version(SV *sv);
3980
3981Returns a pointer to the upgraded SV.
3982
3983=cut
3984*/
3985
3986SV *
ad63d80f 3987Perl_upg_version(pTHX_ SV *ver)
b0f01acb 3988{
137d6fc0
JP
3989 char *version;
3990 bool qv = 0;
3991
3992 if ( SvNOK(ver) ) /* may get too much accuracy */
3993 {
3994 char tbuf[64];
3995 sprintf(tbuf,"%.9"NVgf, SvNVX(ver));
3996 version = savepv(tbuf);
3997 }
ad63d80f 3998#ifdef SvVOK
137d6fc0 3999 else if ( SvVOK(ver) ) { /* already a v-string */
ad63d80f
JP
4000 MAGIC* mg = mg_find(ver,PERL_MAGIC_vstring);
4001 version = savepvn( (const char*)mg->mg_ptr,mg->mg_len );
137d6fc0 4002 qv = 1;
b0f01acb 4003 }
ad63d80f 4004#endif
137d6fc0
JP
4005 else /* must be a string or something like a string */
4006 {
2e0de35c 4007 version = savesvpv(ver);
137d6fc0
JP
4008 }
4009 (void)scan_version(version, ver, qv);
4010 Safefree(version);
ad63d80f 4011 return ver;
b0f01acb
JP
4012}
4013
4014
4015/*
4016=for apidoc vnumify
4017
ad63d80f
JP
4018Accepts a version object and returns the normalized floating
4019point representation. Call like:
b0f01acb 4020
ad63d80f 4021 sv = vnumify(rv);
b0f01acb 4022
ad63d80f
JP
4023NOTE: you can pass either the object directly or the SV
4024contained within the RV.
b0f01acb
JP
4025
4026=cut
4027*/
4028
4029SV *
ad63d80f 4030Perl_vnumify(pTHX_ SV *vs)
b0f01acb 4031{
ad63d80f 4032 I32 i, len, digit;
137d6fc0 4033 SV *sv = newSV(0);
ad63d80f
JP
4034 if ( SvROK(vs) )
4035 vs = SvRV(vs);
4036 len = av_len((AV *)vs);
46314c13
JP
4037 if ( len == -1 )
4038 {
4039 Perl_sv_catpv(aTHX_ sv,"0");
4040 return sv;
4041 }
ad63d80f 4042 digit = SvIVX(*av_fetch((AV *)vs, 0, 0));
c0fd1b42 4043 Perl_sv_setpvf(aTHX_ sv,"%d.", (int)PERL_ABS(digit));
13f8f398 4044 for ( i = 1 ; i < len ; i++ )
b0f01acb 4045 {
ad63d80f 4046 digit = SvIVX(*av_fetch((AV *)vs, i, 0));
c0fd1b42 4047 Perl_sv_catpvf(aTHX_ sv,"%03d", (int)PERL_ABS(digit));
b0f01acb 4048 }
13f8f398
JP
4049
4050 if ( len > 0 )
4051 {
4052 digit = SvIVX(*av_fetch((AV *)vs, len, 0));
13f8f398
JP
4053 if ( (int)PERL_ABS(digit) != 0 || len == 1 )
4054 {
c76df65e
RGS
4055 if ( digit < 0 ) /* alpha version */
4056 Perl_sv_catpv(aTHX_ sv,"_");
4057 /* Don't display additional trailing zeros */
13f8f398
JP
4058 Perl_sv_catpvf(aTHX_ sv,"%03d", (int)PERL_ABS(digit));
4059 }
4060 }
4061 else /* len == 0 */
4062 {
ad63d80f 4063 Perl_sv_catpv(aTHX_ sv,"000");
13f8f398 4064 }
b0f01acb
JP
4065 return sv;
4066}
4067
4068/*
b9381830 4069=for apidoc vnormal
b0f01acb 4070
ad63d80f
JP
4071Accepts a version object and returns the normalized string
4072representation. Call like:
b0f01acb 4073
b9381830 4074 sv = vnormal(rv);
b0f01acb 4075
ad63d80f
JP
4076NOTE: you can pass either the object directly or the SV
4077contained within the RV.
b0f01acb
JP
4078
4079=cut
4080*/
4081
4082SV *
b9381830 4083Perl_vnormal(pTHX_ SV *vs)
b0f01acb 4084{
ad63d80f 4085 I32 i, len, digit;
137d6fc0 4086 SV *sv = newSV(0);
ad63d80f
JP
4087 if ( SvROK(vs) )
4088 vs = SvRV(vs);
4089 len = av_len((AV *)vs);
46314c13
JP
4090 if ( len == -1 )
4091 {
4092 Perl_sv_catpv(aTHX_ sv,"");
4093 return sv;
4094 }
ad63d80f 4095 digit = SvIVX(*av_fetch((AV *)vs, 0, 0));
e3feee4e 4096 Perl_sv_setpvf(aTHX_ sv,"%"IVdf,(IV)digit);
ad63d80f 4097 for ( i = 1 ; i <= len ; i++ )
46314c13 4098 {
ad63d80f
JP
4099 digit = SvIVX(*av_fetch((AV *)vs, i, 0));
4100 if ( digit < 0 )
e3feee4e 4101 Perl_sv_catpvf(aTHX_ sv,"_%"IVdf,(IV)-digit);
ad63d80f 4102 else
e3feee4e 4103 Perl_sv_catpvf(aTHX_ sv,".%"IVdf,(IV)digit);
b0f01acb 4104 }
137d6fc0
JP
4105
4106 if ( len <= 2 ) { /* short version, must be at least three */
4107 for ( len = 2 - len; len != 0; len-- )
4108 Perl_sv_catpv(aTHX_ sv,".0");
4109 }
4110
b0f01acb 4111 return sv;
129318bd 4112}
b0f01acb 4113
ad63d80f 4114/*
b9381830
JP
4115=for apidoc vstringify
4116
4117In order to maintain maximum compatibility with earlier versions
4118of Perl, this function will return either the floating point
4119notation or the multiple dotted notation, depending on whether
4120the original version contained 1 or more dots, respectively
4121
4122=cut
4123*/
4124
4125SV *
4126Perl_vstringify(pTHX_ SV *vs)
4127{
c76df65e 4128 I32 len, digit;
b9381830
JP
4129 if ( SvROK(vs) )
4130 vs = SvRV(vs);
4131 len = av_len((AV *)vs);
c76df65e 4132 digit = SvIVX(*av_fetch((AV *)vs, len, 0));
b9381830 4133
c76df65e 4134 if ( len < 2 || ( len == 2 && digit < 0 ) )
b9381830
JP
4135 return vnumify(vs);
4136 else
4137 return vnormal(vs);
4138}
4139
4140/*
ad63d80f
JP
4141=for apidoc vcmp
4142
4143Version object aware cmp. Both operands must already have been
4144converted into version objects.
4145
4146=cut
4147*/
4148
4149int
4150Perl_vcmp(pTHX_ SV *lsv, SV *rsv)
4151{
4152 I32 i,l,m,r,retval;
4153 if ( SvROK(lsv) )
4154 lsv = SvRV(lsv);
4155 if ( SvROK(rsv) )
4156 rsv = SvRV(rsv);
4157 l = av_len((AV *)lsv);
4158 r = av_len((AV *)rsv);
4159 m = l < r ? l : r;
4160 retval = 0;
4161 i = 0;
4162 while ( i <= m && retval == 0 )
4163 {
4164 I32 left = SvIV(*av_fetch((AV *)lsv,i,0));
4165 I32 right = SvIV(*av_fetch((AV *)rsv,i,0));
137d6fc0
JP
4166 bool lalpha = left < 0 ? 1 : 0;
4167 bool ralpha = right < 0 ? 1 : 0;
4168 left = abs(left);
4169 right = abs(right);
4170 if ( left < right || (left == right && lalpha && !ralpha) )
ad63d80f 4171 retval = -1;
137d6fc0 4172 if ( left > right || (left == right && ralpha && !lalpha) )
ad63d80f
JP
4173 retval = +1;
4174 i++;
4175 }
4176
137d6fc0 4177 if ( l != r && retval == 0 ) /* possible match except for trailing 0's */
129318bd 4178 {
137d6fc0 4179 if ( l < r )
129318bd 4180 {
137d6fc0
JP
4181 while ( i <= r && retval == 0 )
4182 {
4183 if ( SvIV(*av_fetch((AV *)rsv,i,0)) != 0 )
4184 retval = -1; /* not a match after all */
4185 i++;
4186 }
4187 }
4188 else
4189 {
4190 while ( i <= l && retval == 0 )
4191 {
4192 if ( SvIV(*av_fetch((AV *)lsv,i,0)) != 0 )
4193 retval = +1; /* not a match after all */
4194 i++;
4195 }
129318bd
JP
4196 }
4197 }
ad63d80f
JP
4198 return retval;
4199}
4200
c95c94b1 4201#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
2bc69dc4
NIS
4202# define EMULATE_SOCKETPAIR_UDP
4203#endif
4204
4205#ifdef EMULATE_SOCKETPAIR_UDP
02fc2eee
NC
4206static int
4207S_socketpair_udp (int fd[2]) {
e10bb1e9 4208 dTHX;
02fc2eee
NC
4209 /* Fake a datagram socketpair using UDP to localhost. */
4210 int sockets[2] = {-1, -1};
4211 struct sockaddr_in addresses[2];
4212 int i;
3aed30dc 4213 Sock_size_t size = sizeof(struct sockaddr_in);
ae92b34e 4214 unsigned short port;
02fc2eee
NC
4215 int got;
4216
3aed30dc 4217 memset(&addresses, 0, sizeof(addresses));
02fc2eee
NC
4218 i = 1;
4219 do {
3aed30dc
HS
4220 sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
4221 if (sockets[i] == -1)
4222 goto tidy_up_and_fail;
4223
4224 addresses[i].sin_family = AF_INET;
4225 addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4226 addresses[i].sin_port = 0; /* kernel choses port. */
4227 if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
4228 sizeof(struct sockaddr_in)) == -1)
4229 goto tidy_up_and_fail;
02fc2eee
NC
4230 } while (i--);
4231
4232 /* Now have 2 UDP sockets. Find out which port each is connected to, and
4233 for each connect the other socket to it. */
4234 i = 1;
4235 do {
3aed30dc
HS
4236 if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
4237 &size) == -1)
4238 goto tidy_up_and_fail;
4239 if (size != sizeof(struct sockaddr_in))
4240 goto abort_tidy_up_and_fail;
4241 /* !1 is 0, !0 is 1 */
4242 if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
4243 sizeof(struct sockaddr_in)) == -1)
4244 goto tidy_up_and_fail;
02fc2eee
NC
4245 } while (i--);
4246
4247 /* Now we have 2 sockets connected to each other. I don't trust some other
4248 process not to have already sent a packet to us (by random) so send
4249 a packet from each to the other. */
4250 i = 1;
4251 do {
3aed30dc
HS
4252 /* I'm going to send my own port number. As a short.
4253 (Who knows if someone somewhere has sin_port as a bitfield and needs
4254 this routine. (I'm assuming crays have socketpair)) */
4255 port = addresses[i].sin_port;
4256 got = PerlLIO_write(sockets[i], &port, sizeof(port));
4257 if (got != sizeof(port)) {
4258 if (got == -1)
4259 goto tidy_up_and_fail;
4260 goto abort_tidy_up_and_fail;
4261 }
02fc2eee
NC
4262 } while (i--);
4263
4264 /* Packets sent. I don't trust them to have arrived though.
4265 (As I understand it Solaris TCP stack is multithreaded. Non-blocking
4266 connect to localhost will use a second kernel thread. In 2.6 the
4267 first thread running the connect() returns before the second completes,
4268 so EINPROGRESS> In 2.7 the improved stack is faster and connect()
4269 returns 0. Poor programs have tripped up. One poor program's authors'
4270 had a 50-1 reverse stock split. Not sure how connected these were.)
4271 So I don't trust someone not to have an unpredictable UDP stack.
4272 */
4273
4274 {
3aed30dc
HS
4275 struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
4276 int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
4277 fd_set rset;
4278
4279 FD_ZERO(&rset);
4280 FD_SET(sockets[0], &rset);
4281 FD_SET(sockets[1], &rset);
4282
4283 got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
4284 if (got != 2 || !FD_ISSET(sockets[0], &rset)
4285 || !FD_ISSET(sockets[1], &rset)) {
4286 /* I hope this is portable and appropriate. */
4287 if (got == -1)
4288 goto tidy_up_and_fail;
4289 goto abort_tidy_up_and_fail;
4290 }
02fc2eee 4291 }
f4758303 4292
02fc2eee
NC
4293 /* And the paranoia department even now doesn't trust it to have arrive
4294 (hence MSG_DONTWAIT). Or that what arrives was sent by us. */
4295 {
3aed30dc
HS
4296 struct sockaddr_in readfrom;
4297 unsigned short buffer[2];
02fc2eee 4298
3aed30dc
HS
4299 i = 1;
4300 do {
02fc2eee 4301#ifdef MSG_DONTWAIT
3aed30dc
HS
4302 got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4303 sizeof(buffer), MSG_DONTWAIT,
4304 (struct sockaddr *) &readfrom, &size);
02fc2eee 4305#else
3aed30dc
HS
4306 got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4307 sizeof(buffer), 0,
4308 (struct sockaddr *) &readfrom, &size);
e10bb1e9 4309#endif
02fc2eee 4310
3aed30dc
HS
4311 if (got == -1)
4312 goto tidy_up_and_fail;
4313 if (got != sizeof(port)
4314 || size != sizeof(struct sockaddr_in)
4315 /* Check other socket sent us its port. */
4316 || buffer[0] != (unsigned short) addresses[!i].sin_port
4317 /* Check kernel says we got the datagram from that socket */
4318 || readfrom.sin_family != addresses[!i].sin_family
4319 || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
4320 || readfrom.sin_port != addresses[!i].sin_port)
4321 goto abort_tidy_up_and_fail;
4322 } while (i--);
02fc2eee
NC
4323 }
4324 /* My caller (my_socketpair) has validated that this is non-NULL */
4325 fd[0] = sockets[0];
4326 fd[1] = sockets[1];
4327 /* I hereby declare this connection open. May God bless all who cross
4328 her. */
4329 return 0;
4330
4331 abort_tidy_up_and_fail:
4332 errno = ECONNABORTED;
4333 tidy_up_and_fail:
4334 {
3aed30dc
HS
4335 int save_errno = errno;
4336 if (sockets[0] != -1)
4337 PerlLIO_close(sockets[0]);
4338 if (sockets[1] != -1)
4339 PerlLIO_close(sockets[1]);
4340 errno = save_errno;
4341 return -1;
02fc2eee
NC
4342 }
4343}
85ca448a 4344#endif /* EMULATE_SOCKETPAIR_UDP */
02fc2eee 4345
b5ac89c3 4346#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
02fc2eee
NC
4347int
4348Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4349 /* Stevens says that family must be AF_LOCAL, protocol 0.
2948e0bd 4350 I'm going to enforce that, then ignore it, and use TCP (or UDP). */
e10bb1e9 4351 dTHX;
02fc2eee
NC
4352 int listener = -1;
4353 int connector = -1;
4354 int acceptor = -1;
4355 struct sockaddr_in listen_addr;
4356 struct sockaddr_in connect_addr;
4357 Sock_size_t size;
4358
50458334
JH
4359 if (protocol
4360#ifdef AF_UNIX
4361 || family != AF_UNIX
4362#endif
3aed30dc
HS
4363 ) {
4364 errno = EAFNOSUPPORT;
4365 return -1;
02fc2eee 4366 }
2948e0bd 4367 if (!fd) {
3aed30dc
HS
4368 errno = EINVAL;
4369 return -1;
2948e0bd 4370 }
02fc2eee 4371
2bc69dc4 4372#ifdef EMULATE_SOCKETPAIR_UDP
02fc2eee 4373 if (type == SOCK_DGRAM)
3aed30dc 4374 return S_socketpair_udp(fd);
2bc69dc4 4375#endif
02fc2eee 4376
3aed30dc 4377 listener = PerlSock_socket(AF_INET, type, 0);
02fc2eee 4378 if (listener == -1)
3aed30dc
HS
4379 return -1;
4380 memset(&listen_addr, 0, sizeof(listen_addr));
02fc2eee 4381 listen_addr.sin_family = AF_INET;
3aed30dc 4382 listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
02fc2eee 4383 listen_addr.sin_port = 0; /* kernel choses port. */
3aed30dc
HS
4384 if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
4385 sizeof(listen_addr)) == -1)
4386 goto tidy_up_and_fail;
e10bb1e9 4387 if (PerlSock_listen(listener, 1) == -1)
3aed30dc 4388 goto tidy_up_and_fail;
02fc2eee 4389
3aed30dc 4390 connector = PerlSock_socket(AF_INET, type, 0);
02fc2eee 4391 if (connector == -1)
3aed30dc 4392 goto tidy_up_and_fail;
02fc2eee 4393 /* We want to find out the port number to connect to. */
3aed30dc
HS
4394 size = sizeof(connect_addr);
4395 if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
4396 &size) == -1)
4397 goto tidy_up_and_fail;
4398 if (size != sizeof(connect_addr))
4399 goto abort_tidy_up_and_fail;
e10bb1e9 4400 if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
3aed30dc
HS
4401 sizeof(connect_addr)) == -1)
4402 goto tidy_up_and_fail;
02fc2eee 4403
3aed30dc
HS
4404 size = sizeof(listen_addr);
4405 acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
4406 &size);
02fc2eee 4407 if (acceptor == -1)
3aed30dc
HS
4408 goto tidy_up_and_fail;
4409 if (size != sizeof(listen_addr))
4410 goto abort_tidy_up_and_fail;
4411 PerlLIO_close(listener);
02fc2eee
NC
4412 /* Now check we are talking to ourself by matching port and host on the
4413 two sockets. */
3aed30dc
HS
4414 if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
4415 &size) == -1)
4416 goto tidy_up_and_fail;
4417 if (size != sizeof(connect_addr)
4418 || listen_addr.sin_family != connect_addr.sin_family
4419 || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
4420 || listen_addr.sin_port != connect_addr.sin_port) {
4421 goto abort_tidy_up_and_fail;
02fc2eee
NC
4422 }
4423 fd[0] = connector;
4424 fd[1] = acceptor;
4425 return 0;
4426
4427 abort_tidy_up_and_fail:
85ca448a 4428 errno = ECONNABORTED; /* I hope this is portable and appropriate. */
02fc2eee
NC
4429 tidy_up_and_fail:
4430 {
3aed30dc
HS
4431 int save_errno = errno;
4432 if (listener != -1)
4433 PerlLIO_close(listener);
4434 if (connector != -1)
4435 PerlLIO_close(connector);
4436 if (acceptor != -1)
4437 PerlLIO_close(acceptor);
4438 errno = save_errno;
4439 return -1;
02fc2eee
NC
4440 }
4441}
85ca448a 4442#else
48ea76d1
JH
4443/* In any case have a stub so that there's code corresponding
4444 * to the my_socketpair in global.sym. */
4445int
4446Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
daf16542 4447#ifdef HAS_SOCKETPAIR
48ea76d1 4448 return socketpair(family, type, protocol, fd);
daf16542
JH
4449#else
4450 return -1;
4451#endif
48ea76d1
JH
4452}
4453#endif
4454
68795e93
NIS
4455/*
4456
4457=for apidoc sv_nosharing
4458
4459Dummy routine which "shares" an SV when there is no sharing module present.
4460Exists to avoid test for a NULL function pointer and because it could potentially warn under
4461some level of strict-ness.
4462
4463=cut
4464*/
4465
4466void
4467Perl_sv_nosharing(pTHX_ SV *sv)
4468{
4469}
4470
4471/*
4472=for apidoc sv_nolocking
4473
4474Dummy routine which "locks" an SV when there is no locking module present.
4475Exists to avoid test for a NULL function pointer and because it could potentially warn under
4476some level of strict-ness.
4477
4478=cut
4479*/
4480
4481void
4482Perl_sv_nolocking(pTHX_ SV *sv)
4483{
4484}
4485
4486
4487/*
4488=for apidoc sv_nounlocking
4489
4490Dummy routine which "unlocks" an SV when there is no locking module present.
4491Exists to avoid test for a NULL function pointer and because it could potentially warn under
4492some level of strict-ness.
4493
4494=cut
4495*/
4496
4497void
4498Perl_sv_nounlocking(pTHX_ SV *sv)
4499{
4500}
4501
a05d7ebb
JH
4502U32
4503Perl_parse_unicode_opts(pTHX_ char **popt)
4504{
4505 char *p = *popt;
4506 U32 opt = 0;
4507
4508 if (*p) {
4509 if (isDIGIT(*p)) {
4510 opt = (U32) atoi(p);
4511 while (isDIGIT(*p)) p++;
7c91f477 4512 if (*p && *p != '\n' && *p != '\r')
a05d7ebb
JH
4513 Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
4514 }
4515 else {
4516 for (; *p; p++) {
4517 switch (*p) {
4518 case PERL_UNICODE_STDIN:
4519 opt |= PERL_UNICODE_STDIN_FLAG; break;
4520 case PERL_UNICODE_STDOUT:
4521 opt |= PERL_UNICODE_STDOUT_FLAG; break;
4522 case PERL_UNICODE_STDERR:
4523 opt |= PERL_UNICODE_STDERR_FLAG; break;
4524 case PERL_UNICODE_STD:
4525 opt |= PERL_UNICODE_STD_FLAG; break;
4526 case PERL_UNICODE_IN:
4527 opt |= PERL_UNICODE_IN_FLAG; break;
4528 case PERL_UNICODE_OUT:
4529 opt |= PERL_UNICODE_OUT_FLAG; break;
4530 case PERL_UNICODE_INOUT:
4531 opt |= PERL_UNICODE_INOUT_FLAG; break;
4532 case PERL_UNICODE_LOCALE:
4533 opt |= PERL_UNICODE_LOCALE_FLAG; break;
4534 case PERL_UNICODE_ARGV:
4535 opt |= PERL_UNICODE_ARGV_FLAG; break;
4536 default:
7c91f477
JH
4537 if (*p != '\n' && *p != '\r')
4538 Perl_croak(aTHX_
4539 "Unknown Unicode option letter '%c'", *p);
a05d7ebb
JH
4540 }
4541 }
4542 }
4543 }
4544 else
4545 opt = PERL_UNICODE_DEFAULT_FLAGS;
4546
4547 if (opt & ~PERL_UNICODE_ALL_FLAGS)
06e66572 4548 Perl_croak(aTHX_ "Unknown Unicode option value %"UVuf,
a05d7ebb
JH
4549 (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
4550
4551 *popt = p;
4552
4553 return opt;
4554}
4555
132efe8b
JH
4556U32
4557Perl_seed(pTHX)
4558{
4559 /*
4560 * This is really just a quick hack which grabs various garbage
4561 * values. It really should be a real hash algorithm which
4562 * spreads the effect of every input bit onto every output bit,
4563 * if someone who knows about such things would bother to write it.
4564 * Might be a good idea to add that function to CORE as well.
4565 * No numbers below come from careful analysis or anything here,
4566 * except they are primes and SEED_C1 > 1E6 to get a full-width
4567 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
4568 * probably be bigger too.
4569 */
4570#if RANDBITS > 16
4571# define SEED_C1 1000003
4572#define SEED_C4 73819
4573#else
4574# define SEED_C1 25747
4575#define SEED_C4 20639
4576#endif
4577#define SEED_C2 3
4578#define SEED_C3 269
4579#define SEED_C5 26107
4580
4581#ifndef PERL_NO_DEV_RANDOM
4582 int fd;
4583#endif
4584 U32 u;
4585#ifdef VMS
4586# include <starlet.h>
4587 /* when[] = (low 32 bits, high 32 bits) of time since epoch
4588 * in 100-ns units, typically incremented ever 10 ms. */
4589 unsigned int when[2];
4590#else
4591# ifdef HAS_GETTIMEOFDAY
4592 struct timeval when;
4593# else
4594 Time_t when;
4595# endif
4596#endif
4597
4598/* This test is an escape hatch, this symbol isn't set by Configure. */
4599#ifndef PERL_NO_DEV_RANDOM
4600#ifndef PERL_RANDOM_DEVICE
4601 /* /dev/random isn't used by default because reads from it will block
4602 * if there isn't enough entropy available. You can compile with
4603 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
4604 * is enough real entropy to fill the seed. */
4605# define PERL_RANDOM_DEVICE "/dev/urandom"
4606#endif
4607 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
4608 if (fd != -1) {
4609 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
4610 u = 0;
4611 PerlLIO_close(fd);
4612 if (u)
4613 return u;
4614 }
4615#endif
4616
4617#ifdef VMS
4618 _ckvmssts(sys$gettim(when));
4619 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
4620#else
4621# ifdef HAS_GETTIMEOFDAY
4622 PerlProc_gettimeofday(&when,NULL);
4623 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
4624# else
4625 (void)time(&when);
4626 u = (U32)SEED_C1 * when;
4627# endif
4628#endif
4629 u += SEED_C3 * (U32)PerlProc_getpid();
4630 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
4631#ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
4632 u += SEED_C5 * (U32)PTR2UV(&when);
4633#endif
4634 return u;
4635}
4636
bed60192 4637UV
a783c5f4 4638Perl_get_hash_seed(pTHX)
bed60192
JH
4639{
4640 char *s = PerlEnv_getenv("PERL_HASH_SEED");
4641 UV myseed = 0;
4642
4643 if (s)
4644 while (isSPACE(*s)) s++;
4645 if (s && isDIGIT(*s))
4646 myseed = (UV)Atoul(s);
4647 else
4648#ifdef USE_HASH_SEED_EXPLICIT
4649 if (s)
4650#endif
4651 {
4652 /* Compute a random seed */
4653 (void)seedDrand01((Rand_seed_t)seed());
bed60192
JH
4654 myseed = (UV)(Drand01() * (NV)UV_MAX);
4655#if RANDBITS < (UVSIZE * 8)
4656 /* Since there are not enough randbits to to reach all
4657 * the bits of a UV, the low bits might need extra
4658 * help. Sum in another random number that will
4659 * fill in the low bits. */
4660 myseed +=
4661 (UV)(Drand01() * (NV)((1 << ((UVSIZE * 8 - RANDBITS))) - 1));
4662#endif /* RANDBITS < (UVSIZE * 8) */
6cfd5ea7
JH
4663 if (myseed == 0) { /* Superparanoia. */
4664 myseed = (UV)(Drand01() * (NV)UV_MAX); /* One more chance. */
4665 if (myseed == 0)
4666 Perl_croak(aTHX_ "Your random numbers are not that random");
4667 }
bed60192 4668 }
008fb0c0 4669 PL_rehash_seed_set = TRUE;
bed60192
JH
4670
4671 return myseed;
4672}