ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/util.c
Revision: 1.1
Committed: Thu Jun 30 14:26:43 2005 UTC (21 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

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