This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
podcheck.t: clarify its pod
[perl5.git] / perlio.c
... / ...
CommitLineData
1/*
2 * perlio.c
3 * Copyright (c) 1996-2006, Nick Ing-Simmons
4 * Copyright (c) 2006, 2007, 2008 Larry Wall and others
5 *
6 * You may distribute under the terms of either the GNU General Public License
7 * or the Artistic License, as specified in the README file.
8 */
9
10/*
11 * Hour after hour for nearly three weary days he had jogged up and down,
12 * over passes, and through long dales, and across many streams.
13 *
14 * [pp.791-792 of _The Lord of the Rings_, V/iii: "The Muster of Rohan"]
15 */
16
17/* This file contains the functions needed to implement PerlIO, which
18 * is Perl's private replacement for the C stdio library. This is used
19 * by default unless you compile with -Uuseperlio or run with
20 * PERLIO=:stdio (but don't do this unless you know what you're doing)
21 */
22
23/*
24 * If we have ActivePerl-like PERL_IMPLICIT_SYS then we need a dTHX to get
25 * at the dispatch tables, even when we do not need it for other reasons.
26 * Invent a dSYS macro to abstract this out
27 */
28#ifdef PERL_IMPLICIT_SYS
29#define dSYS dTHX
30#else
31#define dSYS dNOOP
32#endif
33
34#define VOIDUSED 1
35#ifdef PERL_MICRO
36# include "uconfig.h"
37#else
38# ifndef USE_CROSS_COMPILE
39# include "config.h"
40# else
41# include "xconfig.h"
42# endif
43#endif
44
45#define PERLIO_NOT_STDIO 0
46#if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
47/*
48 * #define PerlIO FILE
49 */
50#endif
51/*
52 * This file provides those parts of PerlIO abstraction
53 * which are not #defined in perlio.h.
54 * Which these are depends on various Configure #ifdef's
55 */
56
57#include "EXTERN.h"
58#define PERL_IN_PERLIO_C
59#include "perl.h"
60
61#ifdef PERL_IMPLICIT_CONTEXT
62#undef dSYS
63#define dSYS dTHX
64#endif
65
66#include "XSUB.h"
67
68#ifdef __Lynx__
69/* Missing proto on LynxOS */
70int mkstemp(char*);
71#endif
72
73#define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
74
75/* Call the callback or PerlIOBase, and return failure. */
76#define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
77 if (PerlIOValid(f)) { \
78 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
79 if (tab && tab->callback) \
80 return (*tab->callback) args; \
81 else \
82 return PerlIOBase_ ## base args; \
83 } \
84 else \
85 SETERRNO(EBADF, SS_IVCHAN); \
86 return failure
87
88/* Call the callback or fail, and return failure. */
89#define Perl_PerlIO_or_fail(f, callback, failure, args) \
90 if (PerlIOValid(f)) { \
91 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
92 if (tab && tab->callback) \
93 return (*tab->callback) args; \
94 SETERRNO(EINVAL, LIB_INVARG); \
95 } \
96 else \
97 SETERRNO(EBADF, SS_IVCHAN); \
98 return failure
99
100/* Call the callback or PerlIOBase, and be void. */
101#define Perl_PerlIO_or_Base_void(f, callback, base, args) \
102 if (PerlIOValid(f)) { \
103 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
104 if (tab && tab->callback) \
105 (*tab->callback) args; \
106 else \
107 PerlIOBase_ ## base args; \
108 } \
109 else \
110 SETERRNO(EBADF, SS_IVCHAN)
111
112/* Call the callback or fail, and be void. */
113#define Perl_PerlIO_or_fail_void(f, callback, args) \
114 if (PerlIOValid(f)) { \
115 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
116 if (tab && tab->callback) \
117 (*tab->callback) args; \
118 else \
119 SETERRNO(EINVAL, LIB_INVARG); \
120 } \
121 else \
122 SETERRNO(EBADF, SS_IVCHAN)
123
124#if defined(__osf__) && _XOPEN_SOURCE < 500
125extern int fseeko(FILE *, off_t, int);
126extern off_t ftello(FILE *);
127#endif
128
129#ifndef USE_SFIO
130
131EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
132
133int
134perlsio_binmode(FILE *fp, int iotype, int mode)
135{
136 /*
137 * This used to be contents of do_binmode in doio.c
138 */
139#ifdef DOSISH
140# if defined(atarist)
141 PERL_UNUSED_ARG(iotype);
142 if (!fflush(fp)) {
143 if (mode & O_BINARY)
144 ((FILE *) fp)->_flag |= _IOBIN;
145 else
146 ((FILE *) fp)->_flag &= ~_IOBIN;
147 return 1;
148 }
149 return 0;
150# else
151 dTHX;
152 PERL_UNUSED_ARG(iotype);
153#ifdef NETWARE
154 if (PerlLIO_setmode(fp, mode) != -1) {
155#else
156 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
157#endif
158 return 1;
159 }
160 else
161 return 0;
162# endif
163#else
164# if defined(USEMYBINMODE)
165 dTHX;
166# if defined(__CYGWIN__)
167 PERL_UNUSED_ARG(iotype);
168# endif
169 if (my_binmode(fp, iotype, mode) != FALSE)
170 return 1;
171 else
172 return 0;
173# else
174 PERL_UNUSED_ARG(fp);
175 PERL_UNUSED_ARG(iotype);
176 PERL_UNUSED_ARG(mode);
177 return 1;
178# endif
179#endif
180}
181#endif /* sfio */
182
183#ifndef O_ACCMODE
184#define O_ACCMODE 3 /* Assume traditional implementation */
185#endif
186
187int
188PerlIO_intmode2str(int rawmode, char *mode, int *writing)
189{
190 const int result = rawmode & O_ACCMODE;
191 int ix = 0;
192 int ptype;
193 switch (result) {
194 case O_RDONLY:
195 ptype = IoTYPE_RDONLY;
196 break;
197 case O_WRONLY:
198 ptype = IoTYPE_WRONLY;
199 break;
200 case O_RDWR:
201 default:
202 ptype = IoTYPE_RDWR;
203 break;
204 }
205 if (writing)
206 *writing = (result != O_RDONLY);
207
208 if (result == O_RDONLY) {
209 mode[ix++] = 'r';
210 }
211#ifdef O_APPEND
212 else if (rawmode & O_APPEND) {
213 mode[ix++] = 'a';
214 if (result != O_WRONLY)
215 mode[ix++] = '+';
216 }
217#endif
218 else {
219 if (result == O_WRONLY)
220 mode[ix++] = 'w';
221 else {
222 mode[ix++] = 'r';
223 mode[ix++] = '+';
224 }
225 }
226 if (rawmode & O_BINARY)
227 mode[ix++] = 'b';
228 mode[ix] = '\0';
229 return ptype;
230}
231
232#ifndef PERLIO_LAYERS
233int
234PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
235{
236 if (!names || !*names
237 || strEQ(names, ":crlf")
238 || strEQ(names, ":raw")
239 || strEQ(names, ":bytes")
240 ) {
241 return 0;
242 }
243 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
244 /*
245 * NOTREACHED
246 */
247 return -1;
248}
249
250void
251PerlIO_destruct(pTHX)
252{
253}
254
255int
256PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
257{
258#ifdef USE_SFIO
259 PERL_UNUSED_ARG(iotype);
260 PERL_UNUSED_ARG(mode);
261 PERL_UNUSED_ARG(names);
262 return 1;
263#else
264 return perlsio_binmode(fp, iotype, mode);
265#endif
266}
267
268PerlIO *
269PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
270{
271#if defined(PERL_MICRO) || defined(__SYMBIAN32__)
272 return NULL;
273#else
274#ifdef PERL_IMPLICIT_SYS
275 return PerlSIO_fdupopen(f);
276#else
277#ifdef WIN32
278 return win32_fdupopen(f);
279#else
280 if (f) {
281 const int fd = PerlLIO_dup(PerlIO_fileno(f));
282 if (fd >= 0) {
283 char mode[8];
284#ifdef DJGPP
285 const int omode = djgpp_get_stream_mode(f);
286#else
287 const int omode = fcntl(fd, F_GETFL);
288#endif
289 PerlIO_intmode2str(omode,mode,NULL);
290 /* the r+ is a hack */
291 return PerlIO_fdopen(fd, mode);
292 }
293 return NULL;
294 }
295 else {
296 SETERRNO(EBADF, SS_IVCHAN);
297 }
298#endif
299 return NULL;
300#endif
301#endif
302}
303
304
305/*
306 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
307 */
308
309PerlIO *
310PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
311 int imode, int perm, PerlIO *old, int narg, SV **args)
312{
313 if (narg) {
314 if (narg > 1) {
315 Perl_croak(aTHX_ "More than one argument to open");
316 }
317 if (*args == &PL_sv_undef)
318 return PerlIO_tmpfile();
319 else {
320 const char *name = SvPV_nolen_const(*args);
321 if (*mode == IoTYPE_NUMERIC) {
322 fd = PerlLIO_open3(name, imode, perm);
323 if (fd >= 0)
324 return PerlIO_fdopen(fd, mode + 1);
325 }
326 else if (old) {
327 return PerlIO_reopen(name, mode, old);
328 }
329 else {
330 return PerlIO_open(name, mode);
331 }
332 }
333 }
334 else {
335 return PerlIO_fdopen(fd, (char *) mode);
336 }
337 return NULL;
338}
339
340XS(XS_PerlIO__Layer__find)
341{
342 dXSARGS;
343 if (items < 2)
344 Perl_croak(aTHX_ "Usage class->find(name[,load])");
345 else {
346 const char * const name = SvPV_nolen_const(ST(1));
347 ST(0) = (strEQ(name, "crlf")
348 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
349 XSRETURN(1);
350 }
351}
352
353
354void
355Perl_boot_core_PerlIO(pTHX)
356{
357 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
358}
359
360#endif
361
362
363#ifdef PERLIO_IS_STDIO
364
365void
366PerlIO_init(pTHX)
367{
368 PERL_UNUSED_CONTEXT;
369 /*
370 * Does nothing (yet) except force this file to be included in perl
371 * binary. That allows this file to force inclusion of other functions
372 * that may be required by loadable extensions e.g. for
373 * FileHandle::tmpfile
374 */
375}
376
377#undef PerlIO_tmpfile
378PerlIO *
379PerlIO_tmpfile(void)
380{
381 return tmpfile();
382}
383
384#else /* PERLIO_IS_STDIO */
385
386#ifdef USE_SFIO
387
388#undef HAS_FSETPOS
389#undef HAS_FGETPOS
390
391/*
392 * This section is just to make sure these functions get pulled in from
393 * libsfio.a
394 */
395
396#undef PerlIO_tmpfile
397PerlIO *
398PerlIO_tmpfile(void)
399{
400 return sftmp(0);
401}
402
403void
404PerlIO_init(pTHX)
405{
406 PERL_UNUSED_CONTEXT;
407 /*
408 * Force this file to be included in perl binary. Which allows this
409 * file to force inclusion of other functions that may be required by
410 * loadable extensions e.g. for FileHandle::tmpfile
411 */
412
413 /*
414 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
415 * results in a lot of lseek()s to regular files and lot of small
416 * writes to pipes.
417 */
418 sfset(sfstdout, SF_SHARE, 0);
419}
420
421/* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
422PerlIO *
423PerlIO_importFILE(FILE *stdio, const char *mode)
424{
425 const int fd = fileno(stdio);
426 if (!mode || !*mode) {
427 mode = "r+";
428 }
429 return PerlIO_fdopen(fd, mode);
430}
431
432FILE *
433PerlIO_findFILE(PerlIO *pio)
434{
435 const int fd = PerlIO_fileno(pio);
436 FILE * const f = fdopen(fd, "r+");
437 PerlIO_flush(pio);
438 if (!f && errno == EINVAL)
439 f = fdopen(fd, "w");
440 if (!f && errno == EINVAL)
441 f = fdopen(fd, "r");
442 return f;
443}
444
445
446#else /* USE_SFIO */
447/*======================================================================================*/
448/*
449 * Implement all the PerlIO interface ourselves.
450 */
451
452#include "perliol.h"
453
454#ifdef HAS_MMAP
455#include <sys/mman.h>
456#endif
457
458void
459PerlIO_debug(const char *fmt, ...)
460{
461 va_list ap;
462 dSYS;
463 va_start(ap, fmt);
464 if (!PL_perlio_debug_fd) {
465 if (!PL_tainting && PL_uid == PL_euid && PL_gid == PL_egid) {
466 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
467 if (s && *s)
468 PL_perlio_debug_fd
469 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
470 else
471 PL_perlio_debug_fd = -1;
472 } else {
473 /* tainting or set*id, so ignore the environment, and ensure we
474 skip these tests next time through. */
475 PL_perlio_debug_fd = -1;
476 }
477 }
478 if (PL_perlio_debug_fd > 0) {
479 dTHX;
480#ifdef USE_ITHREADS
481 const char * const s = CopFILE(PL_curcop);
482 /* Use fixed buffer as sv_catpvf etc. needs SVs */
483 char buffer[1024];
484 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
485 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
486 PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2);
487#else
488 const char *s = CopFILE(PL_curcop);
489 STRLEN len;
490 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
491 (IV) CopLINE(PL_curcop));
492 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
493
494 s = SvPV_const(sv, len);
495 PerlLIO_write(PL_perlio_debug_fd, s, len);
496 SvREFCNT_dec(sv);
497#endif
498 }
499 va_end(ap);
500}
501
502/*--------------------------------------------------------------------------------------*/
503
504/*
505 * Inner level routines
506 */
507
508/* check that the head field of each layer points back to the head */
509
510#ifdef DEBUGGING
511# define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
512static void
513PerlIO_verify_head(pTHX_ PerlIO *f)
514{
515 PerlIOl *head, *p;
516 int seen = 0;
517 if (!PerlIOValid(f))
518 return;
519 p = head = PerlIOBase(f)->head;
520 assert(p);
521 do {
522 assert(p->head == head);
523 if (p == (PerlIOl*)f)
524 seen = 1;
525 p = p->next;
526 } while (p);
527 assert(seen);
528}
529#else
530# define VERIFY_HEAD(f)
531#endif
532
533
534/*
535 * Table of pointers to the PerlIO structs (malloc'ed)
536 */
537#define PERLIO_TABLE_SIZE 64
538
539static void
540PerlIO_init_table(pTHX)
541{
542 if (PL_perlio)
543 return;
544 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
545}
546
547
548
549PerlIO *
550PerlIO_allocate(pTHX)
551{
552 dVAR;
553 /*
554 * Find a free slot in the table, allocating new table as necessary
555 */
556 PerlIOl **last;
557 PerlIOl *f;
558 last = &PL_perlio;
559 while ((f = *last)) {
560 int i;
561 last = (PerlIOl **) (f);
562 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
563 if (!((++f)->next)) {
564 f->flags = 0; /* lockcnt */
565 f->tab = NULL;
566 f->head = f;
567 return (PerlIO *)f;
568 }
569 }
570 }
571 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
572 if (!f) {
573 return NULL;
574 }
575 *last = (PerlIOl*) f++;
576 f->flags = 0; /* lockcnt */
577 f->tab = NULL;
578 f->head = f;
579 return (PerlIO*) f;
580}
581
582#undef PerlIO_fdupopen
583PerlIO *
584PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
585{
586 if (PerlIOValid(f)) {
587 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
588 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
589 if (tab && tab->Dup)
590 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
591 else {
592 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
593 }
594 }
595 else
596 SETERRNO(EBADF, SS_IVCHAN);
597
598 return NULL;
599}
600
601void
602PerlIO_cleantable(pTHX_ PerlIOl **tablep)
603{
604 PerlIOl * const table = *tablep;
605 if (table) {
606 int i;
607 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
608 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
609 PerlIOl * const f = table + i;
610 if (f->next) {
611 PerlIO_close(&(f->next));
612 }
613 }
614 Safefree(table);
615 *tablep = NULL;
616 }
617}
618
619
620PerlIO_list_t *
621PerlIO_list_alloc(pTHX)
622{
623 PerlIO_list_t *list;
624 PERL_UNUSED_CONTEXT;
625 Newxz(list, 1, PerlIO_list_t);
626 list->refcnt = 1;
627 return list;
628}
629
630void
631PerlIO_list_free(pTHX_ PerlIO_list_t *list)
632{
633 if (list) {
634 if (--list->refcnt == 0) {
635 if (list->array) {
636 IV i;
637 for (i = 0; i < list->cur; i++)
638 SvREFCNT_dec(list->array[i].arg);
639 Safefree(list->array);
640 }
641 Safefree(list);
642 }
643 }
644}
645
646void
647PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
648{
649 dVAR;
650 PerlIO_pair_t *p;
651 PERL_UNUSED_CONTEXT;
652
653 if (list->cur >= list->len) {
654 list->len += 8;
655 if (list->array)
656 Renew(list->array, list->len, PerlIO_pair_t);
657 else
658 Newx(list->array, list->len, PerlIO_pair_t);
659 }
660 p = &(list->array[list->cur++]);
661 p->funcs = funcs;
662 if ((p->arg = arg)) {
663 SvREFCNT_inc_simple_void_NN(arg);
664 }
665}
666
667PerlIO_list_t *
668PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
669{
670 PerlIO_list_t *list = NULL;
671 if (proto) {
672 int i;
673 list = PerlIO_list_alloc(aTHX);
674 for (i=0; i < proto->cur; i++) {
675 SV *arg = proto->array[i].arg;
676#ifdef sv_dup
677 if (arg && param)
678 arg = sv_dup(arg, param);
679#else
680 PERL_UNUSED_ARG(param);
681#endif
682 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
683 }
684 }
685 return list;
686}
687
688void
689PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
690{
691#ifdef USE_ITHREADS
692 PerlIOl **table = &proto->Iperlio;
693 PerlIOl *f;
694 PL_perlio = NULL;
695 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
696 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
697 PerlIO_init_table(aTHX);
698 PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto);
699 while ((f = *table)) {
700 int i;
701 table = (PerlIOl **) (f++);
702 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
703 if (f->next) {
704 (void) fp_dup(&(f->next), 0, param);
705 }
706 f++;
707 }
708 }
709#else
710 PERL_UNUSED_CONTEXT;
711 PERL_UNUSED_ARG(proto);
712 PERL_UNUSED_ARG(param);
713#endif
714}
715
716void
717PerlIO_destruct(pTHX)
718{
719 dVAR;
720 PerlIOl **table = &PL_perlio;
721 PerlIOl *f;
722#ifdef USE_ITHREADS
723 PerlIO_debug("Destruct %p\n",(void*)aTHX);
724#endif
725 while ((f = *table)) {
726 int i;
727 table = (PerlIOl **) (f++);
728 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
729 PerlIO *x = &(f->next);
730 const PerlIOl *l;
731 while ((l = *x)) {
732 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
733 PerlIO_debug("Destruct popping %s\n", l->tab->name);
734 PerlIO_flush(x);
735 PerlIO_pop(aTHX_ x);
736 }
737 else {
738 x = PerlIONext(x);
739 }
740 }
741 f++;
742 }
743 }
744}
745
746void
747PerlIO_pop(pTHX_ PerlIO *f)
748{
749 const PerlIOl *l = *f;
750 VERIFY_HEAD(f);
751 if (l) {
752 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f,
753 l->tab ? l->tab->name : "(Null)");
754 if (l->tab && l->tab->Popped) {
755 /*
756 * If popped returns non-zero do not free its layer structure
757 * it has either done so itself, or it is shared and still in
758 * use
759 */
760 if ((*l->tab->Popped) (aTHX_ f) != 0)
761 return;
762 }
763 if (PerlIO_lockcnt(f)) {
764 /* we're in use; defer freeing the structure */
765 PerlIOBase(f)->flags = PERLIO_F_CLEARED;
766 PerlIOBase(f)->tab = NULL;
767 }
768 else {
769 *f = l->next;
770 Safefree(l);
771 }
772
773 }
774}
775
776/* Return as an array the stack of layers on a filehandle. Note that
777 * the stack is returned top-first in the array, and there are three
778 * times as many array elements as there are layers in the stack: the
779 * first element of a layer triplet is the name, the second one is the
780 * arguments, and the third one is the flags. */
781
782AV *
783PerlIO_get_layers(pTHX_ PerlIO *f)
784{
785 dVAR;
786 AV * const av = newAV();
787
788 if (PerlIOValid(f)) {
789 PerlIOl *l = PerlIOBase(f);
790
791 while (l) {
792 /* There is some collusion in the implementation of
793 XS_PerlIO_get_layers - it knows that name and flags are
794 generated as fresh SVs here, and takes advantage of that to
795 "copy" them by taking a reference. If it changes here, it needs
796 to change there too. */
797 SV * const name = l->tab && l->tab->name ?
798 newSVpv(l->tab->name, 0) : &PL_sv_undef;
799 SV * const arg = l->tab && l->tab->Getarg ?
800 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
801 av_push(av, name);
802 av_push(av, arg);
803 av_push(av, newSViv((IV)l->flags));
804 l = l->next;
805 }
806 }
807
808 return av;
809}
810
811/*--------------------------------------------------------------------------------------*/
812/*
813 * XS Interface for perl code
814 */
815
816PerlIO_funcs *
817PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
818{
819 dVAR;
820 IV i;
821 if ((SSize_t) len <= 0)
822 len = strlen(name);
823 for (i = 0; i < PL_known_layers->cur; i++) {
824 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
825 if (memEQ(f->name, name, len) && f->name[len] == 0) {
826 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
827 return f;
828 }
829 }
830 if (load && PL_subname && PL_def_layerlist
831 && PL_def_layerlist->cur >= 2) {
832 if (PL_in_load_module) {
833 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
834 return NULL;
835 } else {
836 SV * const pkgsv = newSVpvs("PerlIO");
837 SV * const layer = newSVpvn(name, len);
838 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
839 ENTER;
840 SAVEBOOL(PL_in_load_module);
841 if (cv) {
842 SAVEGENERICSV(PL_warnhook);
843 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
844 }
845 PL_in_load_module = TRUE;
846 /*
847 * The two SVs are magically freed by load_module
848 */
849 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
850 LEAVE;
851 return PerlIO_find_layer(aTHX_ name, len, 0);
852 }
853 }
854 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
855 return NULL;
856}
857
858#ifdef USE_ATTRIBUTES_FOR_PERLIO
859
860static int
861perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
862{
863 if (SvROK(sv)) {
864 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
865 PerlIO * const ifp = IoIFP(io);
866 PerlIO * const ofp = IoOFP(io);
867 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
868 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
869 }
870 return 0;
871}
872
873static int
874perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
875{
876 if (SvROK(sv)) {
877 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
878 PerlIO * const ifp = IoIFP(io);
879 PerlIO * const ofp = IoOFP(io);
880 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
881 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
882 }
883 return 0;
884}
885
886static int
887perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
888{
889 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
890 return 0;
891}
892
893static int
894perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
895{
896 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
897 return 0;
898}
899
900MGVTBL perlio_vtab = {
901 perlio_mg_get,
902 perlio_mg_set,
903 NULL, /* len */
904 perlio_mg_clear,
905 perlio_mg_free
906};
907
908XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
909{
910 dXSARGS;
911 SV * const sv = SvRV(ST(1));
912 AV * const av = newAV();
913 MAGIC *mg;
914 int count = 0;
915 int i;
916 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
917 SvRMAGICAL_off(sv);
918 mg = mg_find(sv, PERL_MAGIC_ext);
919 mg->mg_virtual = &perlio_vtab;
920 mg_magical(sv);
921 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
922 for (i = 2; i < items; i++) {
923 STRLEN len;
924 const char * const name = SvPV_const(ST(i), len);
925 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
926 if (layer) {
927 av_push(av, SvREFCNT_inc_simple_NN(layer));
928 }
929 else {
930 ST(count) = ST(i);
931 count++;
932 }
933 }
934 SvREFCNT_dec(av);
935 XSRETURN(count);
936}
937
938#endif /* USE_ATTIBUTES_FOR_PERLIO */
939
940SV *
941PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
942{
943 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
944 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
945 return sv;
946}
947
948XS(XS_PerlIO__Layer__NoWarnings)
949{
950 /* This is used as a %SIG{__WARN__} handler to suppress warnings
951 during loading of layers.
952 */
953 dVAR;
954 dXSARGS;
955 PERL_UNUSED_ARG(cv);
956 if (items)
957 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
958 XSRETURN(0);
959}
960
961XS(XS_PerlIO__Layer__find)
962{
963 dVAR;
964 dXSARGS;
965 PERL_UNUSED_ARG(cv);
966 if (items < 2)
967 Perl_croak(aTHX_ "Usage class->find(name[,load])");
968 else {
969 STRLEN len;
970 const char * const name = SvPV_const(ST(1), len);
971 const bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
972 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
973 ST(0) =
974 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
975 &PL_sv_undef;
976 XSRETURN(1);
977 }
978}
979
980void
981PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
982{
983 dVAR;
984 if (!PL_known_layers)
985 PL_known_layers = PerlIO_list_alloc(aTHX);
986 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
987 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
988}
989
990int
991PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
992{
993 dVAR;
994 if (names) {
995 const char *s = names;
996 while (*s) {
997 while (isSPACE(*s) || *s == ':')
998 s++;
999 if (*s) {
1000 STRLEN llen = 0;
1001 const char *e = s;
1002 const char *as = NULL;
1003 STRLEN alen = 0;
1004 if (!isIDFIRST(*s)) {
1005 /*
1006 * Message is consistent with how attribute lists are
1007 * passed. Even though this means "foo : : bar" is
1008 * seen as an invalid separator character.
1009 */
1010 const char q = ((*s == '\'') ? '"' : '\'');
1011 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1012 "Invalid separator character %c%c%c in PerlIO layer specification %s",
1013 q, *s, q, s);
1014 SETERRNO(EINVAL, LIB_INVARG);
1015 return -1;
1016 }
1017 do {
1018 e++;
1019 } while (isALNUM(*e));
1020 llen = e - s;
1021 if (*e == '(') {
1022 int nesting = 1;
1023 as = ++e;
1024 while (nesting) {
1025 switch (*e++) {
1026 case ')':
1027 if (--nesting == 0)
1028 alen = (e - 1) - as;
1029 break;
1030 case '(':
1031 ++nesting;
1032 break;
1033 case '\\':
1034 /*
1035 * It's a nul terminated string, not allowed
1036 * to \ the terminating null. Anything other
1037 * character is passed over.
1038 */
1039 if (*e++) {
1040 break;
1041 }
1042 /*
1043 * Drop through
1044 */
1045 case '\0':
1046 e--;
1047 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1048 "Argument list not closed for PerlIO layer \"%.*s\"",
1049 (int) (e - s), s);
1050 return -1;
1051 default:
1052 /*
1053 * boring.
1054 */
1055 break;
1056 }
1057 }
1058 }
1059 if (e > s) {
1060 PerlIO_funcs * const layer =
1061 PerlIO_find_layer(aTHX_ s, llen, 1);
1062 if (layer) {
1063 SV *arg = NULL;
1064 if (as)
1065 arg = newSVpvn(as, alen);
1066 PerlIO_list_push(aTHX_ av, layer,
1067 (arg) ? arg : &PL_sv_undef);
1068 SvREFCNT_dec(arg);
1069 }
1070 else {
1071 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1072 (int) llen, s);
1073 return -1;
1074 }
1075 }
1076 s = e;
1077 }
1078 }
1079 }
1080 return 0;
1081}
1082
1083void
1084PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1085{
1086 dVAR;
1087 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1088#ifdef PERLIO_USING_CRLF
1089 tab = &PerlIO_crlf;
1090#else
1091 if (PerlIO_stdio.Set_ptrcnt)
1092 tab = &PerlIO_stdio;
1093#endif
1094 PerlIO_debug("Pushing %s\n", tab->name);
1095 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1096 &PL_sv_undef);
1097}
1098
1099SV *
1100PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1101{
1102 return av->array[n].arg;
1103}
1104
1105PerlIO_funcs *
1106PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1107{
1108 if (n >= 0 && n < av->cur) {
1109 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1110 av->array[n].funcs->name);
1111 return av->array[n].funcs;
1112 }
1113 if (!def)
1114 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1115 return def;
1116}
1117
1118IV
1119PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1120{
1121 PERL_UNUSED_ARG(mode);
1122 PERL_UNUSED_ARG(arg);
1123 PERL_UNUSED_ARG(tab);
1124 if (PerlIOValid(f)) {
1125 PerlIO_flush(f);
1126 PerlIO_pop(aTHX_ f);
1127 return 0;
1128 }
1129 return -1;
1130}
1131
1132PERLIO_FUNCS_DECL(PerlIO_remove) = {
1133 sizeof(PerlIO_funcs),
1134 "pop",
1135 0,
1136 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1137 PerlIOPop_pushed,
1138 NULL,
1139 PerlIOBase_open,
1140 NULL,
1141 NULL,
1142 NULL,
1143 NULL,
1144 NULL,
1145 NULL,
1146 NULL,
1147 NULL,
1148 NULL,
1149 NULL,
1150 NULL, /* flush */
1151 NULL, /* fill */
1152 NULL,
1153 NULL,
1154 NULL,
1155 NULL,
1156 NULL, /* get_base */
1157 NULL, /* get_bufsiz */
1158 NULL, /* get_ptr */
1159 NULL, /* get_cnt */
1160 NULL, /* set_ptrcnt */
1161};
1162
1163PerlIO_list_t *
1164PerlIO_default_layers(pTHX)
1165{
1166 dVAR;
1167 if (!PL_def_layerlist) {
1168 const char * const s = (PL_tainting) ? NULL : PerlEnv_getenv("PERLIO");
1169 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1170 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1171 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1172#if defined(WIN32)
1173 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1174#if 0
1175 osLayer = &PerlIO_win32;
1176#endif
1177#endif
1178 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1179 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1180 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1181 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1182#ifdef HAS_MMAP
1183 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_mmap));
1184#endif
1185 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1186 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1187 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1188 PerlIO_list_push(aTHX_ PL_def_layerlist,
1189 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1190 &PL_sv_undef);
1191 if (s) {
1192 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1193 }
1194 else {
1195 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1196 }
1197 }
1198 if (PL_def_layerlist->cur < 2) {
1199 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1200 }
1201 return PL_def_layerlist;
1202}
1203
1204void
1205Perl_boot_core_PerlIO(pTHX)
1206{
1207#ifdef USE_ATTRIBUTES_FOR_PERLIO
1208 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1209 __FILE__);
1210#endif
1211 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1212 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1213}
1214
1215PerlIO_funcs *
1216PerlIO_default_layer(pTHX_ I32 n)
1217{
1218 dVAR;
1219 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1220 if (n < 0)
1221 n += av->cur;
1222 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1223}
1224
1225#define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1226#define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1227
1228void
1229PerlIO_stdstreams(pTHX)
1230{
1231 dVAR;
1232 if (!PL_perlio) {
1233 PerlIO_init_table(aTHX);
1234 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1235 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1236 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1237 }
1238}
1239
1240PerlIO *
1241PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1242{
1243 VERIFY_HEAD(f);
1244 if (tab->fsize != sizeof(PerlIO_funcs)) {
1245 Perl_croak( aTHX_
1246 "%s (%"UVuf") does not match %s (%"UVuf")",
1247 "PerlIO layer function table size", (UV)tab->fsize,
1248 "size expected by this perl", (UV)sizeof(PerlIO_funcs) );
1249 }
1250 if (tab->size) {
1251 PerlIOl *l;
1252 if (tab->size < sizeof(PerlIOl)) {
1253 Perl_croak( aTHX_
1254 "%s (%"UVuf") smaller than %s (%"UVuf")",
1255 "PerlIO layer instance size", (UV)tab->size,
1256 "size expected by this perl", (UV)sizeof(PerlIOl) );
1257 }
1258 /* Real layer with a data area */
1259 if (f) {
1260 char *temp;
1261 Newxz(temp, tab->size, char);
1262 l = (PerlIOl*)temp;
1263 if (l) {
1264 l->next = *f;
1265 l->tab = (PerlIO_funcs*) tab;
1266 l->head = ((PerlIOl*)f)->head;
1267 *f = l;
1268 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1269 (void*)f, tab->name,
1270 (mode) ? mode : "(Null)", (void*)arg);
1271 if (*l->tab->Pushed &&
1272 (*l->tab->Pushed)
1273 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1274 PerlIO_pop(aTHX_ f);
1275 return NULL;
1276 }
1277 }
1278 else
1279 return NULL;
1280 }
1281 }
1282 else if (f) {
1283 /* Pseudo-layer where push does its own stack adjust */
1284 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1285 (mode) ? mode : "(Null)", (void*)arg);
1286 if (tab->Pushed &&
1287 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1288 return NULL;
1289 }
1290 }
1291 return f;
1292}
1293
1294PerlIO *
1295PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1296 IV n, const char *mode, int fd, int imode, int perm,
1297 PerlIO *old, int narg, SV **args)
1298{
1299 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_layer(aTHX_ 0));
1300 if (tab && tab->Open) {
1301 PerlIO* ret = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm, old, narg, args);
1302 if (ret && PerlIO_push(aTHX_ ret, self, mode, PerlIOArg) == NULL) {
1303 PerlIO_close(ret);
1304 return NULL;
1305 }
1306 return ret;
1307 }
1308 SETERRNO(EINVAL, LIB_INVARG);
1309 return NULL;
1310}
1311
1312IV
1313PerlIOBase_binmode(pTHX_ PerlIO *f)
1314{
1315 if (PerlIOValid(f)) {
1316 /* Is layer suitable for raw stream ? */
1317 if (PerlIOBase(f)->tab && PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1318 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1319 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1320 }
1321 else {
1322 /* Not suitable - pop it */
1323 PerlIO_pop(aTHX_ f);
1324 }
1325 return 0;
1326 }
1327 return -1;
1328}
1329
1330IV
1331PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1332{
1333 PERL_UNUSED_ARG(mode);
1334 PERL_UNUSED_ARG(arg);
1335 PERL_UNUSED_ARG(tab);
1336
1337 if (PerlIOValid(f)) {
1338 PerlIO *t;
1339 const PerlIOl *l;
1340 PerlIO_flush(f);
1341 /*
1342 * Strip all layers that are not suitable for a raw stream
1343 */
1344 t = f;
1345 while (t && (l = *t)) {
1346 if (l->tab && l->tab->Binmode) {
1347 /* Has a handler - normal case */
1348 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1349 if (*t == l) {
1350 /* Layer still there - move down a layer */
1351 t = PerlIONext(t);
1352 }
1353 }
1354 else {
1355 return -1;
1356 }
1357 }
1358 else {
1359 /* No handler - pop it */
1360 PerlIO_pop(aTHX_ t);
1361 }
1362 }
1363 if (PerlIOValid(f)) {
1364 PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1365 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)");
1366 return 0;
1367 }
1368 }
1369 return -1;
1370}
1371
1372int
1373PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1374 PerlIO_list_t *layers, IV n, IV max)
1375{
1376 int code = 0;
1377 while (n < max) {
1378 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1379 if (tab) {
1380 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1381 code = -1;
1382 break;
1383 }
1384 }
1385 n++;
1386 }
1387 return code;
1388}
1389
1390int
1391PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1392{
1393 int code = 0;
1394 ENTER;
1395 save_scalar(PL_errgv);
1396 if (f && names) {
1397 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1398 code = PerlIO_parse_layers(aTHX_ layers, names);
1399 if (code == 0) {
1400 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1401 }
1402 PerlIO_list_free(aTHX_ layers);
1403 }
1404 LEAVE;
1405 return code;
1406}
1407
1408
1409/*--------------------------------------------------------------------------------------*/
1410/*
1411 * Given the abstraction above the public API functions
1412 */
1413
1414int
1415PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1416{
1417 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1418 (PerlIOBase(f) && PerlIOBase(f)->tab) ?
1419 PerlIOBase(f)->tab->name : "(Null)",
1420 iotype, mode, (names) ? names : "(Null)");
1421
1422 if (names) {
1423 /* Do not flush etc. if (e.g.) switching encodings.
1424 if a pushed layer knows it needs to flush lower layers
1425 (for example :unix which is never going to call them)
1426 it can do the flush when it is pushed.
1427 */
1428 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1429 }
1430 else {
1431 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1432#ifdef PERLIO_USING_CRLF
1433 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1434 O_BINARY so we can look for it in mode.
1435 */
1436 if (!(mode & O_BINARY)) {
1437 /* Text mode */
1438 /* FIXME?: Looking down the layer stack seems wrong,
1439 but is a way of reaching past (say) an encoding layer
1440 to flip CRLF-ness of the layer(s) below
1441 */
1442 while (*f) {
1443 /* Perhaps we should turn on bottom-most aware layer
1444 e.g. Ilya's idea that UNIX TTY could serve
1445 */
1446 if (PerlIOBase(f)->tab &&
1447 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1448 {
1449 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1450 /* Not in text mode - flush any pending stuff and flip it */
1451 PerlIO_flush(f);
1452 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1453 }
1454 /* Only need to turn it on in one layer so we are done */
1455 return TRUE;
1456 }
1457 f = PerlIONext(f);
1458 }
1459 /* Not finding a CRLF aware layer presumably means we are binary
1460 which is not what was requested - so we failed
1461 We _could_ push :crlf layer but so could caller
1462 */
1463 return FALSE;
1464 }
1465#endif
1466 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1467 So code that used to be here is now in PerlIORaw_pushed().
1468 */
1469 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1470 }
1471}
1472
1473int
1474PerlIO__close(pTHX_ PerlIO *f)
1475{
1476 if (PerlIOValid(f)) {
1477 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1478 if (tab && tab->Close)
1479 return (*tab->Close)(aTHX_ f);
1480 else
1481 return PerlIOBase_close(aTHX_ f);
1482 }
1483 else {
1484 SETERRNO(EBADF, SS_IVCHAN);
1485 return -1;
1486 }
1487}
1488
1489int
1490Perl_PerlIO_close(pTHX_ PerlIO *f)
1491{
1492 const int code = PerlIO__close(aTHX_ f);
1493 while (PerlIOValid(f)) {
1494 PerlIO_pop(aTHX_ f);
1495 if (PerlIO_lockcnt(f))
1496 /* we're in use; the 'pop' deferred freeing the structure */
1497 f = PerlIONext(f);
1498 }
1499 return code;
1500}
1501
1502int
1503Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1504{
1505 dVAR;
1506 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1507}
1508
1509
1510static PerlIO_funcs *
1511PerlIO_layer_from_ref(pTHX_ SV *sv)
1512{
1513 dVAR;
1514 /*
1515 * For any scalar type load the handler which is bundled with perl
1516 */
1517 if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
1518 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1519 /* This isn't supposed to happen, since PerlIO::scalar is core,
1520 * but could happen anyway in smaller installs or with PAR */
1521 if (!f)
1522 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1523 return f;
1524 }
1525
1526 /*
1527 * For other types allow if layer is known but don't try and load it
1528 */
1529 switch (SvTYPE(sv)) {
1530 case SVt_PVAV:
1531 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1532 case SVt_PVHV:
1533 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1534 case SVt_PVCV:
1535 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1536 case SVt_PVGV:
1537 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1538 default:
1539 return NULL;
1540 }
1541}
1542
1543PerlIO_list_t *
1544PerlIO_resolve_layers(pTHX_ const char *layers,
1545 const char *mode, int narg, SV **args)
1546{
1547 dVAR;
1548 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1549 int incdef = 1;
1550 if (!PL_perlio)
1551 PerlIO_stdstreams(aTHX);
1552 if (narg) {
1553 SV * const arg = *args;
1554 /*
1555 * If it is a reference but not an object see if we have a handler
1556 * for it
1557 */
1558 if (SvROK(arg) && !sv_isobject(arg)) {
1559 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1560 if (handler) {
1561 def = PerlIO_list_alloc(aTHX);
1562 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1563 incdef = 0;
1564 }
1565 /*
1566 * Don't fail if handler cannot be found :via(...) etc. may do
1567 * something sensible else we will just stringfy and open
1568 * resulting string.
1569 */
1570 }
1571 }
1572 if (!layers || !*layers)
1573 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1574 if (layers && *layers) {
1575 PerlIO_list_t *av;
1576 if (incdef) {
1577 av = PerlIO_clone_list(aTHX_ def, NULL);
1578 }
1579 else {
1580 av = def;
1581 }
1582 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1583 return av;
1584 }
1585 else {
1586 PerlIO_list_free(aTHX_ av);
1587 return NULL;
1588 }
1589 }
1590 else {
1591 if (incdef)
1592 def->refcnt++;
1593 return def;
1594 }
1595}
1596
1597PerlIO *
1598PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1599 int imode, int perm, PerlIO *f, int narg, SV **args)
1600{
1601 dVAR;
1602 if (!f && narg == 1 && *args == &PL_sv_undef) {
1603 if ((f = PerlIO_tmpfile())) {
1604 if (!layers || !*layers)
1605 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1606 if (layers && *layers)
1607 PerlIO_apply_layers(aTHX_ f, mode, layers);
1608 }
1609 }
1610 else {
1611 PerlIO_list_t *layera;
1612 IV n;
1613 PerlIO_funcs *tab = NULL;
1614 if (PerlIOValid(f)) {
1615 /*
1616 * This is "reopen" - it is not tested as perl does not use it
1617 * yet
1618 */
1619 PerlIOl *l = *f;
1620 layera = PerlIO_list_alloc(aTHX);
1621 while (l) {
1622 SV *arg = NULL;
1623 if (l->tab && l->tab->Getarg)
1624 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1625 PerlIO_list_push(aTHX_ layera, l->tab,
1626 (arg) ? arg : &PL_sv_undef);
1627 SvREFCNT_dec(arg);
1628 l = *PerlIONext(&l);
1629 }
1630 }
1631 else {
1632 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1633 if (!layera) {
1634 return NULL;
1635 }
1636 }
1637 /*
1638 * Start at "top" of layer stack
1639 */
1640 n = layera->cur - 1;
1641 while (n >= 0) {
1642 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1643 if (t && t->Open) {
1644 tab = t;
1645 break;
1646 }
1647 n--;
1648 }
1649 if (tab) {
1650 /*
1651 * Found that layer 'n' can do opens - call it
1652 */
1653 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1654 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1655 }
1656 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1657 tab->name, layers ? layers : "(Null)", mode, fd,
1658 imode, perm, (void*)f, narg, (void*)args);
1659 if (tab->Open)
1660 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1661 f, narg, args);
1662 else {
1663 SETERRNO(EINVAL, LIB_INVARG);
1664 f = NULL;
1665 }
1666 if (f) {
1667 if (n + 1 < layera->cur) {
1668 /*
1669 * More layers above the one that we used to open -
1670 * apply them now
1671 */
1672 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1673 /* If pushing layers fails close the file */
1674 PerlIO_close(f);
1675 f = NULL;
1676 }
1677 }
1678 }
1679 }
1680 PerlIO_list_free(aTHX_ layera);
1681 }
1682 return f;
1683}
1684
1685
1686SSize_t
1687Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1688{
1689 PERL_ARGS_ASSERT_PERLIO_READ;
1690
1691 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1692}
1693
1694SSize_t
1695Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1696{
1697 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1698
1699 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1700}
1701
1702SSize_t
1703Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1704{
1705 PERL_ARGS_ASSERT_PERLIO_WRITE;
1706
1707 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1708}
1709
1710int
1711Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1712{
1713 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1714}
1715
1716Off_t
1717Perl_PerlIO_tell(pTHX_ PerlIO *f)
1718{
1719 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1720}
1721
1722int
1723Perl_PerlIO_flush(pTHX_ PerlIO *f)
1724{
1725 dVAR;
1726 if (f) {
1727 if (*f) {
1728 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1729
1730 if (tab && tab->Flush)
1731 return (*tab->Flush) (aTHX_ f);
1732 else
1733 return 0; /* If no Flush defined, silently succeed. */
1734 }
1735 else {
1736 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1737 SETERRNO(EBADF, SS_IVCHAN);
1738 return -1;
1739 }
1740 }
1741 else {
1742 /*
1743 * Is it good API design to do flush-all on NULL, a potentially
1744 * erroneous input? Maybe some magical value (PerlIO*
1745 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1746 * things on fflush(NULL), but should we be bound by their design
1747 * decisions? --jhi
1748 */
1749 PerlIOl **table = &PL_perlio;
1750 PerlIOl *ff;
1751 int code = 0;
1752 while ((ff = *table)) {
1753 int i;
1754 table = (PerlIOl **) (ff++);
1755 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1756 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1757 code = -1;
1758 ff++;
1759 }
1760 }
1761 return code;
1762 }
1763}
1764
1765void
1766PerlIOBase_flush_linebuf(pTHX)
1767{
1768 dVAR;
1769 PerlIOl **table = &PL_perlio;
1770 PerlIOl *f;
1771 while ((f = *table)) {
1772 int i;
1773 table = (PerlIOl **) (f++);
1774 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1775 if (f->next
1776 && (PerlIOBase(&(f->next))->
1777 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1778 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1779 PerlIO_flush(&(f->next));
1780 f++;
1781 }
1782 }
1783}
1784
1785int
1786Perl_PerlIO_fill(pTHX_ PerlIO *f)
1787{
1788 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1789}
1790
1791int
1792PerlIO_isutf8(PerlIO *f)
1793{
1794 if (PerlIOValid(f))
1795 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1796 else
1797 SETERRNO(EBADF, SS_IVCHAN);
1798
1799 return -1;
1800}
1801
1802int
1803Perl_PerlIO_eof(pTHX_ PerlIO *f)
1804{
1805 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1806}
1807
1808int
1809Perl_PerlIO_error(pTHX_ PerlIO *f)
1810{
1811 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1812}
1813
1814void
1815Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1816{
1817 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1818}
1819
1820void
1821Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1822{
1823 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1824}
1825
1826int
1827PerlIO_has_base(PerlIO *f)
1828{
1829 if (PerlIOValid(f)) {
1830 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1831
1832 if (tab)
1833 return (tab->Get_base != NULL);
1834 }
1835
1836 return 0;
1837}
1838
1839int
1840PerlIO_fast_gets(PerlIO *f)
1841{
1842 if (PerlIOValid(f)) {
1843 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1844 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1845
1846 if (tab)
1847 return (tab->Set_ptrcnt != NULL);
1848 }
1849 }
1850
1851 return 0;
1852}
1853
1854int
1855PerlIO_has_cntptr(PerlIO *f)
1856{
1857 if (PerlIOValid(f)) {
1858 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1859
1860 if (tab)
1861 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1862 }
1863
1864 return 0;
1865}
1866
1867int
1868PerlIO_canset_cnt(PerlIO *f)
1869{
1870 if (PerlIOValid(f)) {
1871 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1872
1873 if (tab)
1874 return (tab->Set_ptrcnt != NULL);
1875 }
1876
1877 return 0;
1878}
1879
1880STDCHAR *
1881Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1882{
1883 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1884}
1885
1886int
1887Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1888{
1889 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1890}
1891
1892STDCHAR *
1893Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1894{
1895 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1896}
1897
1898int
1899Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1900{
1901 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1902}
1903
1904void
1905Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1906{
1907 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1908}
1909
1910void
1911Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1912{
1913 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1914}
1915
1916
1917/*--------------------------------------------------------------------------------------*/
1918/*
1919 * utf8 and raw dummy layers
1920 */
1921
1922IV
1923PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1924{
1925 PERL_UNUSED_CONTEXT;
1926 PERL_UNUSED_ARG(mode);
1927 PERL_UNUSED_ARG(arg);
1928 if (PerlIOValid(f)) {
1929 if (tab && tab->kind & PERLIO_K_UTF8)
1930 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1931 else
1932 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1933 return 0;
1934 }
1935 return -1;
1936}
1937
1938PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1939 sizeof(PerlIO_funcs),
1940 "utf8",
1941 0,
1942 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1943 PerlIOUtf8_pushed,
1944 NULL,
1945 PerlIOBase_open,
1946 NULL,
1947 NULL,
1948 NULL,
1949 NULL,
1950 NULL,
1951 NULL,
1952 NULL,
1953 NULL,
1954 NULL,
1955 NULL,
1956 NULL, /* flush */
1957 NULL, /* fill */
1958 NULL,
1959 NULL,
1960 NULL,
1961 NULL,
1962 NULL, /* get_base */
1963 NULL, /* get_bufsiz */
1964 NULL, /* get_ptr */
1965 NULL, /* get_cnt */
1966 NULL, /* set_ptrcnt */
1967};
1968
1969PERLIO_FUNCS_DECL(PerlIO_byte) = {
1970 sizeof(PerlIO_funcs),
1971 "bytes",
1972 0,
1973 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1974 PerlIOUtf8_pushed,
1975 NULL,
1976 PerlIOBase_open,
1977 NULL,
1978 NULL,
1979 NULL,
1980 NULL,
1981 NULL,
1982 NULL,
1983 NULL,
1984 NULL,
1985 NULL,
1986 NULL,
1987 NULL, /* flush */
1988 NULL, /* fill */
1989 NULL,
1990 NULL,
1991 NULL,
1992 NULL,
1993 NULL, /* get_base */
1994 NULL, /* get_bufsiz */
1995 NULL, /* get_ptr */
1996 NULL, /* get_cnt */
1997 NULL, /* set_ptrcnt */
1998};
1999
2000PERLIO_FUNCS_DECL(PerlIO_raw) = {
2001 sizeof(PerlIO_funcs),
2002 "raw",
2003 0,
2004 PERLIO_K_DUMMY,
2005 PerlIORaw_pushed,
2006 PerlIOBase_popped,
2007 PerlIOBase_open,
2008 NULL,
2009 NULL,
2010 NULL,
2011 NULL,
2012 NULL,
2013 NULL,
2014 NULL,
2015 NULL,
2016 NULL,
2017 NULL,
2018 NULL, /* flush */
2019 NULL, /* fill */
2020 NULL,
2021 NULL,
2022 NULL,
2023 NULL,
2024 NULL, /* get_base */
2025 NULL, /* get_bufsiz */
2026 NULL, /* get_ptr */
2027 NULL, /* get_cnt */
2028 NULL, /* set_ptrcnt */
2029};
2030/*--------------------------------------------------------------------------------------*/
2031/*--------------------------------------------------------------------------------------*/
2032/*
2033 * "Methods" of the "base class"
2034 */
2035
2036IV
2037PerlIOBase_fileno(pTHX_ PerlIO *f)
2038{
2039 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
2040}
2041
2042char *
2043PerlIO_modestr(PerlIO * f, char *buf)
2044{
2045 char *s = buf;
2046 if (PerlIOValid(f)) {
2047 const IV flags = PerlIOBase(f)->flags;
2048 if (flags & PERLIO_F_APPEND) {
2049 *s++ = 'a';
2050 if (flags & PERLIO_F_CANREAD) {
2051 *s++ = '+';
2052 }
2053 }
2054 else if (flags & PERLIO_F_CANREAD) {
2055 *s++ = 'r';
2056 if (flags & PERLIO_F_CANWRITE)
2057 *s++ = '+';
2058 }
2059 else if (flags & PERLIO_F_CANWRITE) {
2060 *s++ = 'w';
2061 if (flags & PERLIO_F_CANREAD) {
2062 *s++ = '+';
2063 }
2064 }
2065#ifdef PERLIO_USING_CRLF
2066 if (!(flags & PERLIO_F_CRLF))
2067 *s++ = 'b';
2068#endif
2069 }
2070 *s = '\0';
2071 return buf;
2072}
2073
2074
2075IV
2076PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2077{
2078 PerlIOl * const l = PerlIOBase(f);
2079 PERL_UNUSED_CONTEXT;
2080 PERL_UNUSED_ARG(arg);
2081
2082 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2083 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2084 if (tab && tab->Set_ptrcnt != NULL)
2085 l->flags |= PERLIO_F_FASTGETS;
2086 if (mode) {
2087 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2088 mode++;
2089 switch (*mode++) {
2090 case 'r':
2091 l->flags |= PERLIO_F_CANREAD;
2092 break;
2093 case 'a':
2094 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2095 break;
2096 case 'w':
2097 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2098 break;
2099 default:
2100 SETERRNO(EINVAL, LIB_INVARG);
2101 return -1;
2102 }
2103 while (*mode) {
2104 switch (*mode++) {
2105 case '+':
2106 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2107 break;
2108 case 'b':
2109 l->flags &= ~PERLIO_F_CRLF;
2110 break;
2111 case 't':
2112 l->flags |= PERLIO_F_CRLF;
2113 break;
2114 default:
2115 SETERRNO(EINVAL, LIB_INVARG);
2116 return -1;
2117 }
2118 }
2119 }
2120 else {
2121 if (l->next) {
2122 l->flags |= l->next->flags &
2123 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2124 PERLIO_F_APPEND);
2125 }
2126 }
2127#if 0
2128 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2129 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2130 l->flags, PerlIO_modestr(f, temp));
2131#endif
2132 return 0;
2133}
2134
2135IV
2136PerlIOBase_popped(pTHX_ PerlIO *f)
2137{
2138 PERL_UNUSED_CONTEXT;
2139 PERL_UNUSED_ARG(f);
2140 return 0;
2141}
2142
2143SSize_t
2144PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2145{
2146 /*
2147 * Save the position as current head considers it
2148 */
2149 const Off_t old = PerlIO_tell(f);
2150 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2151 PerlIOSelf(f, PerlIOBuf)->posn = old;
2152 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2153}
2154
2155SSize_t
2156PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2157{
2158 STDCHAR *buf = (STDCHAR *) vbuf;
2159 if (f) {
2160 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2161 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2162 SETERRNO(EBADF, SS_IVCHAN);
2163 return 0;
2164 }
2165 while (count > 0) {
2166 get_cnt:
2167 {
2168 SSize_t avail = PerlIO_get_cnt(f);
2169 SSize_t take = 0;
2170 if (avail > 0)
2171 take = ((SSize_t)count < avail) ? (SSize_t)count : avail;
2172 if (take > 0) {
2173 STDCHAR *ptr = PerlIO_get_ptr(f);
2174 Copy(ptr, buf, take, STDCHAR);
2175 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2176 count -= take;
2177 buf += take;
2178 if (avail == 0) /* set_ptrcnt could have reset avail */
2179 goto get_cnt;
2180 }
2181 if (count > 0 && avail <= 0) {
2182 if (PerlIO_fill(f) != 0)
2183 break;
2184 }
2185 }
2186 }
2187 return (buf - (STDCHAR *) vbuf);
2188 }
2189 return 0;
2190}
2191
2192IV
2193PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2194{
2195 PERL_UNUSED_CONTEXT;
2196 PERL_UNUSED_ARG(f);
2197 return 0;
2198}
2199
2200IV
2201PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2202{
2203 PERL_UNUSED_CONTEXT;
2204 PERL_UNUSED_ARG(f);
2205 return -1;
2206}
2207
2208IV
2209PerlIOBase_close(pTHX_ PerlIO *f)
2210{
2211 IV code = -1;
2212 if (PerlIOValid(f)) {
2213 PerlIO *n = PerlIONext(f);
2214 code = PerlIO_flush(f);
2215 PerlIOBase(f)->flags &=
2216 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2217 while (PerlIOValid(n)) {
2218 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2219 if (tab && tab->Close) {
2220 if ((*tab->Close)(aTHX_ n) != 0)
2221 code = -1;
2222 break;
2223 }
2224 else {
2225 PerlIOBase(n)->flags &=
2226 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2227 }
2228 n = PerlIONext(n);
2229 }
2230 }
2231 else {
2232 SETERRNO(EBADF, SS_IVCHAN);
2233 }
2234 return code;
2235}
2236
2237IV
2238PerlIOBase_eof(pTHX_ PerlIO *f)
2239{
2240 PERL_UNUSED_CONTEXT;
2241 if (PerlIOValid(f)) {
2242 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2243 }
2244 return 1;
2245}
2246
2247IV
2248PerlIOBase_error(pTHX_ PerlIO *f)
2249{
2250 PERL_UNUSED_CONTEXT;
2251 if (PerlIOValid(f)) {
2252 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2253 }
2254 return 1;
2255}
2256
2257void
2258PerlIOBase_clearerr(pTHX_ PerlIO *f)
2259{
2260 if (PerlIOValid(f)) {
2261 PerlIO * const n = PerlIONext(f);
2262 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2263 if (PerlIOValid(n))
2264 PerlIO_clearerr(n);
2265 }
2266}
2267
2268void
2269PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2270{
2271 PERL_UNUSED_CONTEXT;
2272 if (PerlIOValid(f)) {
2273 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2274 }
2275}
2276
2277SV *
2278PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2279{
2280 if (!arg)
2281 return NULL;
2282#ifdef sv_dup
2283 if (param) {
2284 arg = sv_dup(arg, param);
2285 SvREFCNT_inc_simple_void_NN(arg);
2286 return arg;
2287 }
2288 else {
2289 return newSVsv(arg);
2290 }
2291#else
2292 PERL_UNUSED_ARG(param);
2293 return newSVsv(arg);
2294#endif
2295}
2296
2297PerlIO *
2298PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2299{
2300 PerlIO * const nexto = PerlIONext(o);
2301 if (PerlIOValid(nexto)) {
2302 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2303 if (tab && tab->Dup)
2304 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2305 else
2306 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2307 }
2308 if (f) {
2309 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2310 SV *arg = NULL;
2311 char buf[8];
2312 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2313 self ? self->name : "(Null)",
2314 (void*)f, (void*)o, (void*)param);
2315 if (self && self->Getarg)
2316 arg = (*self->Getarg)(aTHX_ o, param, flags);
2317 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2318 if (PerlIOBase(o)->flags & PERLIO_F_UTF8)
2319 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2320 SvREFCNT_dec(arg);
2321 }
2322 return f;
2323}
2324
2325/* PL_perlio_fd_refcnt[] is in intrpvar.h */
2326
2327/* Must be called with PL_perlio_mutex locked. */
2328static void
2329S_more_refcounted_fds(pTHX_ const int new_fd) {
2330 dVAR;
2331 const int old_max = PL_perlio_fd_refcnt_size;
2332 const int new_max = 16 + (new_fd & ~15);
2333 int *new_array;
2334
2335 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2336 old_max, new_fd, new_max);
2337
2338 if (new_fd < old_max) {
2339 return;
2340 }
2341
2342 assert (new_max > new_fd);
2343
2344 /* Use plain realloc() since we need this memory to be really
2345 * global and visible to all the interpreters and/or threads. */
2346 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2347
2348 if (!new_array) {
2349#ifdef USE_ITHREADS
2350 MUTEX_UNLOCK(&PL_perlio_mutex);
2351#endif
2352 /* Can't use PerlIO to write as it allocates memory */
2353 PerlLIO_write(PerlIO_fileno(Perl_error_log),
2354 PL_no_mem, strlen(PL_no_mem));
2355 my_exit(1);
2356 }
2357
2358 PL_perlio_fd_refcnt_size = new_max;
2359 PL_perlio_fd_refcnt = new_array;
2360
2361 PerlIO_debug("Zeroing %p, %d\n",
2362 (void*)(new_array + old_max),
2363 new_max - old_max);
2364
2365 Zero(new_array + old_max, new_max - old_max, int);
2366}
2367
2368
2369void
2370PerlIO_init(pTHX)
2371{
2372 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2373 PERL_UNUSED_CONTEXT;
2374}
2375
2376void
2377PerlIOUnix_refcnt_inc(int fd)
2378{
2379 dTHX;
2380 if (fd >= 0) {
2381 dVAR;
2382
2383#ifdef USE_ITHREADS
2384 MUTEX_LOCK(&PL_perlio_mutex);
2385#endif
2386 if (fd >= PL_perlio_fd_refcnt_size)
2387 S_more_refcounted_fds(aTHX_ fd);
2388
2389 PL_perlio_fd_refcnt[fd]++;
2390 if (PL_perlio_fd_refcnt[fd] <= 0) {
2391 /* diag_listed_as: refcnt_inc: fd %d%s */
2392 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2393 fd, PL_perlio_fd_refcnt[fd]);
2394 }
2395 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2396 fd, PL_perlio_fd_refcnt[fd]);
2397
2398#ifdef USE_ITHREADS
2399 MUTEX_UNLOCK(&PL_perlio_mutex);
2400#endif
2401 } else {
2402 /* diag_listed_as: refcnt_inc: fd %d%s */
2403 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2404 }
2405}
2406
2407int
2408PerlIOUnix_refcnt_dec(int fd)
2409{
2410 dTHX;
2411 int cnt = 0;
2412 if (fd >= 0) {
2413 dVAR;
2414#ifdef USE_ITHREADS
2415 MUTEX_LOCK(&PL_perlio_mutex);
2416#endif
2417 if (fd >= PL_perlio_fd_refcnt_size) {
2418 /* diag_listed_as: refcnt_dec: fd %d%s */
2419 Perl_croak(aTHX_ "refcnt_dec: fd %d >= refcnt_size %d\n",
2420 fd, PL_perlio_fd_refcnt_size);
2421 }
2422 if (PL_perlio_fd_refcnt[fd] <= 0) {
2423 /* diag_listed_as: refcnt_dec: fd %d%s */
2424 Perl_croak(aTHX_ "refcnt_dec: fd %d: %d <= 0\n",
2425 fd, PL_perlio_fd_refcnt[fd]);
2426 }
2427 cnt = --PL_perlio_fd_refcnt[fd];
2428 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2429#ifdef USE_ITHREADS
2430 MUTEX_UNLOCK(&PL_perlio_mutex);
2431#endif
2432 } else {
2433 /* diag_listed_as: refcnt_dec: fd %d%s */
2434 Perl_croak(aTHX_ "refcnt_dec: fd %d < 0\n", fd);
2435 }
2436 return cnt;
2437}
2438
2439int
2440PerlIOUnix_refcnt(int fd)
2441{
2442 dTHX;
2443 int cnt = 0;
2444 if (fd >= 0) {
2445 dVAR;
2446#ifdef USE_ITHREADS
2447 MUTEX_LOCK(&PL_perlio_mutex);
2448#endif
2449 if (fd >= PL_perlio_fd_refcnt_size) {
2450 /* diag_listed_as: refcnt: fd %d%s */
2451 Perl_croak(aTHX_ "refcnt: fd %d >= refcnt_size %d\n",
2452 fd, PL_perlio_fd_refcnt_size);
2453 }
2454 if (PL_perlio_fd_refcnt[fd] <= 0) {
2455 /* diag_listed_as: refcnt: fd %d%s */
2456 Perl_croak(aTHX_ "refcnt: fd %d: %d <= 0\n",
2457 fd, PL_perlio_fd_refcnt[fd]);
2458 }
2459 cnt = PL_perlio_fd_refcnt[fd];
2460#ifdef USE_ITHREADS
2461 MUTEX_UNLOCK(&PL_perlio_mutex);
2462#endif
2463 } else {
2464 /* diag_listed_as: refcnt: fd %d%s */
2465 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2466 }
2467 return cnt;
2468}
2469
2470void
2471PerlIO_cleanup(pTHX)
2472{
2473 dVAR;
2474 int i;
2475#ifdef USE_ITHREADS
2476 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2477#else
2478 PerlIO_debug("Cleanup layers\n");
2479#endif
2480
2481 /* Raise STDIN..STDERR refcount so we don't close them */
2482 for (i=0; i < 3; i++)
2483 PerlIOUnix_refcnt_inc(i);
2484 PerlIO_cleantable(aTHX_ &PL_perlio);
2485 /* Restore STDIN..STDERR refcount */
2486 for (i=0; i < 3; i++)
2487 PerlIOUnix_refcnt_dec(i);
2488
2489 if (PL_known_layers) {
2490 PerlIO_list_free(aTHX_ PL_known_layers);
2491 PL_known_layers = NULL;
2492 }
2493 if (PL_def_layerlist) {
2494 PerlIO_list_free(aTHX_ PL_def_layerlist);
2495 PL_def_layerlist = NULL;
2496 }
2497}
2498
2499void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2500{
2501 dVAR;
2502#if 0
2503/* XXX we can't rely on an interpreter being present at this late stage,
2504 XXX so we can't use a function like PerlLIO_write that relies on one
2505 being present (at least in win32) :-(.
2506 Disable for now.
2507*/
2508#ifdef DEBUGGING
2509 {
2510 /* By now all filehandles should have been closed, so any
2511 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2512 * errors. */
2513#define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2514#define PERLIO_TEARDOWN_MESSAGE_FD 2
2515 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2516 int i;
2517 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2518 if (PL_perlio_fd_refcnt[i]) {
2519 const STRLEN len =
2520 my_snprintf(buf, sizeof(buf),
2521 "PerlIO_teardown: fd %d refcnt=%d\n",
2522 i, PL_perlio_fd_refcnt[i]);
2523 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2524 }
2525 }
2526 }
2527#endif
2528#endif
2529 /* Not bothering with PL_perlio_mutex since by now
2530 * all the interpreters are gone. */
2531 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2532 && PL_perlio_fd_refcnt) {
2533 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2534 PL_perlio_fd_refcnt = NULL;
2535 PL_perlio_fd_refcnt_size = 0;
2536 }
2537}
2538
2539/*--------------------------------------------------------------------------------------*/
2540/*
2541 * Bottom-most level for UNIX-like case
2542 */
2543
2544typedef struct {
2545 struct _PerlIO base; /* The generic part */
2546 int fd; /* UNIX like file descriptor */
2547 int oflags; /* open/fcntl flags */
2548} PerlIOUnix;
2549
2550static void
2551S_lockcnt_dec(pTHX_ const void* f)
2552{
2553 PerlIO_lockcnt((PerlIO*)f)--;
2554}
2555
2556
2557/* call the signal handler, and if that handler happens to clear
2558 * this handle, free what we can and return true */
2559
2560static bool
2561S_perlio_async_run(pTHX_ PerlIO* f) {
2562 ENTER;
2563 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2564 PerlIO_lockcnt(f)++;
2565 PERL_ASYNC_CHECK();
2566 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) )
2567 return 0;
2568 /* we've just run some perl-level code that could have done
2569 * anything, including closing the file or clearing this layer.
2570 * If so, free any lower layers that have already been
2571 * cleared, then return an error. */
2572 while (PerlIOValid(f) &&
2573 (PerlIOBase(f)->flags & PERLIO_F_CLEARED))
2574 {
2575 const PerlIOl *l = *f;
2576 *f = l->next;
2577 Safefree(l);
2578 }
2579 return 1;
2580}
2581
2582int
2583PerlIOUnix_oflags(const char *mode)
2584{
2585 int oflags = -1;
2586 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2587 mode++;
2588 switch (*mode) {
2589 case 'r':
2590 oflags = O_RDONLY;
2591 if (*++mode == '+') {
2592 oflags = O_RDWR;
2593 mode++;
2594 }
2595 break;
2596
2597 case 'w':
2598 oflags = O_CREAT | O_TRUNC;
2599 if (*++mode == '+') {
2600 oflags |= O_RDWR;
2601 mode++;
2602 }
2603 else
2604 oflags |= O_WRONLY;
2605 break;
2606
2607 case 'a':
2608 oflags = O_CREAT | O_APPEND;
2609 if (*++mode == '+') {
2610 oflags |= O_RDWR;
2611 mode++;
2612 }
2613 else
2614 oflags |= O_WRONLY;
2615 break;
2616 }
2617 if (*mode == 'b') {
2618 oflags |= O_BINARY;
2619 oflags &= ~O_TEXT;
2620 mode++;
2621 }
2622 else if (*mode == 't') {
2623 oflags |= O_TEXT;
2624 oflags &= ~O_BINARY;
2625 mode++;
2626 }
2627 /*
2628 * Always open in binary mode
2629 */
2630 oflags |= O_BINARY;
2631 if (*mode || oflags == -1) {
2632 SETERRNO(EINVAL, LIB_INVARG);
2633 oflags = -1;
2634 }
2635 return oflags;
2636}
2637
2638IV
2639PerlIOUnix_fileno(pTHX_ PerlIO *f)
2640{
2641 PERL_UNUSED_CONTEXT;
2642 return PerlIOSelf(f, PerlIOUnix)->fd;
2643}
2644
2645static void
2646PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2647{
2648 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2649#if defined(WIN32)
2650 Stat_t st;
2651 if (PerlLIO_fstat(fd, &st) == 0) {
2652 if (!S_ISREG(st.st_mode)) {
2653 PerlIO_debug("%d is not regular file\n",fd);
2654 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2655 }
2656 else {
2657 PerlIO_debug("%d _is_ a regular file\n",fd);
2658 }
2659 }
2660#endif
2661 s->fd = fd;
2662 s->oflags = imode;
2663 PerlIOUnix_refcnt_inc(fd);
2664 PERL_UNUSED_CONTEXT;
2665}
2666
2667IV
2668PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2669{
2670 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2671 if (*PerlIONext(f)) {
2672 /* We never call down so do any pending stuff now */
2673 PerlIO_flush(PerlIONext(f));
2674 /*
2675 * XXX could (or should) we retrieve the oflags from the open file
2676 * handle rather than believing the "mode" we are passed in? XXX
2677 * Should the value on NULL mode be 0 or -1?
2678 */
2679 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2680 mode ? PerlIOUnix_oflags(mode) : -1);
2681 }
2682 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2683
2684 return code;
2685}
2686
2687IV
2688PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2689{
2690 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2691 Off_t new_loc;
2692 PERL_UNUSED_CONTEXT;
2693 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2694#ifdef ESPIPE
2695 SETERRNO(ESPIPE, LIB_INVARG);
2696#else
2697 SETERRNO(EINVAL, LIB_INVARG);
2698#endif
2699 return -1;
2700 }
2701 new_loc = PerlLIO_lseek(fd, offset, whence);
2702 if (new_loc == (Off_t) - 1)
2703 return -1;
2704 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2705 return 0;
2706}
2707
2708PerlIO *
2709PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2710 IV n, const char *mode, int fd, int imode,
2711 int perm, PerlIO *f, int narg, SV **args)
2712{
2713 if (PerlIOValid(f)) {
2714 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2715 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2716 }
2717 if (narg > 0) {
2718 if (*mode == IoTYPE_NUMERIC)
2719 mode++;
2720 else {
2721 imode = PerlIOUnix_oflags(mode);
2722#ifdef VMS
2723 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2724#else
2725 perm = 0666;
2726#endif
2727 }
2728 if (imode != -1) {
2729 const char *path = SvPV_nolen_const(*args);
2730 fd = PerlLIO_open3(path, imode, perm);
2731 }
2732 }
2733 if (fd >= 0) {
2734 if (*mode == IoTYPE_IMPLICIT)
2735 mode++;
2736 if (!f) {
2737 f = PerlIO_allocate(aTHX);
2738 }
2739 if (!PerlIOValid(f)) {
2740 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2741 return NULL;
2742 }
2743 }
2744 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2745 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2746 if (*mode == IoTYPE_APPEND)
2747 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2748 return f;
2749 }
2750 else {
2751 if (f) {
2752 NOOP;
2753 /*
2754 * FIXME: pop layers ???
2755 */
2756 }
2757 return NULL;
2758 }
2759}
2760
2761PerlIO *
2762PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2763{
2764 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2765 int fd = os->fd;
2766 if (flags & PERLIO_DUP_FD) {
2767 fd = PerlLIO_dup(fd);
2768 }
2769 if (fd >= 0) {
2770 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2771 if (f) {
2772 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2773 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2774 return f;
2775 }
2776 }
2777 return NULL;
2778}
2779
2780
2781SSize_t
2782PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2783{
2784 dVAR;
2785 int fd;
2786 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2787 return -1;
2788 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2789#ifdef PERLIO_STD_SPECIAL
2790 if (fd == 0)
2791 return PERLIO_STD_IN(fd, vbuf, count);
2792#endif
2793 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2794 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2795 return 0;
2796 }
2797 while (1) {
2798 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2799 if (len >= 0 || errno != EINTR) {
2800 if (len < 0) {
2801 if (errno != EAGAIN) {
2802 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2803 }
2804 }
2805 else if (len == 0 && count != 0) {
2806 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2807 SETERRNO(0,0);
2808 }
2809 return len;
2810 }
2811 /* EINTR */
2812 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2813 return -1;
2814 }
2815 /*NOTREACHED*/
2816}
2817
2818SSize_t
2819PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2820{
2821 dVAR;
2822 int fd;
2823 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2824 return -1;
2825 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2826#ifdef PERLIO_STD_SPECIAL
2827 if (fd == 1 || fd == 2)
2828 return PERLIO_STD_OUT(fd, vbuf, count);
2829#endif
2830 while (1) {
2831 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2832 if (len >= 0 || errno != EINTR) {
2833 if (len < 0) {
2834 if (errno != EAGAIN) {
2835 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2836 }
2837 }
2838 return len;
2839 }
2840 /* EINTR */
2841 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2842 return -1;
2843 }
2844 /*NOTREACHED*/
2845}
2846
2847Off_t
2848PerlIOUnix_tell(pTHX_ PerlIO *f)
2849{
2850 PERL_UNUSED_CONTEXT;
2851
2852 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2853}
2854
2855
2856IV
2857PerlIOUnix_close(pTHX_ PerlIO *f)
2858{
2859 dVAR;
2860 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2861 int code = 0;
2862 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2863 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2864 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2865 return 0;
2866 }
2867 }
2868 else {
2869 SETERRNO(EBADF,SS_IVCHAN);
2870 return -1;
2871 }
2872 while (PerlLIO_close(fd) != 0) {
2873 if (errno != EINTR) {
2874 code = -1;
2875 break;
2876 }
2877 /* EINTR */
2878 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2879 return -1;
2880 }
2881 if (code == 0) {
2882 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2883 }
2884 return code;
2885}
2886
2887PERLIO_FUNCS_DECL(PerlIO_unix) = {
2888 sizeof(PerlIO_funcs),
2889 "unix",
2890 sizeof(PerlIOUnix),
2891 PERLIO_K_RAW,
2892 PerlIOUnix_pushed,
2893 PerlIOBase_popped,
2894 PerlIOUnix_open,
2895 PerlIOBase_binmode, /* binmode */
2896 NULL,
2897 PerlIOUnix_fileno,
2898 PerlIOUnix_dup,
2899 PerlIOUnix_read,
2900 PerlIOBase_unread,
2901 PerlIOUnix_write,
2902 PerlIOUnix_seek,
2903 PerlIOUnix_tell,
2904 PerlIOUnix_close,
2905 PerlIOBase_noop_ok, /* flush */
2906 PerlIOBase_noop_fail, /* fill */
2907 PerlIOBase_eof,
2908 PerlIOBase_error,
2909 PerlIOBase_clearerr,
2910 PerlIOBase_setlinebuf,
2911 NULL, /* get_base */
2912 NULL, /* get_bufsiz */
2913 NULL, /* get_ptr */
2914 NULL, /* get_cnt */
2915 NULL, /* set_ptrcnt */
2916};
2917
2918/*--------------------------------------------------------------------------------------*/
2919/*
2920 * stdio as a layer
2921 */
2922
2923#if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2924/* perl5.8 - This ensures the last minute VMS ungetc fix is not
2925 broken by the last second glibc 2.3 fix
2926 */
2927#define STDIO_BUFFER_WRITABLE
2928#endif
2929
2930
2931typedef struct {
2932 struct _PerlIO base;
2933 FILE *stdio; /* The stream */
2934} PerlIOStdio;
2935
2936IV
2937PerlIOStdio_fileno(pTHX_ PerlIO *f)
2938{
2939 PERL_UNUSED_CONTEXT;
2940
2941 if (PerlIOValid(f)) {
2942 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2943 if (s)
2944 return PerlSIO_fileno(s);
2945 }
2946 errno = EBADF;
2947 return -1;
2948}
2949
2950char *
2951PerlIOStdio_mode(const char *mode, char *tmode)
2952{
2953 char * const ret = tmode;
2954 if (mode) {
2955 while (*mode) {
2956 *tmode++ = *mode++;
2957 }
2958 }
2959#if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2960 *tmode++ = 'b';
2961#endif
2962 *tmode = '\0';
2963 return ret;
2964}
2965
2966IV
2967PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2968{
2969 PerlIO *n;
2970 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2971 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2972 if (toptab == tab) {
2973 /* Top is already stdio - pop self (duplicate) and use original */
2974 PerlIO_pop(aTHX_ f);
2975 return 0;
2976 } else {
2977 const int fd = PerlIO_fileno(n);
2978 char tmode[8];
2979 FILE *stdio;
2980 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2981 mode = PerlIOStdio_mode(mode, tmode)))) {
2982 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2983 /* We never call down so do any pending stuff now */
2984 PerlIO_flush(PerlIONext(f));
2985 }
2986 else {
2987 return -1;
2988 }
2989 }
2990 }
2991 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2992}
2993
2994
2995PerlIO *
2996PerlIO_importFILE(FILE *stdio, const char *mode)
2997{
2998 dTHX;
2999 PerlIO *f = NULL;
3000 if (stdio) {
3001 PerlIOStdio *s;
3002 if (!mode || !*mode) {
3003 /* We need to probe to see how we can open the stream
3004 so start with read/write and then try write and read
3005 we dup() so that we can fclose without loosing the fd.
3006
3007 Note that the errno value set by a failing fdopen
3008 varies between stdio implementations.
3009 */
3010 const int fd = PerlLIO_dup(fileno(stdio));
3011 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
3012 if (!f2) {
3013 f2 = PerlSIO_fdopen(fd, (mode = "w"));
3014 }
3015 if (!f2) {
3016 f2 = PerlSIO_fdopen(fd, (mode = "r"));
3017 }
3018 if (!f2) {
3019 /* Don't seem to be able to open */
3020 PerlLIO_close(fd);
3021 return f;
3022 }
3023 fclose(f2);
3024 }
3025 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
3026 s = PerlIOSelf(f, PerlIOStdio);
3027 s->stdio = stdio;
3028 PerlIOUnix_refcnt_inc(fileno(stdio));
3029 }
3030 }
3031 return f;
3032}
3033
3034PerlIO *
3035PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3036 IV n, const char *mode, int fd, int imode,
3037 int perm, PerlIO *f, int narg, SV **args)
3038{
3039 char tmode[8];
3040 if (PerlIOValid(f)) {
3041 const char * const path = SvPV_nolen_const(*args);
3042 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3043 FILE *stdio;
3044 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3045 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
3046 s->stdio);
3047 if (!s->stdio)
3048 return NULL;
3049 s->stdio = stdio;
3050 PerlIOUnix_refcnt_inc(fileno(s->stdio));
3051 return f;
3052 }
3053 else {
3054 if (narg > 0) {
3055 const char * const path = SvPV_nolen_const(*args);
3056 if (*mode == IoTYPE_NUMERIC) {
3057 mode++;
3058 fd = PerlLIO_open3(path, imode, perm);
3059 }
3060 else {
3061 FILE *stdio;
3062 bool appended = FALSE;
3063#ifdef __CYGWIN__
3064 /* Cygwin wants its 'b' early. */
3065 appended = TRUE;
3066 mode = PerlIOStdio_mode(mode, tmode);
3067#endif
3068 stdio = PerlSIO_fopen(path, mode);
3069 if (stdio) {
3070 if (!f) {
3071 f = PerlIO_allocate(aTHX);
3072 }
3073 if (!appended)
3074 mode = PerlIOStdio_mode(mode, tmode);
3075 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3076 if (f) {
3077 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3078 PerlIOUnix_refcnt_inc(fileno(stdio));
3079 } else {
3080 PerlSIO_fclose(stdio);
3081 }
3082 return f;
3083 }
3084 else {
3085 return NULL;
3086 }
3087 }
3088 }
3089 if (fd >= 0) {
3090 FILE *stdio = NULL;
3091 int init = 0;
3092 if (*mode == IoTYPE_IMPLICIT) {
3093 init = 1;
3094 mode++;
3095 }
3096 if (init) {
3097 switch (fd) {
3098 case 0:
3099 stdio = PerlSIO_stdin;
3100 break;
3101 case 1:
3102 stdio = PerlSIO_stdout;
3103 break;
3104 case 2:
3105 stdio = PerlSIO_stderr;
3106 break;
3107 }
3108 }
3109 else {
3110 stdio = PerlSIO_fdopen(fd, mode =
3111 PerlIOStdio_mode(mode, tmode));
3112 }
3113 if (stdio) {
3114 if (!f) {
3115 f = PerlIO_allocate(aTHX);
3116 }
3117 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3118 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3119 PerlIOUnix_refcnt_inc(fileno(stdio));
3120 }
3121 return f;
3122 }
3123 }
3124 }
3125 return NULL;
3126}
3127
3128PerlIO *
3129PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3130{
3131 /* This assumes no layers underneath - which is what
3132 happens, but is not how I remember it. NI-S 2001/10/16
3133 */
3134 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3135 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3136 const int fd = fileno(stdio);
3137 char mode[8];
3138 if (flags & PERLIO_DUP_FD) {
3139 const int dfd = PerlLIO_dup(fileno(stdio));
3140 if (dfd >= 0) {
3141 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3142 goto set_this;
3143 }
3144 else {
3145 NOOP;
3146 /* FIXME: To avoid messy error recovery if dup fails
3147 re-use the existing stdio as though flag was not set
3148 */
3149 }
3150 }
3151 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3152 set_this:
3153 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3154 if(stdio) {
3155 PerlIOUnix_refcnt_inc(fileno(stdio));
3156 }
3157 }
3158 return f;
3159}
3160
3161static int
3162PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3163{
3164 PERL_UNUSED_CONTEXT;
3165
3166 /* XXX this could use PerlIO_canset_fileno() and
3167 * PerlIO_set_fileno() support from Configure
3168 */
3169# if defined(__UCLIBC__)
3170 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3171 f->__filedes = -1;
3172 return 1;
3173# elif defined(__GLIBC__)
3174 /* There may be a better way for GLIBC:
3175 - libio.h defines a flag to not close() on cleanup
3176 */
3177 f->_fileno = -1;
3178 return 1;
3179# elif defined(__sun__)
3180 PERL_UNUSED_ARG(f);
3181 return 0;
3182# elif defined(__hpux)
3183 f->__fileH = 0xff;
3184 f->__fileL = 0xff;
3185 return 1;
3186 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3187 your platform does not have special entry try this one.
3188 [For OSF only have confirmation for Tru64 (alpha)
3189 but assume other OSFs will be similar.]
3190 */
3191# elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3192 f->_file = -1;
3193 return 1;
3194# elif defined(__FreeBSD__)
3195 /* There may be a better way on FreeBSD:
3196 - we could insert a dummy func in the _close function entry
3197 f->_close = (int (*)(void *)) dummy_close;
3198 */
3199 f->_file = -1;
3200 return 1;
3201# elif defined(__OpenBSD__)
3202 /* There may be a better way on OpenBSD:
3203 - we could insert a dummy func in the _close function entry
3204 f->_close = (int (*)(void *)) dummy_close;
3205 */
3206 f->_file = -1;
3207 return 1;
3208# elif defined(__EMX__)
3209 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3210 f->_handle = -1;
3211 return 1;
3212# elif defined(__CYGWIN__)
3213 /* There may be a better way on CYGWIN:
3214 - we could insert a dummy func in the _close function entry
3215 f->_close = (int (*)(void *)) dummy_close;
3216 */
3217 f->_file = -1;
3218 return 1;
3219# elif defined(WIN32)
3220# if defined(UNDER_CE)
3221 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3222 structure at all
3223 */
3224# else
3225 f->_file = -1;
3226# endif
3227 return 1;
3228# else
3229#if 0
3230 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3231 (which isn't thread safe) instead
3232 */
3233# error "Don't know how to set FILE.fileno on your platform"
3234#endif
3235 PERL_UNUSED_ARG(f);
3236 return 0;
3237# endif
3238}
3239
3240IV
3241PerlIOStdio_close(pTHX_ PerlIO *f)
3242{
3243 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3244 if (!stdio) {
3245 errno = EBADF;
3246 return -1;
3247 }
3248 else {
3249 const int fd = fileno(stdio);
3250 int invalidate = 0;
3251 IV result = 0;
3252 int dupfd = -1;
3253 dSAVEDERRNO;
3254#ifdef USE_ITHREADS
3255 dVAR;
3256#endif
3257#ifdef SOCKS5_VERSION_NAME
3258 /* Socks lib overrides close() but stdio isn't linked to
3259 that library (though we are) - so we must call close()
3260 on sockets on stdio's behalf.
3261 */
3262 int optval;
3263 Sock_size_t optlen = sizeof(int);
3264 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3265 invalidate = 1;
3266#endif
3267 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3268 that a subsequent fileno() on it returns -1. Don't want to croak()
3269 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3270 trying to close an already closed handle which somehow it still has
3271 a reference to. (via.xs, I'm looking at you). */
3272 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3273 /* File descriptor still in use */
3274 invalidate = 1;
3275 }
3276 if (invalidate) {
3277 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3278 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3279 return 0;
3280 if (stdio == stdout || stdio == stderr)
3281 return PerlIO_flush(f);
3282 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3283 Use Sarathy's trick from maint-5.6 to invalidate the
3284 fileno slot of the FILE *
3285 */
3286 result = PerlIO_flush(f);
3287 SAVE_ERRNO;
3288 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3289 if (!invalidate) {
3290#ifdef USE_ITHREADS
3291 MUTEX_LOCK(&PL_perlio_mutex);
3292 /* Right. We need a mutex here because for a brief while we
3293 will have the situation that fd is actually closed. Hence if
3294 a second thread were to get into this block, its dup() would
3295 likely return our fd as its dupfd. (after all, it is closed)
3296 Then if we get to the dup2() first, we blat the fd back
3297 (messing up its temporary as a side effect) only for it to
3298 then close its dupfd (== our fd) in its close(dupfd) */
3299
3300 /* There is, of course, a race condition, that any other thread
3301 trying to input/output/whatever on this fd will be stuffed
3302 for the duration of this little manoeuvrer. Perhaps we
3303 should hold an IO mutex for the duration of every IO
3304 operation if we know that invalidate doesn't work on this
3305 platform, but that would suck, and could kill performance.
3306
3307 Except that correctness trumps speed.
3308 Advice from klortho #11912. */
3309#endif
3310 dupfd = PerlLIO_dup(fd);
3311#ifdef USE_ITHREADS
3312 if (dupfd < 0) {
3313 MUTEX_UNLOCK(&PL_perlio_mutex);
3314 /* Oh cXap. This isn't going to go well. Not sure if we can
3315 recover from here, or if closing this particular FILE *
3316 is a good idea now. */
3317 }
3318#endif
3319 }
3320 } else {
3321 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3322 }
3323 result = PerlSIO_fclose(stdio);
3324 /* We treat error from stdio as success if we invalidated
3325 errno may NOT be expected EBADF
3326 */
3327 if (invalidate && result != 0) {
3328 RESTORE_ERRNO;
3329 result = 0;
3330 }
3331#ifdef SOCKS5_VERSION_NAME
3332 /* in SOCKS' case, let close() determine return value */
3333 result = close(fd);
3334#endif
3335 if (dupfd >= 0) {
3336 PerlLIO_dup2(dupfd,fd);
3337 PerlLIO_close(dupfd);
3338#ifdef USE_ITHREADS
3339 MUTEX_UNLOCK(&PL_perlio_mutex);
3340#endif
3341 }
3342 return result;
3343 }
3344}
3345
3346SSize_t
3347PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3348{
3349 dVAR;
3350 FILE * s;
3351 SSize_t got = 0;
3352 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3353 return -1;
3354 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3355 for (;;) {
3356 if (count == 1) {
3357 STDCHAR *buf = (STDCHAR *) vbuf;
3358 /*
3359 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3360 * stdio does not do that for fread()
3361 */
3362 const int ch = PerlSIO_fgetc(s);
3363 if (ch != EOF) {
3364 *buf = ch;
3365 got = 1;
3366 }
3367 }
3368 else
3369 got = PerlSIO_fread(vbuf, 1, count, s);
3370 if (got == 0 && PerlSIO_ferror(s))
3371 got = -1;
3372 if (got >= 0 || errno != EINTR)
3373 break;
3374 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3375 return -1;
3376 SETERRNO(0,0); /* just in case */
3377 }
3378 return got;
3379}
3380
3381SSize_t
3382PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3383{
3384 SSize_t unread = 0;
3385 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3386
3387#ifdef STDIO_BUFFER_WRITABLE
3388 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3389 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3390 STDCHAR *base = PerlIO_get_base(f);
3391 SSize_t cnt = PerlIO_get_cnt(f);
3392 STDCHAR *ptr = PerlIO_get_ptr(f);
3393 SSize_t avail = ptr - base;
3394 if (avail > 0) {
3395 if (avail > count) {
3396 avail = count;
3397 }
3398 ptr -= avail;
3399 Move(buf-avail,ptr,avail,STDCHAR);
3400 count -= avail;
3401 unread += avail;
3402 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3403 if (PerlSIO_feof(s) && unread >= 0)
3404 PerlSIO_clearerr(s);
3405 }
3406 }
3407 else
3408#endif
3409 if (PerlIO_has_cntptr(f)) {
3410 /* We can get pointer to buffer but not its base
3411 Do ungetc() but check chars are ending up in the
3412 buffer
3413 */
3414 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3415 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3416 while (count > 0) {
3417 const int ch = *--buf & 0xFF;
3418 if (ungetc(ch,s) != ch) {
3419 /* ungetc did not work */
3420 break;
3421 }
3422 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3423 /* Did not change pointer as expected */
3424 fgetc(s); /* get char back again */
3425 break;
3426 }
3427 /* It worked ! */
3428 count--;
3429 unread++;
3430 }
3431 }
3432
3433 if (count > 0) {
3434 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3435 }
3436 return unread;
3437}
3438
3439SSize_t
3440PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3441{
3442 dVAR;
3443 SSize_t got;
3444 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3445 return -1;
3446 for (;;) {
3447 got = PerlSIO_fwrite(vbuf, 1, count,
3448 PerlIOSelf(f, PerlIOStdio)->stdio);
3449 if (got >= 0 || errno != EINTR)
3450 break;
3451 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3452 return -1;
3453 SETERRNO(0,0); /* just in case */
3454 }
3455 return got;
3456}
3457
3458IV
3459PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3460{
3461 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3462 PERL_UNUSED_CONTEXT;
3463
3464 return PerlSIO_fseek(stdio, offset, whence);
3465}
3466
3467Off_t
3468PerlIOStdio_tell(pTHX_ PerlIO *f)
3469{
3470 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3471 PERL_UNUSED_CONTEXT;
3472
3473 return PerlSIO_ftell(stdio);
3474}
3475
3476IV
3477PerlIOStdio_flush(pTHX_ PerlIO *f)
3478{
3479 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3480 PERL_UNUSED_CONTEXT;
3481
3482 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3483 return PerlSIO_fflush(stdio);
3484 }
3485 else {
3486 NOOP;
3487#if 0
3488 /*
3489 * FIXME: This discards ungetc() and pre-read stuff which is not
3490 * right if this is just a "sync" from a layer above Suspect right
3491 * design is to do _this_ but not have layer above flush this
3492 * layer read-to-read
3493 */
3494 /*
3495 * Not writeable - sync by attempting a seek
3496 */
3497 dSAVE_ERRNO;
3498 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3499 RESTORE_ERRNO;
3500#endif
3501 }
3502 return 0;
3503}
3504
3505IV
3506PerlIOStdio_eof(pTHX_ PerlIO *f)
3507{
3508 PERL_UNUSED_CONTEXT;
3509
3510 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3511}
3512
3513IV
3514PerlIOStdio_error(pTHX_ PerlIO *f)
3515{
3516 PERL_UNUSED_CONTEXT;
3517
3518 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3519}
3520
3521void
3522PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3523{
3524 PERL_UNUSED_CONTEXT;
3525
3526 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3527}
3528
3529void
3530PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3531{
3532 PERL_UNUSED_CONTEXT;
3533
3534#ifdef HAS_SETLINEBUF
3535 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3536#else
3537 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3538#endif
3539}
3540
3541#ifdef FILE_base
3542STDCHAR *
3543PerlIOStdio_get_base(pTHX_ PerlIO *f)
3544{
3545 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3546 return (STDCHAR*)PerlSIO_get_base(stdio);
3547}
3548
3549Size_t
3550PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3551{
3552 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3553 return PerlSIO_get_bufsiz(stdio);
3554}
3555#endif
3556
3557#ifdef USE_STDIO_PTR
3558STDCHAR *
3559PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3560{
3561 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3562 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3563}
3564
3565SSize_t
3566PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3567{
3568 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3569 return PerlSIO_get_cnt(stdio);
3570}
3571
3572void
3573PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3574{
3575 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3576 if (ptr != NULL) {
3577#ifdef STDIO_PTR_LVALUE
3578 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3579#ifdef STDIO_PTR_LVAL_SETS_CNT
3580 assert(PerlSIO_get_cnt(stdio) == (cnt));
3581#endif
3582#if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3583 /*
3584 * Setting ptr _does_ change cnt - we are done
3585 */
3586 return;
3587#endif
3588#else /* STDIO_PTR_LVALUE */
3589 PerlProc_abort();
3590#endif /* STDIO_PTR_LVALUE */
3591 }
3592 /*
3593 * Now (or only) set cnt
3594 */
3595#ifdef STDIO_CNT_LVALUE
3596 PerlSIO_set_cnt(stdio, cnt);
3597#else /* STDIO_CNT_LVALUE */
3598#if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3599 PerlSIO_set_ptr(stdio,
3600 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3601 cnt));
3602#else /* STDIO_PTR_LVAL_SETS_CNT */
3603 PerlProc_abort();
3604#endif /* STDIO_PTR_LVAL_SETS_CNT */
3605#endif /* STDIO_CNT_LVALUE */
3606}
3607
3608
3609#endif
3610
3611IV
3612PerlIOStdio_fill(pTHX_ PerlIO *f)
3613{
3614 FILE * stdio;
3615 int c;
3616 PERL_UNUSED_CONTEXT;
3617 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3618 return -1;
3619 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3620
3621 /*
3622 * fflush()ing read-only streams can cause trouble on some stdio-s
3623 */
3624 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3625 if (PerlSIO_fflush(stdio) != 0)
3626 return EOF;
3627 }
3628 for (;;) {
3629 c = PerlSIO_fgetc(stdio);
3630 if (c != EOF)
3631 break;
3632 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3633 return EOF;
3634 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3635 return -1;
3636 SETERRNO(0,0);
3637 }
3638
3639#if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3640
3641#ifdef STDIO_BUFFER_WRITABLE
3642 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3643 /* Fake ungetc() to the real buffer in case system's ungetc
3644 goes elsewhere
3645 */
3646 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3647 SSize_t cnt = PerlSIO_get_cnt(stdio);
3648 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3649 if (ptr == base+1) {
3650 *--ptr = (STDCHAR) c;
3651 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3652 if (PerlSIO_feof(stdio))
3653 PerlSIO_clearerr(stdio);
3654 return 0;
3655 }
3656 }
3657 else
3658#endif
3659 if (PerlIO_has_cntptr(f)) {
3660 STDCHAR ch = c;
3661 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3662 return 0;
3663 }
3664 }
3665#endif
3666
3667#if defined(VMS)
3668 /* An ungetc()d char is handled separately from the regular
3669 * buffer, so we stuff it in the buffer ourselves.
3670 * Should never get called as should hit code above
3671 */
3672 *(--((*stdio)->_ptr)) = (unsigned char) c;
3673 (*stdio)->_cnt++;
3674#else
3675 /* If buffer snoop scheme above fails fall back to
3676 using ungetc().
3677 */
3678 if (PerlSIO_ungetc(c, stdio) != c)
3679 return EOF;
3680#endif
3681 return 0;
3682}
3683
3684
3685
3686PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3687 sizeof(PerlIO_funcs),
3688 "stdio",
3689 sizeof(PerlIOStdio),
3690 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3691 PerlIOStdio_pushed,
3692 PerlIOBase_popped,
3693 PerlIOStdio_open,
3694 PerlIOBase_binmode, /* binmode */
3695 NULL,
3696 PerlIOStdio_fileno,
3697 PerlIOStdio_dup,
3698 PerlIOStdio_read,
3699 PerlIOStdio_unread,
3700 PerlIOStdio_write,
3701 PerlIOStdio_seek,
3702 PerlIOStdio_tell,
3703 PerlIOStdio_close,
3704 PerlIOStdio_flush,
3705 PerlIOStdio_fill,
3706 PerlIOStdio_eof,
3707 PerlIOStdio_error,
3708 PerlIOStdio_clearerr,
3709 PerlIOStdio_setlinebuf,
3710#ifdef FILE_base
3711 PerlIOStdio_get_base,
3712 PerlIOStdio_get_bufsiz,
3713#else
3714 NULL,
3715 NULL,
3716#endif
3717#ifdef USE_STDIO_PTR
3718 PerlIOStdio_get_ptr,
3719 PerlIOStdio_get_cnt,
3720# if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3721 PerlIOStdio_set_ptrcnt,
3722# else
3723 NULL,
3724# endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3725#else
3726 NULL,
3727 NULL,
3728 NULL,
3729#endif /* USE_STDIO_PTR */
3730};
3731
3732/* Note that calls to PerlIO_exportFILE() are reversed using
3733 * PerlIO_releaseFILE(), not importFILE. */
3734FILE *
3735PerlIO_exportFILE(PerlIO * f, const char *mode)
3736{
3737 dTHX;
3738 FILE *stdio = NULL;
3739 if (PerlIOValid(f)) {
3740 char buf[8];
3741 PerlIO_flush(f);
3742 if (!mode || !*mode) {
3743 mode = PerlIO_modestr(f, buf);
3744 }
3745 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3746 if (stdio) {
3747 PerlIOl *l = *f;
3748 PerlIO *f2;
3749 /* De-link any lower layers so new :stdio sticks */
3750 *f = NULL;
3751 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3752 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3753 s->stdio = stdio;
3754 PerlIOUnix_refcnt_inc(fileno(stdio));
3755 /* Link previous lower layers under new one */
3756 *PerlIONext(f) = l;
3757 }
3758 else {
3759 /* restore layers list */
3760 *f = l;
3761 }
3762 }
3763 }
3764 return stdio;
3765}
3766
3767
3768FILE *
3769PerlIO_findFILE(PerlIO *f)
3770{
3771 PerlIOl *l = *f;
3772 FILE *stdio;
3773 while (l) {
3774 if (l->tab == &PerlIO_stdio) {
3775 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3776 return s->stdio;
3777 }
3778 l = *PerlIONext(&l);
3779 }
3780 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3781 /* However, we're not really exporting a FILE * to someone else (who
3782 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3783 So we need to undo its reference count increase on the underlying file
3784 descriptor. We have to do this, because if the loop above returns you
3785 the FILE *, then *it* didn't increase any reference count. So there's
3786 only one way to be consistent. */
3787 stdio = PerlIO_exportFILE(f, NULL);
3788 if (stdio) {
3789 const int fd = fileno(stdio);
3790 if (fd >= 0)
3791 PerlIOUnix_refcnt_dec(fd);
3792 }
3793 return stdio;
3794}
3795
3796/* Use this to reverse PerlIO_exportFILE calls. */
3797void
3798PerlIO_releaseFILE(PerlIO *p, FILE *f)
3799{
3800 dVAR;
3801 PerlIOl *l;
3802 while ((l = *p)) {
3803 if (l->tab == &PerlIO_stdio) {
3804 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3805 if (s->stdio == f) {
3806 dTHX;
3807 const int fd = fileno(f);
3808 if (fd >= 0)
3809 PerlIOUnix_refcnt_dec(fd);
3810 PerlIO_pop(aTHX_ p);
3811 return;
3812 }
3813 }
3814 p = PerlIONext(p);
3815 }
3816 return;
3817}
3818
3819/*--------------------------------------------------------------------------------------*/
3820/*
3821 * perlio buffer layer
3822 */
3823
3824IV
3825PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3826{
3827 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3828 const int fd = PerlIO_fileno(f);
3829 if (fd >= 0 && PerlLIO_isatty(fd)) {
3830 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3831 }
3832 if (*PerlIONext(f)) {
3833 const Off_t posn = PerlIO_tell(PerlIONext(f));
3834 if (posn != (Off_t) - 1) {
3835 b->posn = posn;
3836 }
3837 }
3838 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3839}
3840
3841PerlIO *
3842PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3843 IV n, const char *mode, int fd, int imode, int perm,
3844 PerlIO *f, int narg, SV **args)
3845{
3846 if (PerlIOValid(f)) {
3847 PerlIO *next = PerlIONext(f);
3848 PerlIO_funcs *tab =
3849 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3850 if (tab && tab->Open)
3851 next =
3852 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3853 next, narg, args);
3854 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3855 return NULL;
3856 }
3857 }
3858 else {
3859 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3860 int init = 0;
3861 if (*mode == IoTYPE_IMPLICIT) {
3862 init = 1;
3863 /*
3864 * mode++;
3865 */
3866 }
3867 if (tab && tab->Open)
3868 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3869 f, narg, args);
3870 else
3871 SETERRNO(EINVAL, LIB_INVARG);
3872 if (f) {
3873 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3874 /*
3875 * if push fails during open, open fails. close will pop us.
3876 */
3877 PerlIO_close (f);
3878 return NULL;
3879 } else {
3880 fd = PerlIO_fileno(f);
3881 if (init && fd == 2) {
3882 /*
3883 * Initial stderr is unbuffered
3884 */
3885 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3886 }
3887#ifdef PERLIO_USING_CRLF
3888# ifdef PERLIO_IS_BINMODE_FD
3889 if (PERLIO_IS_BINMODE_FD(fd))
3890 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3891 else
3892# endif
3893 /*
3894 * do something about failing setmode()? --jhi
3895 */
3896 PerlLIO_setmode(fd, O_BINARY);
3897#endif
3898#ifdef VMS
3899#include <rms.h>
3900 /* Enable line buffering with record-oriented regular files
3901 * so we don't introduce an extraneous record boundary when
3902 * the buffer fills up.
3903 */
3904 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3905 Stat_t st;
3906 if (PerlLIO_fstat(fd, &st) == 0
3907 && S_ISREG(st.st_mode)
3908 && (st.st_fab_rfm == FAB$C_VAR
3909 || st.st_fab_rfm == FAB$C_VFC)) {
3910 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
3911 }
3912 }
3913#endif
3914 }
3915 }
3916 }
3917 return f;
3918}
3919
3920/*
3921 * This "flush" is akin to sfio's sync in that it handles files in either
3922 * read or write state. For write state, we put the postponed data through
3923 * the next layers. For read state, we seek() the next layers to the
3924 * offset given by current position in the buffer, and discard the buffer
3925 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3926 * in any case?). Then the pass the stick further in chain.
3927 */
3928IV
3929PerlIOBuf_flush(pTHX_ PerlIO *f)
3930{
3931 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3932 int code = 0;
3933 PerlIO *n = PerlIONext(f);
3934 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3935 /*
3936 * write() the buffer
3937 */
3938 const STDCHAR *buf = b->buf;
3939 const STDCHAR *p = buf;
3940 while (p < b->ptr) {
3941 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3942 if (count > 0) {
3943 p += count;
3944 }
3945 else if (count < 0 || PerlIO_error(n)) {
3946 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3947 code = -1;
3948 break;
3949 }
3950 }
3951 b->posn += (p - buf);
3952 }
3953 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3954 STDCHAR *buf = PerlIO_get_base(f);
3955 /*
3956 * Note position change
3957 */
3958 b->posn += (b->ptr - buf);
3959 if (b->ptr < b->end) {
3960 /* We did not consume all of it - try and seek downstream to
3961 our logical position
3962 */
3963 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3964 /* Reload n as some layers may pop themselves on seek */
3965 b->posn = PerlIO_tell(n = PerlIONext(f));
3966 }
3967 else {
3968 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3969 data is lost for good - so return saying "ok" having undone
3970 the position adjust
3971 */
3972 b->posn -= (b->ptr - buf);
3973 return code;
3974 }
3975 }
3976 }
3977 b->ptr = b->end = b->buf;
3978 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3979 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3980 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3981 code = -1;
3982 return code;
3983}
3984
3985/* This discards the content of the buffer after b->ptr, and rereads
3986 * the buffer from the position off in the layer downstream; here off
3987 * is at offset corresponding to b->ptr - b->buf.
3988 */
3989IV
3990PerlIOBuf_fill(pTHX_ PerlIO *f)
3991{
3992 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3993 PerlIO *n = PerlIONext(f);
3994 SSize_t avail;
3995 /*
3996 * Down-stream flush is defined not to loose read data so is harmless.
3997 * we would not normally be fill'ing if there was data left in anycase.
3998 */
3999 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
4000 return -1;
4001 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
4002 PerlIOBase_flush_linebuf(aTHX);
4003
4004 if (!b->buf)
4005 PerlIO_get_base(f); /* allocate via vtable */
4006
4007 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
4008
4009 b->ptr = b->end = b->buf;
4010
4011 if (!PerlIOValid(n)) {
4012 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4013 return -1;
4014 }
4015
4016 if (PerlIO_fast_gets(n)) {
4017 /*
4018 * Layer below is also buffered. We do _NOT_ want to call its
4019 * ->Read() because that will loop till it gets what we asked for
4020 * which may hang on a pipe etc. Instead take anything it has to
4021 * hand, or ask it to fill _once_.
4022 */
4023 avail = PerlIO_get_cnt(n);
4024 if (avail <= 0) {
4025 avail = PerlIO_fill(n);
4026 if (avail == 0)
4027 avail = PerlIO_get_cnt(n);
4028 else {
4029 if (!PerlIO_error(n) && PerlIO_eof(n))
4030 avail = 0;
4031 }
4032 }
4033 if (avail > 0) {
4034 STDCHAR *ptr = PerlIO_get_ptr(n);
4035 const SSize_t cnt = avail;
4036 if (avail > (SSize_t)b->bufsiz)
4037 avail = b->bufsiz;
4038 Copy(ptr, b->buf, avail, STDCHAR);
4039 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4040 }
4041 }
4042 else {
4043 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4044 }
4045 if (avail <= 0) {
4046 if (avail == 0)
4047 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4048 else
4049 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4050 return -1;
4051 }
4052 b->end = b->buf + avail;
4053 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4054 return 0;
4055}
4056
4057SSize_t
4058PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4059{
4060 if (PerlIOValid(f)) {
4061 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4062 if (!b->ptr)
4063 PerlIO_get_base(f);
4064 return PerlIOBase_read(aTHX_ f, vbuf, count);
4065 }
4066 return 0;
4067}
4068
4069SSize_t
4070PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4071{
4072 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4073 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4074 SSize_t unread = 0;
4075 SSize_t avail;
4076 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4077 PerlIO_flush(f);
4078 if (!b->buf)
4079 PerlIO_get_base(f);
4080 if (b->buf) {
4081 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4082 /*
4083 * Buffer is already a read buffer, we can overwrite any chars
4084 * which have been read back to buffer start
4085 */
4086 avail = (b->ptr - b->buf);
4087 }
4088 else {
4089 /*
4090 * Buffer is idle, set it up so whole buffer is available for
4091 * unread
4092 */
4093 avail = b->bufsiz;
4094 b->end = b->buf + avail;
4095 b->ptr = b->end;
4096 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4097 /*
4098 * Buffer extends _back_ from where we are now
4099 */
4100 b->posn -= b->bufsiz;
4101 }
4102 if (avail > (SSize_t) count) {
4103 /*
4104 * If we have space for more than count, just move count
4105 */
4106 avail = count;
4107 }
4108 if (avail > 0) {
4109 b->ptr -= avail;
4110 buf -= avail;
4111 /*
4112 * In simple stdio-like ungetc() case chars will be already
4113 * there
4114 */
4115 if (buf != b->ptr) {
4116 Copy(buf, b->ptr, avail, STDCHAR);
4117 }
4118 count -= avail;
4119 unread += avail;
4120 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4121 }
4122 }
4123 if (count > 0) {
4124 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4125 }
4126 return unread;
4127}
4128
4129SSize_t
4130PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4131{
4132 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4133 const STDCHAR *buf = (const STDCHAR *) vbuf;
4134 const STDCHAR *flushptr = buf;
4135 Size_t written = 0;
4136 if (!b->buf)
4137 PerlIO_get_base(f);
4138 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4139 return 0;
4140 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4141 if (PerlIO_flush(f) != 0) {
4142 return 0;
4143 }
4144 }
4145 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4146 flushptr = buf + count;
4147 while (flushptr > buf && *(flushptr - 1) != '\n')
4148 --flushptr;
4149 }
4150 while (count > 0) {
4151 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4152 if ((SSize_t) count < avail)
4153 avail = count;
4154 if (flushptr > buf && flushptr <= buf + avail)
4155 avail = flushptr - buf;
4156 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4157 if (avail) {
4158 Copy(buf, b->ptr, avail, STDCHAR);
4159 count -= avail;
4160 buf += avail;
4161 written += avail;
4162 b->ptr += avail;
4163 if (buf == flushptr)
4164 PerlIO_flush(f);
4165 }
4166 if (b->ptr >= (b->buf + b->bufsiz))
4167 if (PerlIO_flush(f) == -1)
4168 return -1;
4169 }
4170 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4171 PerlIO_flush(f);
4172 return written;
4173}
4174
4175IV
4176PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4177{
4178 IV code;
4179 if ((code = PerlIO_flush(f)) == 0) {
4180 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4181 code = PerlIO_seek(PerlIONext(f), offset, whence);
4182 if (code == 0) {
4183 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4184 b->posn = PerlIO_tell(PerlIONext(f));
4185 }
4186 }
4187 return code;
4188}
4189
4190Off_t
4191PerlIOBuf_tell(pTHX_ PerlIO *f)
4192{
4193 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4194 /*
4195 * b->posn is file position where b->buf was read, or will be written
4196 */
4197 Off_t posn = b->posn;
4198 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4199 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4200#if 1
4201 /* As O_APPEND files are normally shared in some sense it is better
4202 to flush :
4203 */
4204 PerlIO_flush(f);
4205#else
4206 /* when file is NOT shared then this is sufficient */
4207 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4208#endif
4209 posn = b->posn = PerlIO_tell(PerlIONext(f));
4210 }
4211 if (b->buf) {
4212 /*
4213 * If buffer is valid adjust position by amount in buffer
4214 */
4215 posn += (b->ptr - b->buf);
4216 }
4217 return posn;
4218}
4219
4220IV
4221PerlIOBuf_popped(pTHX_ PerlIO *f)
4222{
4223 const IV code = PerlIOBase_popped(aTHX_ f);
4224 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4225 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4226 Safefree(b->buf);
4227 }
4228 b->ptr = b->end = b->buf = NULL;
4229 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4230 return code;
4231}
4232
4233IV
4234PerlIOBuf_close(pTHX_ PerlIO *f)
4235{
4236 const IV code = PerlIOBase_close(aTHX_ f);
4237 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4238 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4239 Safefree(b->buf);
4240 }
4241 b->ptr = b->end = b->buf = NULL;
4242 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4243 return code;
4244}
4245
4246STDCHAR *
4247PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4248{
4249 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4250 if (!b->buf)
4251 PerlIO_get_base(f);
4252 return b->ptr;
4253}
4254
4255SSize_t
4256PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4257{
4258 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4259 if (!b->buf)
4260 PerlIO_get_base(f);
4261 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4262 return (b->end - b->ptr);
4263 return 0;
4264}
4265
4266STDCHAR *
4267PerlIOBuf_get_base(pTHX_ PerlIO *f)
4268{
4269 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4270 PERL_UNUSED_CONTEXT;
4271
4272 if (!b->buf) {
4273 if (!b->bufsiz)
4274 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4275 Newxz(b->buf,b->bufsiz, STDCHAR);
4276 if (!b->buf) {
4277 b->buf = (STDCHAR *) & b->oneword;
4278 b->bufsiz = sizeof(b->oneword);
4279 }
4280 b->end = b->ptr = b->buf;
4281 }
4282 return b->buf;
4283}
4284
4285Size_t
4286PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4287{
4288 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4289 if (!b->buf)
4290 PerlIO_get_base(f);
4291 return (b->end - b->buf);
4292}
4293
4294void
4295PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4296{
4297 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4298#ifndef DEBUGGING
4299 PERL_UNUSED_ARG(cnt);
4300#endif
4301 if (!b->buf)
4302 PerlIO_get_base(f);
4303 b->ptr = ptr;
4304 assert(PerlIO_get_cnt(f) == cnt);
4305 assert(b->ptr >= b->buf);
4306 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4307}
4308
4309PerlIO *
4310PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4311{
4312 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4313}
4314
4315
4316
4317PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4318 sizeof(PerlIO_funcs),
4319 "perlio",
4320 sizeof(PerlIOBuf),
4321 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4322 PerlIOBuf_pushed,
4323 PerlIOBuf_popped,
4324 PerlIOBuf_open,
4325 PerlIOBase_binmode, /* binmode */
4326 NULL,
4327 PerlIOBase_fileno,
4328 PerlIOBuf_dup,
4329 PerlIOBuf_read,
4330 PerlIOBuf_unread,
4331 PerlIOBuf_write,
4332 PerlIOBuf_seek,
4333 PerlIOBuf_tell,
4334 PerlIOBuf_close,
4335 PerlIOBuf_flush,
4336 PerlIOBuf_fill,
4337 PerlIOBase_eof,
4338 PerlIOBase_error,
4339 PerlIOBase_clearerr,
4340 PerlIOBase_setlinebuf,
4341 PerlIOBuf_get_base,
4342 PerlIOBuf_bufsiz,
4343 PerlIOBuf_get_ptr,
4344 PerlIOBuf_get_cnt,
4345 PerlIOBuf_set_ptrcnt,
4346};
4347
4348/*--------------------------------------------------------------------------------------*/
4349/*
4350 * Temp layer to hold unread chars when cannot do it any other way
4351 */
4352
4353IV
4354PerlIOPending_fill(pTHX_ PerlIO *f)
4355{
4356 /*
4357 * Should never happen
4358 */
4359 PerlIO_flush(f);
4360 return 0;
4361}
4362
4363IV
4364PerlIOPending_close(pTHX_ PerlIO *f)
4365{
4366 /*
4367 * A tad tricky - flush pops us, then we close new top
4368 */
4369 PerlIO_flush(f);
4370 return PerlIO_close(f);
4371}
4372
4373IV
4374PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4375{
4376 /*
4377 * A tad tricky - flush pops us, then we seek new top
4378 */
4379 PerlIO_flush(f);
4380 return PerlIO_seek(f, offset, whence);
4381}
4382
4383
4384IV
4385PerlIOPending_flush(pTHX_ PerlIO *f)
4386{
4387 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4388 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4389 Safefree(b->buf);
4390 b->buf = NULL;
4391 }
4392 PerlIO_pop(aTHX_ f);
4393 return 0;
4394}
4395
4396void
4397PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4398{
4399 if (cnt <= 0) {
4400 PerlIO_flush(f);
4401 }
4402 else {
4403 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4404 }
4405}
4406
4407IV
4408PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4409{
4410 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4411 PerlIOl * const l = PerlIOBase(f);
4412 /*
4413 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4414 * etc. get muddled when it changes mid-string when we auto-pop.
4415 */
4416 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4417 (PerlIOBase(PerlIONext(f))->
4418 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4419 return code;
4420}
4421
4422SSize_t
4423PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4424{
4425 SSize_t avail = PerlIO_get_cnt(f);
4426 SSize_t got = 0;
4427 if ((SSize_t)count < avail)
4428 avail = count;
4429 if (avail > 0)
4430 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4431 if (got >= 0 && got < (SSize_t)count) {
4432 const SSize_t more =
4433 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4434 if (more >= 0 || got == 0)
4435 got += more;
4436 }
4437 return got;
4438}
4439
4440PERLIO_FUNCS_DECL(PerlIO_pending) = {
4441 sizeof(PerlIO_funcs),
4442 "pending",
4443 sizeof(PerlIOBuf),
4444 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4445 PerlIOPending_pushed,
4446 PerlIOBuf_popped,
4447 NULL,
4448 PerlIOBase_binmode, /* binmode */
4449 NULL,
4450 PerlIOBase_fileno,
4451 PerlIOBuf_dup,
4452 PerlIOPending_read,
4453 PerlIOBuf_unread,
4454 PerlIOBuf_write,
4455 PerlIOPending_seek,
4456 PerlIOBuf_tell,
4457 PerlIOPending_close,
4458 PerlIOPending_flush,
4459 PerlIOPending_fill,
4460 PerlIOBase_eof,
4461 PerlIOBase_error,
4462 PerlIOBase_clearerr,
4463 PerlIOBase_setlinebuf,
4464 PerlIOBuf_get_base,
4465 PerlIOBuf_bufsiz,
4466 PerlIOBuf_get_ptr,
4467 PerlIOBuf_get_cnt,
4468 PerlIOPending_set_ptrcnt,
4469};
4470
4471
4472
4473/*--------------------------------------------------------------------------------------*/
4474/*
4475 * crlf - translation On read translate CR,LF to "\n" we do this by
4476 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4477 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4478 *
4479 * c->nl points on the first byte of CR LF pair when it is temporarily
4480 * replaced by LF, or to the last CR of the buffer. In the former case
4481 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4482 * that it ends at c->nl; these two cases can be distinguished by
4483 * *c->nl. c->nl is set during _getcnt() call, and unset during
4484 * _unread() and _flush() calls.
4485 * It only matters for read operations.
4486 */
4487
4488typedef struct {
4489 PerlIOBuf base; /* PerlIOBuf stuff */
4490 STDCHAR *nl; /* Position of crlf we "lied" about in the
4491 * buffer */
4492} PerlIOCrlf;
4493
4494/* Inherit the PERLIO_F_UTF8 flag from previous layer.
4495 * Otherwise the :crlf layer would always revert back to
4496 * raw mode.
4497 */
4498static void
4499S_inherit_utf8_flag(PerlIO *f)
4500{
4501 PerlIO *g = PerlIONext(f);
4502 if (PerlIOValid(g)) {
4503 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4504 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4505 }
4506 }
4507}
4508
4509IV
4510PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4511{
4512 IV code;
4513 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4514 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4515#if 0
4516 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4517 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4518 PerlIOBase(f)->flags);
4519#endif
4520 {
4521 /* If the old top layer is a CRLF layer, reactivate it (if
4522 * necessary) and remove this new layer from the stack */
4523 PerlIO *g = PerlIONext(f);
4524 if (PerlIOValid(g)) {
4525 PerlIOl *b = PerlIOBase(g);
4526 if (b && b->tab == &PerlIO_crlf) {
4527 if (!(b->flags & PERLIO_F_CRLF))
4528 b->flags |= PERLIO_F_CRLF;
4529 S_inherit_utf8_flag(g);
4530 PerlIO_pop(aTHX_ f);
4531 return code;
4532 }
4533 }
4534 }
4535 S_inherit_utf8_flag(f);
4536 return code;
4537}
4538
4539
4540SSize_t
4541PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4542{
4543 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4544 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4545 *(c->nl) = 0xd;
4546 c->nl = NULL;
4547 }
4548 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4549 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4550 else {
4551 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4552 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4553 SSize_t unread = 0;
4554 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4555 PerlIO_flush(f);
4556 if (!b->buf)
4557 PerlIO_get_base(f);
4558 if (b->buf) {
4559 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4560 b->end = b->ptr = b->buf + b->bufsiz;
4561 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4562 b->posn -= b->bufsiz;
4563 }
4564 while (count > 0 && b->ptr > b->buf) {
4565 const int ch = *--buf;
4566 if (ch == '\n') {
4567 if (b->ptr - 2 >= b->buf) {
4568 *--(b->ptr) = 0xa;
4569 *--(b->ptr) = 0xd;
4570 unread++;
4571 count--;
4572 }
4573 else {
4574 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4575 *--(b->ptr) = 0xa; /* Works even if 0xa == '\r' */
4576 unread++;
4577 count--;
4578 }
4579 }
4580 else {
4581 *--(b->ptr) = ch;
4582 unread++;
4583 count--;
4584 }
4585 }
4586 }
4587 return unread;
4588 }
4589}
4590
4591/* XXXX This code assumes that buffer size >=2, but does not check it... */
4592SSize_t
4593PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4594{
4595 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4596 if (!b->buf)
4597 PerlIO_get_base(f);
4598 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4599 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4600 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == 0xd)) {
4601 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4602 scan:
4603 while (nl < b->end && *nl != 0xd)
4604 nl++;
4605 if (nl < b->end && *nl == 0xd) {
4606 test:
4607 if (nl + 1 < b->end) {
4608 if (nl[1] == 0xa) {
4609 *nl = '\n';
4610 c->nl = nl;
4611 }
4612 else {
4613 /*
4614 * Not CR,LF but just CR
4615 */
4616 nl++;
4617 goto scan;
4618 }
4619 }
4620 else {
4621 /*
4622 * Blast - found CR as last char in buffer
4623 */
4624
4625 if (b->ptr < nl) {
4626 /*
4627 * They may not care, defer work as long as
4628 * possible
4629 */
4630 c->nl = nl;
4631 return (nl - b->ptr);
4632 }
4633 else {
4634 int code;
4635 b->ptr++; /* say we have read it as far as
4636 * flush() is concerned */
4637 b->buf++; /* Leave space in front of buffer */
4638 /* Note as we have moved buf up flush's
4639 posn += ptr-buf
4640 will naturally make posn point at CR
4641 */
4642 b->bufsiz--; /* Buffer is thus smaller */
4643 code = PerlIO_fill(f); /* Fetch some more */
4644 b->bufsiz++; /* Restore size for next time */
4645 b->buf--; /* Point at space */
4646 b->ptr = nl = b->buf; /* Which is what we hand
4647 * off */
4648 *nl = 0xd; /* Fill in the CR */
4649 if (code == 0)
4650 goto test; /* fill() call worked */
4651 /*
4652 * CR at EOF - just fall through
4653 */
4654 /* Should we clear EOF though ??? */
4655 }
4656 }
4657 }
4658 }
4659 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4660 }
4661 return 0;
4662}
4663
4664void
4665PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4666{
4667 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4668 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4669 if (!b->buf)
4670 PerlIO_get_base(f);
4671 if (!ptr) {
4672 if (c->nl) {
4673 ptr = c->nl + 1;
4674 if (ptr == b->end && *c->nl == 0xd) {
4675 /* Deferred CR at end of buffer case - we lied about count */
4676 ptr--;
4677 }
4678 }
4679 else {
4680 ptr = b->end;
4681 }
4682 ptr -= cnt;
4683 }
4684 else {
4685 NOOP;
4686#if 0
4687 /*
4688 * Test code - delete when it works ...
4689 */
4690 IV flags = PerlIOBase(f)->flags;
4691 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4692 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == 0xd) {
4693 /* Deferred CR at end of buffer case - we lied about count */
4694 chk--;
4695 }
4696 chk -= cnt;
4697
4698 if (ptr != chk ) {
4699 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4700 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4701 flags, c->nl, b->end, cnt);
4702 }
4703#endif
4704 }
4705 if (c->nl) {
4706 if (ptr > c->nl) {
4707 /*
4708 * They have taken what we lied about
4709 */
4710 *(c->nl) = 0xd;
4711 c->nl = NULL;
4712 ptr++;
4713 }
4714 }
4715 b->ptr = ptr;
4716 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4717}
4718
4719SSize_t
4720PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4721{
4722 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4723 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4724 else {
4725 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4726 const STDCHAR *buf = (const STDCHAR *) vbuf;
4727 const STDCHAR * const ebuf = buf + count;
4728 if (!b->buf)
4729 PerlIO_get_base(f);
4730 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4731 return 0;
4732 while (buf < ebuf) {
4733 const STDCHAR * const eptr = b->buf + b->bufsiz;
4734 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4735 while (buf < ebuf && b->ptr < eptr) {
4736 if (*buf == '\n') {
4737 if ((b->ptr + 2) > eptr) {
4738 /*
4739 * Not room for both
4740 */
4741 PerlIO_flush(f);
4742 break;
4743 }
4744 else {
4745 *(b->ptr)++ = 0xd; /* CR */
4746 *(b->ptr)++ = 0xa; /* LF */
4747 buf++;
4748 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4749 PerlIO_flush(f);
4750 break;
4751 }
4752 }
4753 }
4754 else {
4755 *(b->ptr)++ = *buf++;
4756 }
4757 if (b->ptr >= eptr) {
4758 PerlIO_flush(f);
4759 break;
4760 }
4761 }
4762 }
4763 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4764 PerlIO_flush(f);
4765 return (buf - (STDCHAR *) vbuf);
4766 }
4767}
4768
4769IV
4770PerlIOCrlf_flush(pTHX_ PerlIO *f)
4771{
4772 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4773 if (c->nl) {
4774 *(c->nl) = 0xd;
4775 c->nl = NULL;
4776 }
4777 return PerlIOBuf_flush(aTHX_ f);
4778}
4779
4780IV
4781PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4782{
4783 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4784 /* In text mode - flush any pending stuff and flip it */
4785 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4786#ifndef PERLIO_USING_CRLF
4787 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4788 PerlIO_pop(aTHX_ f);
4789#endif
4790 }
4791 return 0;
4792}
4793
4794PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4795 sizeof(PerlIO_funcs),
4796 "crlf",
4797 sizeof(PerlIOCrlf),
4798 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4799 PerlIOCrlf_pushed,
4800 PerlIOBuf_popped, /* popped */
4801 PerlIOBuf_open,
4802 PerlIOCrlf_binmode, /* binmode */
4803 NULL,
4804 PerlIOBase_fileno,
4805 PerlIOBuf_dup,
4806 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4807 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4808 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4809 PerlIOBuf_seek,
4810 PerlIOBuf_tell,
4811 PerlIOBuf_close,
4812 PerlIOCrlf_flush,
4813 PerlIOBuf_fill,
4814 PerlIOBase_eof,
4815 PerlIOBase_error,
4816 PerlIOBase_clearerr,
4817 PerlIOBase_setlinebuf,
4818 PerlIOBuf_get_base,
4819 PerlIOBuf_bufsiz,
4820 PerlIOBuf_get_ptr,
4821 PerlIOCrlf_get_cnt,
4822 PerlIOCrlf_set_ptrcnt,
4823};
4824
4825#ifdef HAS_MMAP
4826/*--------------------------------------------------------------------------------------*/
4827/*
4828 * mmap as "buffer" layer
4829 */
4830
4831typedef struct {
4832 PerlIOBuf base; /* PerlIOBuf stuff */
4833 Mmap_t mptr; /* Mapped address */
4834 Size_t len; /* mapped length */
4835 STDCHAR *bbuf; /* malloced buffer if map fails */
4836} PerlIOMmap;
4837
4838IV
4839PerlIOMmap_map(pTHX_ PerlIO *f)
4840{
4841 dVAR;
4842 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4843 const IV flags = PerlIOBase(f)->flags;
4844 IV code = 0;
4845 if (m->len)
4846 abort();
4847 if (flags & PERLIO_F_CANREAD) {
4848 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4849 const int fd = PerlIO_fileno(f);
4850 Stat_t st;
4851 code = Fstat(fd, &st);
4852 if (code == 0 && S_ISREG(st.st_mode)) {
4853 SSize_t len = st.st_size - b->posn;
4854 if (len > 0) {
4855 Off_t posn;
4856 if (PL_mmap_page_size <= 0)
4857 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
4858 PL_mmap_page_size);
4859 if (b->posn < 0) {
4860 /*
4861 * This is a hack - should never happen - open should
4862 * have set it !
4863 */
4864 b->posn = PerlIO_tell(PerlIONext(f));
4865 }
4866 posn = (b->posn / PL_mmap_page_size) * PL_mmap_page_size;
4867 len = st.st_size - posn;
4868 m->mptr = (Mmap_t)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
4869 if (m->mptr && m->mptr != (Mmap_t) - 1) {
4870#if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
4871 madvise(m->mptr, len, MADV_SEQUENTIAL);
4872#endif
4873#if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
4874 madvise(m->mptr, len, MADV_WILLNEED);
4875#endif
4876 PerlIOBase(f)->flags =
4877 (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
4878 b->end = ((STDCHAR *) m->mptr) + len;
4879 b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
4880 b->ptr = b->buf;
4881 m->len = len;
4882 }
4883 else {
4884 b->buf = NULL;
4885 }
4886 }
4887 else {
4888 PerlIOBase(f)->flags =
4889 flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
4890 b->buf = NULL;
4891 b->ptr = b->end = b->ptr;
4892 code = -1;
4893 }
4894 }
4895 }
4896 return code;
4897}
4898
4899IV
4900PerlIOMmap_unmap(pTHX_ PerlIO *f)
4901{
4902 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4903 IV code = 0;
4904 if (m->len) {
4905 PerlIOBuf * const b = &m->base;
4906 if (b->buf) {
4907 /* The munmap address argument is tricky: depending on the
4908 * standard it is either "void *" or "caddr_t" (which is
4909 * usually "char *" (signed or unsigned). If we cast it
4910 * to "void *", those that have it caddr_t and an uptight
4911 * C++ compiler, will freak out. But casting it as char*
4912 * should work. Maybe. (Using Mmap_t figured out by
4913 * Configure doesn't always work, apparently.) */
4914 code = munmap((char*)m->mptr, m->len);
4915 b->buf = NULL;
4916 m->len = 0;
4917 m->mptr = NULL;
4918 if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
4919 code = -1;
4920 }
4921 b->ptr = b->end = b->buf;
4922 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4923 }
4924 return code;
4925}
4926
4927STDCHAR *
4928PerlIOMmap_get_base(pTHX_ PerlIO *f)
4929{
4930 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4931 PerlIOBuf * const b = &m->base;
4932 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4933 /*
4934 * Already have a readbuffer in progress
4935 */
4936 return b->buf;
4937 }
4938 if (b->buf) {
4939 /*
4940 * We have a write buffer or flushed PerlIOBuf read buffer
4941 */
4942 m->bbuf = b->buf; /* save it in case we need it again */
4943 b->buf = NULL; /* Clear to trigger below */
4944 }
4945 if (!b->buf) {
4946 PerlIOMmap_map(aTHX_ f); /* Try and map it */
4947 if (!b->buf) {
4948 /*
4949 * Map did not work - recover PerlIOBuf buffer if we have one
4950 */
4951 b->buf = m->bbuf;
4952 }
4953 }
4954 b->ptr = b->end = b->buf;
4955 if (b->buf)
4956 return b->buf;
4957 return PerlIOBuf_get_base(aTHX_ f);
4958}
4959
4960SSize_t
4961PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4962{
4963 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4964 PerlIOBuf * const b = &m->base;
4965 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4966 PerlIO_flush(f);
4967 if (b->ptr && (b->ptr - count) >= b->buf
4968 && memEQ(b->ptr - count, vbuf, count)) {
4969 b->ptr -= count;
4970 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4971 return count;
4972 }
4973 if (m->len) {
4974 /*
4975 * Loose the unwritable mapped buffer
4976 */
4977 PerlIO_flush(f);
4978 /*
4979 * If flush took the "buffer" see if we have one from before
4980 */
4981 if (!b->buf && m->bbuf)
4982 b->buf = m->bbuf;
4983 if (!b->buf) {
4984 PerlIOBuf_get_base(aTHX_ f);
4985 m->bbuf = b->buf;
4986 }
4987 }
4988 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4989}
4990
4991SSize_t
4992PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4993{
4994 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4995 PerlIOBuf * const b = &m->base;
4996
4997 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4998 /*
4999 * No, or wrong sort of, buffer
5000 */
5001 if (m->len) {
5002 if (PerlIOMmap_unmap(aTHX_ f) != 0)
5003 return 0;
5004 }
5005 /*
5006 * If unmap took the "buffer" see if we have one from before
5007 */
5008 if (!b->buf && m->bbuf)
5009 b->buf = m->bbuf;
5010 if (!b->buf) {
5011 PerlIOBuf_get_base(aTHX_ f);
5012 m->bbuf = b->buf;
5013 }
5014 }
5015 return PerlIOBuf_write(aTHX_ f, vbuf, count);
5016}
5017
5018IV
5019PerlIOMmap_flush(pTHX_ PerlIO *f)
5020{
5021 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
5022 PerlIOBuf * const b = &m->base;
5023 IV code = PerlIOBuf_flush(aTHX_ f);
5024 /*
5025 * Now we are "synced" at PerlIOBuf level
5026 */
5027 if (b->buf) {
5028 if (m->len) {
5029 /*
5030 * Unmap the buffer
5031 */
5032 if (PerlIOMmap_unmap(aTHX_ f) != 0)
5033 code = -1;
5034 }
5035 else {
5036 /*
5037 * We seem to have a PerlIOBuf buffer which was not mapped
5038 * remember it in case we need one later
5039 */
5040 m->bbuf = b->buf;
5041 }
5042 }
5043 return code;
5044}
5045
5046IV
5047PerlIOMmap_fill(pTHX_ PerlIO *f)
5048{
5049 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
5050 IV code = PerlIO_flush(f);
5051 if (code == 0 && !b->buf) {
5052 code = PerlIOMmap_map(aTHX_ f);
5053 }
5054 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
5055 code = PerlIOBuf_fill(aTHX_ f);
5056 }
5057 return code;
5058}
5059
5060IV
5061PerlIOMmap_close(pTHX_ PerlIO *f)
5062{
5063 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
5064 PerlIOBuf * const b = &m->base;
5065 IV code = PerlIO_flush(f);
5066 if (m->bbuf) {
5067 b->buf = m->bbuf;
5068 m->bbuf = NULL;
5069 b->ptr = b->end = b->buf;
5070 }
5071 if (PerlIOBuf_close(aTHX_ f) != 0)
5072 code = -1;
5073 return code;
5074}
5075
5076PerlIO *
5077PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
5078{
5079 return PerlIOBase_dup(aTHX_ f, o, param, flags);
5080}
5081
5082
5083PERLIO_FUNCS_DECL(PerlIO_mmap) = {
5084 sizeof(PerlIO_funcs),
5085 "mmap",
5086 sizeof(PerlIOMmap),
5087 PERLIO_K_BUFFERED|PERLIO_K_RAW,
5088 PerlIOBuf_pushed,
5089 PerlIOBuf_popped,
5090 PerlIOBuf_open,
5091 PerlIOBase_binmode, /* binmode */
5092 NULL,
5093 PerlIOBase_fileno,
5094 PerlIOMmap_dup,
5095 PerlIOBuf_read,
5096 PerlIOMmap_unread,
5097 PerlIOMmap_write,
5098 PerlIOBuf_seek,
5099 PerlIOBuf_tell,
5100 PerlIOBuf_close,
5101 PerlIOMmap_flush,
5102 PerlIOMmap_fill,
5103 PerlIOBase_eof,
5104 PerlIOBase_error,
5105 PerlIOBase_clearerr,
5106 PerlIOBase_setlinebuf,
5107 PerlIOMmap_get_base,
5108 PerlIOBuf_bufsiz,
5109 PerlIOBuf_get_ptr,
5110 PerlIOBuf_get_cnt,
5111 PerlIOBuf_set_ptrcnt,
5112};
5113
5114#endif /* HAS_MMAP */
5115
5116PerlIO *
5117Perl_PerlIO_stdin(pTHX)
5118{
5119 dVAR;
5120 if (!PL_perlio) {
5121 PerlIO_stdstreams(aTHX);
5122 }
5123 return (PerlIO*)&PL_perlio[1];
5124}
5125
5126PerlIO *
5127Perl_PerlIO_stdout(pTHX)
5128{
5129 dVAR;
5130 if (!PL_perlio) {
5131 PerlIO_stdstreams(aTHX);
5132 }
5133 return (PerlIO*)&PL_perlio[2];
5134}
5135
5136PerlIO *
5137Perl_PerlIO_stderr(pTHX)
5138{
5139 dVAR;
5140 if (!PL_perlio) {
5141 PerlIO_stdstreams(aTHX);
5142 }
5143 return (PerlIO*)&PL_perlio[3];
5144}
5145
5146/*--------------------------------------------------------------------------------------*/
5147
5148char *
5149PerlIO_getname(PerlIO *f, char *buf)
5150{
5151 dTHX;
5152#ifdef VMS
5153 char *name = NULL;
5154 bool exported = FALSE;
5155 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
5156 if (!stdio) {
5157 stdio = PerlIO_exportFILE(f,0);
5158 exported = TRUE;
5159 }
5160 if (stdio) {
5161 name = fgetname(stdio, buf);
5162 if (exported) PerlIO_releaseFILE(f,stdio);
5163 }
5164 return name;
5165#else
5166 PERL_UNUSED_ARG(f);
5167 PERL_UNUSED_ARG(buf);
5168 Perl_croak(aTHX_ "Don't know how to get file name");
5169 return NULL;
5170#endif
5171}
5172
5173
5174/*--------------------------------------------------------------------------------------*/
5175/*
5176 * Functions which can be called on any kind of PerlIO implemented in
5177 * terms of above
5178 */
5179
5180#undef PerlIO_fdopen
5181PerlIO *
5182PerlIO_fdopen(int fd, const char *mode)
5183{
5184 dTHX;
5185 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
5186}
5187
5188#undef PerlIO_open
5189PerlIO *
5190PerlIO_open(const char *path, const char *mode)
5191{
5192 dTHX;
5193 SV *name = sv_2mortal(newSVpv(path, 0));
5194 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
5195}
5196
5197#undef Perlio_reopen
5198PerlIO *
5199PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
5200{
5201 dTHX;
5202 SV *name = sv_2mortal(newSVpv(path,0));
5203 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
5204}
5205
5206#undef PerlIO_getc
5207int
5208PerlIO_getc(PerlIO *f)
5209{
5210 dTHX;
5211 STDCHAR buf[1];
5212 if ( 1 == PerlIO_read(f, buf, 1) ) {
5213 return (unsigned char) buf[0];
5214 }
5215 return EOF;
5216}
5217
5218#undef PerlIO_ungetc
5219int
5220PerlIO_ungetc(PerlIO *f, int ch)
5221{
5222 dTHX;
5223 if (ch != EOF) {
5224 STDCHAR buf = ch;
5225 if (PerlIO_unread(f, &buf, 1) == 1)
5226 return ch;
5227 }
5228 return EOF;
5229}
5230
5231#undef PerlIO_putc
5232int
5233PerlIO_putc(PerlIO *f, int ch)
5234{
5235 dTHX;
5236 STDCHAR buf = ch;
5237 return PerlIO_write(f, &buf, 1);
5238}
5239
5240#undef PerlIO_puts
5241int
5242PerlIO_puts(PerlIO *f, const char *s)
5243{
5244 dTHX;
5245 return PerlIO_write(f, s, strlen(s));
5246}
5247
5248#undef PerlIO_rewind
5249void
5250PerlIO_rewind(PerlIO *f)
5251{
5252 dTHX;
5253 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
5254 PerlIO_clearerr(f);
5255}
5256
5257#undef PerlIO_vprintf
5258int
5259PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
5260{
5261 dTHX;
5262 SV * sv;
5263 const char *s;
5264 STRLEN len;
5265 SSize_t wrote;
5266#ifdef NEED_VA_COPY
5267 va_list apc;
5268 Perl_va_copy(ap, apc);
5269 sv = vnewSVpvf(fmt, &apc);
5270#else
5271 sv = vnewSVpvf(fmt, &ap);
5272#endif
5273 s = SvPV_const(sv, len);
5274 wrote = PerlIO_write(f, s, len);
5275 SvREFCNT_dec(sv);
5276 return wrote;
5277}
5278
5279#undef PerlIO_printf
5280int
5281PerlIO_printf(PerlIO *f, const char *fmt, ...)
5282{
5283 va_list ap;
5284 int result;
5285 va_start(ap, fmt);
5286 result = PerlIO_vprintf(f, fmt, ap);
5287 va_end(ap);
5288 return result;
5289}
5290
5291#undef PerlIO_stdoutf
5292int
5293PerlIO_stdoutf(const char *fmt, ...)
5294{
5295 dTHX;
5296 va_list ap;
5297 int result;
5298 va_start(ap, fmt);
5299 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5300 va_end(ap);
5301 return result;
5302}
5303
5304#undef PerlIO_tmpfile
5305PerlIO *
5306PerlIO_tmpfile(void)
5307{
5308 dTHX;
5309 PerlIO *f = NULL;
5310#ifdef WIN32
5311 const int fd = win32_tmpfd();
5312 if (fd >= 0)
5313 f = PerlIO_fdopen(fd, "w+b");
5314#else /* WIN32 */
5315# if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5316 int fd = -1;
5317 char tempname[] = "/tmp/PerlIO_XXXXXX";
5318 const char * const tmpdir = PL_tainting ? NULL : PerlEnv_getenv("TMPDIR");
5319 SV * sv = NULL;
5320 /*
5321 * I have no idea how portable mkstemp() is ... NI-S
5322 */
5323 if (tmpdir && *tmpdir) {
5324 /* if TMPDIR is set and not empty, we try that first */
5325 sv = newSVpv(tmpdir, 0);
5326 sv_catpv(sv, tempname + 4);
5327 fd = mkstemp(SvPVX(sv));
5328 }
5329 if (fd < 0) {
5330 sv = NULL;
5331 /* else we try /tmp */
5332 fd = mkstemp(tempname);
5333 }
5334 if (fd >= 0) {
5335 f = PerlIO_fdopen(fd, "w+");
5336 if (f)
5337 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5338 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5339 }
5340 SvREFCNT_dec(sv);
5341# else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5342 FILE * const stdio = PerlSIO_tmpfile();
5343
5344 if (stdio)
5345 f = PerlIO_fdopen(fileno(stdio), "w+");
5346
5347# endif /* else HAS_MKSTEMP */
5348#endif /* else WIN32 */
5349 return f;
5350}
5351
5352#undef HAS_FSETPOS
5353#undef HAS_FGETPOS
5354
5355#endif /* USE_SFIO */
5356#endif /* PERLIO_IS_STDIO */
5357
5358/*======================================================================================*/
5359/*
5360 * Now some functions in terms of above which may be needed even if we are
5361 * not in true PerlIO mode
5362 */
5363const char *
5364Perl_PerlIO_context_layers(pTHX_ const char *mode)
5365{
5366 dVAR;
5367 const char *direction = NULL;
5368 SV *layers;
5369 /*
5370 * Need to supply default layer info from open.pm
5371 */
5372
5373 if (!PL_curcop)
5374 return NULL;
5375
5376 if (mode && mode[0] != 'r') {
5377 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5378 direction = "open>";
5379 } else {
5380 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5381 direction = "open<";
5382 }
5383 if (!direction)
5384 return NULL;
5385
5386 layers = cop_hints_fetch_pvn(PL_curcop, direction, 5, 0, 0);
5387
5388 assert(layers);
5389 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5390}
5391
5392
5393#ifndef HAS_FSETPOS
5394#undef PerlIO_setpos
5395int
5396PerlIO_setpos(PerlIO *f, SV *pos)
5397{
5398 dTHX;
5399 if (SvOK(pos)) {
5400 STRLEN len;
5401 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5402 if (f && len == sizeof(Off_t))
5403 return PerlIO_seek(f, *posn, SEEK_SET);
5404 }
5405 SETERRNO(EINVAL, SS_IVCHAN);
5406 return -1;
5407}
5408#else
5409#undef PerlIO_setpos
5410int
5411PerlIO_setpos(PerlIO *f, SV *pos)
5412{
5413 dTHX;
5414 if (SvOK(pos)) {
5415 STRLEN len;
5416 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5417 if (f && len == sizeof(Fpos_t)) {
5418#if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5419 return fsetpos64(f, fpos);
5420#else
5421 return fsetpos(f, fpos);
5422#endif
5423 }
5424 }
5425 SETERRNO(EINVAL, SS_IVCHAN);
5426 return -1;
5427}
5428#endif
5429
5430#ifndef HAS_FGETPOS
5431#undef PerlIO_getpos
5432int
5433PerlIO_getpos(PerlIO *f, SV *pos)
5434{
5435 dTHX;
5436 Off_t posn = PerlIO_tell(f);
5437 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5438 return (posn == (Off_t) - 1) ? -1 : 0;
5439}
5440#else
5441#undef PerlIO_getpos
5442int
5443PerlIO_getpos(PerlIO *f, SV *pos)
5444{
5445 dTHX;
5446 Fpos_t fpos;
5447 int code;
5448#if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5449 code = fgetpos64(f, &fpos);
5450#else
5451 code = fgetpos(f, &fpos);
5452#endif
5453 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5454 return code;
5455}
5456#endif
5457
5458#if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
5459
5460int
5461vprintf(char *pat, char *args)
5462{
5463 _doprnt(pat, args, stdout);
5464 return 0; /* wrong, but perl doesn't use the return
5465 * value */
5466}
5467
5468int
5469vfprintf(FILE *fd, char *pat, char *args)
5470{
5471 _doprnt(pat, args, fd);
5472 return 0; /* wrong, but perl doesn't use the return
5473 * value */
5474}
5475
5476#endif
5477
5478#ifndef PerlIO_vsprintf
5479int
5480PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
5481{
5482 dTHX;
5483 const int val = my_vsnprintf(s, n > 0 ? n : 0, fmt, ap);
5484 PERL_UNUSED_CONTEXT;
5485
5486#ifndef PERL_MY_VSNPRINTF_GUARDED
5487 if (val < 0 || (n > 0 ? val >= n : 0)) {
5488 Perl_croak(aTHX_ "panic: my_vsnprintf overflow in PerlIO_vsprintf\n");
5489 }
5490#endif
5491 return val;
5492}
5493#endif
5494
5495#ifndef PerlIO_sprintf
5496int
5497PerlIO_sprintf(char *s, int n, const char *fmt, ...)
5498{
5499 va_list ap;
5500 int result;
5501 va_start(ap, fmt);
5502 result = PerlIO_vsprintf(s, n, fmt, ap);
5503 va_end(ap);
5504 return result;
5505}
5506#endif
5507
5508/*
5509 * Local variables:
5510 * c-indentation-style: bsd
5511 * c-basic-offset: 4
5512 * indent-tabs-mode: t
5513 * End:
5514 *
5515 * ex: set ts=8 sts=4 sw=4 noet:
5516 */