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