3 * Copyright (c) 1996-2006, Nick Ing-Simmons
4 * Copyright (c) 2006, 2007, 2008 Larry Wall and others
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.
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.
14 * [pp.791-792 of _The Lord of the Rings_, V/iii: "The Muster of Rohan"]
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)
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
28 #ifdef PERL_IMPLICIT_SYS
38 # ifndef USE_CROSS_COMPILE
45 #define PERLIO_NOT_STDIO 0
46 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
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
58 #define PERL_IN_PERLIO_C
61 #ifdef PERL_IMPLICIT_CONTEXT
69 /* Missing proto on LynxOS */
73 #define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
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; \
82 return PerlIOBase_ ## base args; \
85 SETERRNO(EBADF, SS_IVCHAN); \
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); \
97 SETERRNO(EBADF, SS_IVCHAN); \
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; \
107 PerlIOBase_ ## base args; \
110 SETERRNO(EBADF, SS_IVCHAN)
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; \
119 SETERRNO(EINVAL, LIB_INVARG); \
122 SETERRNO(EBADF, SS_IVCHAN)
124 #if defined(__osf__) && _XOPEN_SOURCE < 500
125 extern int fseeko(FILE *, off_t, int);
126 extern off_t ftello(FILE *);
131 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
134 perlsio_binmode(FILE *fp, int iotype, int mode)
137 * This used to be contents of do_binmode in doio.c
140 # if defined(atarist)
141 PERL_UNUSED_ARG(iotype);
144 ((FILE *) fp)->_flag |= _IOBIN;
146 ((FILE *) fp)->_flag &= ~_IOBIN;
152 PERL_UNUSED_ARG(iotype);
154 if (PerlLIO_setmode(fp, mode) != -1) {
156 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
164 # if defined(USEMYBINMODE)
166 # if defined(__CYGWIN__)
167 PERL_UNUSED_ARG(iotype);
169 if (my_binmode(fp, iotype, mode) != FALSE)
175 PERL_UNUSED_ARG(iotype);
176 PERL_UNUSED_ARG(mode);
184 #define O_ACCMODE 3 /* Assume traditional implementation */
188 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
190 const int result = rawmode & O_ACCMODE;
195 ptype = IoTYPE_RDONLY;
198 ptype = IoTYPE_WRONLY;
206 *writing = (result != O_RDONLY);
208 if (result == O_RDONLY) {
212 else if (rawmode & O_APPEND) {
214 if (result != O_WRONLY)
219 if (result == O_WRONLY)
226 if (rawmode & O_BINARY)
232 #ifndef PERLIO_LAYERS
234 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
236 if (!names || !*names
237 || strEQ(names, ":crlf")
238 || strEQ(names, ":raw")
239 || strEQ(names, ":bytes")
243 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
251 PerlIO_destruct(pTHX)
256 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
259 PERL_UNUSED_ARG(iotype);
260 PERL_UNUSED_ARG(mode);
261 PERL_UNUSED_ARG(names);
264 return perlsio_binmode(fp, iotype, mode);
269 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
271 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
274 #ifdef PERL_IMPLICIT_SYS
275 return PerlSIO_fdupopen(f);
278 return win32_fdupopen(f);
281 const int fd = PerlLIO_dup(PerlIO_fileno(f));
285 const int omode = djgpp_get_stream_mode(f);
287 const int omode = fcntl(fd, F_GETFL);
289 PerlIO_intmode2str(omode,mode,NULL);
290 /* the r+ is a hack */
291 return PerlIO_fdopen(fd, mode);
296 SETERRNO(EBADF, SS_IVCHAN);
306 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
310 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
311 int imode, int perm, PerlIO *old, int narg, SV **args)
315 Perl_croak(aTHX_ "More than one argument to open");
317 if (*args == &PL_sv_undef)
318 return PerlIO_tmpfile();
320 const char *name = SvPV_nolen_const(*args);
321 if (*mode == IoTYPE_NUMERIC) {
322 fd = PerlLIO_open3(name, imode, perm);
324 return PerlIO_fdopen(fd, mode + 1);
327 return PerlIO_reopen(name, mode, old);
330 return PerlIO_open(name, mode);
335 return PerlIO_fdopen(fd, (char *) mode);
340 XS(XS_PerlIO__Layer__find)
344 Perl_croak(aTHX_ "Usage class->find(name[,load])");
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;
355 Perl_boot_core_PerlIO(pTHX)
357 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
363 #ifdef PERLIO_IS_STDIO
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
377 #undef PerlIO_tmpfile
384 #else /* PERLIO_IS_STDIO */
392 * This section is just to make sure these functions get pulled in from
396 #undef PerlIO_tmpfile
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
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
418 sfset(sfstdout, SF_SHARE, 0);
421 /* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
423 PerlIO_importFILE(FILE *stdio, const char *mode)
425 const int fd = fileno(stdio);
426 if (!mode || !*mode) {
429 return PerlIO_fdopen(fd, mode);
433 PerlIO_findFILE(PerlIO *pio)
435 const int fd = PerlIO_fileno(pio);
436 FILE * const f = fdopen(fd, "r+");
438 if (!f && errno == EINVAL)
440 if (!f && errno == EINVAL)
447 /*======================================================================================*/
449 * Implement all the PerlIO interface ourselves.
455 #include <sys/mman.h>
459 PerlIO_debug(const char *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");
469 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
471 PL_perlio_debug_fd = -1;
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;
478 if (PL_perlio_debug_fd > 0) {
481 const char * const s = CopFILE(PL_curcop);
482 /* Use fixed buffer as sv_catpvf etc. needs SVs */
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);
488 const char *s = CopFILE(PL_curcop);
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);
494 s = SvPV_const(sv, len);
495 PerlLIO_write(PL_perlio_debug_fd, s, len);
502 /*--------------------------------------------------------------------------------------*/
505 * Inner level routines
508 /* check that the head field of each layer points back to the head */
511 # define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
513 PerlIO_verify_head(pTHX_ PerlIO *f)
519 p = head = PerlIOBase(f)->head;
522 assert(p->head == head);
523 if (p == (PerlIOl*)f)
530 # define VERIFY_HEAD(f)
535 * Table of pointers to the PerlIO structs (malloc'ed)
537 #define PERLIO_TABLE_SIZE 64
540 PerlIO_init_table(pTHX)
544 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
550 PerlIO_allocate(pTHX)
554 * Find a free slot in the table, allocating new table as necessary
559 while ((f = *last)) {
561 last = (PerlIOl **) (f);
562 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
563 if (!((++f)->next)) {
564 f->flags = 0; /* lockcnt */
571 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
575 *last = (PerlIOl*) f++;
576 f->flags = 0; /* lockcnt */
582 #undef PerlIO_fdupopen
584 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
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);
590 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
592 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
596 SETERRNO(EBADF, SS_IVCHAN);
602 PerlIO_cleantable(pTHX_ PerlIOl **tablep)
604 PerlIOl * const table = *tablep;
607 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
608 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
609 PerlIOl * const f = table + i;
611 PerlIO_close(&(f->next));
621 PerlIO_list_alloc(pTHX)
625 Newxz(list, 1, PerlIO_list_t);
631 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
634 if (--list->refcnt == 0) {
637 for (i = 0; i < list->cur; i++)
638 SvREFCNT_dec(list->array[i].arg);
639 Safefree(list->array);
647 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
653 if (list->cur >= list->len) {
656 Renew(list->array, list->len, PerlIO_pair_t);
658 Newx(list->array, list->len, PerlIO_pair_t);
660 p = &(list->array[list->cur++]);
662 if ((p->arg = arg)) {
663 SvREFCNT_inc_simple_void_NN(arg);
668 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
670 PerlIO_list_t *list = NULL;
673 list = PerlIO_list_alloc(aTHX);
674 for (i=0; i < proto->cur; i++) {
675 SV *arg = proto->array[i].arg;
678 arg = sv_dup(arg, param);
680 PERL_UNUSED_ARG(param);
682 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
689 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
692 PerlIOl **table = &proto->Iperlio;
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)) {
701 table = (PerlIOl **) (f++);
702 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
704 (void) fp_dup(&(f->next), 0, param);
711 PERL_UNUSED_ARG(proto);
712 PERL_UNUSED_ARG(param);
717 PerlIO_destruct(pTHX)
720 PerlIOl **table = &PL_perlio;
723 PerlIO_debug("Destruct %p\n",(void*)aTHX);
725 while ((f = *table)) {
727 table = (PerlIOl **) (f++);
728 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
729 PerlIO *x = &(f->next);
732 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
733 PerlIO_debug("Destruct popping %s\n", l->tab->name);
747 PerlIO_pop(pTHX_ PerlIO *f)
749 const PerlIOl *l = *f;
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) {
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
760 if ((*l->tab->Popped) (aTHX_ f) != 0)
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;
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. */
783 PerlIO_get_layers(pTHX_ PerlIO *f)
786 AV * const av = newAV();
788 if (PerlIOValid(f)) {
789 PerlIOl *l = PerlIOBase(f);
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;
803 av_push(av, newSViv((IV)l->flags));
811 /*--------------------------------------------------------------------------------------*/
813 * XS Interface for perl code
817 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
821 if ((SSize_t) len <= 0)
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);
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");
836 SV * const pkgsv = newSVpvs("PerlIO");
837 SV * const layer = newSVpvn(name, len);
838 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
840 SAVEBOOL(PL_in_load_module);
842 SAVEGENERICSV(PL_warnhook);
843 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
845 PL_in_load_module = TRUE;
847 * The two SVs are magically freed by load_module
849 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
851 return PerlIO_find_layer(aTHX_ name, len, 0);
854 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
858 #ifdef USE_ATTRIBUTES_FOR_PERLIO
861 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
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);
874 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
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);
887 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
889 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
894 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
896 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
900 MGVTBL perlio_vtab = {
908 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
911 SV * const sv = SvRV(ST(1));
912 AV * const av = newAV();
916 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
918 mg = mg_find(sv, PERL_MAGIC_ext);
919 mg->mg_virtual = &perlio_vtab;
921 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
922 for (i = 2; i < items; i++) {
924 const char * const name = SvPV_const(ST(i), len);
925 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
927 av_push(av, SvREFCNT_inc_simple_NN(layer));
938 #endif /* USE_ATTIBUTES_FOR_PERLIO */
941 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
943 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
944 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
948 XS(XS_PerlIO__Layer__NoWarnings)
950 /* This is used as a %SIG{__WARN__} handler to suppress warnings
951 during loading of layers.
957 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
961 XS(XS_PerlIO__Layer__find)
967 Perl_croak(aTHX_ "Usage class->find(name[,load])");
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);
974 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
981 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
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);
991 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
995 const char *s = names;
997 while (isSPACE(*s) || *s == ':')
1002 const char *as = NULL;
1004 if (!isIDFIRST(*s)) {
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.
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",
1014 SETERRNO(EINVAL, LIB_INVARG);
1019 } while (isALNUM(*e));
1028 alen = (e - 1) - as;
1035 * It's a nul terminated string, not allowed
1036 * to \ the terminating null. Anything other
1037 * character is passed over.
1047 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1048 "Argument list not closed for PerlIO layer \"%.*s\"",
1060 PerlIO_funcs * const layer =
1061 PerlIO_find_layer(aTHX_ s, llen, 1);
1065 arg = newSVpvn(as, alen);
1066 PerlIO_list_push(aTHX_ av, layer,
1067 (arg) ? arg : &PL_sv_undef);
1071 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1084 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1087 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1088 #ifdef PERLIO_USING_CRLF
1091 if (PerlIO_stdio.Set_ptrcnt)
1092 tab = &PerlIO_stdio;
1094 PerlIO_debug("Pushing %s\n", tab->name);
1095 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1100 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1102 return av->array[n].arg;
1106 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
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;
1114 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1119 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1121 PERL_UNUSED_ARG(mode);
1122 PERL_UNUSED_ARG(arg);
1123 PERL_UNUSED_ARG(tab);
1124 if (PerlIOValid(f)) {
1126 PerlIO_pop(aTHX_ f);
1132 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1133 sizeof(PerlIO_funcs),
1136 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1156 NULL, /* get_base */
1157 NULL, /* get_bufsiz */
1160 NULL, /* set_ptrcnt */
1164 PerlIO_default_layers(pTHX)
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));
1173 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1175 osLayer = &PerlIO_win32;
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));
1183 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_mmap));
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),
1192 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1195 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1198 if (PL_def_layerlist->cur < 2) {
1199 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1201 return PL_def_layerlist;
1205 Perl_boot_core_PerlIO(pTHX)
1207 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1208 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1211 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1212 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1216 PerlIO_default_layer(pTHX_ I32 n)
1219 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1222 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1225 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1226 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1229 PerlIO_stdstreams(pTHX)
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);
1241 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1244 if (tab->fsize != sizeof(PerlIO_funcs)) {
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) );
1252 if (tab->size < sizeof(PerlIOl)) {
1254 "%s (%"UVuf") smaller than %s (%"UVuf")",
1255 "PerlIO layer instance size", (UV)tab->size,
1256 "size expected by this perl", (UV)sizeof(PerlIOl) );
1258 /* Real layer with a data area */
1261 Newxz(temp, tab->size, char);
1265 l->tab = (PerlIO_funcs*) tab;
1266 l->head = ((PerlIOl*)f)->head;
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 &&
1273 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1274 PerlIO_pop(aTHX_ 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);
1287 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1295 PerlIOBase_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)
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) {
1308 SETERRNO(EINVAL, LIB_INVARG);
1313 PerlIOBase_binmode(pTHX_ PerlIO *f)
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;
1322 /* Not suitable - pop it */
1323 PerlIO_pop(aTHX_ f);
1331 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1333 PERL_UNUSED_ARG(mode);
1334 PERL_UNUSED_ARG(arg);
1335 PERL_UNUSED_ARG(tab);
1337 if (PerlIOValid(f)) {
1342 * Strip all layers that are not suitable for a raw stream
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) {
1350 /* Layer still there - move down a layer */
1359 /* No handler - pop it */
1360 PerlIO_pop(aTHX_ t);
1363 if (PerlIOValid(f)) {
1364 PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1365 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)");
1373 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1374 PerlIO_list_t *layers, IV n, IV max)
1378 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1380 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1391 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1395 save_scalar(PL_errgv);
1397 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1398 code = PerlIO_parse_layers(aTHX_ layers, names);
1400 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1402 PerlIO_list_free(aTHX_ layers);
1409 /*--------------------------------------------------------------------------------------*/
1411 * Given the abstraction above the public API functions
1415 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
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)");
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.
1428 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
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.
1436 if (!(mode & O_BINARY)) {
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
1443 /* Perhaps we should turn on bottom-most aware layer
1444 e.g. Ilya's idea that UNIX TTY could serve
1446 if (PerlIOBase(f)->tab &&
1447 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1449 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1450 /* Not in text mode - flush any pending stuff and flip it */
1452 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1454 /* Only need to turn it on in one layer so we are done */
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
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().
1469 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1474 PerlIO__close(pTHX_ PerlIO *f)
1476 if (PerlIOValid(f)) {
1477 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1478 if (tab && tab->Close)
1479 return (*tab->Close)(aTHX_ f);
1481 return PerlIOBase_close(aTHX_ f);
1484 SETERRNO(EBADF, SS_IVCHAN);
1490 Perl_PerlIO_close(pTHX_ PerlIO *f)
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 */
1503 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1506 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1510 static PerlIO_funcs *
1511 PerlIO_layer_from_ref(pTHX_ SV *sv)
1515 * For any scalar type load the handler which is bundled with perl
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 */
1522 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1527 * For other types allow if layer is known but don't try and load it
1529 switch (SvTYPE(sv)) {
1531 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1533 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1535 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1537 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1544 PerlIO_resolve_layers(pTHX_ const char *layers,
1545 const char *mode, int narg, SV **args)
1548 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1551 PerlIO_stdstreams(aTHX);
1553 SV * const arg = *args;
1555 * If it is a reference but not an object see if we have a handler
1558 if (SvROK(arg) && !sv_isobject(arg)) {
1559 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1561 def = PerlIO_list_alloc(aTHX);
1562 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1566 * Don't fail if handler cannot be found :via(...) etc. may do
1567 * something sensible else we will just stringfy and open
1572 if (!layers || !*layers)
1573 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1574 if (layers && *layers) {
1577 av = PerlIO_clone_list(aTHX_ def, NULL);
1582 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1586 PerlIO_list_free(aTHX_ av);
1598 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1599 int imode, int perm, PerlIO *f, int narg, SV **args)
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);
1611 PerlIO_list_t *layera;
1613 PerlIO_funcs *tab = NULL;
1614 if (PerlIOValid(f)) {
1616 * This is "reopen" - it is not tested as perl does not use it
1620 layera = PerlIO_list_alloc(aTHX);
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);
1628 l = *PerlIONext(&l);
1632 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1638 * Start at "top" of layer stack
1640 n = layera->cur - 1;
1642 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1651 * Found that layer 'n' can do opens - call it
1653 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1654 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
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);
1660 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1663 SETERRNO(EINVAL, LIB_INVARG);
1667 if (n + 1 < layera->cur) {
1669 * More layers above the one that we used to open -
1672 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1673 /* If pushing layers fails close the file */
1680 PerlIO_list_free(aTHX_ layera);
1687 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1689 PERL_ARGS_ASSERT_PERLIO_READ;
1691 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1695 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1697 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1699 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1703 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1705 PERL_ARGS_ASSERT_PERLIO_WRITE;
1707 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1711 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1713 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1717 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1719 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1723 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1728 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1730 if (tab && tab->Flush)
1731 return (*tab->Flush) (aTHX_ f);
1733 return 0; /* If no Flush defined, silently succeed. */
1736 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1737 SETERRNO(EBADF, SS_IVCHAN);
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
1749 PerlIOl **table = &PL_perlio;
1752 while ((ff = *table)) {
1754 table = (PerlIOl **) (ff++);
1755 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1756 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1766 PerlIOBase_flush_linebuf(pTHX)
1769 PerlIOl **table = &PL_perlio;
1771 while ((f = *table)) {
1773 table = (PerlIOl **) (f++);
1774 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1776 && (PerlIOBase(&(f->next))->
1777 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1778 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1779 PerlIO_flush(&(f->next));
1786 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1788 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1792 PerlIO_isutf8(PerlIO *f)
1795 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1797 SETERRNO(EBADF, SS_IVCHAN);
1803 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1805 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1809 Perl_PerlIO_error(pTHX_ PerlIO *f)
1811 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1815 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1817 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1821 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1823 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1827 PerlIO_has_base(PerlIO *f)
1829 if (PerlIOValid(f)) {
1830 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1833 return (tab->Get_base != NULL);
1840 PerlIO_fast_gets(PerlIO *f)
1842 if (PerlIOValid(f)) {
1843 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1844 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1847 return (tab->Set_ptrcnt != NULL);
1855 PerlIO_has_cntptr(PerlIO *f)
1857 if (PerlIOValid(f)) {
1858 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1861 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1868 PerlIO_canset_cnt(PerlIO *f)
1870 if (PerlIOValid(f)) {
1871 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1874 return (tab->Set_ptrcnt != NULL);
1881 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1883 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1887 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1889 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1893 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1895 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1899 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1901 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1905 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1907 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1911 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1913 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1917 /*--------------------------------------------------------------------------------------*/
1919 * utf8 and raw dummy layers
1923 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
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;
1932 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1938 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1939 sizeof(PerlIO_funcs),
1942 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1962 NULL, /* get_base */
1963 NULL, /* get_bufsiz */
1966 NULL, /* set_ptrcnt */
1969 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1970 sizeof(PerlIO_funcs),
1973 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1993 NULL, /* get_base */
1994 NULL, /* get_bufsiz */
1997 NULL, /* set_ptrcnt */
2000 PERLIO_FUNCS_DECL(PerlIO_raw) = {
2001 sizeof(PerlIO_funcs),
2024 NULL, /* get_base */
2025 NULL, /* get_bufsiz */
2028 NULL, /* set_ptrcnt */
2030 /*--------------------------------------------------------------------------------------*/
2031 /*--------------------------------------------------------------------------------------*/
2033 * "Methods" of the "base class"
2037 PerlIOBase_fileno(pTHX_ PerlIO *f)
2039 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
2043 PerlIO_modestr(PerlIO * f, char *buf)
2046 if (PerlIOValid(f)) {
2047 const IV flags = PerlIOBase(f)->flags;
2048 if (flags & PERLIO_F_APPEND) {
2050 if (flags & PERLIO_F_CANREAD) {
2054 else if (flags & PERLIO_F_CANREAD) {
2056 if (flags & PERLIO_F_CANWRITE)
2059 else if (flags & PERLIO_F_CANWRITE) {
2061 if (flags & PERLIO_F_CANREAD) {
2065 #ifdef PERLIO_USING_CRLF
2066 if (!(flags & PERLIO_F_CRLF))
2076 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2078 PerlIOl * const l = PerlIOBase(f);
2079 PERL_UNUSED_CONTEXT;
2080 PERL_UNUSED_ARG(arg);
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;
2087 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2091 l->flags |= PERLIO_F_CANREAD;
2094 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2097 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2100 SETERRNO(EINVAL, LIB_INVARG);
2106 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2109 l->flags &= ~PERLIO_F_CRLF;
2112 l->flags |= PERLIO_F_CRLF;
2115 SETERRNO(EINVAL, LIB_INVARG);
2122 l->flags |= l->next->flags &
2123 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
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));
2136 PerlIOBase_popped(pTHX_ PerlIO *f)
2138 PERL_UNUSED_CONTEXT;
2144 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2147 * Save the position as current head considers it
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);
2156 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2158 STDCHAR *buf = (STDCHAR *) vbuf;
2160 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2161 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2162 SETERRNO(EBADF, SS_IVCHAN);
2168 SSize_t avail = PerlIO_get_cnt(f);
2171 take = ((SSize_t)count < avail) ? (SSize_t)count : avail;
2173 STDCHAR *ptr = PerlIO_get_ptr(f);
2174 Copy(ptr, buf, take, STDCHAR);
2175 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2178 if (avail == 0) /* set_ptrcnt could have reset avail */
2181 if (count > 0 && avail <= 0) {
2182 if (PerlIO_fill(f) != 0)
2187 return (buf - (STDCHAR *) vbuf);
2193 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2195 PERL_UNUSED_CONTEXT;
2201 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2203 PERL_UNUSED_CONTEXT;
2209 PerlIOBase_close(pTHX_ PerlIO *f)
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)
2225 PerlIOBase(n)->flags &=
2226 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2232 SETERRNO(EBADF, SS_IVCHAN);
2238 PerlIOBase_eof(pTHX_ PerlIO *f)
2240 PERL_UNUSED_CONTEXT;
2241 if (PerlIOValid(f)) {
2242 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2248 PerlIOBase_error(pTHX_ PerlIO *f)
2250 PERL_UNUSED_CONTEXT;
2251 if (PerlIOValid(f)) {
2252 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2258 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2260 if (PerlIOValid(f)) {
2261 PerlIO * const n = PerlIONext(f);
2262 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2269 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2271 PERL_UNUSED_CONTEXT;
2272 if (PerlIOValid(f)) {
2273 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2278 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2284 arg = sv_dup(arg, param);
2285 SvREFCNT_inc_simple_void_NN(arg);
2289 return newSVsv(arg);
2292 PERL_UNUSED_ARG(param);
2293 return newSVsv(arg);
2298 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
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);
2306 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2309 PerlIO_funcs * const self = PerlIOBase(o)->tab;
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;
2325 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2327 /* Must be called with PL_perlio_mutex locked. */
2329 S_more_refcounted_fds(pTHX_ const int new_fd) {
2331 const int old_max = PL_perlio_fd_refcnt_size;
2332 const int new_max = 16 + (new_fd & ~15);
2335 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2336 old_max, new_fd, new_max);
2338 if (new_fd < old_max) {
2342 assert (new_max > new_fd);
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));
2350 MUTEX_UNLOCK(&PL_perlio_mutex);
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));
2358 PL_perlio_fd_refcnt_size = new_max;
2359 PL_perlio_fd_refcnt = new_array;
2361 PerlIO_debug("Zeroing %p, %d\n",
2362 (void*)(new_array + old_max),
2365 Zero(new_array + old_max, new_max - old_max, int);
2372 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2373 PERL_UNUSED_CONTEXT;
2377 PerlIOUnix_refcnt_inc(int fd)
2384 MUTEX_LOCK(&PL_perlio_mutex);
2386 if (fd >= PL_perlio_fd_refcnt_size)
2387 S_more_refcounted_fds(aTHX_ fd);
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]);
2395 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2396 fd, PL_perlio_fd_refcnt[fd]);
2399 MUTEX_UNLOCK(&PL_perlio_mutex);
2402 /* diag_listed_as: refcnt_inc: fd %d%s */
2403 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2408 PerlIOUnix_refcnt_dec(int fd)
2415 MUTEX_LOCK(&PL_perlio_mutex);
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);
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]);
2427 cnt = --PL_perlio_fd_refcnt[fd];
2428 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2430 MUTEX_UNLOCK(&PL_perlio_mutex);
2433 /* diag_listed_as: refcnt_dec: fd %d%s */
2434 Perl_croak(aTHX_ "refcnt_dec: fd %d < 0\n", fd);
2440 PerlIOUnix_refcnt(int fd)
2447 MUTEX_LOCK(&PL_perlio_mutex);
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);
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]);
2459 cnt = PL_perlio_fd_refcnt[fd];
2461 MUTEX_UNLOCK(&PL_perlio_mutex);
2464 /* diag_listed_as: refcnt: fd %d%s */
2465 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2471 PerlIO_cleanup(pTHX)
2476 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2478 PerlIO_debug("Cleanup layers\n");
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);
2489 if (PL_known_layers) {
2490 PerlIO_list_free(aTHX_ PL_known_layers);
2491 PL_known_layers = NULL;
2493 if (PL_def_layerlist) {
2494 PerlIO_list_free(aTHX_ PL_def_layerlist);
2495 PL_def_layerlist = NULL;
2499 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
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) :-(.
2510 /* By now all filehandles should have been closed, so any
2511 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2513 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2514 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2515 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2517 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2518 if (PL_perlio_fd_refcnt[i]) {
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);
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;
2539 /*--------------------------------------------------------------------------------------*/
2541 * Bottom-most level for UNIX-like case
2545 struct _PerlIO base; /* The generic part */
2546 int fd; /* UNIX like file descriptor */
2547 int oflags; /* open/fcntl flags */
2551 S_lockcnt_dec(pTHX_ const void* f)
2553 PerlIO_lockcnt((PerlIO*)f)--;
2557 /* call the signal handler, and if that handler happens to clear
2558 * this handle, free what we can and return true */
2561 S_perlio_async_run(pTHX_ PerlIO* f) {
2563 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2564 PerlIO_lockcnt(f)++;
2566 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) )
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))
2575 const PerlIOl *l = *f;
2583 PerlIOUnix_oflags(const char *mode)
2586 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2591 if (*++mode == '+') {
2598 oflags = O_CREAT | O_TRUNC;
2599 if (*++mode == '+') {
2608 oflags = O_CREAT | O_APPEND;
2609 if (*++mode == '+') {
2622 else if (*mode == 't') {
2624 oflags &= ~O_BINARY;
2628 * Always open in binary mode
2631 if (*mode || oflags == -1) {
2632 SETERRNO(EINVAL, LIB_INVARG);
2639 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2641 PERL_UNUSED_CONTEXT;
2642 return PerlIOSelf(f, PerlIOUnix)->fd;
2646 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2648 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
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;
2657 PerlIO_debug("%d _is_ a regular file\n",fd);
2663 PerlIOUnix_refcnt_inc(fd);
2664 PERL_UNUSED_CONTEXT;
2668 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
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));
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?
2679 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2680 mode ? PerlIOUnix_oflags(mode) : -1);
2682 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2688 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2690 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2692 PERL_UNUSED_CONTEXT;
2693 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2695 SETERRNO(ESPIPE, LIB_INVARG);
2697 SETERRNO(EINVAL, LIB_INVARG);
2701 new_loc = PerlLIO_lseek(fd, offset, whence);
2702 if (new_loc == (Off_t) - 1)
2704 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2709 PerlIOUnix_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)
2713 if (PerlIOValid(f)) {
2714 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2715 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2718 if (*mode == IoTYPE_NUMERIC)
2721 imode = PerlIOUnix_oflags(mode);
2723 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2729 const char *path = SvPV_nolen_const(*args);
2730 fd = PerlLIO_open3(path, imode, perm);
2734 if (*mode == IoTYPE_IMPLICIT)
2737 f = PerlIO_allocate(aTHX);
2739 if (!PerlIOValid(f)) {
2740 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
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);
2754 * FIXME: pop layers ???
2762 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2764 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2766 if (flags & PERLIO_DUP_FD) {
2767 fd = PerlLIO_dup(fd);
2770 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2772 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2773 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2782 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2786 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2788 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2789 #ifdef PERLIO_STD_SPECIAL
2791 return PERLIO_STD_IN(fd, vbuf, count);
2793 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2794 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2798 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2799 if (len >= 0 || errno != EINTR) {
2801 if (errno != EAGAIN) {
2802 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2805 else if (len == 0 && count != 0) {
2806 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2812 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2819 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2823 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
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);
2831 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2832 if (len >= 0 || errno != EINTR) {
2834 if (errno != EAGAIN) {
2835 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2841 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2848 PerlIOUnix_tell(pTHX_ PerlIO *f)
2850 PERL_UNUSED_CONTEXT;
2852 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2857 PerlIOUnix_close(pTHX_ PerlIO *f)
2860 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2862 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2863 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2864 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2869 SETERRNO(EBADF,SS_IVCHAN);
2872 while (PerlLIO_close(fd) != 0) {
2873 if (errno != EINTR) {
2878 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2882 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2887 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2888 sizeof(PerlIO_funcs),
2895 PerlIOBase_binmode, /* binmode */
2905 PerlIOBase_noop_ok, /* flush */
2906 PerlIOBase_noop_fail, /* fill */
2909 PerlIOBase_clearerr,
2910 PerlIOBase_setlinebuf,
2911 NULL, /* get_base */
2912 NULL, /* get_bufsiz */
2915 NULL, /* set_ptrcnt */
2918 /*--------------------------------------------------------------------------------------*/
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
2927 #define STDIO_BUFFER_WRITABLE
2932 struct _PerlIO base;
2933 FILE *stdio; /* The stream */
2937 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2939 PERL_UNUSED_CONTEXT;
2941 if (PerlIOValid(f)) {
2942 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2944 return PerlSIO_fileno(s);
2951 PerlIOStdio_mode(const char *mode, char *tmode)
2953 char * const ret = tmode;
2959 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2967 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
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);
2977 const int fd = PerlIO_fileno(n);
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));
2991 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2996 PerlIO_importFILE(FILE *stdio, const char *mode)
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.
3007 Note that the errno value set by a failing fdopen
3008 varies between stdio implementations.
3010 const int fd = PerlLIO_dup(fileno(stdio));
3011 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
3013 f2 = PerlSIO_fdopen(fd, (mode = "w"));
3016 f2 = PerlSIO_fdopen(fd, (mode = "r"));
3019 /* Don't seem to be able to open */
3025 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
3026 s = PerlIOSelf(f, PerlIOStdio);
3028 PerlIOUnix_refcnt_inc(fileno(stdio));
3035 PerlIOStdio_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)
3040 if (PerlIOValid(f)) {
3041 const char * const path = SvPV_nolen_const(*args);
3042 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3044 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3045 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
3050 PerlIOUnix_refcnt_inc(fileno(s->stdio));
3055 const char * const path = SvPV_nolen_const(*args);
3056 if (*mode == IoTYPE_NUMERIC) {
3058 fd = PerlLIO_open3(path, imode, perm);
3062 bool appended = FALSE;
3064 /* Cygwin wants its 'b' early. */
3066 mode = PerlIOStdio_mode(mode, tmode);
3068 stdio = PerlSIO_fopen(path, mode);
3071 f = PerlIO_allocate(aTHX);
3074 mode = PerlIOStdio_mode(mode, tmode);
3075 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3077 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3078 PerlIOUnix_refcnt_inc(fileno(stdio));
3080 PerlSIO_fclose(stdio);
3092 if (*mode == IoTYPE_IMPLICIT) {
3099 stdio = PerlSIO_stdin;
3102 stdio = PerlSIO_stdout;
3105 stdio = PerlSIO_stderr;
3110 stdio = PerlSIO_fdopen(fd, mode =
3111 PerlIOStdio_mode(mode, tmode));
3115 f = PerlIO_allocate(aTHX);
3117 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3118 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3119 PerlIOUnix_refcnt_inc(fileno(stdio));
3129 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3131 /* This assumes no layers underneath - which is what
3132 happens, but is not how I remember it. NI-S 2001/10/16
3134 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3135 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3136 const int fd = fileno(stdio);
3138 if (flags & PERLIO_DUP_FD) {
3139 const int dfd = PerlLIO_dup(fileno(stdio));
3141 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3146 /* FIXME: To avoid messy error recovery if dup fails
3147 re-use the existing stdio as though flag was not set
3151 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3153 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3155 PerlIOUnix_refcnt_inc(fileno(stdio));
3162 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3164 PERL_UNUSED_CONTEXT;
3166 /* XXX this could use PerlIO_canset_fileno() and
3167 * PerlIO_set_fileno() support from Configure
3169 # if defined(__UCLIBC__)
3170 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3173 # elif defined(__GLIBC__)
3174 /* There may be a better way for GLIBC:
3175 - libio.h defines a flag to not close() on cleanup
3179 # elif defined(__sun__)
3182 # elif defined(__hpux)
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.]
3191 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
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;
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;
3208 # elif defined(__EMX__)
3209 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
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;
3219 # elif defined(WIN32)
3220 # if defined(UNDER_CE)
3221 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3230 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3231 (which isn't thread safe) instead
3233 # error "Don't know how to set FILE.fileno on your platform"
3241 PerlIOStdio_close(pTHX_ PerlIO *f)
3243 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3249 const int fd = fileno(stdio);
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.
3263 Sock_size_t optlen = sizeof(int);
3264 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
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 */
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 */
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 *
3286 result = PerlIO_flush(f);
3288 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
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) */
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.
3307 Except that correctness trumps speed.
3308 Advice from klortho #11912. */
3310 dupfd = PerlLIO_dup(fd);
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. */
3321 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3323 result = PerlSIO_fclose(stdio);
3324 /* We treat error from stdio as success if we invalidated
3325 errno may NOT be expected EBADF
3327 if (invalidate && result != 0) {
3331 #ifdef SOCKS5_VERSION_NAME
3332 /* in SOCKS' case, let close() determine return value */
3336 PerlLIO_dup2(dupfd,fd);
3337 PerlLIO_close(dupfd);
3339 MUTEX_UNLOCK(&PL_perlio_mutex);
3347 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3352 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3354 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3357 STDCHAR *buf = (STDCHAR *) vbuf;
3359 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3360 * stdio does not do that for fread()
3362 const int ch = PerlSIO_fgetc(s);
3369 got = PerlSIO_fread(vbuf, 1, count, s);
3370 if (got == 0 && PerlSIO_ferror(s))
3372 if (got >= 0 || errno != EINTR)
3374 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3376 SETERRNO(0,0); /* just in case */
3382 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3385 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
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;
3395 if (avail > count) {
3399 Move(buf-avail,ptr,avail,STDCHAR);
3402 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3403 if (PerlSIO_feof(s) && unread >= 0)
3404 PerlSIO_clearerr(s);
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
3414 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3415 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3417 const int ch = *--buf & 0xFF;
3418 if (ungetc(ch,s) != ch) {
3419 /* ungetc did not work */
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 */
3434 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3440 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3444 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3447 got = PerlSIO_fwrite(vbuf, 1, count,
3448 PerlIOSelf(f, PerlIOStdio)->stdio);
3449 if (got >= 0 || errno != EINTR)
3451 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3453 SETERRNO(0,0); /* just in case */
3459 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3461 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3462 PERL_UNUSED_CONTEXT;
3464 return PerlSIO_fseek(stdio, offset, whence);
3468 PerlIOStdio_tell(pTHX_ PerlIO *f)
3470 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3471 PERL_UNUSED_CONTEXT;
3473 return PerlSIO_ftell(stdio);
3477 PerlIOStdio_flush(pTHX_ PerlIO *f)
3479 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3480 PERL_UNUSED_CONTEXT;
3482 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3483 return PerlSIO_fflush(stdio);
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
3495 * Not writeable - sync by attempting a seek
3498 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3506 PerlIOStdio_eof(pTHX_ PerlIO *f)
3508 PERL_UNUSED_CONTEXT;
3510 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3514 PerlIOStdio_error(pTHX_ PerlIO *f)
3516 PERL_UNUSED_CONTEXT;
3518 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3522 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3524 PERL_UNUSED_CONTEXT;
3526 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3530 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3532 PERL_UNUSED_CONTEXT;
3534 #ifdef HAS_SETLINEBUF
3535 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3537 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3543 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3545 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3546 return (STDCHAR*)PerlSIO_get_base(stdio);
3550 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3552 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3553 return PerlSIO_get_bufsiz(stdio);
3557 #ifdef USE_STDIO_PTR
3559 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3561 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3562 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3566 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3568 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3569 return PerlSIO_get_cnt(stdio);
3573 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3575 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
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));
3582 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3584 * Setting ptr _does_ change cnt - we are done
3588 #else /* STDIO_PTR_LVALUE */
3590 #endif /* STDIO_PTR_LVALUE */
3593 * Now (or only) set cnt
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) -
3602 #else /* STDIO_PTR_LVAL_SETS_CNT */
3604 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3605 #endif /* STDIO_CNT_LVALUE */
3612 PerlIOStdio_fill(pTHX_ PerlIO *f)
3616 PERL_UNUSED_CONTEXT;
3617 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3619 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3622 * fflush()ing read-only streams can cause trouble on some stdio-s
3624 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3625 if (PerlSIO_fflush(stdio) != 0)
3629 c = PerlSIO_fgetc(stdio);
3632 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3634 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3639 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
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
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);
3659 if (PerlIO_has_cntptr(f)) {
3661 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
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
3672 *(--((*stdio)->_ptr)) = (unsigned char) c;
3675 /* If buffer snoop scheme above fails fall back to
3678 if (PerlSIO_ungetc(c, stdio) != c)
3686 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3687 sizeof(PerlIO_funcs),
3689 sizeof(PerlIOStdio),
3690 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3694 PerlIOBase_binmode, /* binmode */
3708 PerlIOStdio_clearerr,
3709 PerlIOStdio_setlinebuf,
3711 PerlIOStdio_get_base,
3712 PerlIOStdio_get_bufsiz,
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,
3724 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3729 #endif /* USE_STDIO_PTR */
3732 /* Note that calls to PerlIO_exportFILE() are reversed using
3733 * PerlIO_releaseFILE(), not importFILE. */
3735 PerlIO_exportFILE(PerlIO * f, const char *mode)
3739 if (PerlIOValid(f)) {
3742 if (!mode || !*mode) {
3743 mode = PerlIO_modestr(f, buf);
3745 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3749 /* De-link any lower layers so new :stdio sticks */
3751 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3752 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3754 PerlIOUnix_refcnt_inc(fileno(stdio));
3755 /* Link previous lower layers under new one */
3759 /* restore layers list */
3769 PerlIO_findFILE(PerlIO *f)
3774 if (l->tab == &PerlIO_stdio) {
3775 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3778 l = *PerlIONext(&l);
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);
3789 const int fd = fileno(stdio);
3791 PerlIOUnix_refcnt_dec(fd);
3796 /* Use this to reverse PerlIO_exportFILE calls. */
3798 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3803 if (l->tab == &PerlIO_stdio) {
3804 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3805 if (s->stdio == f) {
3807 const int fd = fileno(f);
3809 PerlIOUnix_refcnt_dec(fd);
3810 PerlIO_pop(aTHX_ p);
3819 /*--------------------------------------------------------------------------------------*/
3821 * perlio buffer layer
3825 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
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;
3832 if (*PerlIONext(f)) {
3833 const Off_t posn = PerlIO_tell(PerlIONext(f));
3834 if (posn != (Off_t) - 1) {
3838 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3842 PerlIOBuf_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)
3846 if (PerlIOValid(f)) {
3847 PerlIO *next = PerlIONext(f);
3849 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3850 if (tab && tab->Open)
3852 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3854 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3859 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3861 if (*mode == IoTYPE_IMPLICIT) {
3867 if (tab && tab->Open)
3868 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3871 SETERRNO(EINVAL, LIB_INVARG);
3873 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3875 * if push fails during open, open fails. close will pop us.
3880 fd = PerlIO_fileno(f);
3881 if (init && fd == 2) {
3883 * Initial stderr is unbuffered
3885 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
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);
3894 * do something about failing setmode()? --jhi
3896 PerlLIO_setmode(fd, O_BINARY);
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.
3904 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
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;
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.
3929 PerlIOBuf_flush(pTHX_ PerlIO *f)
3931 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3933 PerlIO *n = PerlIONext(f);
3934 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3936 * write() the buffer
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);
3945 else if (count < 0 || PerlIO_error(n)) {
3946 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3951 b->posn += (p - buf);
3953 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3954 STDCHAR *buf = PerlIO_get_base(f);
3956 * Note position change
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
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));
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
3972 b->posn -= (b->ptr - buf);
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)
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.
3990 PerlIOBuf_fill(pTHX_ PerlIO *f)
3992 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3993 PerlIO *n = PerlIONext(f);
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.
3999 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
4001 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
4002 PerlIOBase_flush_linebuf(aTHX);
4005 PerlIO_get_base(f); /* allocate via vtable */
4007 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
4009 b->ptr = b->end = b->buf;
4011 if (!PerlIOValid(n)) {
4012 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4016 if (PerlIO_fast_gets(n)) {
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_.
4023 avail = PerlIO_get_cnt(n);
4025 avail = PerlIO_fill(n);
4027 avail = PerlIO_get_cnt(n);
4029 if (!PerlIO_error(n) && PerlIO_eof(n))
4034 STDCHAR *ptr = PerlIO_get_ptr(n);
4035 const SSize_t cnt = avail;
4036 if (avail > (SSize_t)b->bufsiz)
4038 Copy(ptr, b->buf, avail, STDCHAR);
4039 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4043 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4047 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4049 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4052 b->end = b->buf + avail;
4053 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4058 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4060 if (PerlIOValid(f)) {
4061 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4064 return PerlIOBase_read(aTHX_ f, vbuf, count);
4070 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4072 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4073 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4076 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4081 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4083 * Buffer is already a read buffer, we can overwrite any chars
4084 * which have been read back to buffer start
4086 avail = (b->ptr - b->buf);
4090 * Buffer is idle, set it up so whole buffer is available for
4094 b->end = b->buf + avail;
4096 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4098 * Buffer extends _back_ from where we are now
4100 b->posn -= b->bufsiz;
4102 if (avail > (SSize_t) count) {
4104 * If we have space for more than count, just move count
4112 * In simple stdio-like ungetc() case chars will be already
4115 if (buf != b->ptr) {
4116 Copy(buf, b->ptr, avail, STDCHAR);
4120 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4124 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4130 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4132 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4133 const STDCHAR *buf = (const STDCHAR *) vbuf;
4134 const STDCHAR *flushptr = buf;
4138 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4140 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4141 if (PerlIO_flush(f) != 0) {
4145 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4146 flushptr = buf + count;
4147 while (flushptr > buf && *(flushptr - 1) != '\n')
4151 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4152 if ((SSize_t) count < avail)
4154 if (flushptr > buf && flushptr <= buf + avail)
4155 avail = flushptr - buf;
4156 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4158 Copy(buf, b->ptr, avail, STDCHAR);
4163 if (buf == flushptr)
4166 if (b->ptr >= (b->buf + b->bufsiz))
4167 if (PerlIO_flush(f) == -1)
4170 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4176 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4179 if ((code = PerlIO_flush(f)) == 0) {
4180 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4181 code = PerlIO_seek(PerlIONext(f), offset, whence);
4183 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4184 b->posn = PerlIO_tell(PerlIONext(f));
4191 PerlIOBuf_tell(pTHX_ PerlIO *f)
4193 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4195 * b->posn is file position where b->buf was read, or will be written
4197 Off_t posn = b->posn;
4198 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4199 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4201 /* As O_APPEND files are normally shared in some sense it is better
4206 /* when file is NOT shared then this is sufficient */
4207 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4209 posn = b->posn = PerlIO_tell(PerlIONext(f));
4213 * If buffer is valid adjust position by amount in buffer
4215 posn += (b->ptr - b->buf);
4221 PerlIOBuf_popped(pTHX_ PerlIO *f)
4223 const IV code = PerlIOBase_popped(aTHX_ f);
4224 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4225 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4228 b->ptr = b->end = b->buf = NULL;
4229 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4234 PerlIOBuf_close(pTHX_ PerlIO *f)
4236 const IV code = PerlIOBase_close(aTHX_ f);
4237 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4238 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4241 b->ptr = b->end = b->buf = NULL;
4242 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4247 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4249 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4256 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4258 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4261 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4262 return (b->end - b->ptr);
4267 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4269 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4270 PERL_UNUSED_CONTEXT;
4274 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4275 Newxz(b->buf,b->bufsiz, STDCHAR);
4277 b->buf = (STDCHAR *) & b->oneword;
4278 b->bufsiz = sizeof(b->oneword);
4280 b->end = b->ptr = b->buf;
4286 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4288 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4291 return (b->end - b->buf);
4295 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4297 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4299 PERL_UNUSED_ARG(cnt);
4304 assert(PerlIO_get_cnt(f) == cnt);
4305 assert(b->ptr >= b->buf);
4306 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4310 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4312 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4317 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4318 sizeof(PerlIO_funcs),
4321 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4325 PerlIOBase_binmode, /* binmode */
4339 PerlIOBase_clearerr,
4340 PerlIOBase_setlinebuf,
4345 PerlIOBuf_set_ptrcnt,
4348 /*--------------------------------------------------------------------------------------*/
4350 * Temp layer to hold unread chars when cannot do it any other way
4354 PerlIOPending_fill(pTHX_ PerlIO *f)
4357 * Should never happen
4364 PerlIOPending_close(pTHX_ PerlIO *f)
4367 * A tad tricky - flush pops us, then we close new top
4370 return PerlIO_close(f);
4374 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4377 * A tad tricky - flush pops us, then we seek new top
4380 return PerlIO_seek(f, offset, whence);
4385 PerlIOPending_flush(pTHX_ PerlIO *f)
4387 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4388 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4392 PerlIO_pop(aTHX_ f);
4397 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4403 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4408 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4410 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4411 PerlIOl * const l = PerlIOBase(f);
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.
4416 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4417 (PerlIOBase(PerlIONext(f))->
4418 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4423 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4425 SSize_t avail = PerlIO_get_cnt(f);
4427 if ((SSize_t)count < avail)
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)
4440 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4441 sizeof(PerlIO_funcs),
4444 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4445 PerlIOPending_pushed,
4448 PerlIOBase_binmode, /* binmode */
4457 PerlIOPending_close,
4458 PerlIOPending_flush,
4462 PerlIOBase_clearerr,
4463 PerlIOBase_setlinebuf,
4468 PerlIOPending_set_ptrcnt,
4473 /*--------------------------------------------------------------------------------------*/
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
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.
4489 PerlIOBuf base; /* PerlIOBuf stuff */
4490 STDCHAR *nl; /* Position of crlf we "lied" about in the
4494 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4495 * Otherwise the :crlf layer would always revert back to
4499 S_inherit_utf8_flag(PerlIO *f)
4501 PerlIO *g = PerlIONext(f);
4502 if (PerlIOValid(g)) {
4503 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4504 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4510 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4513 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4514 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
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);
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);
4535 S_inherit_utf8_flag(f);
4541 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4543 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4544 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4548 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4549 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4551 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4552 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4554 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
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;
4564 while (count > 0 && b->ptr > b->buf) {
4565 const int ch = *--buf;
4567 if (b->ptr - 2 >= b->buf) {
4574 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4575 *--(b->ptr) = 0xa; /* Works even if 0xa == '\r' */
4591 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4593 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4595 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
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;
4603 while (nl < b->end && *nl != 0xd)
4605 if (nl < b->end && *nl == 0xd) {
4607 if (nl + 1 < b->end) {
4614 * Not CR,LF but just CR
4622 * Blast - found CR as last char in buffer
4627 * They may not care, defer work as long as
4631 return (nl - b->ptr);
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
4640 will naturally make posn point at CR
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
4648 *nl = 0xd; /* Fill in the CR */
4650 goto test; /* fill() call worked */
4652 * CR at EOF - just fall through
4654 /* Should we clear EOF though ??? */
4659 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4665 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4667 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4668 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4674 if (ptr == b->end && *c->nl == 0xd) {
4675 /* Deferred CR at end of buffer case - we lied about count */
4688 * Test code - delete when it works ...
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 */
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);
4708 * They have taken what we lied about
4716 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4720 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4722 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4723 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4725 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4726 const STDCHAR *buf = (const STDCHAR *) vbuf;
4727 const STDCHAR * const ebuf = buf + count;
4730 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
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) {
4737 if ((b->ptr + 2) > eptr) {
4745 *(b->ptr)++ = 0xd; /* CR */
4746 *(b->ptr)++ = 0xa; /* LF */
4748 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4755 *(b->ptr)++ = *buf++;
4757 if (b->ptr >= eptr) {
4763 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4765 return (buf - (STDCHAR *) vbuf);
4770 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4772 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4777 return PerlIOBuf_flush(aTHX_ f);
4781 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
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);
4794 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4795 sizeof(PerlIO_funcs),
4798 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4800 PerlIOBuf_popped, /* popped */
4802 PerlIOCrlf_binmode, /* binmode */
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' */
4816 PerlIOBase_clearerr,
4817 PerlIOBase_setlinebuf,
4822 PerlIOCrlf_set_ptrcnt,
4826 /*--------------------------------------------------------------------------------------*/
4828 * mmap as "buffer" layer
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 */
4839 PerlIOMmap_map(pTHX_ PerlIO *f)
4842 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4843 const IV flags = PerlIOBase(f)->flags;
4847 if (flags & PERLIO_F_CANREAD) {
4848 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4849 const int fd = PerlIO_fileno(f);
4851 code = Fstat(fd, &st);
4852 if (code == 0 && S_ISREG(st.st_mode)) {
4853 SSize_t len = st.st_size - b->posn;
4856 if (PL_mmap_page_size <= 0)
4857 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
4861 * This is a hack - should never happen - open should
4864 b->posn = PerlIO_tell(PerlIONext(f));
4866 posn = (b->posn / PL_mmap_page_size) * PL_mmap_page_size;
4867 len = st.st_size - posn;