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 /* Call the callback or PerlIOBase, and return failure. */
74 #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
75 if (PerlIOValid(f)) { \
76 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
77 if (tab && tab->callback) \
78 return (*tab->callback) args; \
80 return PerlIOBase_ ## base args; \
83 SETERRNO(EBADF, SS_IVCHAN); \
86 /* Call the callback or fail, and return failure. */
87 #define Perl_PerlIO_or_fail(f, callback, failure, args) \
88 if (PerlIOValid(f)) { \
89 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
90 if (tab && tab->callback) \
91 return (*tab->callback) args; \
92 SETERRNO(EINVAL, LIB_INVARG); \
95 SETERRNO(EBADF, SS_IVCHAN); \
98 /* Call the callback or PerlIOBase, and be void. */
99 #define Perl_PerlIO_or_Base_void(f, callback, base, args) \
100 if (PerlIOValid(f)) { \
101 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
102 if (tab && tab->callback) \
103 (*tab->callback) args; \
105 PerlIOBase_ ## base args; \
108 SETERRNO(EBADF, SS_IVCHAN)
110 /* Call the callback or fail, and be void. */
111 #define Perl_PerlIO_or_fail_void(f, callback, args) \
112 if (PerlIOValid(f)) { \
113 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
114 if (tab && tab->callback) \
115 (*tab->callback) args; \
117 SETERRNO(EINVAL, LIB_INVARG); \
120 SETERRNO(EBADF, SS_IVCHAN)
122 #if defined(__osf__) && _XOPEN_SOURCE < 500
123 extern int fseeko(FILE *, off_t, int);
124 extern off_t ftello(FILE *);
129 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
132 perlsio_binmode(FILE *fp, int iotype, int mode)
135 * This used to be contents of do_binmode in doio.c
138 # if defined(atarist)
139 PERL_UNUSED_ARG(iotype);
142 ((FILE *) fp)->_flag |= _IOBIN;
144 ((FILE *) fp)->_flag &= ~_IOBIN;
150 PERL_UNUSED_ARG(iotype);
152 if (PerlLIO_setmode(fp, mode) != -1) {
154 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
156 # if defined(WIN32) && defined(__BORLANDC__)
158 * The translation mode of the stream is maintained independent
160 * the translation mode of the fd in the Borland RTL (heavy
161 * digging through their runtime sources reveal). User has to
163 * the mode explicitly for the stream (though they don't
165 * this anywhere). GSAR 97-5-24
171 fp->flags &= ~_F_BIN;
179 # if defined(USEMYBINMODE)
181 # if defined(__CYGWIN__)
182 PERL_UNUSED_ARG(iotype);
184 if (my_binmode(fp, iotype, mode) != FALSE)
190 PERL_UNUSED_ARG(iotype);
191 PERL_UNUSED_ARG(mode);
199 #define O_ACCMODE 3 /* Assume traditional implementation */
203 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
205 const int result = rawmode & O_ACCMODE;
210 ptype = IoTYPE_RDONLY;
213 ptype = IoTYPE_WRONLY;
221 *writing = (result != O_RDONLY);
223 if (result == O_RDONLY) {
227 else if (rawmode & O_APPEND) {
229 if (result != O_WRONLY)
234 if (result == O_WRONLY)
241 if (rawmode & O_BINARY)
247 #ifndef PERLIO_LAYERS
249 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
251 if (!names || !*names
252 || strEQ(names, ":crlf")
253 || strEQ(names, ":raw")
254 || strEQ(names, ":bytes")
258 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
266 PerlIO_destruct(pTHX)
271 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
274 PERL_UNUSED_ARG(iotype);
275 PERL_UNUSED_ARG(mode);
276 PERL_UNUSED_ARG(names);
279 return perlsio_binmode(fp, iotype, mode);
284 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
286 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
289 #ifdef PERL_IMPLICIT_SYS
290 return PerlSIO_fdupopen(f);
293 return win32_fdupopen(f);
296 const int fd = PerlLIO_dup(PerlIO_fileno(f));
300 const int omode = djgpp_get_stream_mode(f);
302 const int omode = fcntl(fd, F_GETFL);
304 PerlIO_intmode2str(omode,mode,NULL);
305 /* the r+ is a hack */
306 return PerlIO_fdopen(fd, mode);
311 SETERRNO(EBADF, SS_IVCHAN);
321 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
325 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
326 int imode, int perm, PerlIO *old, int narg, SV **args)
330 Perl_croak(aTHX_ "More than one argument to open");
332 if (*args == &PL_sv_undef)
333 return PerlIO_tmpfile();
335 const char *name = SvPV_nolen_const(*args);
336 if (*mode == IoTYPE_NUMERIC) {
337 fd = PerlLIO_open3(name, imode, perm);
339 return PerlIO_fdopen(fd, mode + 1);
342 return PerlIO_reopen(name, mode, old);
345 return PerlIO_open(name, mode);
350 return PerlIO_fdopen(fd, (char *) mode);
355 XS(XS_PerlIO__Layer__find)
359 Perl_croak(aTHX_ "Usage class->find(name[,load])");
361 const char * const name = SvPV_nolen_const(ST(1));
362 ST(0) = (strEQ(name, "crlf")
363 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
370 Perl_boot_core_PerlIO(pTHX)
372 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
378 #ifdef PERLIO_IS_STDIO
385 * Does nothing (yet) except force this file to be included in perl
386 * binary. That allows this file to force inclusion of other functions
387 * that may be required by loadable extensions e.g. for
388 * FileHandle::tmpfile
392 #undef PerlIO_tmpfile
399 #else /* PERLIO_IS_STDIO */
407 * This section is just to make sure these functions get pulled in from
411 #undef PerlIO_tmpfile
423 * Force this file to be included in perl binary. Which allows this
424 * file to force inclusion of other functions that may be required by
425 * loadable extensions e.g. for FileHandle::tmpfile
429 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
430 * results in a lot of lseek()s to regular files and lot of small
433 sfset(sfstdout, SF_SHARE, 0);
436 /* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
438 PerlIO_importFILE(FILE *stdio, const char *mode)
440 const int fd = fileno(stdio);
441 if (!mode || !*mode) {
444 return PerlIO_fdopen(fd, mode);
448 PerlIO_findFILE(PerlIO *pio)
450 const int fd = PerlIO_fileno(pio);
451 FILE * const f = fdopen(fd, "r+");
453 if (!f && errno == EINVAL)
455 if (!f && errno == EINVAL)
462 /*======================================================================================*/
464 * Implement all the PerlIO interface ourselves.
470 * We _MUST_ have <unistd.h> if we are using lseek() and may have large
477 #include <sys/mman.h>
481 PerlIO_debug(const char *fmt, ...)
486 if (!PL_perlio_debug_fd) {
487 if (!PL_tainting && PL_uid == PL_euid && PL_gid == PL_egid) {
488 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
491 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
493 PL_perlio_debug_fd = -1;
495 /* tainting or set*id, so ignore the environment, and ensure we
496 skip these tests next time through. */
497 PL_perlio_debug_fd = -1;
500 if (PL_perlio_debug_fd > 0) {
503 const char * const s = CopFILE(PL_curcop);
504 /* Use fixed buffer as sv_catpvf etc. needs SVs */
506 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
507 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
508 PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2);
510 const char *s = CopFILE(PL_curcop);
512 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
513 (IV) CopLINE(PL_curcop));
514 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
516 s = SvPV_const(sv, len);
517 PerlLIO_write(PL_perlio_debug_fd, s, len);
524 /*--------------------------------------------------------------------------------------*/
527 * Inner level routines
531 * Table of pointers to the PerlIO structs (malloc'ed)
533 #define PERLIO_TABLE_SIZE 64
536 PerlIO_allocate(pTHX)
540 * Find a free slot in the table, allocating new table as necessary
545 while ((f = *last)) {
547 last = (PerlIO **) (f);
548 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
554 Newxz(f,PERLIO_TABLE_SIZE,PerlIO);
562 #undef PerlIO_fdupopen
564 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
566 if (PerlIOValid(f)) {
567 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
568 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
570 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
572 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
576 SETERRNO(EBADF, SS_IVCHAN);
582 PerlIO_cleantable(pTHX_ PerlIO **tablep)
584 PerlIO * const table = *tablep;
587 PerlIO_cleantable(aTHX_(PerlIO **) & (table[0]));
588 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
589 PerlIO * const f = table + i;
601 PerlIO_list_alloc(pTHX)
605 Newxz(list, 1, PerlIO_list_t);
611 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
614 if (--list->refcnt == 0) {
617 for (i = 0; i < list->cur; i++)
618 SvREFCNT_dec(list->array[i].arg);
619 Safefree(list->array);
627 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
633 if (list->cur >= list->len) {
636 Renew(list->array, list->len, PerlIO_pair_t);
638 Newx(list->array, list->len, PerlIO_pair_t);
640 p = &(list->array[list->cur++]);
642 if ((p->arg = arg)) {
643 SvREFCNT_inc_simple_void_NN(arg);
648 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
650 PerlIO_list_t *list = NULL;
653 list = PerlIO_list_alloc(aTHX);
654 for (i=0; i < proto->cur; i++) {
655 SV *arg = proto->array[i].arg;
658 arg = sv_dup(arg, param);
660 PERL_UNUSED_ARG(param);
662 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
669 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
672 PerlIO **table = &proto->Iperlio;
675 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
676 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
677 PerlIO_allocate(aTHX); /* root slot is never used */
678 PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto);
679 while ((f = *table)) {
681 table = (PerlIO **) (f++);
682 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
684 (void) fp_dup(f, 0, param);
691 PERL_UNUSED_ARG(proto);
692 PERL_UNUSED_ARG(param);
697 PerlIO_destruct(pTHX)
700 PerlIO **table = &PL_perlio;
703 PerlIO_debug("Destruct %p\n",(void*)aTHX);
705 while ((f = *table)) {
707 table = (PerlIO **) (f++);
708 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
712 if (l->tab->kind & PERLIO_K_DESTRUCT) {
713 PerlIO_debug("Destruct popping %s\n", l->tab->name);
727 PerlIO_pop(pTHX_ PerlIO *f)
729 const PerlIOl *l = *f;
731 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f, l->tab->name);
732 if (l->tab->Popped) {
734 * If popped returns non-zero do not free its layer structure
735 * it has either done so itself, or it is shared and still in
738 if ((*l->tab->Popped) (aTHX_ f) != 0)
746 /* Return as an array the stack of layers on a filehandle. Note that
747 * the stack is returned top-first in the array, and there are three
748 * times as many array elements as there are layers in the stack: the
749 * first element of a layer triplet is the name, the second one is the
750 * arguments, and the third one is the flags. */
753 PerlIO_get_layers(pTHX_ PerlIO *f)
756 AV * const av = newAV();
758 if (PerlIOValid(f)) {
759 PerlIOl *l = PerlIOBase(f);
762 /* There is some collusion in the implementation of
763 XS_PerlIO_get_layers - it knows that name and flags are
764 generated as fresh SVs here, and takes advantage of that to
765 "copy" them by taking a reference. If it changes here, it needs
766 to change there too. */
767 SV * const name = l->tab && l->tab->name ?
768 newSVpv(l->tab->name, 0) : &PL_sv_undef;
769 SV * const arg = l->tab && l->tab->Getarg ?
770 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
773 av_push(av, newSViv((IV)l->flags));
781 /*--------------------------------------------------------------------------------------*/
783 * XS Interface for perl code
787 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
791 if ((SSize_t) len <= 0)
793 for (i = 0; i < PL_known_layers->cur; i++) {
794 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
795 if (memEQ(f->name, name, len) && f->name[len] == 0) {
796 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
800 if (load && PL_subname && PL_def_layerlist
801 && PL_def_layerlist->cur >= 2) {
802 if (PL_in_load_module) {
803 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
806 SV * const pkgsv = newSVpvs("PerlIO");
807 SV * const layer = newSVpvn(name, len);
808 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
810 SAVEINT(PL_in_load_module);
812 SAVEGENERICSV(PL_warnhook);
813 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
817 * The two SVs are magically freed by load_module
819 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
822 return PerlIO_find_layer(aTHX_ name, len, 0);
825 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
829 #ifdef USE_ATTRIBUTES_FOR_PERLIO
832 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
835 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
836 PerlIO * const ifp = IoIFP(io);
837 PerlIO * const ofp = IoOFP(io);
838 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
839 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
845 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
848 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
849 PerlIO * const ifp = IoIFP(io);
850 PerlIO * const ofp = IoOFP(io);
851 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
852 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
858 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
860 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
865 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
867 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
871 MGVTBL perlio_vtab = {
879 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
882 SV * const sv = SvRV(ST(1));
883 AV * const av = newAV();
887 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
889 mg = mg_find(sv, PERL_MAGIC_ext);
890 mg->mg_virtual = &perlio_vtab;
892 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
893 for (i = 2; i < items; i++) {
895 const char * const name = SvPV_const(ST(i), len);
896 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
898 av_push(av, SvREFCNT_inc_simple_NN(layer));
909 #endif /* USE_ATTIBUTES_FOR_PERLIO */
912 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
914 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
915 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
919 XS(XS_PerlIO__Layer__NoWarnings)
921 /* This is used as a %SIG{__WARN__} handler to supress warnings
922 during loading of layers.
928 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
932 XS(XS_PerlIO__Layer__find)
938 Perl_croak(aTHX_ "Usage class->find(name[,load])");
941 const char * const name = SvPV_const(ST(1), len);
942 const bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
943 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
945 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
952 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
955 if (!PL_known_layers)
956 PL_known_layers = PerlIO_list_alloc(aTHX);
957 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
958 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
962 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
966 const char *s = names;
968 while (isSPACE(*s) || *s == ':')
973 const char *as = NULL;
975 if (!isIDFIRST(*s)) {
977 * Message is consistent with how attribute lists are
978 * passed. Even though this means "foo : : bar" is
979 * seen as an invalid separator character.
981 const char q = ((*s == '\'') ? '"' : '\'');
982 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
983 "Invalid separator character %c%c%c in PerlIO layer specification %s",
985 SETERRNO(EINVAL, LIB_INVARG);
990 } while (isALNUM(*e));
1006 * It's a nul terminated string, not allowed
1007 * to \ the terminating null. Anything other
1008 * character is passed over.
1018 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1019 "Argument list not closed for PerlIO layer \"%.*s\"",
1031 PerlIO_funcs * const layer =
1032 PerlIO_find_layer(aTHX_ s, llen, 1);
1036 arg = newSVpvn(as, alen);
1037 PerlIO_list_push(aTHX_ av, layer,
1038 (arg) ? arg : &PL_sv_undef);
1042 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1055 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1058 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1059 #ifdef PERLIO_USING_CRLF
1062 if (PerlIO_stdio.Set_ptrcnt)
1063 tab = &PerlIO_stdio;
1065 PerlIO_debug("Pushing %s\n", tab->name);
1066 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1071 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1073 return av->array[n].arg;
1077 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1079 if (n >= 0 && n < av->cur) {
1080 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1081 av->array[n].funcs->name);
1082 return av->array[n].funcs;
1085 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1090 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1092 PERL_UNUSED_ARG(mode);
1093 PERL_UNUSED_ARG(arg);
1094 PERL_UNUSED_ARG(tab);
1095 if (PerlIOValid(f)) {
1097 PerlIO_pop(aTHX_ f);
1103 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1104 sizeof(PerlIO_funcs),
1107 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1127 NULL, /* get_base */
1128 NULL, /* get_bufsiz */
1131 NULL, /* set_ptrcnt */
1135 PerlIO_default_layers(pTHX)
1138 if (!PL_def_layerlist) {
1139 const char * const s = (PL_tainting) ? NULL : PerlEnv_getenv("PERLIO");
1140 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1141 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1142 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1144 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1146 osLayer = &PerlIO_win32;
1149 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1150 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1151 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1152 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1154 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_mmap));
1156 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1157 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1158 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1159 PerlIO_list_push(aTHX_ PL_def_layerlist,
1160 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1163 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1166 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1169 if (PL_def_layerlist->cur < 2) {
1170 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1172 return PL_def_layerlist;
1176 Perl_boot_core_PerlIO(pTHX)
1178 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1179 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1182 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1183 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1187 PerlIO_default_layer(pTHX_ I32 n)
1190 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1193 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1196 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1197 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1200 PerlIO_stdstreams(pTHX)
1204 PerlIO_allocate(aTHX);
1205 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1206 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1207 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1212 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1214 if (tab->fsize != sizeof(PerlIO_funcs)) {
1216 Perl_croak(aTHX_ "Layer does not match this perl");
1220 if (tab->size < sizeof(PerlIOl)) {
1223 /* Real layer with a data area */
1226 Newxz(temp, tab->size, char);
1230 l->tab = (PerlIO_funcs*) tab;
1232 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1233 (void*)f, tab->name,
1234 (mode) ? mode : "(Null)", (void*)arg);
1235 if (*l->tab->Pushed &&
1237 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1238 PerlIO_pop(aTHX_ f);
1247 /* Pseudo-layer where push does its own stack adjust */
1248 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1249 (mode) ? mode : "(Null)", (void*)arg);
1251 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1259 PerlIOBase_binmode(pTHX_ PerlIO *f)
1261 if (PerlIOValid(f)) {
1262 /* Is layer suitable for raw stream ? */
1263 if (PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1264 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1265 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1268 /* Not suitable - pop it */
1269 PerlIO_pop(aTHX_ f);
1277 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1279 PERL_UNUSED_ARG(mode);
1280 PERL_UNUSED_ARG(arg);
1281 PERL_UNUSED_ARG(tab);
1283 if (PerlIOValid(f)) {
1288 * Strip all layers that are not suitable for a raw stream
1291 while (t && (l = *t)) {
1292 if (l->tab->Binmode) {
1293 /* Has a handler - normal case */
1294 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1296 /* Layer still there - move down a layer */
1305 /* No handler - pop it */
1306 PerlIO_pop(aTHX_ t);
1309 if (PerlIOValid(f)) {
1310 PerlIO_debug(":raw f=%p :%s\n", (void*)f, PerlIOBase(f)->tab->name);
1318 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1319 PerlIO_list_t *layers, IV n, IV max)
1323 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1325 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1336 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1340 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1341 code = PerlIO_parse_layers(aTHX_ layers, names);
1343 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1345 PerlIO_list_free(aTHX_ layers);
1351 /*--------------------------------------------------------------------------------------*/
1353 * Given the abstraction above the public API functions
1357 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1359 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1360 (PerlIOBase(f)) ? PerlIOBase(f)->tab->name : "(Null)",
1361 iotype, mode, (names) ? names : "(Null)");
1364 /* Do not flush etc. if (e.g.) switching encodings.
1365 if a pushed layer knows it needs to flush lower layers
1366 (for example :unix which is never going to call them)
1367 it can do the flush when it is pushed.
1369 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1372 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1373 #ifdef PERLIO_USING_CRLF
1374 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1375 O_BINARY so we can look for it in mode.
1377 if (!(mode & O_BINARY)) {
1379 /* FIXME?: Looking down the layer stack seems wrong,
1380 but is a way of reaching past (say) an encoding layer
1381 to flip CRLF-ness of the layer(s) below
1384 /* Perhaps we should turn on bottom-most aware layer
1385 e.g. Ilya's idea that UNIX TTY could serve
1387 if (PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF) {
1388 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1389 /* Not in text mode - flush any pending stuff and flip it */
1391 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1393 /* Only need to turn it on in one layer so we are done */
1398 /* Not finding a CRLF aware layer presumably means we are binary
1399 which is not what was requested - so we failed
1400 We _could_ push :crlf layer but so could caller
1405 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1406 So code that used to be here is now in PerlIORaw_pushed().
1408 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1413 PerlIO__close(pTHX_ PerlIO *f)
1415 if (PerlIOValid(f)) {
1416 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1417 if (tab && tab->Close)
1418 return (*tab->Close)(aTHX_ f);
1420 return PerlIOBase_close(aTHX_ f);
1423 SETERRNO(EBADF, SS_IVCHAN);
1429 Perl_PerlIO_close(pTHX_ PerlIO *f)
1431 const int code = PerlIO__close(aTHX_ f);
1432 while (PerlIOValid(f)) {
1433 PerlIO_pop(aTHX_ f);
1439 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1442 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1446 static PerlIO_funcs *
1447 PerlIO_layer_from_ref(pTHX_ SV *sv)
1451 * For any scalar type load the handler which is bundled with perl
1453 if (SvTYPE(sv) < SVt_PVAV) {
1454 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1455 /* This isn't supposed to happen, since PerlIO::scalar is core,
1456 * but could happen anyway in smaller installs or with PAR */
1458 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1463 * For other types allow if layer is known but don't try and load it
1465 switch (SvTYPE(sv)) {
1467 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1469 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1471 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1473 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1480 PerlIO_resolve_layers(pTHX_ const char *layers,
1481 const char *mode, int narg, SV **args)
1484 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1487 PerlIO_stdstreams(aTHX);
1489 SV * const arg = *args;
1491 * If it is a reference but not an object see if we have a handler
1494 if (SvROK(arg) && !sv_isobject(arg)) {
1495 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1497 def = PerlIO_list_alloc(aTHX);
1498 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1502 * Don't fail if handler cannot be found :via(...) etc. may do
1503 * something sensible else we will just stringfy and open
1508 if (!layers || !*layers)
1509 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1510 if (layers && *layers) {
1513 av = PerlIO_clone_list(aTHX_ def, NULL);
1518 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1522 PerlIO_list_free(aTHX_ av);
1534 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1535 int imode, int perm, PerlIO *f, int narg, SV **args)
1538 if (!f && narg == 1 && *args == &PL_sv_undef) {
1539 if ((f = PerlIO_tmpfile())) {
1540 if (!layers || !*layers)
1541 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1542 if (layers && *layers)
1543 PerlIO_apply_layers(aTHX_ f, mode, layers);
1547 PerlIO_list_t *layera;
1549 PerlIO_funcs *tab = NULL;
1550 if (PerlIOValid(f)) {
1552 * This is "reopen" - it is not tested as perl does not use it
1556 layera = PerlIO_list_alloc(aTHX);
1560 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1561 PerlIO_list_push(aTHX_ layera, l->tab,
1562 (arg) ? arg : &PL_sv_undef);
1564 l = *PerlIONext(&l);
1568 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1574 * Start at "top" of layer stack
1576 n = layera->cur - 1;
1578 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1587 * Found that layer 'n' can do opens - call it
1589 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1590 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1592 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1593 tab->name, layers ? layers : "(Null)", mode, fd,
1594 imode, perm, (void*)f, narg, (void*)args);
1596 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1599 SETERRNO(EINVAL, LIB_INVARG);
1603 if (n + 1 < layera->cur) {
1605 * More layers above the one that we used to open -
1608 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1609 /* If pushing layers fails close the file */
1616 PerlIO_list_free(aTHX_ layera);
1623 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1625 PERL_ARGS_ASSERT_PERLIO_READ;
1627 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1631 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1633 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1635 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1639 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1641 PERL_ARGS_ASSERT_PERLIO_WRITE;
1643 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1647 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1649 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1653 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1655 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1659 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1664 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1666 if (tab && tab->Flush)
1667 return (*tab->Flush) (aTHX_ f);
1669 return 0; /* If no Flush defined, silently succeed. */
1672 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1673 SETERRNO(EBADF, SS_IVCHAN);
1679 * Is it good API design to do flush-all on NULL, a potentially
1680 * errorneous input? Maybe some magical value (PerlIO*
1681 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1682 * things on fflush(NULL), but should we be bound by their design
1685 PerlIO **table = &PL_perlio;
1687 while ((f = *table)) {
1689 table = (PerlIO **) (f++);
1690 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1691 if (*f && PerlIO_flush(f) != 0)
1701 PerlIOBase_flush_linebuf(pTHX)
1704 PerlIO **table = &PL_perlio;
1706 while ((f = *table)) {
1708 table = (PerlIO **) (f++);
1709 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1712 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1713 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1721 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1723 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1727 PerlIO_isutf8(PerlIO *f)
1730 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1732 SETERRNO(EBADF, SS_IVCHAN);
1738 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1740 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1744 Perl_PerlIO_error(pTHX_ PerlIO *f)
1746 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1750 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1752 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1756 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1758 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1762 PerlIO_has_base(PerlIO *f)
1764 if (PerlIOValid(f)) {
1765 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1768 return (tab->Get_base != NULL);
1775 PerlIO_fast_gets(PerlIO *f)
1777 if (PerlIOValid(f)) {
1778 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1779 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1782 return (tab->Set_ptrcnt != NULL);
1790 PerlIO_has_cntptr(PerlIO *f)
1792 if (PerlIOValid(f)) {
1793 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1796 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1803 PerlIO_canset_cnt(PerlIO *f)
1805 if (PerlIOValid(f)) {
1806 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1809 return (tab->Set_ptrcnt != NULL);
1816 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1818 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1822 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1824 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1828 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1830 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1834 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1836 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1840 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1842 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1846 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1848 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1852 /*--------------------------------------------------------------------------------------*/
1854 * utf8 and raw dummy layers
1858 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1860 PERL_UNUSED_CONTEXT;
1861 PERL_UNUSED_ARG(mode);
1862 PERL_UNUSED_ARG(arg);
1863 if (PerlIOValid(f)) {
1864 if (tab->kind & PERLIO_K_UTF8)
1865 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1867 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1873 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1874 sizeof(PerlIO_funcs),
1877 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1897 NULL, /* get_base */
1898 NULL, /* get_bufsiz */
1901 NULL, /* set_ptrcnt */
1904 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1905 sizeof(PerlIO_funcs),
1928 NULL, /* get_base */
1929 NULL, /* get_bufsiz */
1932 NULL, /* set_ptrcnt */
1936 PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1937 IV n, const char *mode, int fd, int imode, int perm,
1938 PerlIO *old, int narg, SV **args)
1940 PerlIO_funcs * const tab = PerlIO_default_btm();
1941 PERL_UNUSED_ARG(self);
1942 if (tab && tab->Open)
1943 return (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
1945 SETERRNO(EINVAL, LIB_INVARG);
1949 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1950 sizeof(PerlIO_funcs),
1973 NULL, /* get_base */
1974 NULL, /* get_bufsiz */
1977 NULL, /* set_ptrcnt */
1979 /*--------------------------------------------------------------------------------------*/
1980 /*--------------------------------------------------------------------------------------*/
1982 * "Methods" of the "base class"
1986 PerlIOBase_fileno(pTHX_ PerlIO *f)
1988 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
1992 PerlIO_modestr(PerlIO * f, char *buf)
1995 if (PerlIOValid(f)) {
1996 const IV flags = PerlIOBase(f)->flags;
1997 if (flags & PERLIO_F_APPEND) {
1999 if (flags & PERLIO_F_CANREAD) {
2003 else if (flags & PERLIO_F_CANREAD) {
2005 if (flags & PERLIO_F_CANWRITE)
2008 else if (flags & PERLIO_F_CANWRITE) {
2010 if (flags & PERLIO_F_CANREAD) {
2014 #ifdef PERLIO_USING_CRLF
2015 if (!(flags & PERLIO_F_CRLF))
2025 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2027 PerlIOl * const l = PerlIOBase(f);
2028 PERL_UNUSED_CONTEXT;
2029 PERL_UNUSED_ARG(arg);
2031 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2032 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2033 if (tab->Set_ptrcnt != NULL)
2034 l->flags |= PERLIO_F_FASTGETS;
2036 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2040 l->flags |= PERLIO_F_CANREAD;
2043 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2046 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2049 SETERRNO(EINVAL, LIB_INVARG);
2055 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2058 l->flags &= ~PERLIO_F_CRLF;
2061 l->flags |= PERLIO_F_CRLF;
2064 SETERRNO(EINVAL, LIB_INVARG);
2071 l->flags |= l->next->flags &
2072 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2077 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2078 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2079 l->flags, PerlIO_modestr(f, temp));
2085 PerlIOBase_popped(pTHX_ PerlIO *f)
2087 PERL_UNUSED_CONTEXT;
2093 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2096 * Save the position as current head considers it
2098 const Off_t old = PerlIO_tell(f);
2099 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2100 PerlIOSelf(f, PerlIOBuf)->posn = old;
2101 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2105 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2107 STDCHAR *buf = (STDCHAR *) vbuf;
2109 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2110 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2111 SETERRNO(EBADF, SS_IVCHAN);
2117 SSize_t avail = PerlIO_get_cnt(f);
2120 take = ((SSize_t)count < avail) ? (SSize_t)count : avail;
2122 STDCHAR *ptr = PerlIO_get_ptr(f);
2123 Copy(ptr, buf, take, STDCHAR);
2124 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2127 if (avail == 0) /* set_ptrcnt could have reset avail */
2130 if (count > 0 && avail <= 0) {
2131 if (PerlIO_fill(f) != 0)
2136 return (buf - (STDCHAR *) vbuf);
2142 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2144 PERL_UNUSED_CONTEXT;
2150 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2152 PERL_UNUSED_CONTEXT;
2158 PerlIOBase_close(pTHX_ PerlIO *f)
2161 if (PerlIOValid(f)) {
2162 PerlIO *n = PerlIONext(f);
2163 code = PerlIO_flush(f);
2164 PerlIOBase(f)->flags &=
2165 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2166 while (PerlIOValid(n)) {
2167 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2168 if (tab && tab->Close) {
2169 if ((*tab->Close)(aTHX_ n) != 0)
2174 PerlIOBase(n)->flags &=
2175 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2181 SETERRNO(EBADF, SS_IVCHAN);
2187 PerlIOBase_eof(pTHX_ PerlIO *f)
2189 PERL_UNUSED_CONTEXT;
2190 if (PerlIOValid(f)) {
2191 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2197 PerlIOBase_error(pTHX_ PerlIO *f)
2199 PERL_UNUSED_CONTEXT;
2200 if (PerlIOValid(f)) {
2201 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2207 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2209 if (PerlIOValid(f)) {
2210 PerlIO * const n = PerlIONext(f);
2211 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2218 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2220 PERL_UNUSED_CONTEXT;
2221 if (PerlIOValid(f)) {
2222 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2227 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2233 arg = sv_dup(arg, param);
2234 SvREFCNT_inc_simple_void_NN(arg);
2238 return newSVsv(arg);
2241 PERL_UNUSED_ARG(param);
2242 return newSVsv(arg);
2247 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2249 PerlIO * const nexto = PerlIONext(o);
2250 if (PerlIOValid(nexto)) {
2251 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2252 if (tab && tab->Dup)
2253 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2255 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2258 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2261 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2262 self->name, (void*)f, (void*)o, (void*)param);
2264 arg = (*self->Getarg)(aTHX_ o, param, flags);
2265 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2266 if (PerlIOBase(o)->flags & PERLIO_F_UTF8)
2267 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2273 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2275 /* Must be called with PL_perlio_mutex locked. */
2277 S_more_refcounted_fds(pTHX_ const int new_fd) {
2279 const int old_max = PL_perlio_fd_refcnt_size;
2280 const int new_max = 16 + (new_fd & ~15);
2283 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2284 old_max, new_fd, new_max);
2286 if (new_fd < old_max) {
2290 assert (new_max > new_fd);
2292 /* Use plain realloc() since we need this memory to be really
2293 * global and visible to all the interpreters and/or threads. */
2294 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2298 MUTEX_UNLOCK(&PL_perlio_mutex);
2300 /* Can't use PerlIO to write as it allocates memory */
2301 PerlLIO_write(PerlIO_fileno(Perl_error_log),
2302 PL_no_mem, strlen(PL_no_mem));
2306 PL_perlio_fd_refcnt_size = new_max;
2307 PL_perlio_fd_refcnt = new_array;
2309 PerlIO_debug("Zeroing %p, %d\n",
2310 (void*)(new_array + old_max),
2313 Zero(new_array + old_max, new_max - old_max, int);
2320 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2321 PERL_UNUSED_CONTEXT;
2325 PerlIOUnix_refcnt_inc(int fd)
2332 MUTEX_LOCK(&PL_perlio_mutex);
2334 if (fd >= PL_perlio_fd_refcnt_size)
2335 S_more_refcounted_fds(aTHX_ fd);
2337 PL_perlio_fd_refcnt[fd]++;
2338 if (PL_perlio_fd_refcnt[fd] <= 0) {
2339 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2340 fd, PL_perlio_fd_refcnt[fd]);
2342 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2343 fd, PL_perlio_fd_refcnt[fd]);
2346 MUTEX_UNLOCK(&PL_perlio_mutex);
2349 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2354 PerlIOUnix_refcnt_dec(int fd)
2361 MUTEX_LOCK(&PL_perlio_mutex);
2363 if (fd >= PL_perlio_fd_refcnt_size) {
2364 Perl_croak(aTHX_ "refcnt_dec: fd %d >= refcnt_size %d\n",
2365 fd, PL_perlio_fd_refcnt_size);
2367 if (PL_perlio_fd_refcnt[fd] <= 0) {
2368 Perl_croak(aTHX_ "refcnt_dec: fd %d: %d <= 0\n",
2369 fd, PL_perlio_fd_refcnt[fd]);
2371 cnt = --PL_perlio_fd_refcnt[fd];
2372 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2374 MUTEX_UNLOCK(&PL_perlio_mutex);
2377 Perl_croak(aTHX_ "refcnt_dec: fd %d < 0\n", fd);
2383 PerlIO_cleanup(pTHX)
2388 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2390 PerlIO_debug("Cleanup layers\n");
2393 /* Raise STDIN..STDERR refcount so we don't close them */
2394 for (i=0; i < 3; i++)
2395 PerlIOUnix_refcnt_inc(i);
2396 PerlIO_cleantable(aTHX_ &PL_perlio);
2397 /* Restore STDIN..STDERR refcount */
2398 for (i=0; i < 3; i++)
2399 PerlIOUnix_refcnt_dec(i);
2401 if (PL_known_layers) {
2402 PerlIO_list_free(aTHX_ PL_known_layers);
2403 PL_known_layers = NULL;
2405 if (PL_def_layerlist) {
2406 PerlIO_list_free(aTHX_ PL_def_layerlist);
2407 PL_def_layerlist = NULL;
2411 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2415 /* XXX we can't rely on an interpreter being present at this late stage,
2416 XXX so we can't use a function like PerlLIO_write that relies on one
2417 being present (at least in win32) :-(.
2422 /* By now all filehandles should have been closed, so any
2423 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2425 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2426 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2427 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2429 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2430 if (PL_perlio_fd_refcnt[i]) {
2432 my_snprintf(buf, sizeof(buf),
2433 "PerlIO_teardown: fd %d refcnt=%d\n",
2434 i, PL_perlio_fd_refcnt[i]);
2435 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2441 /* Not bothering with PL_perlio_mutex since by now
2442 * all the interpreters are gone. */
2443 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2444 && PL_perlio_fd_refcnt) {
2445 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2446 PL_perlio_fd_refcnt = NULL;
2447 PL_perlio_fd_refcnt_size = 0;
2451 /*--------------------------------------------------------------------------------------*/
2453 * Bottom-most level for UNIX-like case
2457 struct _PerlIO base; /* The generic part */
2458 int fd; /* UNIX like file descriptor */
2459 int oflags; /* open/fcntl flags */
2463 PerlIOUnix_oflags(const char *mode)
2466 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2471 if (*++mode == '+') {
2478 oflags = O_CREAT | O_TRUNC;
2479 if (*++mode == '+') {
2488 oflags = O_CREAT | O_APPEND;
2489 if (*++mode == '+') {
2502 else if (*mode == 't') {
2504 oflags &= ~O_BINARY;
2508 * Always open in binary mode
2511 if (*mode || oflags == -1) {
2512 SETERRNO(EINVAL, LIB_INVARG);
2519 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2521 PERL_UNUSED_CONTEXT;
2522 return PerlIOSelf(f, PerlIOUnix)->fd;
2526 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2528 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2531 if (PerlLIO_fstat(fd, &st) == 0) {
2532 if (!S_ISREG(st.st_mode)) {
2533 PerlIO_debug("%d is not regular file\n",fd);
2534 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2537 PerlIO_debug("%d _is_ a regular file\n",fd);
2543 PerlIOUnix_refcnt_inc(fd);
2544 PERL_UNUSED_CONTEXT;
2548 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2550 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2551 if (*PerlIONext(f)) {
2552 /* We never call down so do any pending stuff now */
2553 PerlIO_flush(PerlIONext(f));
2555 * XXX could (or should) we retrieve the oflags from the open file
2556 * handle rather than believing the "mode" we are passed in? XXX
2557 * Should the value on NULL mode be 0 or -1?
2559 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2560 mode ? PerlIOUnix_oflags(mode) : -1);
2562 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2568 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2570 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2572 PERL_UNUSED_CONTEXT;
2573 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2575 SETERRNO(ESPIPE, LIB_INVARG);
2577 SETERRNO(EINVAL, LIB_INVARG);
2581 new_loc = PerlLIO_lseek(fd, offset, whence);
2582 if (new_loc == (Off_t) - 1)
2584 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2589 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2590 IV n, const char *mode, int fd, int imode,
2591 int perm, PerlIO *f, int narg, SV **args)
2593 if (PerlIOValid(f)) {
2594 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
2595 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2598 if (*mode == IoTYPE_NUMERIC)
2601 imode = PerlIOUnix_oflags(mode);
2605 const char *path = SvPV_nolen_const(*args);
2606 fd = PerlLIO_open3(path, imode, perm);
2610 if (*mode == IoTYPE_IMPLICIT)
2613 f = PerlIO_allocate(aTHX);
2615 if (!PerlIOValid(f)) {
2616 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2620 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2621 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2622 if (*mode == IoTYPE_APPEND)
2623 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2630 * FIXME: pop layers ???
2638 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2640 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2642 if (flags & PERLIO_DUP_FD) {
2643 fd = PerlLIO_dup(fd);
2646 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2648 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2649 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2658 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2661 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2662 #ifdef PERLIO_STD_SPECIAL
2664 return PERLIO_STD_IN(fd, vbuf, count);
2666 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2667 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2671 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2672 if (len >= 0 || errno != EINTR) {
2674 if (errno != EAGAIN) {
2675 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2678 else if (len == 0 && count != 0) {
2679 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2690 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2693 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2694 #ifdef PERLIO_STD_SPECIAL
2695 if (fd == 1 || fd == 2)
2696 return PERLIO_STD_OUT(fd, vbuf, count);
2699 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2700 if (len >= 0 || errno != EINTR) {
2702 if (errno != EAGAIN) {
2703 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2714 PerlIOUnix_tell(pTHX_ PerlIO *f)
2716 PERL_UNUSED_CONTEXT;
2718 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2723 PerlIOUnix_close(pTHX_ PerlIO *f)
2726 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2728 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2729 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2730 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2735 SETERRNO(EBADF,SS_IVCHAN);
2738 while (PerlLIO_close(fd) != 0) {
2739 if (errno != EINTR) {
2746 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2751 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2752 sizeof(PerlIO_funcs),
2759 PerlIOBase_binmode, /* binmode */
2769 PerlIOBase_noop_ok, /* flush */
2770 PerlIOBase_noop_fail, /* fill */
2773 PerlIOBase_clearerr,
2774 PerlIOBase_setlinebuf,
2775 NULL, /* get_base */
2776 NULL, /* get_bufsiz */
2779 NULL, /* set_ptrcnt */
2782 /*--------------------------------------------------------------------------------------*/
2787 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2788 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2789 broken by the last second glibc 2.3 fix
2791 #define STDIO_BUFFER_WRITABLE
2796 struct _PerlIO base;
2797 FILE *stdio; /* The stream */
2801 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2803 PERL_UNUSED_CONTEXT;
2805 if (PerlIOValid(f)) {
2806 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2808 return PerlSIO_fileno(s);
2815 PerlIOStdio_mode(const char *mode, char *tmode)
2817 char * const ret = tmode;
2823 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2831 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2834 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2835 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2836 if (toptab == tab) {
2837 /* Top is already stdio - pop self (duplicate) and use original */
2838 PerlIO_pop(aTHX_ f);
2841 const int fd = PerlIO_fileno(n);
2844 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2845 mode = PerlIOStdio_mode(mode, tmode)))) {
2846 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2847 /* We never call down so do any pending stuff now */
2848 PerlIO_flush(PerlIONext(f));
2855 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2860 PerlIO_importFILE(FILE *stdio, const char *mode)
2866 if (!mode || !*mode) {
2867 /* We need to probe to see how we can open the stream
2868 so start with read/write and then try write and read
2869 we dup() so that we can fclose without loosing the fd.
2871 Note that the errno value set by a failing fdopen
2872 varies between stdio implementations.
2874 const int fd = PerlLIO_dup(fileno(stdio));
2875 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
2877 f2 = PerlSIO_fdopen(fd, (mode = "w"));
2880 f2 = PerlSIO_fdopen(fd, (mode = "r"));
2883 /* Don't seem to be able to open */
2889 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
2890 s = PerlIOSelf(f, PerlIOStdio);
2892 PerlIOUnix_refcnt_inc(fileno(stdio));
2899 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2900 IV n, const char *mode, int fd, int imode,
2901 int perm, PerlIO *f, int narg, SV **args)
2904 if (PerlIOValid(f)) {
2905 const char * const path = SvPV_nolen_const(*args);
2906 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
2908 PerlIOUnix_refcnt_dec(fileno(s->stdio));
2909 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
2914 PerlIOUnix_refcnt_inc(fileno(s->stdio));
2919 const char * const path = SvPV_nolen_const(*args);
2920 if (*mode == IoTYPE_NUMERIC) {
2922 fd = PerlLIO_open3(path, imode, perm);
2926 bool appended = FALSE;
2928 /* Cygwin wants its 'b' early. */
2930 mode = PerlIOStdio_mode(mode, tmode);
2932 stdio = PerlSIO_fopen(path, mode);
2935 f = PerlIO_allocate(aTHX);
2938 mode = PerlIOStdio_mode(mode, tmode);
2939 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
2941 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2942 PerlIOUnix_refcnt_inc(fileno(stdio));
2944 PerlSIO_fclose(stdio);
2956 if (*mode == IoTYPE_IMPLICIT) {
2963 stdio = PerlSIO_stdin;
2966 stdio = PerlSIO_stdout;
2969 stdio = PerlSIO_stderr;
2974 stdio = PerlSIO_fdopen(fd, mode =
2975 PerlIOStdio_mode(mode, tmode));
2979 f = PerlIO_allocate(aTHX);
2981 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2982 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2983 PerlIOUnix_refcnt_inc(fileno(stdio));
2993 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2995 /* This assumes no layers underneath - which is what
2996 happens, but is not how I remember it. NI-S 2001/10/16
2998 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
2999 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3000 const int fd = fileno(stdio);
3002 if (flags & PERLIO_DUP_FD) {
3003 const int dfd = PerlLIO_dup(fileno(stdio));
3005 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3010 /* FIXME: To avoid messy error recovery if dup fails
3011 re-use the existing stdio as though flag was not set
3015 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3017 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3019 PerlIOUnix_refcnt_inc(fileno(stdio));
3026 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3028 PERL_UNUSED_CONTEXT;
3030 /* XXX this could use PerlIO_canset_fileno() and
3031 * PerlIO_set_fileno() support from Configure
3033 # if defined(__UCLIBC__)
3034 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3037 # elif defined(__GLIBC__)
3038 /* There may be a better way for GLIBC:
3039 - libio.h defines a flag to not close() on cleanup
3043 # elif defined(__sun__)
3046 # elif defined(__hpux)
3050 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3051 your platform does not have special entry try this one.
3052 [For OSF only have confirmation for Tru64 (alpha)
3053 but assume other OSFs will be similar.]
3055 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3058 # elif defined(__FreeBSD__)
3059 /* There may be a better way on FreeBSD:
3060 - we could insert a dummy func in the _close function entry
3061 f->_close = (int (*)(void *)) dummy_close;
3065 # elif defined(__OpenBSD__)
3066 /* There may be a better way on OpenBSD:
3067 - we could insert a dummy func in the _close function entry
3068 f->_close = (int (*)(void *)) dummy_close;
3072 # elif defined(__EMX__)
3073 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3076 # elif defined(__CYGWIN__)
3077 /* There may be a better way on CYGWIN:
3078 - we could insert a dummy func in the _close function entry
3079 f->_close = (int (*)(void *)) dummy_close;
3083 # elif defined(WIN32)
3084 # if defined(__BORLANDC__)
3085 f->fd = PerlLIO_dup(fileno(f));
3086 # elif defined(UNDER_CE)
3087 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3096 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3097 (which isn't thread safe) instead
3099 # error "Don't know how to set FILE.fileno on your platform"
3107 PerlIOStdio_close(pTHX_ PerlIO *f)
3109 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3115 const int fd = fileno(stdio);
3123 #ifdef SOCKS5_VERSION_NAME
3124 /* Socks lib overrides close() but stdio isn't linked to
3125 that library (though we are) - so we must call close()
3126 on sockets on stdio's behalf.
3129 Sock_size_t optlen = sizeof(int);
3130 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3133 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3134 that a subsequent fileno() on it returns -1. Don't want to croak()
3135 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3136 trying to close an already closed handle which somehow it still has
3137 a reference to. (via.xs, I'm looking at you). */
3138 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3139 /* File descriptor still in use */
3143 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3144 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3146 if (stdio == stdout || stdio == stderr)
3147 return PerlIO_flush(f);
3148 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3149 Use Sarathy's trick from maint-5.6 to invalidate the
3150 fileno slot of the FILE *
3152 result = PerlIO_flush(f);
3154 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3157 MUTEX_LOCK(&PL_perlio_mutex);
3158 /* Right. We need a mutex here because for a brief while we
3159 will have the situation that fd is actually closed. Hence if
3160 a second thread were to get into this block, its dup() would
3161 likely return our fd as its dupfd. (after all, it is closed)
3162 Then if we get to the dup2() first, we blat the fd back
3163 (messing up its temporary as a side effect) only for it to
3164 then close its dupfd (== our fd) in its close(dupfd) */
3166 /* There is, of course, a race condition, that any other thread
3167 trying to input/output/whatever on this fd will be stuffed
3168 for the duration of this little manoeuvrer. Perhaps we
3169 should hold an IO mutex for the duration of every IO
3170 operation if we know that invalidate doesn't work on this
3171 platform, but that would suck, and could kill performance.
3173 Except that correctness trumps speed.
3174 Advice from klortho #11912. */
3176 dupfd = PerlLIO_dup(fd);
3179 MUTEX_UNLOCK(&PL_perlio_mutex);
3180 /* Oh cXap. This isn't going to go well. Not sure if we can
3181 recover from here, or if closing this particular FILE *
3182 is a good idea now. */
3187 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3189 result = PerlSIO_fclose(stdio);
3190 /* We treat error from stdio as success if we invalidated
3191 errno may NOT be expected EBADF
3193 if (invalidate && result != 0) {
3197 #ifdef SOCKS5_VERSION_NAME
3198 /* in SOCKS' case, let close() determine return value */
3202 PerlLIO_dup2(dupfd,fd);
3203 PerlLIO_close(dupfd);
3205 MUTEX_UNLOCK(&PL_perlio_mutex);
3213 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3216 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3220 STDCHAR *buf = (STDCHAR *) vbuf;
3222 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3223 * stdio does not do that for fread()
3225 const int ch = PerlSIO_fgetc(s);
3232 got = PerlSIO_fread(vbuf, 1, count, s);
3233 if (got == 0 && PerlSIO_ferror(s))
3235 if (got >= 0 || errno != EINTR)
3238 SETERRNO(0,0); /* just in case */
3244 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3247 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3249 #ifdef STDIO_BUFFER_WRITABLE
3250 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3251 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3252 STDCHAR *base = PerlIO_get_base(f);
3253 SSize_t cnt = PerlIO_get_cnt(f);
3254 STDCHAR *ptr = PerlIO_get_ptr(f);
3255 SSize_t avail = ptr - base;
3257 if (avail > count) {
3261 Move(buf-avail,ptr,avail,STDCHAR);
3264 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3265 if (PerlSIO_feof(s) && unread >= 0)
3266 PerlSIO_clearerr(s);
3271 if (PerlIO_has_cntptr(f)) {
3272 /* We can get pointer to buffer but not its base
3273 Do ungetc() but check chars are ending up in the
3276 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3277 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3279 const int ch = *--buf & 0xFF;
3280 if (ungetc(ch,s) != ch) {
3281 /* ungetc did not work */
3284 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3285 /* Did not change pointer as expected */
3286 fgetc(s); /* get char back again */
3296 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3302 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3307 got = PerlSIO_fwrite(vbuf, 1, count,
3308 PerlIOSelf(f, PerlIOStdio)->stdio);
3309 if (got >= 0 || errno != EINTR)
3312 SETERRNO(0,0); /* just in case */
3318 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3320 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3321 PERL_UNUSED_CONTEXT;
3323 return PerlSIO_fseek(stdio, offset, whence);
3327 PerlIOStdio_tell(pTHX_ PerlIO *f)
3329 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3330 PERL_UNUSED_CONTEXT;
3332 return PerlSIO_ftell(stdio);
3336 PerlIOStdio_flush(pTHX_ PerlIO *f)
3338 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3339 PERL_UNUSED_CONTEXT;
3341 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3342 return PerlSIO_fflush(stdio);
3348 * FIXME: This discards ungetc() and pre-read stuff which is not
3349 * right if this is just a "sync" from a layer above Suspect right
3350 * design is to do _this_ but not have layer above flush this
3351 * layer read-to-read
3354 * Not writeable - sync by attempting a seek
3357 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3365 PerlIOStdio_eof(pTHX_ PerlIO *f)
3367 PERL_UNUSED_CONTEXT;
3369 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3373 PerlIOStdio_error(pTHX_ PerlIO *f)
3375 PERL_UNUSED_CONTEXT;
3377 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3381 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3383 PERL_UNUSED_CONTEXT;
3385 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3389 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3391 PERL_UNUSED_CONTEXT;
3393 #ifdef HAS_SETLINEBUF
3394 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3396 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3402 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3404 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3405 return (STDCHAR*)PerlSIO_get_base(stdio);
3409 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3411 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3412 return PerlSIO_get_bufsiz(stdio);
3416 #ifdef USE_STDIO_PTR
3418 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3420 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3421 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3425 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3427 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3428 return PerlSIO_get_cnt(stdio);
3432 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3434 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3436 #ifdef STDIO_PTR_LVALUE
3437 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3438 #ifdef STDIO_PTR_LVAL_SETS_CNT
3439 assert(PerlSIO_get_cnt(stdio) == (cnt));
3441 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3443 * Setting ptr _does_ change cnt - we are done
3447 #else /* STDIO_PTR_LVALUE */
3449 #endif /* STDIO_PTR_LVALUE */
3452 * Now (or only) set cnt
3454 #ifdef STDIO_CNT_LVALUE
3455 PerlSIO_set_cnt(stdio, cnt);
3456 #else /* STDIO_CNT_LVALUE */
3457 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3458 PerlSIO_set_ptr(stdio,
3459 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3461 #else /* STDIO_PTR_LVAL_SETS_CNT */
3463 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3464 #endif /* STDIO_CNT_LVALUE */
3471 PerlIOStdio_fill(pTHX_ PerlIO *f)
3473 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3475 PERL_UNUSED_CONTEXT;
3478 * fflush()ing read-only streams can cause trouble on some stdio-s
3480 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3481 if (PerlSIO_fflush(stdio) != 0)
3485 c = PerlSIO_fgetc(stdio);
3488 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3494 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3496 #ifdef STDIO_BUFFER_WRITABLE
3497 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3498 /* Fake ungetc() to the real buffer in case system's ungetc
3501 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3502 SSize_t cnt = PerlSIO_get_cnt(stdio);
3503 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3504 if (ptr == base+1) {
3505 *--ptr = (STDCHAR) c;
3506 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3507 if (PerlSIO_feof(stdio))
3508 PerlSIO_clearerr(stdio);
3514 if (PerlIO_has_cntptr(f)) {
3516 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3523 /* An ungetc()d char is handled separately from the regular
3524 * buffer, so we stuff it in the buffer ourselves.
3525 * Should never get called as should hit code above
3527 *(--((*stdio)->_ptr)) = (unsigned char) c;
3530 /* If buffer snoop scheme above fails fall back to
3533 if (PerlSIO_ungetc(c, stdio) != c)
3541 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3542 sizeof(PerlIO_funcs),
3544 sizeof(PerlIOStdio),
3545 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3549 PerlIOBase_binmode, /* binmode */
3563 PerlIOStdio_clearerr,
3564 PerlIOStdio_setlinebuf,
3566 PerlIOStdio_get_base,
3567 PerlIOStdio_get_bufsiz,
3572 #ifdef USE_STDIO_PTR
3573 PerlIOStdio_get_ptr,
3574 PerlIOStdio_get_cnt,
3575 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3576 PerlIOStdio_set_ptrcnt,
3579 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3584 #endif /* USE_STDIO_PTR */
3587 /* Note that calls to PerlIO_exportFILE() are reversed using
3588 * PerlIO_releaseFILE(), not importFILE. */
3590 PerlIO_exportFILE(PerlIO * f, const char *mode)
3594 if (PerlIOValid(f)) {
3597 if (!mode || !*mode) {
3598 mode = PerlIO_modestr(f, buf);
3600 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3604 /* De-link any lower layers so new :stdio sticks */
3606 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3607 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3609 PerlIOUnix_refcnt_inc(fileno(stdio));
3610 /* Link previous lower layers under new one */
3614 /* restore layers list */
3624 PerlIO_findFILE(PerlIO *f)
3629 if (l->tab == &PerlIO_stdio) {
3630 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3633 l = *PerlIONext(&l);
3635 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3636 /* However, we're not really exporting a FILE * to someone else (who
3637 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3638 So we need to undo its refernce count increase on the underlying file
3639 descriptor. We have to do this, because if the loop above returns you
3640 the FILE *, then *it* didn't increase any reference count. So there's
3641 only one way to be consistent. */
3642 stdio = PerlIO_exportFILE(f, NULL);
3644 const int fd = fileno(stdio);
3646 PerlIOUnix_refcnt_dec(fd);
3651 /* Use this to reverse PerlIO_exportFILE calls. */
3653 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3658 if (l->tab == &PerlIO_stdio) {
3659 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3660 if (s->stdio == f) {
3662 const int fd = fileno(f);
3664 PerlIOUnix_refcnt_dec(fd);
3665 PerlIO_pop(aTHX_ p);
3674 /*--------------------------------------------------------------------------------------*/
3676 * perlio buffer layer
3680 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3682 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3683 const int fd = PerlIO_fileno(f);
3684 if (fd >= 0 && PerlLIO_isatty(fd)) {
3685 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3687 if (*PerlIONext(f)) {
3688 const Off_t posn = PerlIO_tell(PerlIONext(f));
3689 if (posn != (Off_t) - 1) {
3693 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3697 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3698 IV n, const char *mode, int fd, int imode, int perm,
3699 PerlIO *f, int narg, SV **args)
3701 if (PerlIOValid(f)) {
3702 PerlIO *next = PerlIONext(f);
3704 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3705 if (tab && tab->Open)
3707 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3709 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3714 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3716 if (*mode == IoTYPE_IMPLICIT) {
3722 if (tab && tab->Open)
3723 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3726 SETERRNO(EINVAL, LIB_INVARG);
3728 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3730 * if push fails during open, open fails. close will pop us.
3735 fd = PerlIO_fileno(f);
3736 if (init && fd == 2) {
3738 * Initial stderr is unbuffered
3740 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3742 #ifdef PERLIO_USING_CRLF
3743 # ifdef PERLIO_IS_BINMODE_FD
3744 if (PERLIO_IS_BINMODE_FD(fd))
3745 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3749 * do something about failing setmode()? --jhi
3751 PerlLIO_setmode(fd, O_BINARY);
3760 * This "flush" is akin to sfio's sync in that it handles files in either
3761 * read or write state. For write state, we put the postponed data through
3762 * the next layers. For read state, we seek() the next layers to the
3763 * offset given by current position in the buffer, and discard the buffer
3764 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3765 * in any case?). Then the pass the stick further in chain.
3768 PerlIOBuf_flush(pTHX_ PerlIO *f)
3770 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3772 PerlIO *n = PerlIONext(f);
3773 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3775 * write() the buffer
3777 const STDCHAR *buf = b->buf;
3778 const STDCHAR *p = buf;
3779 while (p < b->ptr) {
3780 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3784 else if (count < 0 || PerlIO_error(n)) {
3785 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3790 b->posn += (p - buf);
3792 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3793 STDCHAR *buf = PerlIO_get_base(f);
3795 * Note position change
3797 b->posn += (b->ptr - buf);
3798 if (b->ptr < b->end) {
3799 /* We did not consume all of it - try and seek downstream to
3800 our logical position
3802 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3803 /* Reload n as some layers may pop themselves on seek */
3804 b->posn = PerlIO_tell(n = PerlIONext(f));
3807 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3808 data is lost for good - so return saying "ok" having undone
3811 b->posn -= (b->ptr - buf);
3816 b->ptr = b->end = b->buf;
3817 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3818 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3819 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3824 /* This discards the content of the buffer after b->ptr, and rereads
3825 * the buffer from the position off in the layer downstream; here off
3826 * is at offset corresponding to b->ptr - b->buf.
3829 PerlIOBuf_fill(pTHX_ PerlIO *f)
3831 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3832 PerlIO *n = PerlIONext(f);
3835 * Down-stream flush is defined not to loose read data so is harmless.
3836 * we would not normally be fill'ing if there was data left in anycase.
3838 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
3840 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
3841 PerlIOBase_flush_linebuf(aTHX);
3844 PerlIO_get_base(f); /* allocate via vtable */
3846 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
3848 b->ptr = b->end = b->buf;
3850 if (!PerlIOValid(n)) {
3851 PerlIOBase(f)->flags |= PERLIO_F_EOF;
3855 if (PerlIO_fast_gets(n)) {
3857 * Layer below is also buffered. We do _NOT_ want to call its
3858 * ->Read() because that will loop till it gets what we asked for
3859 * which may hang on a pipe etc. Instead take anything it has to
3860 * hand, or ask it to fill _once_.
3862 avail = PerlIO_get_cnt(n);
3864 avail = PerlIO_fill(n);
3866 avail = PerlIO_get_cnt(n);
3868 if (!PerlIO_error(n) && PerlIO_eof(n))
3873 STDCHAR *ptr = PerlIO_get_ptr(n);
3874 const SSize_t cnt = avail;
3875 if (avail > (SSize_t)b->bufsiz)
3877 Copy(ptr, b->buf, avail, STDCHAR);
3878 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
3882 avail = PerlIO_read(n, b->ptr, b->bufsiz);
3886 PerlIOBase(f)->flags |= PERLIO_F_EOF;
3888 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3891 b->end = b->buf + avail;
3892 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3897 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3899 if (PerlIOValid(f)) {
3900 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3903 return PerlIOBase_read(aTHX_ f, vbuf, count);
3909 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3911 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
3912 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3915 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3920 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3922 * Buffer is already a read buffer, we can overwrite any chars
3923 * which have been read back to buffer start
3925 avail = (b->ptr - b->buf);
3929 * Buffer is idle, set it up so whole buffer is available for
3933 b->end = b->buf + avail;
3935 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3937 * Buffer extends _back_ from where we are now
3939 b->posn -= b->bufsiz;
3941 if (avail > (SSize_t) count) {
3943 * If we have space for more than count, just move count
3951 * In simple stdio-like ungetc() case chars will be already
3954 if (buf != b->ptr) {
3955 Copy(buf, b->ptr, avail, STDCHAR);
3959 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
3963 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3969 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3971 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3972 const STDCHAR *buf = (const STDCHAR *) vbuf;
3973 const STDCHAR *flushptr = buf;
3977 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3979 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3980 if (PerlIO_flush(f) != 0) {
3984 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
3985 flushptr = buf + count;
3986 while (flushptr > buf && *(flushptr - 1) != '\n')
3990 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
3991 if ((SSize_t) count < avail)
3993 if (flushptr > buf && flushptr <= buf + avail)
3994 avail = flushptr - buf;
3995 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3997 Copy(buf, b->ptr, avail, STDCHAR);
4002 if (buf == flushptr)
4005 if (b->ptr >= (b->buf + b->bufsiz))
4008 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4014 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4017 if ((code = PerlIO_flush(f)) == 0) {
4018 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4019 code = PerlIO_seek(PerlIONext(f), offset, whence);
4021 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4022 b->posn = PerlIO_tell(PerlIONext(f));
4029 PerlIOBuf_tell(pTHX_ PerlIO *f)
4031 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4033 * b->posn is file position where b->buf was read, or will be written
4035 Off_t posn = b->posn;
4036 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4037 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4039 /* As O_APPEND files are normally shared in some sense it is better
4044 /* when file is NOT shared then this is sufficient */
4045 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4047 posn = b->posn = PerlIO_tell(PerlIONext(f));
4051 * If buffer is valid adjust position by amount in buffer
4053 posn += (b->ptr - b->buf);
4059 PerlIOBuf_popped(pTHX_ PerlIO *f)
4061 const IV code = PerlIOBase_popped(aTHX_ f);
4062 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4063 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4066 b->ptr = b->end = b->buf = NULL;
4067 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4072 PerlIOBuf_close(pTHX_ PerlIO *f)
4074 const IV code = PerlIOBase_close(aTHX_ f);
4075 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4076 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4079 b->ptr = b->end = b->buf = NULL;
4080 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4085 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4087 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4094 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4096 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4099 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4100 return (b->end - b->ptr);
4105 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4107 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4108 PERL_UNUSED_CONTEXT;
4113 b->buf = Newxz(b->buf,b->bufsiz, STDCHAR);
4115 b->buf = (STDCHAR *) & b->oneword;
4116 b->bufsiz = sizeof(b->oneword);
4118 b->end = b->ptr = b->buf;
4124 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4126 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4129 return (b->end - b->buf);
4133 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4135 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4137 PERL_UNUSED_ARG(cnt);
4142 assert(PerlIO_get_cnt(f) == cnt);
4143 assert(b->ptr >= b->buf);
4144 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4148 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4150 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4155 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4156 sizeof(PerlIO_funcs),
4159 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4163 PerlIOBase_binmode, /* binmode */
4177 PerlIOBase_clearerr,
4178 PerlIOBase_setlinebuf,
4183 PerlIOBuf_set_ptrcnt,
4186 /*--------------------------------------------------------------------------------------*/
4188 * Temp layer to hold unread chars when cannot do it any other way
4192 PerlIOPending_fill(pTHX_ PerlIO *f)
4195 * Should never happen
4202 PerlIOPending_close(pTHX_ PerlIO *f)
4205 * A tad tricky - flush pops us, then we close new top
4208 return PerlIO_close(f);
4212 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4215 * A tad tricky - flush pops us, then we seek new top
4218 return PerlIO_seek(f, offset, whence);
4223 PerlIOPending_flush(pTHX_ PerlIO *f)
4225 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4226 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4230 PerlIO_pop(aTHX_ f);
4235 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4241 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4246 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4248 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4249 PerlIOl * const l = PerlIOBase(f);
4251 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4252 * etc. get muddled when it changes mid-string when we auto-pop.
4254 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4255 (PerlIOBase(PerlIONext(f))->
4256 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4261 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4263 SSize_t avail = PerlIO_get_cnt(f);
4265 if ((SSize_t)count < avail)
4268 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4269 if (got >= 0 && got < (SSize_t)count) {
4270 const SSize_t more =
4271 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4272 if (more >= 0 || got == 0)
4278 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4279 sizeof(PerlIO_funcs),
4282 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4283 PerlIOPending_pushed,
4286 PerlIOBase_binmode, /* binmode */
4295 PerlIOPending_close,
4296 PerlIOPending_flush,
4300 PerlIOBase_clearerr,
4301 PerlIOBase_setlinebuf,
4306 PerlIOPending_set_ptrcnt,
4311 /*--------------------------------------------------------------------------------------*/
4313 * crlf - translation On read translate CR,LF to "\n" we do this by
4314 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4315 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4317 * c->nl points on the first byte of CR LF pair when it is temporarily
4318 * replaced by LF, or to the last CR of the buffer. In the former case
4319 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4320 * that it ends at c->nl; these two cases can be distinguished by
4321 * *c->nl. c->nl is set during _getcnt() call, and unset during
4322 * _unread() and _flush() calls.
4323 * It only matters for read operations.
4327 PerlIOBuf base; /* PerlIOBuf stuff */
4328 STDCHAR *nl; /* Position of crlf we "lied" about in the
4332 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4333 * Otherwise the :crlf layer would always revert back to
4337 S_inherit_utf8_flag(PerlIO *f)
4339 PerlIO *g = PerlIONext(f);
4340 if (PerlIOValid(g)) {
4341 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4342 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4348 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4351 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4352 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4354 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4355 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4356 PerlIOBase(f)->flags);
4359 /* Enable the first CRLF capable layer you can find, but if none
4360 * found, the one we just pushed is fine. This results in at
4361 * any given moment at most one CRLF-capable layer being enabled
4362 * in the whole layer stack. */
4363 PerlIO *g = PerlIONext(f);
4364 while (PerlIOValid(g)) {
4365 PerlIOl *b = PerlIOBase(g);
4366 if (b && b->tab == &PerlIO_crlf) {
4367 if (!(b->flags & PERLIO_F_CRLF))
4368 b->flags |= PERLIO_F_CRLF;
4369 S_inherit_utf8_flag(g);
4370 PerlIO_pop(aTHX_ f);
4376 S_inherit_utf8_flag(f);
4382 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4384 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4385 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4389 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4390 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4392 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4393 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4395 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4400 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4401 b->end = b->ptr = b->buf + b->bufsiz;
4402 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4403 b->posn -= b->bufsiz;
4405 while (count > 0 && b->ptr > b->buf) {
4406 const int ch = *--buf;
4408 if (b->ptr - 2 >= b->buf) {
4415 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4416 *--(b->ptr) = 0xa; /* Works even if 0xa == '\r' */
4432 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4434 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4436 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4439 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4440 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4441 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == 0xd)) {
4442 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4444 while (nl < b->end && *nl != 0xd)
4446 if (nl < b->end && *nl == 0xd) {
4448 if (nl + 1 < b->end) {
4455 * Not CR,LF but just CR
4463 * Blast - found CR as last char in buffer
4468 * They may not care, defer work as long as
4472 return (nl - b->ptr);
4476 b->ptr++; /* say we have read it as far as
4477 * flush() is concerned */
4478 b->buf++; /* Leave space in front of buffer */
4479 /* Note as we have moved buf up flush's
4481 will naturally make posn point at CR
4483 b->bufsiz--; /* Buffer is thus smaller */
4484 code = PerlIO_fill(f); /* Fetch some more */
4485 b->bufsiz++; /* Restore size for next time */
4486 b->buf--; /* Point at space */
4487 b->ptr = nl = b->buf; /* Which is what we hand
4489 *nl = 0xd; /* Fill in the CR */
4491 goto test; /* fill() call worked */
4493 * CR at EOF - just fall through
4495 /* Should we clear EOF though ??? */
4500 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4506 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4508 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4509 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4515 if (ptr == b->end && *c->nl == 0xd) {
4516 /* Defered CR at end of buffer case - we lied about count */
4529 * Test code - delete when it works ...
4531 IV flags = PerlIOBase(f)->flags;
4532 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4533 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == 0xd) {
4534 /* Defered CR at end of buffer case - we lied about count */
4540 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4541 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4542 flags, c->nl, b->end, cnt);
4549 * They have taken what we lied about
4557 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4561 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4563 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4564 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4566 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4567 const STDCHAR *buf = (const STDCHAR *) vbuf;
4568 const STDCHAR * const ebuf = buf + count;
4571 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4573 while (buf < ebuf) {
4574 const STDCHAR * const eptr = b->buf + b->bufsiz;
4575 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4576 while (buf < ebuf && b->ptr < eptr) {
4578 if ((b->ptr + 2) > eptr) {
4586 *(b->ptr)++ = 0xd; /* CR */
4587 *(b->ptr)++ = 0xa; /* LF */
4589 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4596 *(b->ptr)++ = *buf++;
4598 if (b->ptr >= eptr) {
4604 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4606 return (buf - (STDCHAR *) vbuf);
4611 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4613 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4618 return PerlIOBuf_flush(aTHX_ f);
4622 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4624 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4625 /* In text mode - flush any pending stuff and flip it */
4626 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4627 #ifndef PERLIO_USING_CRLF
4628 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4629 PerlIO_pop(aTHX_ f);
4635 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4636 sizeof(PerlIO_funcs),
4639 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4641 PerlIOBuf_popped, /* popped */
4643 PerlIOCrlf_binmode, /* binmode */
4647 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4648 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4649 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4657 PerlIOBase_clearerr,
4658 PerlIOBase_setlinebuf,
4663 PerlIOCrlf_set_ptrcnt,
4667 /*--------------------------------------------------------------------------------------*/
4669 * mmap as "buffer" layer
4673 PerlIOBuf base; /* PerlIOBuf stuff */
4674 Mmap_t mptr; /* Mapped address */
4675 Size_t len; /* mapped length */
4676 STDCHAR *bbuf; /* malloced buffer if map fails */
4680 PerlIOMmap_map(pTHX_ PerlIO *f)
4683 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4684 const IV flags = PerlIOBase(f)->flags;
4688 if (flags & PERLIO_F_CANREAD) {
4689 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4690 const int fd = PerlIO_fileno(f);
4692 code = Fstat(fd, &st);
4693 if (code == 0 && S_ISREG(st.st_mode)) {
4694 SSize_t len = st.st_size - b->posn;
4697 if (PL_mmap_page_size <= 0)
4698 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
4702 * This is a hack - should never happen - open should
4705 b->posn = PerlIO_tell(PerlIONext(f));
4707 posn = (b->posn / PL_mmap_page_size) * PL_mmap_page_size;
4708 len = st.st_size - posn;
4709 m->mptr = (Mmap_t)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
4710 if (m->mptr && m->mptr != (Mmap_t) - 1) {
4711 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
4712 madvise(m->mptr, len, MADV_SEQUENTIAL);
4714 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
4715 madvise(m->mptr, len, MADV_WILLNEED);
4717 PerlIOBase(f)->flags =
4718 (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
4719 b->end = ((STDCHAR *) m->mptr) + len;
4720 b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
4729 PerlIOBase(f)->flags =
4730 flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
4732 b->ptr = b->end = b->ptr;
4741 PerlIOMmap_unmap(pTHX_ PerlIO *f)
4743 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4746 PerlIOBuf * const b = &m->base;
4748 /* The munmap address argument is tricky: depending on the
4749 * standard it is either "void *" or "caddr_t" (which is
4750 * usually "char *" (signed or unsigned). If we cast it
4751 * to "void *", those that have it caddr_t and an uptight
4752 * C++ compiler, will freak out. But casting it as char*
4753 * should work. Maybe. (Using Mmap_t figured out by
4754 * Configure doesn't always work, apparently.) */
4755 code = munmap((char*)m->mptr, m->len);
4759 if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
4762 b->ptr = b->end = b->buf;
4763 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4769 PerlIOMmap_get_base(pTHX_ PerlIO *f)
4771 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4772 PerlIOBuf * const b = &m->base;
4773 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4775 * Already have a readbuffer in progress
4781 * We have a write buffer or flushed PerlIOBuf read buffer
4783 m->bbuf = b->buf; /* save it in case we need it again */
4784 b->buf = NULL; /* Clear to trigger below */
4787 PerlIOMmap_map(aTHX_ f); /* Try and map it */
4790 * Map did not work - recover PerlIOBuf buffer if we have one
4795 b->ptr = b->end = b->buf;
4798 return PerlIOBuf_get_base(aTHX_ f);
4802 PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4804 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4805 PerlIOBuf * const b = &m->base;
4806 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4808 if (b->ptr && (b->ptr - count) >= b->buf
4809 && memEQ(b->ptr - count, vbuf, count)) {
4811 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4816 * Loose the unwritable mapped buffer
4820 * If flush took the "buffer" see if we have one from before
4822 if (!b->buf && m->bbuf)
4825 PerlIOBuf_get_base(aTHX_ f);
4829 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4833 PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4835 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4836 PerlIOBuf * const b = &m->base;
4838 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4840 * No, or wrong sort of, buffer
4843 if (PerlIOMmap_unmap(aTHX_ f) != 0)
4847 * If unmap took the "buffer" see if we have one from before
4849 if (!b->buf && m->bbuf)
4852 PerlIOBuf_get_base(aTHX_ f);
4856 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4860 PerlIOMmap_flush(pTHX_ PerlIO *f)
4862 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4863 PerlIOBuf * const b = &m->base;
4864 IV code = PerlIOBuf_flush(aTHX_ f);
4866 * Now we are "synced" at PerlIOBuf level
4873 if (PerlIOMmap_unmap(aTHX_ f) != 0)
4878 * We seem to have a PerlIOBuf buffer which was not mapped
4879 * remember it in case we need one later
4888 PerlIOMmap_fill(pTHX_ PerlIO *f)
4890 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4891 IV code = PerlIO_flush(f);
4892 if (code == 0 && !b->buf) {
4893 code = PerlIOMmap_map(aTHX_ f);
4895 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4896 code = PerlIOBuf_fill(aTHX_ f);
4902 PerlIOMmap_close(pTHX_ PerlIO *f)
4904 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4905 PerlIOBuf * const b = &m->base;
4906 IV code = PerlIO_flush(f);
4910 b->ptr = b->end = b->buf;
4912 if (PerlIOBuf_close(aTHX_ f) != 0)
4918 PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4920 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4924 PERLIO_FUNCS_DECL(PerlIO_mmap) = {
4925 sizeof(PerlIO_funcs),
4928 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4932 PerlIOBase_binmode, /* binmode */
4946 PerlIOBase_clearerr,
4947 PerlIOBase_setlinebuf,
4948 PerlIOMmap_get_base,
4952 PerlIOBuf_set_ptrcnt,
4955 #endif /* HAS_MMAP */
4958 Perl_PerlIO_stdin(pTHX)
4962 PerlIO_stdstreams(aTHX);
4964 return &PL_perlio[1];
4968 Perl_PerlIO_stdout(pTHX)
4972 PerlIO_stdstreams(aTHX);
4974 return &PL_perlio[2];
4978 Perl_PerlIO_stderr(pTHX)
4982 PerlIO_stdstreams(aTHX);
4984 return &PL_perlio[3];
4987 /*--------------------------------------------------------------------------------------*/
4990 PerlIO_getname(PerlIO *f, char *buf)
4995 bool exported = FALSE;
4996 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
4998 stdio = PerlIO_exportFILE(f,0);
5002 name = fgetname(stdio, buf);
5003 if (exported) PerlIO_releaseFILE(f,stdio);
5008 PERL_UNUSED_ARG(buf);
5009 Perl_croak(aTHX_ "Don't know how to get file name");
5015 /*--------------------------------------------------------------------------------------*/
5017 * Functions which can be called on any kind of PerlIO implemented in
5021 #undef PerlIO_fdopen
5023 PerlIO_fdopen(int fd, const char *mode)
5026 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
5031 PerlIO_open(const char *path, const char *mode)
5034 SV *name = sv_2mortal(newSVpv(path, 0));
5035 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
5038 #undef Perlio_reopen
5040 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
5043 SV *name = sv_2mortal(newSVpv(path,0));
5044 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
5049 PerlIO_getc(PerlIO *f)
5053 if ( 1 == PerlIO_read(f, buf, 1) ) {
5054 return (unsigned char) buf[0];
5059 #undef PerlIO_ungetc
5061 PerlIO_ungetc(PerlIO *f, int ch)
5066 if (PerlIO_unread(f, &buf, 1) == 1)
5074 PerlIO_putc(PerlIO *f, int ch)
5078 return PerlIO_write(f, &buf, 1);
5083 PerlIO_puts(PerlIO *f, const char *s)
5086 return PerlIO_write(f, s, strlen(s));
5089 #undef PerlIO_rewind
5091 PerlIO_rewind(PerlIO *f)
5094 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
5098 #undef PerlIO_vprintf
5100 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
5109 Perl_va_copy(ap, apc);
5110 sv = vnewSVpvf(fmt, &apc);
5112 sv = vnewSVpvf(fmt, &ap);
5114 s = SvPV_const(sv, len);
5115 wrote = PerlIO_write(f, s, len);
5120 #undef PerlIO_printf
5122 PerlIO_printf(PerlIO *f, const char *fmt, ...)
5127 result = PerlIO_vprintf(f, fmt, ap);
5132 #undef PerlIO_stdoutf
5134 PerlIO_stdoutf(const char *fmt, ...)
5140 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5145 #undef PerlIO_tmpfile
5147 PerlIO_tmpfile(void)
5152 const int fd = win32_tmpfd();
5154 f = PerlIO_fdopen(fd, "w+b");
5156 # if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5158 char tempname[] = "/tmp/PerlIO_XXXXXX";
5159 const char * const tmpdir = PL_tainting ? NULL : PerlEnv_getenv("TMPDIR");
5160 SV * const sv = tmpdir && *tmpdir ? newSVpv(tmpdir, 0) : NULL;
5162 * I have no idea how portable mkstemp() is ... NI-S
5165 /* if TMPDIR is set and not empty, we try that first */
5166 sv_catpv(sv, tempname + 4);
5167 fd = mkstemp(SvPVX(sv));
5170 /* else we try /tmp */
5171 fd = mkstemp(tempname);
5174 f = PerlIO_fdopen(fd, "w+");
5176 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5177 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5180 # else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5181 FILE * const stdio = PerlSIO_tmpfile();
5184 f = PerlIO_fdopen(fileno(stdio), "w+");
5186 # endif /* else HAS_MKSTEMP */
5187 #endif /* else WIN32 */
5194 #endif /* USE_SFIO */
5195 #endif /* PERLIO_IS_STDIO */
5197 /*======================================================================================*/
5199 * Now some functions in terms of above which may be needed even if we are
5200 * not in true PerlIO mode
5203 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5206 const char *direction = NULL;
5209 * Need to supply default layer info from open.pm
5215 if (mode && mode[0] != 'r') {
5216 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5217 direction = "open>";
5219 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5220 direction = "open<";
5225 layers = Perl_refcounted_he_fetch(aTHX_ PL_curcop->cop_hints_hash,
5226 0, direction, 5, 0, 0);
5229 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5234 #undef PerlIO_setpos
5236 PerlIO_setpos(PerlIO *f, SV *pos)
5241 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5242 if (f && len == sizeof(Off_t))
5243 return PerlIO_seek(f, *posn, SEEK_SET);
5245 SETERRNO(EINVAL, SS_IVCHAN);
5249 #undef PerlIO_setpos
5251 PerlIO_setpos(PerlIO *f, SV *pos)
5256 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5257 if (f && len == sizeof(Fpos_t)) {
5258 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5259 return fsetpos64(f, fpos);
5261 return fsetpos(f, fpos);
5265 SETERRNO(EINVAL, SS_IVCHAN);
5271 #undef PerlIO_getpos
5273 PerlIO_getpos(PerlIO *f, SV *pos)
5276 Off_t posn = PerlIO_tell(f);
5277 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5278 return (posn == (Off_t) - 1) ? -1 : 0;
5281 #undef PerlIO_getpos
5283 PerlIO_getpos(PerlIO *f, SV *pos)
5288 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5289 code = fgetpos64(f, &fpos);
5291 code = fgetpos(f, &fpos);
5293 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5298 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
5301 vprintf(char *pat, char *args)
5303 _doprnt(pat, args, stdout);
5304 return 0; /* wrong, but perl doesn't use the return
5309 vfprintf(FILE *fd, char *pat, char *args)
5311 _doprnt(pat, args, fd);
5312 return 0; /* wrong, but perl doesn't use the return
5318 #ifndef PerlIO_vsprintf
5320 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
5323 const int val = my_vsnprintf(s, n > 0 ? n : 0, fmt, ap);
5324 PERL_UNUSED_CONTEXT;
5326 #ifndef PERL_MY_VSNPRINTF_GUARDED
5327 if (val < 0 || (n > 0 ? val >= n : 0)) {
5328 Perl_croak(aTHX_ "panic: my_vsnprintf overflow in PerlIO_vsprintf\n");
5335 #ifndef PerlIO_sprintf
5337 PerlIO_sprintf(char *s, int n, const char *fmt, ...)
5342 result = PerlIO_vsprintf(s, n, fmt, ap);
5350 * c-indentation-style: bsd
5352 * indent-tabs-mode: t
5355 * ex: set ts=8 sts=4 sw=4 noet: