3 * Copyright (c) 1996-2006, Nick Ing-Simmons
4 * Copyright (c) 2006, 2007, 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.
15 /* This file contains the functions needed to implement PerlIO, which
16 * is Perl's private replacement for the C stdio library. This is used
17 * by default unless you compile with -Uuseperlio or run with
18 * PERLIO=:stdio (but don't do this unless you know what you're doing)
22 * If we have ActivePerl-like PERL_IMPLICIT_SYS then we need a dTHX to get
23 * at the dispatch tables, even when we do not need it for other reasons.
24 * Invent a dSYS macro to abstract this out
26 #ifdef PERL_IMPLICIT_SYS
36 # ifndef USE_CROSS_COMPILE
43 #define PERLIO_NOT_STDIO 0
44 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
50 * This file provides those parts of PerlIO abstraction
51 * which are not #defined in perlio.h.
52 * Which these are depends on various Configure #ifdef's
56 #define PERL_IN_PERLIO_C
59 #ifdef PERL_IMPLICIT_CONTEXT
67 /* Missing proto on LynxOS */
71 /* Call the callback or PerlIOBase, and return failure. */
72 #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
73 if (PerlIOValid(f)) { \
74 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
75 if (tab && tab->callback) \
76 return (*tab->callback) args; \
78 return PerlIOBase_ ## base args; \
81 SETERRNO(EBADF, SS_IVCHAN); \
84 /* Call the callback or fail, and return failure. */
85 #define Perl_PerlIO_or_fail(f, callback, failure, args) \
86 if (PerlIOValid(f)) { \
87 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
88 if (tab && tab->callback) \
89 return (*tab->callback) args; \
90 SETERRNO(EINVAL, LIB_INVARG); \
93 SETERRNO(EBADF, SS_IVCHAN); \
96 /* Call the callback or PerlIOBase, and be void. */
97 #define Perl_PerlIO_or_Base_void(f, callback, base, args) \
98 if (PerlIOValid(f)) { \
99 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
100 if (tab && tab->callback) \
101 (*tab->callback) args; \
103 PerlIOBase_ ## base args; \
106 SETERRNO(EBADF, SS_IVCHAN)
108 /* Call the callback or fail, and be void. */
109 #define Perl_PerlIO_or_fail_void(f, callback, args) \
110 if (PerlIOValid(f)) { \
111 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
112 if (tab && tab->callback) \
113 (*tab->callback) args; \
115 SETERRNO(EINVAL, LIB_INVARG); \
118 SETERRNO(EBADF, SS_IVCHAN)
120 #if defined(__osf__) && _XOPEN_SOURCE < 500
121 extern int fseeko(FILE *, off_t, int);
122 extern off_t ftello(FILE *);
127 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
130 perlsio_binmode(FILE *fp, int iotype, int mode)
133 * This used to be contents of do_binmode in doio.c
136 # if defined(atarist) || defined(__MINT__)
137 PERL_UNUSED_ARG(iotype);
140 ((FILE *) fp)->_flag |= _IOBIN;
142 ((FILE *) fp)->_flag &= ~_IOBIN;
148 PERL_UNUSED_ARG(iotype);
150 if (PerlLIO_setmode(fp, mode) != -1) {
152 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
154 # if defined(WIN32) && defined(__BORLANDC__)
156 * The translation mode of the stream is maintained independent
158 * the translation mode of the fd in the Borland RTL (heavy
159 * digging through their runtime sources reveal). User has to
161 * the mode explicitly for the stream (though they don't
163 * this anywhere). GSAR 97-5-24
169 fp->flags &= ~_F_BIN;
177 # if defined(USEMYBINMODE)
179 # if defined(__CYGWIN__)
180 PERL_UNUSED_ARG(iotype);
182 if (my_binmode(fp, iotype, mode) != FALSE)
188 PERL_UNUSED_ARG(iotype);
189 PERL_UNUSED_ARG(mode);
197 #define O_ACCMODE 3 /* Assume traditional implementation */
201 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
203 const int result = rawmode & O_ACCMODE;
208 ptype = IoTYPE_RDONLY;
211 ptype = IoTYPE_WRONLY;
219 *writing = (result != O_RDONLY);
221 if (result == O_RDONLY) {
225 else if (rawmode & O_APPEND) {
227 if (result != O_WRONLY)
232 if (result == O_WRONLY)
239 if (rawmode & O_BINARY)
245 #ifndef PERLIO_LAYERS
247 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
249 if (!names || !*names
250 || strEQ(names, ":crlf")
251 || strEQ(names, ":raw")
252 || strEQ(names, ":bytes")
256 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
264 PerlIO_destruct(pTHX)
269 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
272 PERL_UNUSED_ARG(iotype);
273 PERL_UNUSED_ARG(mode);
274 PERL_UNUSED_ARG(names);
277 return perlsio_binmode(fp, iotype, mode);
282 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
284 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
287 #ifdef PERL_IMPLICIT_SYS
288 return PerlSIO_fdupopen(f);
291 return win32_fdupopen(f);
294 const int fd = PerlLIO_dup(PerlIO_fileno(f));
298 const int omode = djgpp_get_stream_mode(f);
300 const int omode = fcntl(fd, F_GETFL);
302 PerlIO_intmode2str(omode,mode,NULL);
303 /* the r+ is a hack */
304 return PerlIO_fdopen(fd, mode);
309 SETERRNO(EBADF, SS_IVCHAN);
319 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
323 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
324 int imode, int perm, PerlIO *old, int narg, SV **args)
328 Perl_croak(aTHX_ "More than one argument to open");
330 if (*args == &PL_sv_undef)
331 return PerlIO_tmpfile();
333 const char *name = SvPV_nolen_const(*args);
334 if (*mode == IoTYPE_NUMERIC) {
335 fd = PerlLIO_open3(name, imode, perm);
337 return PerlIO_fdopen(fd, mode + 1);
340 return PerlIO_reopen(name, mode, old);
343 return PerlIO_open(name, mode);
348 return PerlIO_fdopen(fd, (char *) mode);
353 XS(XS_PerlIO__Layer__find)
357 Perl_croak(aTHX_ "Usage class->find(name[,load])");
359 const char * const name = SvPV_nolen_const(ST(1));
360 ST(0) = (strEQ(name, "crlf")
361 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
368 Perl_boot_core_PerlIO(pTHX)
370 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
376 #ifdef PERLIO_IS_STDIO
383 * Does nothing (yet) except force this file to be included in perl
384 * binary. That allows this file to force inclusion of other functions
385 * that may be required by loadable extensions e.g. for
386 * FileHandle::tmpfile
390 #undef PerlIO_tmpfile
397 #else /* PERLIO_IS_STDIO */
405 * This section is just to make sure these functions get pulled in from
409 #undef PerlIO_tmpfile
421 * Force this file to be included in perl binary. Which allows this
422 * file to force inclusion of other functions that may be required by
423 * loadable extensions e.g. for FileHandle::tmpfile
427 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
428 * results in a lot of lseek()s to regular files and lot of small
431 sfset(sfstdout, SF_SHARE, 0);
434 /* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
436 PerlIO_importFILE(FILE *stdio, const char *mode)
438 const int fd = fileno(stdio);
439 if (!mode || !*mode) {
442 return PerlIO_fdopen(fd, mode);
446 PerlIO_findFILE(PerlIO *pio)
448 const int fd = PerlIO_fileno(pio);
449 FILE * const f = fdopen(fd, "r+");
451 if (!f && errno == EINVAL)
453 if (!f && errno == EINVAL)
460 /*======================================================================================*/
462 * Implement all the PerlIO interface ourselves.
468 * We _MUST_ have <unistd.h> if we are using lseek() and may have large
475 #include <sys/mman.h>
479 PerlIO_debug(const char *fmt, ...)
484 if (!PL_perlio_debug_fd) {
485 if (!PL_tainting && PL_uid == PL_euid && PL_gid == PL_egid) {
486 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
489 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
491 PL_perlio_debug_fd = -1;
493 /* tainting or set*id, so ignore the environment, and ensure we
494 skip these tests next time through. */
495 PL_perlio_debug_fd = -1;
498 if (PL_perlio_debug_fd > 0) {
501 const char * const s = CopFILE(PL_curcop);
502 /* Use fixed buffer as sv_catpvf etc. needs SVs */
504 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
505 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
506 PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2);
508 const char *s = CopFILE(PL_curcop);
510 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
511 (IV) CopLINE(PL_curcop));
512 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
514 s = SvPV_const(sv, len);
515 PerlLIO_write(PL_perlio_debug_fd, s, len);
522 /*--------------------------------------------------------------------------------------*/
525 * Inner level routines
529 * Table of pointers to the PerlIO structs (malloc'ed)
531 #define PERLIO_TABLE_SIZE 64
534 PerlIO_allocate(pTHX)
538 * Find a free slot in the table, allocating new table as necessary
543 while ((f = *last)) {
545 last = (PerlIO **) (f);
546 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
552 Newxz(f,PERLIO_TABLE_SIZE,PerlIO);
560 #undef PerlIO_fdupopen
562 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
564 if (PerlIOValid(f)) {
565 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
566 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
568 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
570 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
574 SETERRNO(EBADF, SS_IVCHAN);
580 PerlIO_cleantable(pTHX_ PerlIO **tablep)
582 PerlIO * const table = *tablep;
585 PerlIO_cleantable(aTHX_(PerlIO **) & (table[0]));
586 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
587 PerlIO * const f = table + i;
599 PerlIO_list_alloc(pTHX)
603 Newxz(list, 1, PerlIO_list_t);
609 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
612 if (--list->refcnt == 0) {
615 for (i = 0; i < list->cur; i++) {
616 if (list->array[i].arg)
617 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 = Perl_get_cvn_flags(aTHX_ STR_WITH_LEN("PerlIO::Layer::NoWarnings"), 0);
810 SAVEINT(PL_in_load_module);
812 SAVEGENERICSV(PL_warnhook);
813 PL_warnhook = (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((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((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, (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 if (ckWARN(WARN_LAYER))
983 Perl_warner(aTHX_ packWARN(WARN_LAYER),
984 "Invalid separator character %c%c%c in PerlIO layer specification %s",
986 SETERRNO(EINVAL, LIB_INVARG);
991 } while (isALNUM(*e));
1000 alen = (e - 1) - as;
1007 * It's a nul terminated string, not allowed
1008 * to \ the terminating null. Anything other
1009 * character is passed over.
1019 if (ckWARN(WARN_LAYER))
1020 Perl_warner(aTHX_ packWARN(WARN_LAYER),
1021 "Argument list not closed for PerlIO layer \"%.*s\"",
1033 PerlIO_funcs * const layer =
1034 PerlIO_find_layer(aTHX_ s, llen, 1);
1038 arg = newSVpvn(as, alen);
1039 PerlIO_list_push(aTHX_ av, layer,
1040 (arg) ? arg : &PL_sv_undef);
1045 if (ckWARN(WARN_LAYER))
1046 Perl_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1059 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1062 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1063 #ifdef PERLIO_USING_CRLF
1066 if (PerlIO_stdio.Set_ptrcnt)
1067 tab = &PerlIO_stdio;
1069 PerlIO_debug("Pushing %s\n", tab->name);
1070 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1075 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1077 return av->array[n].arg;
1081 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1083 if (n >= 0 && n < av->cur) {
1084 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1085 av->array[n].funcs->name);
1086 return av->array[n].funcs;
1089 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1094 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1096 PERL_UNUSED_ARG(mode);
1097 PERL_UNUSED_ARG(arg);
1098 PERL_UNUSED_ARG(tab);
1099 if (PerlIOValid(f)) {
1101 PerlIO_pop(aTHX_ f);
1107 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1108 sizeof(PerlIO_funcs),
1111 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1131 NULL, /* get_base */
1132 NULL, /* get_bufsiz */
1135 NULL, /* set_ptrcnt */
1139 PerlIO_default_layers(pTHX)
1142 if (!PL_def_layerlist) {
1143 const char * const s = (PL_tainting) ? NULL : PerlEnv_getenv("PERLIO");
1144 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1145 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1146 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1148 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1150 osLayer = &PerlIO_win32;
1153 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1154 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1155 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1156 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1158 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_mmap));
1160 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1161 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1162 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1163 PerlIO_list_push(aTHX_ PL_def_layerlist,
1164 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1167 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1170 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1173 if (PL_def_layerlist->cur < 2) {
1174 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1176 return PL_def_layerlist;
1180 Perl_boot_core_PerlIO(pTHX)
1182 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1183 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1186 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1187 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1191 PerlIO_default_layer(pTHX_ I32 n)
1194 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1197 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1200 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1201 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1204 PerlIO_stdstreams(pTHX)
1208 PerlIO_allocate(aTHX);
1209 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1210 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1211 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1216 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1218 if (tab->fsize != sizeof(PerlIO_funcs)) {
1220 Perl_croak(aTHX_ "Layer does not match this perl");
1224 if (tab->size < sizeof(PerlIOl)) {
1227 /* Real layer with a data area */
1230 Newxz(temp, tab->size, char);
1234 l->tab = (PerlIO_funcs*) tab;
1236 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1237 (void*)f, tab->name,
1238 (mode) ? mode : "(Null)", (void*)arg);
1239 if (*l->tab->Pushed &&
1241 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1242 PerlIO_pop(aTHX_ f);
1251 /* Pseudo-layer where push does its own stack adjust */
1252 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1253 (mode) ? mode : "(Null)", (void*)arg);
1255 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1263 PerlIOBase_binmode(pTHX_ PerlIO *f)
1265 if (PerlIOValid(f)) {
1266 /* Is layer suitable for raw stream ? */
1267 if (PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1268 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1269 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1272 /* Not suitable - pop it */
1273 PerlIO_pop(aTHX_ f);
1281 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1283 PERL_UNUSED_ARG(mode);
1284 PERL_UNUSED_ARG(arg);
1285 PERL_UNUSED_ARG(tab);
1287 if (PerlIOValid(f)) {
1292 * Strip all layers that are not suitable for a raw stream
1295 while (t && (l = *t)) {
1296 if (l->tab->Binmode) {
1297 /* Has a handler - normal case */
1298 if ((*l->tab->Binmode)(aTHX_ f) == 0) {
1300 /* Layer still there - move down a layer */
1309 /* No handler - pop it */
1310 PerlIO_pop(aTHX_ t);
1313 if (PerlIOValid(f)) {
1314 PerlIO_debug(":raw f=%p :%s\n", (void*)f, PerlIOBase(f)->tab->name);
1322 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1323 PerlIO_list_t *layers, IV n, IV max)
1327 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1329 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1340 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1344 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1345 code = PerlIO_parse_layers(aTHX_ layers, names);
1347 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1349 PerlIO_list_free(aTHX_ layers);
1355 /*--------------------------------------------------------------------------------------*/
1357 * Given the abstraction above the public API functions
1361 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1363 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1364 (PerlIOBase(f)) ? PerlIOBase(f)->tab->name : "(Null)",
1365 iotype, mode, (names) ? names : "(Null)");
1368 /* Do not flush etc. if (e.g.) switching encodings.
1369 if a pushed layer knows it needs to flush lower layers
1370 (for example :unix which is never going to call them)
1371 it can do the flush when it is pushed.
1373 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1376 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1377 #ifdef PERLIO_USING_CRLF
1378 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1379 O_BINARY so we can look for it in mode.
1381 if (!(mode & O_BINARY)) {
1383 /* FIXME?: Looking down the layer stack seems wrong,
1384 but is a way of reaching past (say) an encoding layer
1385 to flip CRLF-ness of the layer(s) below
1388 /* Perhaps we should turn on bottom-most aware layer
1389 e.g. Ilya's idea that UNIX TTY could serve
1391 if (PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF) {
1392 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1393 /* Not in text mode - flush any pending stuff and flip it */
1395 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1397 /* Only need to turn it on in one layer so we are done */
1402 /* Not finding a CRLF aware layer presumably means we are binary
1403 which is not what was requested - so we failed
1404 We _could_ push :crlf layer but so could caller
1409 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1410 So code that used to be here is now in PerlIORaw_pushed().
1412 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1417 PerlIO__close(pTHX_ PerlIO *f)
1419 if (PerlIOValid(f)) {
1420 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1421 if (tab && tab->Close)
1422 return (*tab->Close)(aTHX_ f);
1424 return PerlIOBase_close(aTHX_ f);
1427 SETERRNO(EBADF, SS_IVCHAN);
1433 Perl_PerlIO_close(pTHX_ PerlIO *f)
1435 const int code = PerlIO__close(aTHX_ f);
1436 while (PerlIOValid(f)) {
1437 PerlIO_pop(aTHX_ f);
1443 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1446 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1450 static PerlIO_funcs *
1451 PerlIO_layer_from_ref(pTHX_ SV *sv)
1455 * For any scalar type load the handler which is bundled with perl
1457 if (SvTYPE(sv) < SVt_PVAV) {
1458 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1459 /* This isn't supposed to happen, since PerlIO::scalar is core,
1460 * but could happen anyway in smaller installs or with PAR */
1461 if (!f && ckWARN(WARN_LAYER))
1462 Perl_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1467 * For other types allow if layer is known but don't try and load it
1469 switch (SvTYPE(sv)) {
1471 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1473 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1475 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1477 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1484 PerlIO_resolve_layers(pTHX_ const char *layers,
1485 const char *mode, int narg, SV **args)
1488 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1491 PerlIO_stdstreams(aTHX);
1493 SV * const arg = *args;
1495 * If it is a reference but not an object see if we have a handler
1498 if (SvROK(arg) && !sv_isobject(arg)) {
1499 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1501 def = PerlIO_list_alloc(aTHX);
1502 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1506 * Don't fail if handler cannot be found :via(...) etc. may do
1507 * something sensible else we will just stringfy and open
1512 if (!layers || !*layers)
1513 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1514 if (layers && *layers) {
1517 av = PerlIO_clone_list(aTHX_ def, NULL);
1522 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1526 PerlIO_list_free(aTHX_ av);
1538 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1539 int imode, int perm, PerlIO *f, int narg, SV **args)
1542 if (!f && narg == 1 && *args == &PL_sv_undef) {
1543 if ((f = PerlIO_tmpfile())) {
1544 if (!layers || !*layers)
1545 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1546 if (layers && *layers)
1547 PerlIO_apply_layers(aTHX_ f, mode, layers);
1551 PerlIO_list_t *layera;
1553 PerlIO_funcs *tab = NULL;
1554 if (PerlIOValid(f)) {
1556 * This is "reopen" - it is not tested as perl does not use it
1560 layera = PerlIO_list_alloc(aTHX);
1564 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1565 PerlIO_list_push(aTHX_ layera, l->tab,
1566 (arg) ? arg : &PL_sv_undef);
1569 l = *PerlIONext(&l);
1573 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1579 * Start at "top" of layer stack
1581 n = layera->cur - 1;
1583 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1592 * Found that layer 'n' can do opens - call it
1594 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1595 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1597 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1598 tab->name, layers ? layers : "(Null)", mode, fd,
1599 imode, perm, (void*)f, narg, (void*)args);
1601 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1604 SETERRNO(EINVAL, LIB_INVARG);
1608 if (n + 1 < layera->cur) {
1610 * More layers above the one that we used to open -
1613 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1614 /* If pushing layers fails close the file */
1621 PerlIO_list_free(aTHX_ layera);
1628 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1630 PERL_ARGS_ASSERT_PERLIO_READ;
1632 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1636 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1638 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1640 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1644 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1646 PERL_ARGS_ASSERT_PERLIO_WRITE;
1648 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1652 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1654 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1658 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1660 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1664 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1669 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1671 if (tab && tab->Flush)
1672 return (*tab->Flush) (aTHX_ f);
1674 return 0; /* If no Flush defined, silently succeed. */
1677 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1678 SETERRNO(EBADF, SS_IVCHAN);
1684 * Is it good API design to do flush-all on NULL, a potentially
1685 * errorneous input? Maybe some magical value (PerlIO*
1686 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1687 * things on fflush(NULL), but should we be bound by their design
1690 PerlIO **table = &PL_perlio;
1692 while ((f = *table)) {
1694 table = (PerlIO **) (f++);
1695 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1696 if (*f && PerlIO_flush(f) != 0)
1706 PerlIOBase_flush_linebuf(pTHX)
1709 PerlIO **table = &PL_perlio;
1711 while ((f = *table)) {
1713 table = (PerlIO **) (f++);
1714 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1717 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1718 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1726 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1728 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1732 PerlIO_isutf8(PerlIO *f)
1735 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1737 SETERRNO(EBADF, SS_IVCHAN);
1743 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1745 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1749 Perl_PerlIO_error(pTHX_ PerlIO *f)
1751 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1755 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1757 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1761 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1763 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1767 PerlIO_has_base(PerlIO *f)
1769 if (PerlIOValid(f)) {
1770 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1773 return (tab->Get_base != NULL);
1774 SETERRNO(EINVAL, LIB_INVARG);
1777 SETERRNO(EBADF, SS_IVCHAN);
1783 PerlIO_fast_gets(PerlIO *f)
1785 if (PerlIOValid(f) && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS)) {
1786 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1789 return (tab->Set_ptrcnt != NULL);
1790 SETERRNO(EINVAL, LIB_INVARG);
1793 SETERRNO(EBADF, SS_IVCHAN);
1799 PerlIO_has_cntptr(PerlIO *f)
1801 if (PerlIOValid(f)) {
1802 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1805 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1806 SETERRNO(EINVAL, LIB_INVARG);
1809 SETERRNO(EBADF, SS_IVCHAN);
1815 PerlIO_canset_cnt(PerlIO *f)
1817 if (PerlIOValid(f)) {
1818 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1821 return (tab->Set_ptrcnt != NULL);
1822 SETERRNO(EINVAL, LIB_INVARG);
1825 SETERRNO(EBADF, SS_IVCHAN);
1831 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1833 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1837 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1839 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1843 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1845 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1849 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1851 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1855 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1857 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1861 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1863 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1867 /*--------------------------------------------------------------------------------------*/
1869 * utf8 and raw dummy layers
1873 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1875 PERL_UNUSED_CONTEXT;
1876 PERL_UNUSED_ARG(mode);
1877 PERL_UNUSED_ARG(arg);
1878 if (PerlIOValid(f)) {
1879 if (tab->kind & PERLIO_K_UTF8)
1880 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1882 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1888 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1889 sizeof(PerlIO_funcs),
1892 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1912 NULL, /* get_base */
1913 NULL, /* get_bufsiz */
1916 NULL, /* set_ptrcnt */
1919 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1920 sizeof(PerlIO_funcs),
1943 NULL, /* get_base */
1944 NULL, /* get_bufsiz */
1947 NULL, /* set_ptrcnt */
1951 PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1952 IV n, const char *mode, int fd, int imode, int perm,
1953 PerlIO *old, int narg, SV **args)
1955 PerlIO_funcs * const tab = PerlIO_default_btm();
1956 PERL_UNUSED_ARG(self);
1957 if (tab && tab->Open)
1958 return (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
1960 SETERRNO(EINVAL, LIB_INVARG);
1964 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1965 sizeof(PerlIO_funcs),
1988 NULL, /* get_base */
1989 NULL, /* get_bufsiz */
1992 NULL, /* set_ptrcnt */
1994 /*--------------------------------------------------------------------------------------*/
1995 /*--------------------------------------------------------------------------------------*/
1997 * "Methods" of the "base class"
2001 PerlIOBase_fileno(pTHX_ PerlIO *f)
2003 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
2007 PerlIO_modestr(PerlIO * f, char *buf)
2010 if (PerlIOValid(f)) {
2011 const IV flags = PerlIOBase(f)->flags;
2012 if (flags & PERLIO_F_APPEND) {
2014 if (flags & PERLIO_F_CANREAD) {
2018 else if (flags & PERLIO_F_CANREAD) {
2020 if (flags & PERLIO_F_CANWRITE)
2023 else if (flags & PERLIO_F_CANWRITE) {
2025 if (flags & PERLIO_F_CANREAD) {
2029 #ifdef PERLIO_USING_CRLF
2030 if (!(flags & PERLIO_F_CRLF))
2040 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2042 PerlIOl * const l = PerlIOBase(f);
2043 PERL_UNUSED_CONTEXT;
2044 PERL_UNUSED_ARG(arg);
2046 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2047 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2048 if (tab->Set_ptrcnt != NULL)
2049 l->flags |= PERLIO_F_FASTGETS;
2051 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2055 l->flags |= PERLIO_F_CANREAD;
2058 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2061 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2064 SETERRNO(EINVAL, LIB_INVARG);
2070 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2073 l->flags &= ~PERLIO_F_CRLF;
2076 l->flags |= PERLIO_F_CRLF;
2079 SETERRNO(EINVAL, LIB_INVARG);
2086 l->flags |= l->next->flags &
2087 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2092 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2093 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2094 l->flags, PerlIO_modestr(f, temp));
2100 PerlIOBase_popped(pTHX_ PerlIO *f)
2102 PERL_UNUSED_CONTEXT;
2108 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2111 * Save the position as current head considers it
2113 const Off_t old = PerlIO_tell(f);
2114 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2115 PerlIOSelf(f, PerlIOBuf)->posn = old;
2116 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2120 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2122 STDCHAR *buf = (STDCHAR *) vbuf;
2124 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2125 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2126 SETERRNO(EBADF, SS_IVCHAN);
2132 SSize_t avail = PerlIO_get_cnt(f);
2135 take = ((SSize_t)count < avail) ? (SSize_t)count : avail;
2137 STDCHAR *ptr = PerlIO_get_ptr(f);
2138 Copy(ptr, buf, take, STDCHAR);
2139 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2142 if (avail == 0) /* set_ptrcnt could have reset avail */
2145 if (count > 0 && avail <= 0) {
2146 if (PerlIO_fill(f) != 0)
2151 return (buf - (STDCHAR *) vbuf);
2157 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2159 PERL_UNUSED_CONTEXT;
2165 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2167 PERL_UNUSED_CONTEXT;
2173 PerlIOBase_close(pTHX_ PerlIO *f)
2176 if (PerlIOValid(f)) {
2177 PerlIO *n = PerlIONext(f);
2178 code = PerlIO_flush(f);
2179 PerlIOBase(f)->flags &=
2180 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2181 while (PerlIOValid(n)) {
2182 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2183 if (tab && tab->Close) {
2184 if ((*tab->Close)(aTHX_ n) != 0)
2189 PerlIOBase(n)->flags &=
2190 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2196 SETERRNO(EBADF, SS_IVCHAN);
2202 PerlIOBase_eof(pTHX_ PerlIO *f)
2204 PERL_UNUSED_CONTEXT;
2205 if (PerlIOValid(f)) {
2206 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2212 PerlIOBase_error(pTHX_ PerlIO *f)
2214 PERL_UNUSED_CONTEXT;
2215 if (PerlIOValid(f)) {
2216 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2222 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2224 if (PerlIOValid(f)) {
2225 PerlIO * const n = PerlIONext(f);
2226 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2233 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2235 PERL_UNUSED_CONTEXT;
2236 if (PerlIOValid(f)) {
2237 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2242 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2248 arg = sv_dup(arg, param);
2249 SvREFCNT_inc_simple_void_NN(arg);
2253 return newSVsv(arg);
2256 PERL_UNUSED_ARG(param);
2257 return newSVsv(arg);
2262 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2264 PerlIO * const nexto = PerlIONext(o);
2265 if (PerlIOValid(nexto)) {
2266 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2267 if (tab && tab->Dup)
2268 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2270 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2273 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2276 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2277 self->name, (void*)f, (void*)o, (void*)param);
2279 arg = (*self->Getarg)(aTHX_ o, param, flags);
2280 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2281 if (PerlIOBase(o)->flags & PERLIO_F_UTF8)
2282 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2289 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2291 /* Must be called with PL_perlio_mutex locked. */
2293 S_more_refcounted_fds(pTHX_ const int new_fd) {
2295 const int old_max = PL_perlio_fd_refcnt_size;
2296 const int new_max = 16 + (new_fd & ~15);
2299 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2300 old_max, new_fd, new_max);
2302 if (new_fd < old_max) {
2306 assert (new_max > new_fd);
2308 /* Use plain realloc() since we need this memory to be really
2309 * global and visible to all the interpreters and/or threads. */
2310 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2314 MUTEX_UNLOCK(&PL_perlio_mutex);
2316 /* Can't use PerlIO to write as it allocates memory */
2317 PerlLIO_write(PerlIO_fileno(Perl_error_log),
2318 PL_no_mem, strlen(PL_no_mem));
2322 PL_perlio_fd_refcnt_size = new_max;
2323 PL_perlio_fd_refcnt = new_array;
2325 PerlIO_debug("Zeroing %p, %d\n",
2326 (void*)(new_array + old_max),
2329 Zero(new_array + old_max, new_max - old_max, int);
2336 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2337 PERL_UNUSED_CONTEXT;
2341 PerlIOUnix_refcnt_inc(int fd)
2348 MUTEX_LOCK(&PL_perlio_mutex);
2350 if (fd >= PL_perlio_fd_refcnt_size)
2351 S_more_refcounted_fds(aTHX_ fd);
2353 PL_perlio_fd_refcnt[fd]++;
2354 if (PL_perlio_fd_refcnt[fd] <= 0) {
2355 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2356 fd, PL_perlio_fd_refcnt[fd]);
2358 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2359 fd, PL_perlio_fd_refcnt[fd]);
2362 MUTEX_UNLOCK(&PL_perlio_mutex);
2365 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2370 PerlIOUnix_refcnt_dec(int fd)
2377 MUTEX_LOCK(&PL_perlio_mutex);
2379 if (fd >= PL_perlio_fd_refcnt_size) {
2380 Perl_croak(aTHX_ "refcnt_dec: fd %d >= refcnt_size %d\n",
2381 fd, PL_perlio_fd_refcnt_size);
2383 if (PL_perlio_fd_refcnt[fd] <= 0) {
2384 Perl_croak(aTHX_ "refcnt_dec: fd %d: %d <= 0\n",
2385 fd, PL_perlio_fd_refcnt[fd]);
2387 cnt = --PL_perlio_fd_refcnt[fd];
2388 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2390 MUTEX_UNLOCK(&PL_perlio_mutex);
2393 Perl_croak(aTHX_ "refcnt_dec: fd %d < 0\n", fd);
2399 PerlIO_cleanup(pTHX)
2404 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2406 PerlIO_debug("Cleanup layers\n");
2409 /* Raise STDIN..STDERR refcount so we don't close them */
2410 for (i=0; i < 3; i++)
2411 PerlIOUnix_refcnt_inc(i);
2412 PerlIO_cleantable(aTHX_ &PL_perlio);
2413 /* Restore STDIN..STDERR refcount */
2414 for (i=0; i < 3; i++)
2415 PerlIOUnix_refcnt_dec(i);
2417 if (PL_known_layers) {
2418 PerlIO_list_free(aTHX_ PL_known_layers);
2419 PL_known_layers = NULL;
2421 if (PL_def_layerlist) {
2422 PerlIO_list_free(aTHX_ PL_def_layerlist);
2423 PL_def_layerlist = NULL;
2427 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2431 /* XXX we can't rely on an interpreter being present at this late stage,
2432 XXX so we can't use a function like PerlLIO_write that relies on one
2433 being present (at least in win32) :-(.
2438 /* By now all filehandles should have been closed, so any
2439 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2441 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2442 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2443 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2445 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2446 if (PL_perlio_fd_refcnt[i]) {
2448 my_snprintf(buf, sizeof(buf),
2449 "PerlIO_teardown: fd %d refcnt=%d\n",
2450 i, PL_perlio_fd_refcnt[i]);
2451 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2457 /* Not bothering with PL_perlio_mutex since by now
2458 * all the interpreters are gone. */
2459 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2460 && PL_perlio_fd_refcnt) {
2461 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2462 PL_perlio_fd_refcnt = NULL;
2463 PL_perlio_fd_refcnt_size = 0;
2467 /*--------------------------------------------------------------------------------------*/
2469 * Bottom-most level for UNIX-like case
2473 struct _PerlIO base; /* The generic part */
2474 int fd; /* UNIX like file descriptor */
2475 int oflags; /* open/fcntl flags */
2479 PerlIOUnix_oflags(const char *mode)
2482 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2487 if (*++mode == '+') {
2494 oflags = O_CREAT | O_TRUNC;
2495 if (*++mode == '+') {
2504 oflags = O_CREAT | O_APPEND;
2505 if (*++mode == '+') {
2518 else if (*mode == 't') {
2520 oflags &= ~O_BINARY;
2524 * Always open in binary mode
2527 if (*mode || oflags == -1) {
2528 SETERRNO(EINVAL, LIB_INVARG);
2535 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2537 PERL_UNUSED_CONTEXT;
2538 return PerlIOSelf(f, PerlIOUnix)->fd;
2542 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2544 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2547 if (PerlLIO_fstat(fd, &st) == 0) {
2548 if (!S_ISREG(st.st_mode)) {
2549 PerlIO_debug("%d is not regular file\n",fd);
2550 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2553 PerlIO_debug("%d _is_ a regular file\n",fd);
2559 PerlIOUnix_refcnt_inc(fd);
2560 PERL_UNUSED_CONTEXT;
2564 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2566 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2567 if (*PerlIONext(f)) {
2568 /* We never call down so do any pending stuff now */
2569 PerlIO_flush(PerlIONext(f));
2571 * XXX could (or should) we retrieve the oflags from the open file
2572 * handle rather than believing the "mode" we are passed in? XXX
2573 * Should the value on NULL mode be 0 or -1?
2575 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2576 mode ? PerlIOUnix_oflags(mode) : -1);
2578 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2584 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2586 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2588 PERL_UNUSED_CONTEXT;
2589 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2591 SETERRNO(ESPIPE, LIB_INVARG);
2593 SETERRNO(EINVAL, LIB_INVARG);
2597 new_loc = PerlLIO_lseek(fd, offset, whence);
2598 if (new_loc == (Off_t) - 1)
2600 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2605 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2606 IV n, const char *mode, int fd, int imode,
2607 int perm, PerlIO *f, int narg, SV **args)
2609 if (PerlIOValid(f)) {
2610 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
2611 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2614 if (*mode == IoTYPE_NUMERIC)
2617 imode = PerlIOUnix_oflags(mode);
2621 const char *path = SvPV_nolen_const(*args);
2622 fd = PerlLIO_open3(path, imode, perm);
2626 if (*mode == IoTYPE_IMPLICIT)
2629 f = PerlIO_allocate(aTHX);
2631 if (!PerlIOValid(f)) {
2632 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2636 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2637 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2638 if (*mode == IoTYPE_APPEND)
2639 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2646 * FIXME: pop layers ???
2654 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2656 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2658 if (flags & PERLIO_DUP_FD) {
2659 fd = PerlLIO_dup(fd);
2662 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2664 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2665 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2674 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2677 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2678 #ifdef PERLIO_STD_SPECIAL
2680 return PERLIO_STD_IN(fd, vbuf, count);
2682 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2683 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2687 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2688 if (len >= 0 || errno != EINTR) {
2690 if (errno != EAGAIN) {
2691 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2694 else if (len == 0 && count != 0) {
2695 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2706 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2709 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2710 #ifdef PERLIO_STD_SPECIAL
2711 if (fd == 1 || fd == 2)
2712 return PERLIO_STD_OUT(fd, vbuf, count);
2715 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2716 if (len >= 0 || errno != EINTR) {
2718 if (errno != EAGAIN) {
2719 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2730 PerlIOUnix_tell(pTHX_ PerlIO *f)
2732 PERL_UNUSED_CONTEXT;
2734 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2739 PerlIOUnix_close(pTHX_ PerlIO *f)
2742 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2744 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2745 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2746 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2751 SETERRNO(EBADF,SS_IVCHAN);
2754 while (PerlLIO_close(fd) != 0) {
2755 if (errno != EINTR) {
2762 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2767 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2768 sizeof(PerlIO_funcs),
2775 PerlIOBase_binmode, /* binmode */
2785 PerlIOBase_noop_ok, /* flush */
2786 PerlIOBase_noop_fail, /* fill */
2789 PerlIOBase_clearerr,
2790 PerlIOBase_setlinebuf,
2791 NULL, /* get_base */
2792 NULL, /* get_bufsiz */
2795 NULL, /* set_ptrcnt */
2798 /*--------------------------------------------------------------------------------------*/
2803 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2804 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2805 broken by the last second glibc 2.3 fix
2807 #define STDIO_BUFFER_WRITABLE
2812 struct _PerlIO base;
2813 FILE *stdio; /* The stream */
2817 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2819 PERL_UNUSED_CONTEXT;
2821 if (PerlIOValid(f)) {
2822 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2824 return PerlSIO_fileno(s);
2831 PerlIOStdio_mode(const char *mode, char *tmode)
2833 char * const ret = tmode;
2839 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2847 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2850 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2851 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2852 if (toptab == tab) {
2853 /* Top is already stdio - pop self (duplicate) and use original */
2854 PerlIO_pop(aTHX_ f);
2857 const int fd = PerlIO_fileno(n);
2860 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2861 mode = PerlIOStdio_mode(mode, tmode)))) {
2862 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2863 /* We never call down so do any pending stuff now */
2864 PerlIO_flush(PerlIONext(f));
2871 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2876 PerlIO_importFILE(FILE *stdio, const char *mode)
2882 if (!mode || !*mode) {
2883 /* We need to probe to see how we can open the stream
2884 so start with read/write and then try write and read
2885 we dup() so that we can fclose without loosing the fd.
2887 Note that the errno value set by a failing fdopen
2888 varies between stdio implementations.
2890 const int fd = PerlLIO_dup(fileno(stdio));
2891 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
2893 f2 = PerlSIO_fdopen(fd, (mode = "w"));
2896 f2 = PerlSIO_fdopen(fd, (mode = "r"));
2899 /* Don't seem to be able to open */
2905 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
2906 s = PerlIOSelf(f, PerlIOStdio);
2908 PerlIOUnix_refcnt_inc(fileno(stdio));
2915 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2916 IV n, const char *mode, int fd, int imode,
2917 int perm, PerlIO *f, int narg, SV **args)
2920 if (PerlIOValid(f)) {
2921 const char * const path = SvPV_nolen_const(*args);
2922 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
2924 PerlIOUnix_refcnt_dec(fileno(s->stdio));
2925 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
2930 PerlIOUnix_refcnt_inc(fileno(s->stdio));
2935 const char * const path = SvPV_nolen_const(*args);
2936 if (*mode == IoTYPE_NUMERIC) {
2938 fd = PerlLIO_open3(path, imode, perm);
2942 bool appended = FALSE;
2944 /* Cygwin wants its 'b' early. */
2946 mode = PerlIOStdio_mode(mode, tmode);
2948 stdio = PerlSIO_fopen(path, mode);
2951 f = PerlIO_allocate(aTHX);
2954 mode = PerlIOStdio_mode(mode, tmode);
2955 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
2957 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2958 PerlIOUnix_refcnt_inc(fileno(stdio));
2960 PerlSIO_fclose(stdio);
2972 if (*mode == IoTYPE_IMPLICIT) {
2979 stdio = PerlSIO_stdin;
2982 stdio = PerlSIO_stdout;
2985 stdio = PerlSIO_stderr;
2990 stdio = PerlSIO_fdopen(fd, mode =
2991 PerlIOStdio_mode(mode, tmode));
2995 f = PerlIO_allocate(aTHX);
2997 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2998 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2999 PerlIOUnix_refcnt_inc(fileno(stdio));
3009 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3011 /* This assumes no layers underneath - which is what
3012 happens, but is not how I remember it. NI-S 2001/10/16
3014 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3015 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3016 const int fd = fileno(stdio);
3018 if (flags & PERLIO_DUP_FD) {
3019 const int dfd = PerlLIO_dup(fileno(stdio));
3021 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3026 /* FIXME: To avoid messy error recovery if dup fails
3027 re-use the existing stdio as though flag was not set
3031 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3033 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3034 PerlIOUnix_refcnt_inc(fileno(stdio));
3040 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3042 PERL_UNUSED_CONTEXT;
3044 /* XXX this could use PerlIO_canset_fileno() and
3045 * PerlIO_set_fileno() support from Configure
3047 # if defined(__UCLIBC__)
3048 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3051 # elif defined(__GLIBC__)
3052 /* There may be a better way for GLIBC:
3053 - libio.h defines a flag to not close() on cleanup
3057 # elif defined(__sun__)
3060 # elif defined(__hpux)
3064 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3065 your platform does not have special entry try this one.
3066 [For OSF only have confirmation for Tru64 (alpha)
3067 but assume other OSFs will be similar.]
3069 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3072 # elif defined(__FreeBSD__)
3073 /* There may be a better way on FreeBSD:
3074 - we could insert a dummy func in the _close function entry
3075 f->_close = (int (*)(void *)) dummy_close;
3079 # elif defined(__OpenBSD__)
3080 /* There may be a better way on OpenBSD:
3081 - we could insert a dummy func in the _close function entry
3082 f->_close = (int (*)(void *)) dummy_close;
3086 # elif defined(__EMX__)
3087 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3090 # elif defined(__CYGWIN__)
3091 /* There may be a better way on CYGWIN:
3092 - we could insert a dummy func in the _close function entry
3093 f->_close = (int (*)(void *)) dummy_close;
3097 # elif defined(WIN32)
3098 # if defined(__BORLANDC__)
3099 f->fd = PerlLIO_dup(fileno(f));
3100 # elif defined(UNDER_CE)
3101 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3110 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3111 (which isn't thread safe) instead
3113 # error "Don't know how to set FILE.fileno on your platform"
3121 PerlIOStdio_close(pTHX_ PerlIO *f)
3123 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3129 const int fd = fileno(stdio);
3134 #ifdef SOCKS5_VERSION_NAME
3135 /* Socks lib overrides close() but stdio isn't linked to
3136 that library (though we are) - so we must call close()
3137 on sockets on stdio's behalf.
3140 Sock_size_t optlen = sizeof(int);
3141 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3144 if (PerlIOUnix_refcnt_dec(fd) > 0) /* File descriptor still in use */
3147 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3148 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3150 if (stdio == stdout || stdio == stderr)
3151 return PerlIO_flush(f);
3152 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3153 Use Sarathy's trick from maint-5.6 to invalidate the
3154 fileno slot of the FILE *
3156 result = PerlIO_flush(f);
3158 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3161 MUTEX_LOCK(&PL_perlio_mutex);
3162 /* Right. We need a mutex here because for a brief while we
3163 will have the situation that fd is actually closed. Hence if
3164 a second thread were to get into this block, its dup() would
3165 likely return our fd as its dupfd. (after all, it is closed)
3166 Then if we get to the dup2() first, we blat the fd back
3167 (messing up its temporary as a side effect) only for it to
3168 then close its dupfd (== our fd) in its close(dupfd) */
3170 /* There is, of course, a race condition, that any other thread
3171 trying to input/output/whatever on this fd will be stuffed
3172 for the duration of this little manoeuvrer. Perhaps we
3173 should hold an IO mutex for the duration of every IO
3174 operation if we know that invalidate doesn't work on this
3175 platform, but that would suck, and could kill performance.
3177 Except that correctness trumps speed.
3178 Advice from klortho #11912. */
3180 dupfd = PerlLIO_dup(fd);
3183 MUTEX_UNLOCK(&PL_perlio_mutex);
3184 /* Oh cXap. This isn't going to go well. Not sure if we can
3185 recover from here, or if closing this particular FILE *
3186 is a good idea now. */
3191 result = PerlSIO_fclose(stdio);
3192 /* We treat error from stdio as success if we invalidated
3193 errno may NOT be expected EBADF
3195 if (invalidate && result != 0) {
3199 #ifdef SOCKS5_VERSION_NAME
3200 /* in SOCKS' case, let close() determine return value */
3204 PerlLIO_dup2(dupfd,fd);
3205 PerlLIO_close(dupfd);
3207 MUTEX_UNLOCK(&PL_perlio_mutex);
3215 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3218 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3222 STDCHAR *buf = (STDCHAR *) vbuf;
3224 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3225 * stdio does not do that for fread()
3227 const int ch = PerlSIO_fgetc(s);
3234 got = PerlSIO_fread(vbuf, 1, count, s);
3235 if (got == 0 && PerlSIO_ferror(s))
3237 if (got >= 0 || errno != EINTR)
3240 SETERRNO(0,0); /* just in case */
3246 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3249 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3251 #ifdef STDIO_BUFFER_WRITABLE
3252 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3253 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3254 STDCHAR *base = PerlIO_get_base(f);
3255 SSize_t cnt = PerlIO_get_cnt(f);
3256 STDCHAR *ptr = PerlIO_get_ptr(f);
3257 SSize_t avail = ptr - base;
3259 if (avail > count) {
3263 Move(buf-avail,ptr,avail,STDCHAR);
3266 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3267 if (PerlSIO_feof(s) && unread >= 0)
3268 PerlSIO_clearerr(s);
3273 if (PerlIO_has_cntptr(f)) {
3274 /* We can get pointer to buffer but not its base
3275 Do ungetc() but check chars are ending up in the
3278 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3279 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3281 const int ch = *--buf & 0xFF;
3282 if (ungetc(ch,s) != ch) {
3283 /* ungetc did not work */
3286 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3287 /* Did not change pointer as expected */
3288 fgetc(s); /* get char back again */
3298 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3304 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3309 got = PerlSIO_fwrite(vbuf, 1, count,
3310 PerlIOSelf(f, PerlIOStdio)->stdio);
3311 if (got >= 0 || errno != EINTR)
3314 SETERRNO(0,0); /* just in case */
3320 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3322 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3323 PERL_UNUSED_CONTEXT;
3325 return PerlSIO_fseek(stdio, offset, whence);
3329 PerlIOStdio_tell(pTHX_ PerlIO *f)
3331 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3332 PERL_UNUSED_CONTEXT;
3334 return PerlSIO_ftell(stdio);
3338 PerlIOStdio_flush(pTHX_ PerlIO *f)
3340 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3341 PERL_UNUSED_CONTEXT;
3343 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3344 return PerlSIO_fflush(stdio);
3350 * FIXME: This discards ungetc() and pre-read stuff which is not
3351 * right if this is just a "sync" from a layer above Suspect right
3352 * design is to do _this_ but not have layer above flush this
3353 * layer read-to-read
3356 * Not writeable - sync by attempting a seek
3358 const int err = errno;
3359 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3367 PerlIOStdio_eof(pTHX_ PerlIO *f)
3369 PERL_UNUSED_CONTEXT;
3371 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3375 PerlIOStdio_error(pTHX_ PerlIO *f)
3377 PERL_UNUSED_CONTEXT;
3379 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3383 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3385 PERL_UNUSED_CONTEXT;
3387 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3391 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3393 PERL_UNUSED_CONTEXT;
3395 #ifdef HAS_SETLINEBUF
3396 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3398 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3404 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3406 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3407 return (STDCHAR*)PerlSIO_get_base(stdio);
3411 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3413 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3414 return PerlSIO_get_bufsiz(stdio);
3418 #ifdef USE_STDIO_PTR
3420 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3422 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3423 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3427 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3429 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3430 return PerlSIO_get_cnt(stdio);
3434 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3436 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3438 #ifdef STDIO_PTR_LVALUE
3439 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3440 #ifdef STDIO_PTR_LVAL_SETS_CNT
3441 assert(PerlSIO_get_cnt(stdio) == (cnt));
3443 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3445 * Setting ptr _does_ change cnt - we are done
3449 #else /* STDIO_PTR_LVALUE */
3451 #endif /* STDIO_PTR_LVALUE */
3454 * Now (or only) set cnt
3456 #ifdef STDIO_CNT_LVALUE
3457 PerlSIO_set_cnt(stdio, cnt);
3458 #else /* STDIO_CNT_LVALUE */
3459 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3460 PerlSIO_set_ptr(stdio,
3461 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3463 #else /* STDIO_PTR_LVAL_SETS_CNT */
3465 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3466 #endif /* STDIO_CNT_LVALUE */
3473 PerlIOStdio_fill(pTHX_ PerlIO *f)
3475 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3477 PERL_UNUSED_CONTEXT;
3480 * fflush()ing read-only streams can cause trouble on some stdio-s
3482 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3483 if (PerlSIO_fflush(stdio) != 0)
3487 c = PerlSIO_fgetc(stdio);
3490 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3496 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3498 #ifdef STDIO_BUFFER_WRITABLE
3499 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3500 /* Fake ungetc() to the real buffer in case system's ungetc
3503 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3504 SSize_t cnt = PerlSIO_get_cnt(stdio);
3505 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3506 if (ptr == base+1) {
3507 *--ptr = (STDCHAR) c;
3508 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3509 if (PerlSIO_feof(stdio))
3510 PerlSIO_clearerr(stdio);
3516 if (PerlIO_has_cntptr(f)) {
3518 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3525 /* An ungetc()d char is handled separately from the regular
3526 * buffer, so we stuff it in the buffer ourselves.
3527 * Should never get called as should hit code above
3529 *(--((*stdio)->_ptr)) = (unsigned char) c;
3532 /* If buffer snoop scheme above fails fall back to
3535 if (PerlSIO_ungetc(c, stdio) != c)
3543 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3544 sizeof(PerlIO_funcs),
3546 sizeof(PerlIOStdio),
3547 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3551 PerlIOBase_binmode, /* binmode */
3565 PerlIOStdio_clearerr,
3566 PerlIOStdio_setlinebuf,
3568 PerlIOStdio_get_base,
3569 PerlIOStdio_get_bufsiz,
3574 #ifdef USE_STDIO_PTR
3575 PerlIOStdio_get_ptr,
3576 PerlIOStdio_get_cnt,
3577 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3578 PerlIOStdio_set_ptrcnt,
3581 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3586 #endif /* USE_STDIO_PTR */
3589 /* Note that calls to PerlIO_exportFILE() are reversed using
3590 * PerlIO_releaseFILE(), not importFILE. */
3592 PerlIO_exportFILE(PerlIO * f, const char *mode)
3596 if (PerlIOValid(f)) {
3599 if (!mode || !*mode) {
3600 mode = PerlIO_modestr(f, buf);
3602 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3606 /* De-link any lower layers so new :stdio sticks */
3608 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3609 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3611 PerlIOUnix_refcnt_inc(fileno(stdio));
3612 /* Link previous lower layers under new one */
3616 /* restore layers list */
3626 PerlIO_findFILE(PerlIO *f)
3631 if (l->tab == &PerlIO_stdio) {
3632 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3635 l = *PerlIONext(&l);
3637 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3638 /* However, we're not really exporting a FILE * to someone else (who
3639 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3640 So we need to undo its refernce count increase on the underlying file
3641 descriptor. We have to do this, because if the loop above returns you
3642 the FILE *, then *it* didn't increase any reference count. So there's
3643 only one way to be consistent. */
3644 stdio = PerlIO_exportFILE(f, NULL);
3646 const int fd = fileno(stdio);
3648 PerlIOUnix_refcnt_dec(fd);
3653 /* Use this to reverse PerlIO_exportFILE calls. */
3655 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3660 if (l->tab == &PerlIO_stdio) {
3661 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3662 if (s->stdio == f) {
3664 const int fd = fileno(f);
3666 PerlIOUnix_refcnt_dec(fd);
3667 PerlIO_pop(aTHX_ p);
3676 /*--------------------------------------------------------------------------------------*/
3678 * perlio buffer layer
3682 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3684 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3685 const int fd = PerlIO_fileno(f);
3686 if (fd >= 0 && PerlLIO_isatty(fd)) {
3687 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3689 if (*PerlIONext(f)) {
3690 const Off_t posn = PerlIO_tell(PerlIONext(f));
3691 if (posn != (Off_t) - 1) {
3695 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3699 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3700 IV n, const char *mode, int fd, int imode, int perm,
3701 PerlIO *f, int narg, SV **args)
3703 if (PerlIOValid(f)) {
3704 PerlIO *next = PerlIONext(f);
3706 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3707 if (tab && tab->Open)
3709 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3711 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3716 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3718 if (*mode == IoTYPE_IMPLICIT) {
3724 if (tab && tab->Open)
3725 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3728 SETERRNO(EINVAL, LIB_INVARG);
3730 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3732 * if push fails during open, open fails. close will pop us.
3737 fd = PerlIO_fileno(f);
3738 if (init && fd == 2) {
3740 * Initial stderr is unbuffered
3742 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3744 #ifdef PERLIO_USING_CRLF
3745 # ifdef PERLIO_IS_BINMODE_FD
3746 if (PERLIO_IS_BINMODE_FD(fd))
3747 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3751 * do something about failing setmode()? --jhi
3753 PerlLIO_setmode(fd, O_BINARY);
3762 * This "flush" is akin to sfio's sync in that it handles files in either
3763 * read or write state. For write state, we put the postponed data through
3764 * the next layers. For read state, we seek() the next layers to the
3765 * offset given by current position in the buffer, and discard the buffer
3766 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3767 * in any case?). Then the pass the stick further in chain.
3770 PerlIOBuf_flush(pTHX_ PerlIO *f)
3772 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3774 PerlIO *n = PerlIONext(f);
3775 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3777 * write() the buffer
3779 const STDCHAR *buf = b->buf;
3780 const STDCHAR *p = buf;
3781 while (p < b->ptr) {
3782 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3786 else if (count < 0 || PerlIO_error(n)) {
3787 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3792 b->posn += (p - buf);
3794 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3795 STDCHAR *buf = PerlIO_get_base(f);
3797 * Note position change
3799 b->posn += (b->ptr - buf);
3800 if (b->ptr < b->end) {
3801 /* We did not consume all of it - try and seek downstream to
3802 our logical position
3804 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3805 /* Reload n as some layers may pop themselves on seek */
3806 b->posn = PerlIO_tell(n = PerlIONext(f));
3809 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3810 data is lost for good - so return saying "ok" having undone
3813 b->posn -= (b->ptr - buf);
3818 b->ptr = b->end = b->buf;
3819 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3820 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3821 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3826 /* This discards the content of the buffer after b->ptr, and rereads
3827 * the buffer from the position off in the layer downstream; here off
3828 * is at offset corresponding to b->ptr - b->buf.
3831 PerlIOBuf_fill(pTHX_ PerlIO *f)
3833 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3834 PerlIO *n = PerlIONext(f);
3837 * Down-stream flush is defined not to loose read data so is harmless.
3838 * we would not normally be fill'ing if there was data left in anycase.
3840 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
3842 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
3843 PerlIOBase_flush_linebuf(aTHX);
3846 PerlIO_get_base(f); /* allocate via vtable */
3848 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
3850 b->ptr = b->end = b->buf;
3852 if (!PerlIOValid(n)) {
3853 PerlIOBase(f)->flags |= PERLIO_F_EOF;
3857 if (PerlIO_fast_gets(n)) {
3859 * Layer below is also buffered. We do _NOT_ want to call its
3860 * ->Read() because that will loop till it gets what we asked for
3861 * which may hang on a pipe etc. Instead take anything it has to
3862 * hand, or ask it to fill _once_.
3864 avail = PerlIO_get_cnt(n);
3866 avail = PerlIO_fill(n);
3868 avail = PerlIO_get_cnt(n);
3870 if (!PerlIO_error(n) && PerlIO_eof(n))
3875 STDCHAR *ptr = PerlIO_get_ptr(n);
3876 const SSize_t cnt = avail;
3877 if (avail > (SSize_t)b->bufsiz)
3879 Copy(ptr, b->buf, avail, STDCHAR);
3880 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
3884 avail = PerlIO_read(n, b->ptr, b->bufsiz);
3888 PerlIOBase(f)->flags |= PERLIO_F_EOF;
3890 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3893 b->end = b->buf + avail;
3894 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3899 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3901 if (PerlIOValid(f)) {
3902 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3905 return PerlIOBase_read(aTHX_ f, vbuf, count);
3911 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3913 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
3914 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3917 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3922 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3924 * Buffer is already a read buffer, we can overwrite any chars
3925 * which have been read back to buffer start
3927 avail = (b->ptr - b->buf);
3931 * Buffer is idle, set it up so whole buffer is available for
3935 b->end = b->buf + avail;
3937 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3939 * Buffer extends _back_ from where we are now
3941 b->posn -= b->bufsiz;
3943 if (avail > (SSize_t) count) {
3945 * If we have space for more than count, just move count
3953 * In simple stdio-like ungetc() case chars will be already
3956 if (buf != b->ptr) {
3957 Copy(buf, b->ptr, avail, STDCHAR);
3961 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
3965 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3971 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3973 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3974 const STDCHAR *buf = (const STDCHAR *) vbuf;
3975 const STDCHAR *flushptr = buf;
3979 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3981 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3982 if (PerlIO_flush(f) != 0) {
3986 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
3987 flushptr = buf + count;
3988 while (flushptr > buf && *(flushptr - 1) != '\n')
3992 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
3993 if ((SSize_t) count < avail)
3995 if (flushptr > buf && flushptr <= buf + avail)
3996 avail = flushptr - buf;
3997 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3999 Copy(buf, b->ptr, avail, STDCHAR);
4004 if (buf == flushptr)
4007 if (b->ptr >= (b->buf + b->bufsiz))
4010 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4016 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4019 if ((code = PerlIO_flush(f)) == 0) {
4020 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4021 code = PerlIO_seek(PerlIONext(f), offset, whence);
4023 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4024 b->posn = PerlIO_tell(PerlIONext(f));
4031 PerlIOBuf_tell(pTHX_ PerlIO *f)
4033 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4035 * b->posn is file position where b->buf was read, or will be written
4037 Off_t posn = b->posn;
4038 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4039 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4041 /* As O_APPEND files are normally shared in some sense it is better
4046 /* when file is NOT shared then this is sufficient */
4047 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4049 posn = b->posn = PerlIO_tell(PerlIONext(f));
4053 * If buffer is valid adjust position by amount in buffer
4055 posn += (b->ptr - b->buf);
4061 PerlIOBuf_popped(pTHX_ PerlIO *f)
4063 const IV code = PerlIOBase_popped(aTHX_ f);
4064 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4065 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4068 b->ptr = b->end = b->buf = NULL;
4069 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4074 PerlIOBuf_close(pTHX_ PerlIO *f)
4076 const IV code = PerlIOBase_close(aTHX_ f);
4077 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4078 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4081 b->ptr = b->end = b->buf = NULL;
4082 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4087 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4089 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4096 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4098 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4101 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4102 return (b->end - b->ptr);
4107 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4109 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4110 PERL_UNUSED_CONTEXT;
4115 b->buf = Newxz(b->buf,b->bufsiz, STDCHAR);
4117 b->buf = (STDCHAR *) & b->oneword;
4118 b->bufsiz = sizeof(b->oneword);
4120 b->end = b->ptr = b->buf;
4126 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4128 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4131 return (b->end - b->buf);
4135 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4137 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4139 PERL_UNUSED_ARG(cnt);
4144 assert(PerlIO_get_cnt(f) == cnt);
4145 assert(b->ptr >= b->buf);
4146 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4150 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4152 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4157 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4158 sizeof(PerlIO_funcs),
4161 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4165 PerlIOBase_binmode, /* binmode */
4179 PerlIOBase_clearerr,
4180 PerlIOBase_setlinebuf,
4185 PerlIOBuf_set_ptrcnt,
4188 /*--------------------------------------------------------------------------------------*/
4190 * Temp layer to hold unread chars when cannot do it any other way
4194 PerlIOPending_fill(pTHX_ PerlIO *f)
4197 * Should never happen
4204 PerlIOPending_close(pTHX_ PerlIO *f)
4207 * A tad tricky - flush pops us, then we close new top
4210 return PerlIO_close(f);
4214 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4217 * A tad tricky - flush pops us, then we seek new top
4220 return PerlIO_seek(f, offset, whence);
4225 PerlIOPending_flush(pTHX_ PerlIO *f)
4227 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4228 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4232 PerlIO_pop(aTHX_ f);
4237 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4243 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4248 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4250 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4251 PerlIOl * const l = PerlIOBase(f);
4253 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4254 * etc. get muddled when it changes mid-string when we auto-pop.
4256 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4257 (PerlIOBase(PerlIONext(f))->
4258 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4263 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4265 SSize_t avail = PerlIO_get_cnt(f);
4267 if ((SSize_t)count < avail)
4270 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4271 if (got >= 0 && got < (SSize_t)count) {
4272 const SSize_t more =
4273 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4274 if (more >= 0 || got == 0)
4280 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4281 sizeof(PerlIO_funcs),
4284 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4285 PerlIOPending_pushed,
4288 PerlIOBase_binmode, /* binmode */
4297 PerlIOPending_close,
4298 PerlIOPending_flush,
4302 PerlIOBase_clearerr,
4303 PerlIOBase_setlinebuf,
4308 PerlIOPending_set_ptrcnt,
4313 /*--------------------------------------------------------------------------------------*/
4315 * crlf - translation On read translate CR,LF to "\n" we do this by
4316 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4317 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4319 * c->nl points on the first byte of CR LF pair when it is temporarily
4320 * replaced by LF, or to the last CR of the buffer. In the former case
4321 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4322 * that it ends at c->nl; these two cases can be distinguished by
4323 * *c->nl. c->nl is set during _getcnt() call, and unset during
4324 * _unread() and _flush() calls.
4325 * It only matters for read operations.
4329 PerlIOBuf base; /* PerlIOBuf stuff */
4330 STDCHAR *nl; /* Position of crlf we "lied" about in the
4334 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4335 * Otherwise the :crlf layer would always revert back to
4339 S_inherit_utf8_flag(PerlIO *f)
4341 PerlIO *g = PerlIONext(f);
4342 if (PerlIOValid(g)) {
4343 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4344 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4350 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4353 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4354 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4356 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4357 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4358 PerlIOBase(f)->flags);
4361 /* Enable the first CRLF capable layer you can find, but if none
4362 * found, the one we just pushed is fine. This results in at
4363 * any given moment at most one CRLF-capable layer being enabled
4364 * in the whole layer stack. */
4365 PerlIO *g = PerlIONext(f);
4366 while (PerlIOValid(g)) {
4367 PerlIOl *b = PerlIOBase(g);
4368 if (b && b->tab == &PerlIO_crlf) {
4369 if (!(b->flags & PERLIO_F_CRLF))
4370 b->flags |= PERLIO_F_CRLF;
4371 S_inherit_utf8_flag(g);
4372 PerlIO_pop(aTHX_ f);
4378 S_inherit_utf8_flag(f);
4384 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4386 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4387 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4391 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4392 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4394 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4395 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4397 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4402 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4403 b->end = b->ptr = b->buf + b->bufsiz;
4404 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4405 b->posn -= b->bufsiz;
4407 while (count > 0 && b->ptr > b->buf) {
4408 const int ch = *--buf;
4410 if (b->ptr - 2 >= b->buf) {
4417 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4418 *--(b->ptr) = 0xa; /* Works even if 0xa == '\r' */
4434 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4436 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4438 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4441 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4442 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4443 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == 0xd)) {
4444 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4446 while (nl < b->end && *nl != 0xd)
4448 if (nl < b->end && *nl == 0xd) {
4450 if (nl + 1 < b->end) {
4457 * Not CR,LF but just CR
4465 * Blast - found CR as last char in buffer
4470 * They may not care, defer work as long as
4474 return (nl - b->ptr);
4478 b->ptr++; /* say we have read it as far as
4479 * flush() is concerned */
4480 b->buf++; /* Leave space in front of buffer */
4481 /* Note as we have moved buf up flush's
4483 will naturally make posn point at CR
4485 b->bufsiz--; /* Buffer is thus smaller */
4486 code = PerlIO_fill(f); /* Fetch some more */
4487 b->bufsiz++; /* Restore size for next time */
4488 b->buf--; /* Point at space */
4489 b->ptr = nl = b->buf; /* Which is what we hand
4491 *nl = 0xd; /* Fill in the CR */
4493 goto test; /* fill() call worked */
4495 * CR at EOF - just fall through
4497 /* Should we clear EOF though ??? */
4502 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4508 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4510 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4511 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4517 if (ptr == b->end && *c->nl == 0xd) {
4518 /* Defered CR at end of buffer case - we lied about count */
4531 * Test code - delete when it works ...
4533 IV flags = PerlIOBase(f)->flags;
4534 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4535 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == 0xd) {
4536 /* Defered CR at end of buffer case - we lied about count */
4542 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4543 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4544 flags, c->nl, b->end, cnt);
4551 * They have taken what we lied about
4559 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4563 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4565 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4566 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4568 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4569 const STDCHAR *buf = (const STDCHAR *) vbuf;
4570 const STDCHAR * const ebuf = buf + count;
4573 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4575 while (buf < ebuf) {
4576 const STDCHAR * const eptr = b->buf + b->bufsiz;
4577 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4578 while (buf < ebuf && b->ptr < eptr) {
4580 if ((b->ptr + 2) > eptr) {
4588 *(b->ptr)++ = 0xd; /* CR */
4589 *(b->ptr)++ = 0xa; /* LF */
4591 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4598 *(b->ptr)++ = *buf++;
4600 if (b->ptr >= eptr) {
4606 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4608 return (buf - (STDCHAR *) vbuf);
4613 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4615 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4620 return PerlIOBuf_flush(aTHX_ f);
4624 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4626 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4627 /* In text mode - flush any pending stuff and flip it */
4628 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4629 #ifndef PERLIO_USING_CRLF
4630 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4631 if (PerlIOBase(f)->tab == &PerlIO_crlf) {
4632 PerlIO_pop(aTHX_ f);
4639 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4640 sizeof(PerlIO_funcs),
4643 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4645 PerlIOBuf_popped, /* popped */
4647 PerlIOCrlf_binmode, /* binmode */
4651 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4652 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4653 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4661 PerlIOBase_clearerr,
4662 PerlIOBase_setlinebuf,
4667 PerlIOCrlf_set_ptrcnt,
4671 /*--------------------------------------------------------------------------------------*/
4673 * mmap as "buffer" layer
4677 PerlIOBuf base; /* PerlIOBuf stuff */
4678 Mmap_t mptr; /* Mapped address */
4679 Size_t len; /* mapped length */
4680 STDCHAR *bbuf; /* malloced buffer if map fails */
4684 PerlIOMmap_map(pTHX_ PerlIO *f)
4687 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4688 const IV flags = PerlIOBase(f)->flags;
4692 if (flags & PERLIO_F_CANREAD) {
4693 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4694 const int fd = PerlIO_fileno(f);
4696 code = Fstat(fd, &st);
4697 if (code == 0 && S_ISREG(st.st_mode)) {
4698 SSize_t len = st.st_size - b->posn;
4701 if (PL_mmap_page_size <= 0)
4702 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
4706 * This is a hack - should never happen - open should
4709 b->posn = PerlIO_tell(PerlIONext(f));
4711 posn = (b->posn / PL_mmap_page_size) * PL_mmap_page_size;
4712 len = st.st_size - posn;
4713 m->mptr = (Mmap_t)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
4714 if (m->mptr && m->mptr != (Mmap_t) - 1) {
4715 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
4716 madvise(m->mptr, len, MADV_SEQUENTIAL);
4718 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
4719 madvise(m->mptr, len, MADV_WILLNEED);
4721 PerlIOBase(f)->flags =
4722 (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
4723 b->end = ((STDCHAR *) m->mptr) + len;
4724 b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
4733 PerlIOBase(f)->flags =
4734 flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
4736 b->ptr = b->end = b->ptr;
4745 PerlIOMmap_unmap(pTHX_ PerlIO *f)
4747 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4750 PerlIOBuf * const b = &m->base;
4752 /* The munmap address argument is tricky: depending on the
4753 * standard it is either "void *" or "caddr_t" (which is
4754 * usually "char *" (signed or unsigned). If we cast it
4755 * to "void *", those that have it caddr_t and an uptight
4756 * C++ compiler, will freak out. But casting it as char*
4757 * should work. Maybe. (Using Mmap_t figured out by
4758 * Configure doesn't always work, apparently.) */
4759 code = munmap((char*)m->mptr, m->len);
4763 if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
4766 b->ptr = b->end = b->buf;
4767 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4773 PerlIOMmap_get_base(pTHX_ PerlIO *f)
4775 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4776 PerlIOBuf * const b = &m->base;
4777 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4779 * Already have a readbuffer in progress
4785 * We have a write buffer or flushed PerlIOBuf read buffer
4787 m->bbuf = b->buf; /* save it in case we need it again */
4788 b->buf = NULL; /* Clear to trigger below */
4791 PerlIOMmap_map(aTHX_ f); /* Try and map it */
4794 * Map did not work - recover PerlIOBuf buffer if we have one
4799 b->ptr = b->end = b->buf;
4802 return PerlIOBuf_get_base(aTHX_ f);
4806 PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4808 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4809 PerlIOBuf * const b = &m->base;
4810 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4812 if (b->ptr && (b->ptr - count) >= b->buf
4813 && memEQ(b->ptr - count, vbuf, count)) {
4815 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4820 * Loose the unwritable mapped buffer
4824 * If flush took the "buffer" see if we have one from before
4826 if (!b->buf && m->bbuf)
4829 PerlIOBuf_get_base(aTHX_ f);
4833 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4837 PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4839 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4840 PerlIOBuf * const b = &m->base;
4842 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4844 * No, or wrong sort of, buffer
4847 if (PerlIOMmap_unmap(aTHX_ f) != 0)
4851 * If unmap took the "buffer" see if we have one from before
4853 if (!b->buf && m->bbuf)
4856 PerlIOBuf_get_base(aTHX_ f);
4860 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4864 PerlIOMmap_flush(pTHX_ PerlIO *f)
4866 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4867 PerlIOBuf * const b = &m->base;
4868 IV code = PerlIOBuf_flush(aTHX_ f);
4870 * Now we are "synced" at PerlIOBuf level
4877 if (PerlIOMmap_unmap(aTHX_ f) != 0)
4882 * We seem to have a PerlIOBuf buffer which was not mapped
4883 * remember it in case we need one later
4892 PerlIOMmap_fill(pTHX_ PerlIO *f)
4894 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4895 IV code = PerlIO_flush(f);
4896 if (code == 0 && !b->buf) {
4897 code = PerlIOMmap_map(aTHX_ f);
4899 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4900 code = PerlIOBuf_fill(aTHX_ f);
4906 PerlIOMmap_close(pTHX_ PerlIO *f)
4908 PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
4909 PerlIOBuf * const b = &m->base;
4910 IV code = PerlIO_flush(f);
4914 b->ptr = b->end = b->buf;
4916 if (PerlIOBuf_close(aTHX_ f) != 0)
4922 PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4924 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4928 PERLIO_FUNCS_DECL(PerlIO_mmap) = {
4929 sizeof(PerlIO_funcs),
4932 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4936 PerlIOBase_binmode, /* binmode */
4950 PerlIOBase_clearerr,
4951 PerlIOBase_setlinebuf,
4952 PerlIOMmap_get_base,
4956 PerlIOBuf_set_ptrcnt,
4959 #endif /* HAS_MMAP */
4962 Perl_PerlIO_stdin(pTHX)
4966 PerlIO_stdstreams(aTHX);
4968 return &PL_perlio[1];
4972 Perl_PerlIO_stdout(pTHX)
4976 PerlIO_stdstreams(aTHX);
4978 return &PL_perlio[2];
4982 Perl_PerlIO_stderr(pTHX)
4986 PerlIO_stdstreams(aTHX);
4988 return &PL_perlio[3];
4991 /*--------------------------------------------------------------------------------------*/
4994 PerlIO_getname(PerlIO *f, char *buf)
4999 bool exported = FALSE;
5000 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
5002 stdio = PerlIO_exportFILE(f,0);
5006 name = fgetname(stdio, buf);
5007 if (exported) PerlIO_releaseFILE(f,stdio);
5012 PERL_UNUSED_ARG(buf);
5013 Perl_croak(aTHX_ "Don't know how to get file name");
5019 /*--------------------------------------------------------------------------------------*/
5021 * Functions which can be called on any kind of PerlIO implemented in
5025 #undef PerlIO_fdopen
5027 PerlIO_fdopen(int fd, const char *mode)
5030 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
5035 PerlIO_open(const char *path, const char *mode)
5038 SV *name = sv_2mortal(newSVpv(path, 0));
5039 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
5042 #undef Perlio_reopen
5044 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
5047 SV *name = sv_2mortal(newSVpv(path,0));
5048 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
5053 PerlIO_getc(PerlIO *f)
5057 if ( 1 == PerlIO_read(f, buf, 1) ) {
5058 return (unsigned char) buf[0];
5063 #undef PerlIO_ungetc
5065 PerlIO_ungetc(PerlIO *f, int ch)
5070 if (PerlIO_unread(f, &buf, 1) == 1)
5078 PerlIO_putc(PerlIO *f, int ch)
5082 return PerlIO_write(f, &buf, 1);
5087 PerlIO_puts(PerlIO *f, const char *s)
5090 return PerlIO_write(f, s, strlen(s));
5093 #undef PerlIO_rewind
5095 PerlIO_rewind(PerlIO *f)
5098 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
5102 #undef PerlIO_vprintf
5104 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
5113 Perl_va_copy(ap, apc);
5114 sv = vnewSVpvf(fmt, &apc);
5116 sv = vnewSVpvf(fmt, &ap);
5118 s = SvPV_const(sv, len);
5119 wrote = PerlIO_write(f, s, len);
5124 #undef PerlIO_printf
5126 PerlIO_printf(PerlIO *f, const char *fmt, ...)
5131 result = PerlIO_vprintf(f, fmt, ap);
5136 #undef PerlIO_stdoutf
5138 PerlIO_stdoutf(const char *fmt, ...)
5144 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5149 #undef PerlIO_tmpfile
5151 PerlIO_tmpfile(void)
5156 const int fd = win32_tmpfd();
5158 f = PerlIO_fdopen(fd, "w+b");
5160 # if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5161 SV * const sv = newSVpvs("/tmp/PerlIO_XXXXXX");
5163 * I have no idea how portable mkstemp() is ... NI-S
5165 const int fd = mkstemp(SvPVX(sv));
5167 f = PerlIO_fdopen(fd, "w+");
5169 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5170 PerlLIO_unlink(SvPVX_const(sv));
5173 # else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5174 FILE * const stdio = PerlSIO_tmpfile();
5177 f = PerlIO_fdopen(fileno(stdio), "w+");
5179 # endif /* else HAS_MKSTEMP */
5180 #endif /* else WIN32 */
5187 #endif /* USE_SFIO */
5188 #endif /* PERLIO_IS_STDIO */
5190 /*======================================================================================*/
5192 * Now some functions in terms of above which may be needed even if we are
5193 * not in true PerlIO mode
5196 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5199 const char *direction = NULL;
5202 * Need to supply default layer info from open.pm
5208 if (mode && mode[0] != 'r') {
5209 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5210 direction = "open>";
5212 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5213 direction = "open<";
5218 layers = Perl_refcounted_he_fetch(aTHX_ PL_curcop->cop_hints_hash,
5219 0, direction, 5, 0, 0);
5222 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5227 #undef PerlIO_setpos
5229 PerlIO_setpos(PerlIO *f, SV *pos)
5234 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5235 if (f && len == sizeof(Off_t))
5236 return PerlIO_seek(f, *posn, SEEK_SET);
5238 SETERRNO(EINVAL, SS_IVCHAN);
5242 #undef PerlIO_setpos
5244 PerlIO_setpos(PerlIO *f, SV *pos)
5249 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5250 if (f && len == sizeof(Fpos_t)) {
5251 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5252 return fsetpos64(f, fpos);
5254 return fsetpos(f, fpos);
5258 SETERRNO(EINVAL, SS_IVCHAN);
5264 #undef PerlIO_getpos
5266 PerlIO_getpos(PerlIO *f, SV *pos)
5269 Off_t posn = PerlIO_tell(f);
5270 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5271 return (posn == (Off_t) - 1) ? -1 : 0;
5274 #undef PerlIO_getpos
5276 PerlIO_getpos(PerlIO *f, SV *pos)
5281 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5282 code = fgetpos64(f, &fpos);
5284 code = fgetpos(f, &fpos);
5286 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5291 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
5294 vprintf(char *pat, char *args)
5296 _doprnt(pat, args, stdout);
5297 return 0; /* wrong, but perl doesn't use the return
5302 vfprintf(FILE *fd, char *pat, char *args)
5304 _doprnt(pat, args, fd);
5305 return 0; /* wrong, but perl doesn't use the return
5311 #ifndef PerlIO_vsprintf
5313 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
5316 const int val = my_vsnprintf(s, n > 0 ? n : 0, fmt, ap);
5317 PERL_UNUSED_CONTEXT;
5319 #ifndef PERL_MY_VSNPRINTF_GUARDED
5320 if (val < 0 || (n > 0 ? val >= n : 0)) {
5321 Perl_croak(aTHX_ "panic: my_vsnprintf overflow in PerlIO_vsprintf\n");
5328 #ifndef PerlIO_sprintf
5330 PerlIO_sprintf(char *s, int n, const char *fmt, ...)
5335 result = PerlIO_vsprintf(s, n, fmt, ap);
5343 * c-indentation-style: bsd
5345 * indent-tabs-mode: t
5348 * ex: set ts=8 sts=4 sw=4 noet: