3 * Copyright (c) 1996-2006, Nick Ing-Simmons
4 * Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public License
7 * or the Artistic License, as specified in the README file.
11 * Hour after hour for nearly three weary days he had jogged up and down,
12 * over passes, and through long dales, and across many streams.
14 * [pp.791-792 of _The Lord of the Rings_, V/iii: "The Muster of Rohan"]
17 /* This file contains the functions needed to implement PerlIO, which
18 * is Perl's private replacement for the C stdio library. This is used
19 * by default unless you compile with -Uuseperlio or run with
20 * PERLIO=:stdio (but don't do this unless you know what you're doing)
24 * If we have ActivePerl-like PERL_IMPLICIT_SYS then we need a dTHX to get
25 * at the dispatch tables, even when we do not need it for other reasons.
26 * Invent a dSYS macro to abstract this out
28 #ifdef PERL_IMPLICIT_SYS
34 #define PERLIO_NOT_STDIO 0
36 * This file provides those parts of PerlIO abstraction
37 * which are not #defined in perlio.h.
38 * Which these are depends on various Configure #ifdef's
42 #define PERL_IN_PERLIO_C
45 #ifdef PERL_IMPLICIT_CONTEXT
53 /* Missing proto on LynxOS */
61 #define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
63 /* Call the callback or PerlIOBase, and return failure. */
64 #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
65 if (PerlIOValid(f)) { \
66 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
67 if (tab && tab->callback) \
68 return (*tab->callback) args; \
70 return PerlIOBase_ ## base args; \
73 SETERRNO(EBADF, SS_IVCHAN); \
76 /* Call the callback or fail, and return failure. */
77 #define Perl_PerlIO_or_fail(f, callback, failure, args) \
78 if (PerlIOValid(f)) { \
79 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
80 if (tab && tab->callback) \
81 return (*tab->callback) args; \
82 SETERRNO(EINVAL, LIB_INVARG); \
85 SETERRNO(EBADF, SS_IVCHAN); \
88 /* Call the callback or PerlIOBase, and be void. */
89 #define Perl_PerlIO_or_Base_void(f, callback, base, args) \
90 if (PerlIOValid(f)) { \
91 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
92 if (tab && tab->callback) \
93 (*tab->callback) args; \
95 PerlIOBase_ ## base args; \
98 SETERRNO(EBADF, SS_IVCHAN)
100 /* Call the callback or fail, and be void. */
101 #define Perl_PerlIO_or_fail_void(f, callback, args) \
102 if (PerlIOValid(f)) { \
103 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
104 if (tab && tab->callback) \
105 (*tab->callback) args; \
107 SETERRNO(EINVAL, LIB_INVARG); \
110 SETERRNO(EBADF, SS_IVCHAN)
112 #if defined(__osf__) && _XOPEN_SOURCE < 500
113 extern int fseeko(FILE *, off_t, int);
114 extern off_t ftello(FILE *);
117 #define NATIVE_0xd CR_NATIVE
118 #define NATIVE_0xa LF_NATIVE
122 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
125 perlsio_binmode(FILE *fp, int iotype, int mode)
128 * This used to be contents of do_binmode in doio.c
132 PERL_UNUSED_ARG(iotype);
134 if (PerlLIO_setmode(fp, mode) != -1) {
136 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
143 # if defined(USEMYBINMODE)
145 # if defined(__CYGWIN__)
146 PERL_UNUSED_ARG(iotype);
148 if (my_binmode(fp, iotype, mode) != FALSE)
154 PERL_UNUSED_ARG(iotype);
155 PERL_UNUSED_ARG(mode);
163 #define O_ACCMODE 3 /* Assume traditional implementation */
167 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
169 const int result = rawmode & O_ACCMODE;
174 ptype = IoTYPE_RDONLY;
177 ptype = IoTYPE_WRONLY;
185 *writing = (result != O_RDONLY);
187 if (result == O_RDONLY) {
191 else if (rawmode & O_APPEND) {
193 if (result != O_WRONLY)
198 if (result == O_WRONLY)
205 if (rawmode & O_BINARY)
211 #ifndef PERLIO_LAYERS
213 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
215 if (!names || !*names
216 || strEQ(names, ":crlf")
217 || strEQ(names, ":raw")
218 || strEQ(names, ":bytes")
222 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
230 PerlIO_destruct(pTHX)
235 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
238 PERL_UNUSED_ARG(iotype);
239 PERL_UNUSED_ARG(mode);
240 PERL_UNUSED_ARG(names);
243 return perlsio_binmode(fp, iotype, mode);
248 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
250 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
253 #ifdef PERL_IMPLICIT_SYS
254 return PerlSIO_fdupopen(f);
257 return win32_fdupopen(f);
260 const int fd = PerlLIO_dup(PerlIO_fileno(f));
264 const int omode = djgpp_get_stream_mode(f);
266 const int omode = fcntl(fd, F_GETFL);
268 PerlIO_intmode2str(omode,mode,NULL);
269 /* the r+ is a hack */
270 return PerlIO_fdopen(fd, mode);
275 SETERRNO(EBADF, SS_IVCHAN);
285 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
289 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
290 int imode, int perm, PerlIO *old, int narg, SV **args)
294 Perl_croak(aTHX_ "More than one argument to open");
296 if (*args == &PL_sv_undef)
297 return PerlIO_tmpfile();
300 const char *name = SvPV_const(*args, len);
301 if (!IS_SAFE_PATHNAME(name, len, "open"))
304 if (*mode == IoTYPE_NUMERIC) {
305 fd = PerlLIO_open3(name, imode, perm);
307 return PerlIO_fdopen(fd, mode + 1);
310 return PerlIO_reopen(name, mode, old);
313 return PerlIO_open(name, mode);
318 return PerlIO_fdopen(fd, (char *) mode);
323 XS(XS_PerlIO__Layer__find)
327 Perl_croak(aTHX_ "Usage class->find(name[,load])");
329 const char * const name = SvPV_nolen_const(ST(1));
330 ST(0) = (strEQ(name, "crlf")
331 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
338 Perl_boot_core_PerlIO(pTHX)
340 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
346 #ifdef PERLIO_IS_STDIO
353 * Does nothing (yet) except force this file to be included in perl
354 * binary. That allows this file to force inclusion of other functions
355 * that may be required by loadable extensions e.g. for
356 * FileHandle::tmpfile
360 #undef PerlIO_tmpfile
367 #else /* PERLIO_IS_STDIO */
375 * This section is just to make sure these functions get pulled in from
379 #undef PerlIO_tmpfile
391 * Force this file to be included in perl binary. Which allows this
392 * file to force inclusion of other functions that may be required by
393 * loadable extensions e.g. for FileHandle::tmpfile
397 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
398 * results in a lot of lseek()s to regular files and lot of small
401 sfset(sfstdout, SF_SHARE, 0);
404 /* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
406 PerlIO_importFILE(FILE *stdio, const char *mode)
408 const int fd = fileno(stdio);
409 if (!mode || !*mode) {
412 return PerlIO_fdopen(fd, mode);
416 PerlIO_findFILE(PerlIO *pio)
418 const int fd = PerlIO_fileno(pio);
419 FILE * f = fdopen(fd, "r+");
421 if (!f && errno == EINVAL)
423 if (!f && errno == EINVAL)
430 /*======================================================================================*/
432 * Implement all the PerlIO interface ourselves.
438 PerlIO_debug(const char *fmt, ...)
443 if (!PL_perlio_debug_fd) {
445 PerlProc_getuid() == PerlProc_geteuid() &&
446 PerlProc_getgid() == PerlProc_getegid()) {
447 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
450 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
452 PL_perlio_debug_fd = -1;
454 /* tainting or set*id, so ignore the environment, and ensure we
455 skip these tests next time through. */
456 PL_perlio_debug_fd = -1;
459 if (PL_perlio_debug_fd > 0) {
462 const char * const s = CopFILE(PL_curcop);
463 /* Use fixed buffer as sv_catpvf etc. needs SVs */
465 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
466 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
467 rc = PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2);
469 const char *s = CopFILE(PL_curcop);
471 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
472 (IV) CopLINE(PL_curcop));
473 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
475 s = SvPV_const(sv, len);
476 rc = PerlLIO_write(PL_perlio_debug_fd, s, len);
479 /* silently ignore failures */
485 /*--------------------------------------------------------------------------------------*/
488 * Inner level routines
491 /* check that the head field of each layer points back to the head */
494 # define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
496 PerlIO_verify_head(pTHX_ PerlIO *f)
502 p = head = PerlIOBase(f)->head;
505 assert(p->head == head);
506 if (p == (PerlIOl*)f)
513 # define VERIFY_HEAD(f)
518 * Table of pointers to the PerlIO structs (malloc'ed)
520 #define PERLIO_TABLE_SIZE 64
523 PerlIO_init_table(pTHX)
527 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
533 PerlIO_allocate(pTHX)
537 * Find a free slot in the table, allocating new table as necessary
542 while ((f = *last)) {
544 last = (PerlIOl **) (f);
545 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
546 if (!((++f)->next)) {
547 f->flags = 0; /* lockcnt */
554 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
558 *last = (PerlIOl*) f++;
559 f->flags = 0; /* lockcnt */
565 #undef PerlIO_fdupopen
567 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
569 if (PerlIOValid(f)) {
570 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
571 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
573 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
575 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
579 SETERRNO(EBADF, SS_IVCHAN);
585 PerlIO_cleantable(pTHX_ PerlIOl **tablep)
587 PerlIOl * const table = *tablep;
590 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
591 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
592 PerlIOl * const f = table + i;
594 PerlIO_close(&(f->next));
604 PerlIO_list_alloc(pTHX)
608 Newxz(list, 1, PerlIO_list_t);
614 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
617 if (--list->refcnt == 0) {
620 for (i = 0; i < list->cur; i++)
621 SvREFCNT_dec(list->array[i].arg);
622 Safefree(list->array);
630 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
636 if (list->cur >= list->len) {
639 Renew(list->array, list->len, PerlIO_pair_t);
641 Newx(list->array, list->len, PerlIO_pair_t);
643 p = &(list->array[list->cur++]);
645 if ((p->arg = arg)) {
646 SvREFCNT_inc_simple_void_NN(arg);
651 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
653 PerlIO_list_t *list = NULL;
656 list = PerlIO_list_alloc(aTHX);
657 for (i=0; i < proto->cur; i++) {
658 SV *arg = proto->array[i].arg;
661 arg = sv_dup(arg, param);
663 PERL_UNUSED_ARG(param);
665 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
672 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
675 PerlIOl **table = &proto->Iperlio;
678 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
679 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
680 PerlIO_init_table(aTHX);
681 PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto);
682 while ((f = *table)) {
684 table = (PerlIOl **) (f++);
685 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
687 (void) fp_dup(&(f->next), 0, param);
694 PERL_UNUSED_ARG(proto);
695 PERL_UNUSED_ARG(param);
700 PerlIO_destruct(pTHX)
703 PerlIOl **table = &PL_perlio;
706 PerlIO_debug("Destruct %p\n",(void*)aTHX);
708 while ((f = *table)) {
710 table = (PerlIOl **) (f++);
711 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
712 PerlIO *x = &(f->next);
715 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
716 PerlIO_debug("Destruct popping %s\n", l->tab->name);
730 PerlIO_pop(pTHX_ PerlIO *f)
732 const PerlIOl *l = *f;
735 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f,
736 l->tab ? l->tab->name : "(Null)");
737 if (l->tab && l->tab->Popped) {
739 * If popped returns non-zero do not free its layer structure
740 * it has either done so itself, or it is shared and still in
743 if ((*l->tab->Popped) (aTHX_ f) != 0)
746 if (PerlIO_lockcnt(f)) {
747 /* we're in use; defer freeing the structure */
748 PerlIOBase(f)->flags = PERLIO_F_CLEARED;
749 PerlIOBase(f)->tab = NULL;
759 /* Return as an array the stack of layers on a filehandle. Note that
760 * the stack is returned top-first in the array, and there are three
761 * times as many array elements as there are layers in the stack: the
762 * first element of a layer triplet is the name, the second one is the
763 * arguments, and the third one is the flags. */
766 PerlIO_get_layers(pTHX_ PerlIO *f)
769 AV * const av = newAV();
771 if (PerlIOValid(f)) {
772 PerlIOl *l = PerlIOBase(f);
775 /* There is some collusion in the implementation of
776 XS_PerlIO_get_layers - it knows that name and flags are
777 generated as fresh SVs here, and takes advantage of that to
778 "copy" them by taking a reference. If it changes here, it needs
779 to change there too. */
780 SV * const name = l->tab && l->tab->name ?
781 newSVpv(l->tab->name, 0) : &PL_sv_undef;
782 SV * const arg = l->tab && l->tab->Getarg ?
783 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
786 av_push(av, newSViv((IV)l->flags));
794 /*--------------------------------------------------------------------------------------*/
796 * XS Interface for perl code
800 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
804 if ((SSize_t) len <= 0)
806 for (i = 0; i < PL_known_layers->cur; i++) {
807 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
808 const STRLEN this_len = strlen(f->name);
809 if (this_len == len && memEQ(f->name, name, len)) {
810 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
814 if (load && PL_subname && PL_def_layerlist
815 && PL_def_layerlist->cur >= 2) {
816 if (PL_in_load_module) {
817 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
820 SV * const pkgsv = newSVpvs("PerlIO");
821 SV * const layer = newSVpvn(name, len);
822 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
824 SAVEBOOL(PL_in_load_module);
826 SAVEGENERICSV(PL_warnhook);
827 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
829 PL_in_load_module = TRUE;
831 * The two SVs are magically freed by load_module
833 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
835 return PerlIO_find_layer(aTHX_ name, len, 0);
838 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
842 #ifdef USE_ATTRIBUTES_FOR_PERLIO
845 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
848 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
849 PerlIO * const ifp = IoIFP(io);
850 PerlIO * const ofp = IoOFP(io);
851 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
852 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
858 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
861 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
862 PerlIO * const ifp = IoIFP(io);
863 PerlIO * const ofp = IoOFP(io);
864 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
865 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
871 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
873 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
878 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
880 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
884 MGVTBL perlio_vtab = {
892 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
895 SV * const sv = SvRV(ST(1));
896 AV * const av = newAV();
900 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
902 mg = mg_find(sv, PERL_MAGIC_ext);
903 mg->mg_virtual = &perlio_vtab;
905 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
906 for (i = 2; i < items; i++) {
908 const char * const name = SvPV_const(ST(i), len);
909 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
911 av_push(av, SvREFCNT_inc_simple_NN(layer));
922 #endif /* USE_ATTIBUTES_FOR_PERLIO */
925 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
927 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
928 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
932 XS(XS_PerlIO__Layer__NoWarnings)
934 /* This is used as a %SIG{__WARN__} handler to suppress warnings
935 during loading of layers.
941 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
945 XS(XS_PerlIO__Layer__find)
951 Perl_croak(aTHX_ "Usage class->find(name[,load])");
954 const char * const name = SvPV_const(ST(1), len);
955 const bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
956 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
958 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
965 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
968 if (!PL_known_layers)
969 PL_known_layers = PerlIO_list_alloc(aTHX);
970 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
971 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
975 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
979 const char *s = names;
981 while (isSPACE(*s) || *s == ':')
986 const char *as = NULL;
988 if (!isIDFIRST(*s)) {
990 * Message is consistent with how attribute lists are
991 * passed. Even though this means "foo : : bar" is
992 * seen as an invalid separator character.
994 const char q = ((*s == '\'') ? '"' : '\'');
995 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
996 "Invalid separator character %c%c%c in PerlIO layer specification %s",
998 SETERRNO(EINVAL, LIB_INVARG);
1003 } while (isWORDCHAR(*e));
1012 alen = (e - 1) - as;
1019 * It's a nul terminated string, not allowed
1020 * to \ the terminating null. Anything other
1021 * character is passed over.
1031 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1032 "Argument list not closed for PerlIO layer \"%.*s\"",
1044 PerlIO_funcs * const layer =
1045 PerlIO_find_layer(aTHX_ s, llen, 1);
1049 arg = newSVpvn(as, alen);
1050 PerlIO_list_push(aTHX_ av, layer,
1051 (arg) ? arg : &PL_sv_undef);
1055 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1068 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1071 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1072 #ifdef PERLIO_USING_CRLF
1075 if (PerlIO_stdio.Set_ptrcnt)
1076 tab = &PerlIO_stdio;
1078 PerlIO_debug("Pushing %s\n", tab->name);
1079 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1084 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1086 return av->array[n].arg;
1090 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1092 if (n >= 0 && n < av->cur) {
1093 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1094 av->array[n].funcs->name);
1095 return av->array[n].funcs;
1098 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1103 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1105 PERL_UNUSED_ARG(mode);
1106 PERL_UNUSED_ARG(arg);
1107 PERL_UNUSED_ARG(tab);
1108 if (PerlIOValid(f)) {
1110 PerlIO_pop(aTHX_ f);
1116 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1117 sizeof(PerlIO_funcs),
1120 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1140 NULL, /* get_base */
1141 NULL, /* get_bufsiz */
1144 NULL, /* set_ptrcnt */
1148 PerlIO_default_layers(pTHX)
1151 if (!PL_def_layerlist) {
1152 const char * const s = TAINTING_get ? NULL : PerlEnv_getenv("PERLIO");
1153 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1154 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1155 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1157 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1159 osLayer = &PerlIO_win32;
1162 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1163 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1164 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1165 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1166 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1167 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1168 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1169 PerlIO_list_push(aTHX_ PL_def_layerlist,
1170 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1173 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1176 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1179 if (PL_def_layerlist->cur < 2) {
1180 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1182 return PL_def_layerlist;
1186 Perl_boot_core_PerlIO(pTHX)
1188 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1189 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1192 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1193 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1197 PerlIO_default_layer(pTHX_ I32 n)
1200 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1203 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1206 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1207 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1210 PerlIO_stdstreams(pTHX)
1214 PerlIO_init_table(aTHX);
1215 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1216 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1217 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1222 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1225 if (tab->fsize != sizeof(PerlIO_funcs)) {
1227 "%s (%"UVuf") does not match %s (%"UVuf")",
1228 "PerlIO layer function table size", (UV)tab->fsize,
1229 "size expected by this perl", (UV)sizeof(PerlIO_funcs) );
1233 if (tab->size < sizeof(PerlIOl)) {
1235 "%s (%"UVuf") smaller than %s (%"UVuf")",
1236 "PerlIO layer instance size", (UV)tab->size,
1237 "size expected by this perl", (UV)sizeof(PerlIOl) );
1239 /* Real layer with a data area */
1242 Newxz(temp, tab->size, char);
1246 l->tab = (PerlIO_funcs*) tab;
1247 l->head = ((PerlIOl*)f)->head;
1249 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1250 (void*)f, tab->name,
1251 (mode) ? mode : "(Null)", (void*)arg);
1252 if (*l->tab->Pushed &&
1254 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1255 PerlIO_pop(aTHX_ f);
1264 /* Pseudo-layer where push does its own stack adjust */
1265 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1266 (mode) ? mode : "(Null)", (void*)arg);
1268 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1276 PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1277 IV n, const char *mode, int fd, int imode, int perm,
1278 PerlIO *old, int narg, SV **args)
1280 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_layer(aTHX_ 0));
1281 if (tab && tab->Open) {
1282 PerlIO* ret = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm, old, narg, args);
1283 if (ret && PerlIO_push(aTHX_ ret, self, mode, PerlIOArg) == NULL) {
1289 SETERRNO(EINVAL, LIB_INVARG);
1294 PerlIOBase_binmode(pTHX_ PerlIO *f)
1296 if (PerlIOValid(f)) {
1297 /* Is layer suitable for raw stream ? */
1298 if (PerlIOBase(f)->tab && PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1299 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1300 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1303 /* Not suitable - pop it */
1304 PerlIO_pop(aTHX_ f);
1312 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1314 PERL_UNUSED_ARG(mode);
1315 PERL_UNUSED_ARG(arg);
1316 PERL_UNUSED_ARG(tab);
1318 if (PerlIOValid(f)) {
1323 * Strip all layers that are not suitable for a raw stream
1326 while (t && (l = *t)) {
1327 if (l->tab && l->tab->Binmode) {
1328 /* Has a handler - normal case */
1329 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1331 /* Layer still there - move down a layer */
1340 /* No handler - pop it */
1341 PerlIO_pop(aTHX_ t);
1344 if (PerlIOValid(f)) {
1345 PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1346 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)");
1354 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1355 PerlIO_list_t *layers, IV n, IV max)
1359 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1361 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1372 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1376 save_scalar(PL_errgv);
1378 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1379 code = PerlIO_parse_layers(aTHX_ layers, names);
1381 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1383 PerlIO_list_free(aTHX_ layers);
1390 /*--------------------------------------------------------------------------------------*/
1392 * Given the abstraction above the public API functions
1396 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1398 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1399 (PerlIOBase(f) && PerlIOBase(f)->tab) ?
1400 PerlIOBase(f)->tab->name : "(Null)",
1401 iotype, mode, (names) ? names : "(Null)");
1404 /* Do not flush etc. if (e.g.) switching encodings.
1405 if a pushed layer knows it needs to flush lower layers
1406 (for example :unix which is never going to call them)
1407 it can do the flush when it is pushed.
1409 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1412 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1413 #ifdef PERLIO_USING_CRLF
1414 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1415 O_BINARY so we can look for it in mode.
1417 if (!(mode & O_BINARY)) {
1419 /* FIXME?: Looking down the layer stack seems wrong,
1420 but is a way of reaching past (say) an encoding layer
1421 to flip CRLF-ness of the layer(s) below
1424 /* Perhaps we should turn on bottom-most aware layer
1425 e.g. Ilya's idea that UNIX TTY could serve
1427 if (PerlIOBase(f)->tab &&
1428 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1430 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1431 /* Not in text mode - flush any pending stuff and flip it */
1433 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1435 /* Only need to turn it on in one layer so we are done */
1440 /* Not finding a CRLF aware layer presumably means we are binary
1441 which is not what was requested - so we failed
1442 We _could_ push :crlf layer but so could caller
1447 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1448 So code that used to be here is now in PerlIORaw_pushed().
1450 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1455 PerlIO__close(pTHX_ PerlIO *f)
1457 if (PerlIOValid(f)) {
1458 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1459 if (tab && tab->Close)
1460 return (*tab->Close)(aTHX_ f);
1462 return PerlIOBase_close(aTHX_ f);
1465 SETERRNO(EBADF, SS_IVCHAN);
1471 Perl_PerlIO_close(pTHX_ PerlIO *f)
1473 const int code = PerlIO__close(aTHX_ f);
1474 while (PerlIOValid(f)) {
1475 PerlIO_pop(aTHX_ f);
1476 if (PerlIO_lockcnt(f))
1477 /* we're in use; the 'pop' deferred freeing the structure */
1484 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1487 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1491 static PerlIO_funcs *
1492 PerlIO_layer_from_ref(pTHX_ SV *sv)
1496 * For any scalar type load the handler which is bundled with perl
1498 if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
1499 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1500 /* This isn't supposed to happen, since PerlIO::scalar is core,
1501 * but could happen anyway in smaller installs or with PAR */
1503 /* diag_listed_as: Unknown PerlIO layer "%s" */
1504 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1509 * For other types allow if layer is known but don't try and load it
1511 switch (SvTYPE(sv)) {
1513 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1515 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1517 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1519 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1526 PerlIO_resolve_layers(pTHX_ const char *layers,
1527 const char *mode, int narg, SV **args)
1530 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1533 PerlIO_stdstreams(aTHX);
1535 SV * const arg = *args;
1537 * If it is a reference but not an object see if we have a handler
1540 if (SvROK(arg) && !sv_isobject(arg)) {
1541 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1543 def = PerlIO_list_alloc(aTHX);
1544 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1548 * Don't fail if handler cannot be found :via(...) etc. may do
1549 * something sensible else we will just stringfy and open
1554 if (!layers || !*layers)
1555 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1556 if (layers && *layers) {
1559 av = PerlIO_clone_list(aTHX_ def, NULL);
1564 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1568 PerlIO_list_free(aTHX_ av);
1580 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1581 int imode, int perm, PerlIO *f, int narg, SV **args)
1584 if (!f && narg == 1 && *args == &PL_sv_undef) {
1585 if ((f = PerlIO_tmpfile())) {
1586 if (!layers || !*layers)
1587 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1588 if (layers && *layers)
1589 PerlIO_apply_layers(aTHX_ f, mode, layers);
1593 PerlIO_list_t *layera;
1595 PerlIO_funcs *tab = NULL;
1596 if (PerlIOValid(f)) {
1598 * This is "reopen" - it is not tested as perl does not use it
1602 layera = PerlIO_list_alloc(aTHX);
1605 if (l->tab && l->tab->Getarg)
1606 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1607 PerlIO_list_push(aTHX_ layera, l->tab,
1608 (arg) ? arg : &PL_sv_undef);
1610 l = *PerlIONext(&l);
1614 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1620 * Start at "top" of layer stack
1622 n = layera->cur - 1;
1624 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1633 * Found that layer 'n' can do opens - call it
1635 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1636 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1638 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1639 tab->name, layers ? layers : "(Null)", mode, fd,
1640 imode, perm, (void*)f, narg, (void*)args);
1642 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1645 SETERRNO(EINVAL, LIB_INVARG);
1649 if (n + 1 < layera->cur) {
1651 * More layers above the one that we used to open -
1654 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1655 /* If pushing layers fails close the file */
1662 PerlIO_list_free(aTHX_ layera);
1669 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1671 PERL_ARGS_ASSERT_PERLIO_READ;
1673 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1677 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1679 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1681 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1685 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1687 PERL_ARGS_ASSERT_PERLIO_WRITE;
1689 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1693 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1695 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1699 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1701 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1705 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1710 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1712 if (tab && tab->Flush)
1713 return (*tab->Flush) (aTHX_ f);
1715 return 0; /* If no Flush defined, silently succeed. */
1718 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1719 SETERRNO(EBADF, SS_IVCHAN);
1725 * Is it good API design to do flush-all on NULL, a potentially
1726 * erroneous input? Maybe some magical value (PerlIO*
1727 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1728 * things on fflush(NULL), but should we be bound by their design
1731 PerlIOl **table = &PL_perlio;
1734 while ((ff = *table)) {
1736 table = (PerlIOl **) (ff++);
1737 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1738 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1748 PerlIOBase_flush_linebuf(pTHX)
1751 PerlIOl **table = &PL_perlio;
1753 while ((f = *table)) {
1755 table = (PerlIOl **) (f++);
1756 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1758 && (PerlIOBase(&(f->next))->
1759 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1760 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1761 PerlIO_flush(&(f->next));
1768 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1770 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1774 PerlIO_isutf8(PerlIO *f)
1777 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1779 SETERRNO(EBADF, SS_IVCHAN);
1785 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1787 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1791 Perl_PerlIO_error(pTHX_ PerlIO *f)
1793 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1797 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1799 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1803 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1805 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1809 PerlIO_has_base(PerlIO *f)
1811 if (PerlIOValid(f)) {
1812 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1815 return (tab->Get_base != NULL);
1822 PerlIO_fast_gets(PerlIO *f)
1824 if (PerlIOValid(f)) {
1825 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1826 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1829 return (tab->Set_ptrcnt != NULL);
1837 PerlIO_has_cntptr(PerlIO *f)
1839 if (PerlIOValid(f)) {
1840 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1843 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1850 PerlIO_canset_cnt(PerlIO *f)
1852 if (PerlIOValid(f)) {
1853 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1856 return (tab->Set_ptrcnt != NULL);
1863 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1865 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1869 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1871 /* Note that Get_bufsiz returns a Size_t */
1872 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1876 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1878 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1882 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1884 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1888 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt)
1890 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1894 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
1896 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1900 /*--------------------------------------------------------------------------------------*/
1902 * utf8 and raw dummy layers
1906 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1908 PERL_UNUSED_CONTEXT;
1909 PERL_UNUSED_ARG(mode);
1910 PERL_UNUSED_ARG(arg);
1911 if (PerlIOValid(f)) {
1912 if (tab && tab->kind & PERLIO_K_UTF8)
1913 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1915 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1921 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1922 sizeof(PerlIO_funcs),
1925 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1945 NULL, /* get_base */
1946 NULL, /* get_bufsiz */
1949 NULL, /* set_ptrcnt */
1952 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1953 sizeof(PerlIO_funcs),
1956 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1976 NULL, /* get_base */
1977 NULL, /* get_bufsiz */
1980 NULL, /* set_ptrcnt */
1983 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1984 sizeof(PerlIO_funcs),
2007 NULL, /* get_base */
2008 NULL, /* get_bufsiz */
2011 NULL, /* set_ptrcnt */
2013 /*--------------------------------------------------------------------------------------*/
2014 /*--------------------------------------------------------------------------------------*/
2016 * "Methods" of the "base class"
2020 PerlIOBase_fileno(pTHX_ PerlIO *f)
2022 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
2026 PerlIO_modestr(PerlIO * f, char *buf)
2029 if (PerlIOValid(f)) {
2030 const IV flags = PerlIOBase(f)->flags;
2031 if (flags & PERLIO_F_APPEND) {
2033 if (flags & PERLIO_F_CANREAD) {
2037 else if (flags & PERLIO_F_CANREAD) {
2039 if (flags & PERLIO_F_CANWRITE)
2042 else if (flags & PERLIO_F_CANWRITE) {
2044 if (flags & PERLIO_F_CANREAD) {
2048 #ifdef PERLIO_USING_CRLF
2049 if (!(flags & PERLIO_F_CRLF))
2059 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2061 PerlIOl * const l = PerlIOBase(f);
2062 PERL_UNUSED_CONTEXT;
2063 PERL_UNUSED_ARG(arg);
2065 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2066 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2067 if (tab && tab->Set_ptrcnt != NULL)
2068 l->flags |= PERLIO_F_FASTGETS;
2070 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2074 l->flags |= PERLIO_F_CANREAD;
2077 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2080 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2083 SETERRNO(EINVAL, LIB_INVARG);
2089 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2092 l->flags &= ~PERLIO_F_CRLF;
2095 l->flags |= PERLIO_F_CRLF;
2098 SETERRNO(EINVAL, LIB_INVARG);
2105 l->flags |= l->next->flags &
2106 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2111 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2112 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2113 l->flags, PerlIO_modestr(f, temp));
2119 PerlIOBase_popped(pTHX_ PerlIO *f)
2121 PERL_UNUSED_CONTEXT;
2127 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2130 * Save the position as current head considers it
2132 const Off_t old = PerlIO_tell(f);
2133 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2134 PerlIOSelf(f, PerlIOBuf)->posn = old;
2135 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2139 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2141 STDCHAR *buf = (STDCHAR *) vbuf;
2143 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2144 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2145 SETERRNO(EBADF, SS_IVCHAN);
2151 SSize_t avail = PerlIO_get_cnt(f);
2154 take = (((SSize_t) count >= 0) && ((SSize_t)count < avail)) ? (SSize_t)count : avail;
2156 STDCHAR *ptr = PerlIO_get_ptr(f);
2157 Copy(ptr, buf, take, STDCHAR);
2158 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2161 if (avail == 0) /* set_ptrcnt could have reset avail */
2164 if (count > 0 && avail <= 0) {
2165 if (PerlIO_fill(f) != 0)
2170 return (buf - (STDCHAR *) vbuf);
2176 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2178 PERL_UNUSED_CONTEXT;
2184 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2186 PERL_UNUSED_CONTEXT;
2192 PerlIOBase_close(pTHX_ PerlIO *f)
2195 if (PerlIOValid(f)) {
2196 PerlIO *n = PerlIONext(f);
2197 code = PerlIO_flush(f);
2198 PerlIOBase(f)->flags &=
2199 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2200 while (PerlIOValid(n)) {
2201 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2202 if (tab && tab->Close) {
2203 if ((*tab->Close)(aTHX_ n) != 0)
2208 PerlIOBase(n)->flags &=
2209 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2215 SETERRNO(EBADF, SS_IVCHAN);
2221 PerlIOBase_eof(pTHX_ PerlIO *f)
2223 PERL_UNUSED_CONTEXT;
2224 if (PerlIOValid(f)) {
2225 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2231 PerlIOBase_error(pTHX_ PerlIO *f)
2233 PERL_UNUSED_CONTEXT;
2234 if (PerlIOValid(f)) {
2235 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2241 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2243 if (PerlIOValid(f)) {
2244 PerlIO * const n = PerlIONext(f);
2245 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2252 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2254 PERL_UNUSED_CONTEXT;
2255 if (PerlIOValid(f)) {
2256 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2261 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2267 arg = sv_dup(arg, param);
2268 SvREFCNT_inc_simple_void_NN(arg);
2272 return newSVsv(arg);
2275 PERL_UNUSED_ARG(param);
2276 return newSVsv(arg);
2281 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2283 PerlIO * const nexto = PerlIONext(o);
2284 if (PerlIOValid(nexto)) {
2285 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2286 if (tab && tab->Dup)
2287 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2289 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2292 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2295 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2296 self ? self->name : "(Null)",
2297 (void*)f, (void*)o, (void*)param);
2298 if (self && self->Getarg)
2299 arg = (*self->Getarg)(aTHX_ o, param, flags);
2300 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2301 if (f && PerlIOBase(o)->flags & PERLIO_F_UTF8)
2302 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2308 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2310 /* Must be called with PL_perlio_mutex locked. */
2312 S_more_refcounted_fds(pTHX_ const int new_fd) {
2314 const int old_max = PL_perlio_fd_refcnt_size;
2315 const int new_max = 16 + (new_fd & ~15);
2318 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2319 old_max, new_fd, new_max);
2321 if (new_fd < old_max) {
2325 assert (new_max > new_fd);
2327 /* Use plain realloc() since we need this memory to be really
2328 * global and visible to all the interpreters and/or threads. */
2329 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2333 MUTEX_UNLOCK(&PL_perlio_mutex);
2338 PL_perlio_fd_refcnt_size = new_max;
2339 PL_perlio_fd_refcnt = new_array;
2341 PerlIO_debug("Zeroing %p, %d\n",
2342 (void*)(new_array + old_max),
2345 Zero(new_array + old_max, new_max - old_max, int);
2352 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2353 PERL_UNUSED_CONTEXT;
2357 PerlIOUnix_refcnt_inc(int fd)
2364 MUTEX_LOCK(&PL_perlio_mutex);
2366 if (fd >= PL_perlio_fd_refcnt_size)
2367 S_more_refcounted_fds(aTHX_ fd);
2369 PL_perlio_fd_refcnt[fd]++;
2370 if (PL_perlio_fd_refcnt[fd] <= 0) {
2371 /* diag_listed_as: refcnt_inc: fd %d%s */
2372 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2373 fd, PL_perlio_fd_refcnt[fd]);
2375 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2376 fd, PL_perlio_fd_refcnt[fd]);
2379 MUTEX_UNLOCK(&PL_perlio_mutex);
2382 /* diag_listed_as: refcnt_inc: fd %d%s */
2383 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2388 PerlIOUnix_refcnt_dec(int fd)
2394 MUTEX_LOCK(&PL_perlio_mutex);
2396 if (fd >= PL_perlio_fd_refcnt_size) {
2397 /* diag_listed_as: refcnt_dec: fd %d%s */
2398 Perl_croak_nocontext("refcnt_dec: fd %d >= refcnt_size %d\n",
2399 fd, PL_perlio_fd_refcnt_size);
2401 if (PL_perlio_fd_refcnt[fd] <= 0) {
2402 /* diag_listed_as: refcnt_dec: fd %d%s */
2403 Perl_croak_nocontext("refcnt_dec: fd %d: %d <= 0\n",
2404 fd, PL_perlio_fd_refcnt[fd]);
2406 cnt = --PL_perlio_fd_refcnt[fd];
2407 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2409 MUTEX_UNLOCK(&PL_perlio_mutex);
2412 /* diag_listed_as: refcnt_dec: fd %d%s */
2413 Perl_croak_nocontext("refcnt_dec: fd %d < 0\n", fd);
2419 PerlIOUnix_refcnt(int fd)
2426 MUTEX_LOCK(&PL_perlio_mutex);
2428 if (fd >= PL_perlio_fd_refcnt_size) {
2429 /* diag_listed_as: refcnt: fd %d%s */
2430 Perl_croak(aTHX_ "refcnt: fd %d >= refcnt_size %d\n",
2431 fd, PL_perlio_fd_refcnt_size);
2433 if (PL_perlio_fd_refcnt[fd] <= 0) {
2434 /* diag_listed_as: refcnt: fd %d%s */
2435 Perl_croak(aTHX_ "refcnt: fd %d: %d <= 0\n",
2436 fd, PL_perlio_fd_refcnt[fd]);
2438 cnt = PL_perlio_fd_refcnt[fd];
2440 MUTEX_UNLOCK(&PL_perlio_mutex);
2443 /* diag_listed_as: refcnt: fd %d%s */
2444 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2450 PerlIO_cleanup(pTHX)
2455 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2457 PerlIO_debug("Cleanup layers\n");
2460 /* Raise STDIN..STDERR refcount so we don't close them */
2461 for (i=0; i < 3; i++)
2462 PerlIOUnix_refcnt_inc(i);
2463 PerlIO_cleantable(aTHX_ &PL_perlio);
2464 /* Restore STDIN..STDERR refcount */
2465 for (i=0; i < 3; i++)
2466 PerlIOUnix_refcnt_dec(i);
2468 if (PL_known_layers) {
2469 PerlIO_list_free(aTHX_ PL_known_layers);
2470 PL_known_layers = NULL;
2472 if (PL_def_layerlist) {
2473 PerlIO_list_free(aTHX_ PL_def_layerlist);
2474 PL_def_layerlist = NULL;
2478 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2482 /* XXX we can't rely on an interpreter being present at this late stage,
2483 XXX so we can't use a function like PerlLIO_write that relies on one
2484 being present (at least in win32) :-(.
2489 /* By now all filehandles should have been closed, so any
2490 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2492 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2493 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2494 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2496 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2497 if (PL_perlio_fd_refcnt[i]) {
2499 my_snprintf(buf, sizeof(buf),
2500 "PerlIO_teardown: fd %d refcnt=%d\n",
2501 i, PL_perlio_fd_refcnt[i]);
2502 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2508 /* Not bothering with PL_perlio_mutex since by now
2509 * all the interpreters are gone. */
2510 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2511 && PL_perlio_fd_refcnt) {
2512 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2513 PL_perlio_fd_refcnt = NULL;
2514 PL_perlio_fd_refcnt_size = 0;
2518 /*--------------------------------------------------------------------------------------*/
2520 * Bottom-most level for UNIX-like case
2524 struct _PerlIO base; /* The generic part */
2525 int fd; /* UNIX like file descriptor */
2526 int oflags; /* open/fcntl flags */
2530 S_lockcnt_dec(pTHX_ const void* f)
2532 PerlIO_lockcnt((PerlIO*)f)--;
2536 /* call the signal handler, and if that handler happens to clear
2537 * this handle, free what we can and return true */
2540 S_perlio_async_run(pTHX_ PerlIO* f) {
2542 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2543 PerlIO_lockcnt(f)++;
2545 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) ) {
2549 /* we've just run some perl-level code that could have done
2550 * anything, including closing the file or clearing this layer.
2551 * If so, free any lower layers that have already been
2552 * cleared, then return an error. */
2553 while (PerlIOValid(f) &&
2554 (PerlIOBase(f)->flags & PERLIO_F_CLEARED))
2556 const PerlIOl *l = *f;
2565 PerlIOUnix_oflags(const char *mode)
2568 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2573 if (*++mode == '+') {
2580 oflags = O_CREAT | O_TRUNC;
2581 if (*++mode == '+') {
2590 oflags = O_CREAT | O_APPEND;
2591 if (*++mode == '+') {
2604 else if (*mode == 't') {
2606 oflags &= ~O_BINARY;
2610 #ifdef PERLIO_USING_CRLF
2612 * If neither "t" nor "b" was specified, open the file
2618 if (*mode || oflags == -1) {
2619 SETERRNO(EINVAL, LIB_INVARG);
2626 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2628 PERL_UNUSED_CONTEXT;
2629 return PerlIOSelf(f, PerlIOUnix)->fd;
2633 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2635 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2638 if (PerlLIO_fstat(fd, &st) == 0) {
2639 if (!S_ISREG(st.st_mode)) {
2640 PerlIO_debug("%d is not regular file\n",fd);
2641 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2644 PerlIO_debug("%d _is_ a regular file\n",fd);
2650 PerlIOUnix_refcnt_inc(fd);
2651 PERL_UNUSED_CONTEXT;
2655 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2657 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2658 if (*PerlIONext(f)) {
2659 /* We never call down so do any pending stuff now */
2660 PerlIO_flush(PerlIONext(f));
2662 * XXX could (or should) we retrieve the oflags from the open file
2663 * handle rather than believing the "mode" we are passed in? XXX
2664 * Should the value on NULL mode be 0 or -1?
2666 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2667 mode ? PerlIOUnix_oflags(mode) : -1);
2669 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2675 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2677 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2679 PERL_UNUSED_CONTEXT;
2680 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2682 SETERRNO(ESPIPE, LIB_INVARG);
2684 SETERRNO(EINVAL, LIB_INVARG);
2688 new_loc = PerlLIO_lseek(fd, offset, whence);
2689 if (new_loc == (Off_t) - 1)
2691 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2696 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2697 IV n, const char *mode, int fd, int imode,
2698 int perm, PerlIO *f, int narg, SV **args)
2700 if (PerlIOValid(f)) {
2701 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2702 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2705 if (*mode == IoTYPE_NUMERIC)
2708 imode = PerlIOUnix_oflags(mode);
2710 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2717 const char *path = SvPV_const(*args, len);
2718 if (!IS_SAFE_PATHNAME(path, len, "open"))
2720 fd = PerlLIO_open3(path, imode, perm);
2724 if (*mode == IoTYPE_IMPLICIT)
2727 f = PerlIO_allocate(aTHX);
2729 if (!PerlIOValid(f)) {
2730 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2734 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2735 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2736 if (*mode == IoTYPE_APPEND)
2737 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2744 * FIXME: pop layers ???
2752 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2754 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2756 if (flags & PERLIO_DUP_FD) {
2757 fd = PerlLIO_dup(fd);
2760 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2762 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2763 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2772 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2776 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2778 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2779 #ifdef PERLIO_STD_SPECIAL
2781 return PERLIO_STD_IN(fd, vbuf, count);
2783 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2784 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2788 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2789 if (len >= 0 || errno != EINTR) {
2791 if (errno != EAGAIN) {
2792 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2795 else if (len == 0 && count != 0) {
2796 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2802 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2809 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2813 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2815 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2816 #ifdef PERLIO_STD_SPECIAL
2817 if (fd == 1 || fd == 2)
2818 return PERLIO_STD_OUT(fd, vbuf, count);
2821 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2822 if (len >= 0 || errno != EINTR) {
2824 if (errno != EAGAIN) {
2825 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2831 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2838 PerlIOUnix_tell(pTHX_ PerlIO *f)
2840 PERL_UNUSED_CONTEXT;
2842 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2847 PerlIOUnix_close(pTHX_ PerlIO *f)
2850 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2852 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2853 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2854 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2859 SETERRNO(EBADF,SS_IVCHAN);
2862 while (PerlLIO_close(fd) != 0) {
2863 if (errno != EINTR) {
2868 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2872 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2877 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2878 sizeof(PerlIO_funcs),
2885 PerlIOBase_binmode, /* binmode */
2895 PerlIOBase_noop_ok, /* flush */
2896 PerlIOBase_noop_fail, /* fill */
2899 PerlIOBase_clearerr,
2900 PerlIOBase_setlinebuf,
2901 NULL, /* get_base */
2902 NULL, /* get_bufsiz */
2905 NULL, /* set_ptrcnt */
2908 /*--------------------------------------------------------------------------------------*/
2913 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2914 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2915 broken by the last second glibc 2.3 fix
2917 #define STDIO_BUFFER_WRITABLE
2922 struct _PerlIO base;
2923 FILE *stdio; /* The stream */
2927 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2929 PERL_UNUSED_CONTEXT;
2931 if (PerlIOValid(f)) {
2932 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2934 return PerlSIO_fileno(s);
2941 PerlIOStdio_mode(const char *mode, char *tmode)
2943 char * const ret = tmode;
2949 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2957 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2960 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2961 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2962 if (toptab == tab) {
2963 /* Top is already stdio - pop self (duplicate) and use original */
2964 PerlIO_pop(aTHX_ f);
2967 const int fd = PerlIO_fileno(n);
2970 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2971 mode = PerlIOStdio_mode(mode, tmode)))) {
2972 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2973 /* We never call down so do any pending stuff now */
2974 PerlIO_flush(PerlIONext(f));
2981 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2986 PerlIO_importFILE(FILE *stdio, const char *mode)
2992 if (!mode || !*mode) {
2993 /* We need to probe to see how we can open the stream
2994 so start with read/write and then try write and read
2995 we dup() so that we can fclose without loosing the fd.
2997 Note that the errno value set by a failing fdopen
2998 varies between stdio implementations.
3000 const int fd = PerlLIO_dup(fileno(stdio));
3001 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
3003 f2 = PerlSIO_fdopen(fd, (mode = "w"));
3006 f2 = PerlSIO_fdopen(fd, (mode = "r"));
3009 /* Don't seem to be able to open */
3015 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
3016 s = PerlIOSelf(f, PerlIOStdio);
3018 PerlIOUnix_refcnt_inc(fileno(stdio));
3025 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3026 IV n, const char *mode, int fd, int imode,
3027 int perm, PerlIO *f, int narg, SV **args)
3030 if (PerlIOValid(f)) {
3032 const char * const path = SvPV_const(*args, len);
3033 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3035 if (!IS_SAFE_PATHNAME(path, len, "open"))
3037 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3038 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
3043 PerlIOUnix_refcnt_inc(fileno(s->stdio));
3049 const char * const path = SvPV_const(*args, len);
3050 if (!IS_SAFE_PATHNAME(path, len, "open"))
3052 if (*mode == IoTYPE_NUMERIC) {
3054 fd = PerlLIO_open3(path, imode, perm);
3058 bool appended = FALSE;
3060 /* Cygwin wants its 'b' early. */
3062 mode = PerlIOStdio_mode(mode, tmode);
3064 stdio = PerlSIO_fopen(path, mode);
3067 f = PerlIO_allocate(aTHX);
3070 mode = PerlIOStdio_mode(mode, tmode);
3071 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3073 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3074 PerlIOUnix_refcnt_inc(fileno(stdio));
3076 PerlSIO_fclose(stdio);
3088 if (*mode == IoTYPE_IMPLICIT) {
3095 stdio = PerlSIO_stdin;
3098 stdio = PerlSIO_stdout;
3101 stdio = PerlSIO_stderr;
3106 stdio = PerlSIO_fdopen(fd, mode =
3107 PerlIOStdio_mode(mode, tmode));
3111 f = PerlIO_allocate(aTHX);
3113 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3114 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3115 PerlIOUnix_refcnt_inc(fileno(stdio));
3125 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3127 /* This assumes no layers underneath - which is what
3128 happens, but is not how I remember it. NI-S 2001/10/16
3130 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3131 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3132 const int fd = fileno(stdio);
3134 if (flags & PERLIO_DUP_FD) {
3135 const int dfd = PerlLIO_dup(fileno(stdio));
3137 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3142 /* FIXME: To avoid messy error recovery if dup fails
3143 re-use the existing stdio as though flag was not set
3147 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3149 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3151 PerlIOUnix_refcnt_inc(fileno(stdio));
3158 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3160 PERL_UNUSED_CONTEXT;
3162 /* XXX this could use PerlIO_canset_fileno() and
3163 * PerlIO_set_fileno() support from Configure
3165 # if defined(__UCLIBC__)
3166 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3169 # elif defined(__GLIBC__)
3170 /* There may be a better way for GLIBC:
3171 - libio.h defines a flag to not close() on cleanup
3175 # elif defined(__sun)
3178 # elif defined(__hpux)
3182 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3183 your platform does not have special entry try this one.
3184 [For OSF only have confirmation for Tru64 (alpha)
3185 but assume other OSFs will be similar.]
3187 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3190 # elif defined(__FreeBSD__)
3191 /* There may be a better way on FreeBSD:
3192 - we could insert a dummy func in the _close function entry
3193 f->_close = (int (*)(void *)) dummy_close;
3197 # elif defined(__OpenBSD__)
3198 /* There may be a better way on OpenBSD:
3199 - we could insert a dummy func in the _close function entry
3200 f->_close = (int (*)(void *)) dummy_close;
3204 # elif defined(__EMX__)
3205 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3208 # elif defined(__CYGWIN__)
3209 /* There may be a better way on CYGWIN:
3210 - we could insert a dummy func in the _close function entry
3211 f->_close = (int (*)(void *)) dummy_close;
3215 # elif defined(WIN32)
3216 # if defined(UNDER_CE)
3217 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3226 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3227 (which isn't thread safe) instead
3229 # error "Don't know how to set FILE.fileno on your platform"
3237 PerlIOStdio_close(pTHX_ PerlIO *f)
3239 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3245 const int fd = fileno(stdio);
3253 #ifdef SOCKS5_VERSION_NAME
3254 /* Socks lib overrides close() but stdio isn't linked to
3255 that library (though we are) - so we must call close()
3256 on sockets on stdio's behalf.
3259 Sock_size_t optlen = sizeof(int);
3260 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3263 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3264 that a subsequent fileno() on it returns -1. Don't want to croak()
3265 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3266 trying to close an already closed handle which somehow it still has
3267 a reference to. (via.xs, I'm looking at you). */
3268 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3269 /* File descriptor still in use */
3273 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3274 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3276 if (stdio == stdout || stdio == stderr)
3277 return PerlIO_flush(f);
3278 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3279 Use Sarathy's trick from maint-5.6 to invalidate the
3280 fileno slot of the FILE *
3282 result = PerlIO_flush(f);
3284 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3287 MUTEX_LOCK(&PL_perlio_mutex);
3288 /* Right. We need a mutex here because for a brief while we
3289 will have the situation that fd is actually closed. Hence if
3290 a second thread were to get into this block, its dup() would
3291 likely return our fd as its dupfd. (after all, it is closed)
3292 Then if we get to the dup2() first, we blat the fd back
3293 (messing up its temporary as a side effect) only for it to
3294 then close its dupfd (== our fd) in its close(dupfd) */
3296 /* There is, of course, a race condition, that any other thread
3297 trying to input/output/whatever on this fd will be stuffed
3298 for the duration of this little manoeuvrer. Perhaps we
3299 should hold an IO mutex for the duration of every IO
3300 operation if we know that invalidate doesn't work on this
3301 platform, but that would suck, and could kill performance.
3303 Except that correctness trumps speed.
3304 Advice from klortho #11912. */
3306 dupfd = PerlLIO_dup(fd);
3309 MUTEX_UNLOCK(&PL_perlio_mutex);
3310 /* Oh cXap. This isn't going to go well. Not sure if we can
3311 recover from here, or if closing this particular FILE *
3312 is a good idea now. */
3317 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3319 result = PerlSIO_fclose(stdio);
3320 /* We treat error from stdio as success if we invalidated
3321 errno may NOT be expected EBADF
3323 if (invalidate && result != 0) {
3327 #ifdef SOCKS5_VERSION_NAME
3328 /* in SOCKS' case, let close() determine return value */
3332 PerlLIO_dup2(dupfd,fd);
3333 PerlLIO_close(dupfd);
3335 MUTEX_UNLOCK(&PL_perlio_mutex);
3343 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3348 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3350 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3353 STDCHAR *buf = (STDCHAR *) vbuf;
3355 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3356 * stdio does not do that for fread()
3358 const int ch = PerlSIO_fgetc(s);
3365 got = PerlSIO_fread(vbuf, 1, count, s);
3366 if (got == 0 && PerlSIO_ferror(s))
3368 if (got >= 0 || errno != EINTR)
3370 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3372 SETERRNO(0,0); /* just in case */
3378 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3381 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3383 #ifdef STDIO_BUFFER_WRITABLE
3384 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3385 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3386 STDCHAR *base = PerlIO_get_base(f);
3387 SSize_t cnt = PerlIO_get_cnt(f);
3388 STDCHAR *ptr = PerlIO_get_ptr(f);
3389 SSize_t avail = ptr - base;
3391 if (avail > count) {
3395 Move(buf-avail,ptr,avail,STDCHAR);
3398 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3399 if (PerlSIO_feof(s) && unread >= 0)
3400 PerlSIO_clearerr(s);
3405 if (PerlIO_has_cntptr(f)) {
3406 /* We can get pointer to buffer but not its base
3407 Do ungetc() but check chars are ending up in the
3410 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3411 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3413 const int ch = *--buf & 0xFF;
3414 if (ungetc(ch,s) != ch) {
3415 /* ungetc did not work */
3418 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3419 /* Did not change pointer as expected */
3420 fgetc(s); /* get char back again */
3430 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3436 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3440 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3443 got = PerlSIO_fwrite(vbuf, 1, count,
3444 PerlIOSelf(f, PerlIOStdio)->stdio);
3445 if (got >= 0 || errno != EINTR)
3447 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3449 SETERRNO(0,0); /* just in case */
3455 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3457 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3458 PERL_UNUSED_CONTEXT;
3460 return PerlSIO_fseek(stdio, offset, whence);
3464 PerlIOStdio_tell(pTHX_ PerlIO *f)
3466 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3467 PERL_UNUSED_CONTEXT;
3469 return PerlSIO_ftell(stdio);
3473 PerlIOStdio_flush(pTHX_ PerlIO *f)
3475 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3476 PERL_UNUSED_CONTEXT;
3478 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3479 return PerlSIO_fflush(stdio);
3485 * FIXME: This discards ungetc() and pre-read stuff which is not
3486 * right if this is just a "sync" from a layer above Suspect right
3487 * design is to do _this_ but not have layer above flush this
3488 * layer read-to-read
3491 * Not writeable - sync by attempting a seek
3494 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3502 PerlIOStdio_eof(pTHX_ PerlIO *f)
3504 PERL_UNUSED_CONTEXT;
3506 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3510 PerlIOStdio_error(pTHX_ PerlIO *f)
3512 PERL_UNUSED_CONTEXT;
3514 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3518 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3520 PERL_UNUSED_CONTEXT;
3522 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3526 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3528 PERL_UNUSED_CONTEXT;
3530 #ifdef HAS_SETLINEBUF
3531 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3533 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3539 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3541 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3542 return (STDCHAR*)PerlSIO_get_base(stdio);
3546 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3548 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3549 return PerlSIO_get_bufsiz(stdio);
3553 #ifdef USE_STDIO_PTR
3555 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3557 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3558 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3562 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3564 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3565 return PerlSIO_get_cnt(stdio);
3569 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3571 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3573 #ifdef STDIO_PTR_LVALUE
3574 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3575 #ifdef STDIO_PTR_LVAL_SETS_CNT
3576 assert(PerlSIO_get_cnt(stdio) == (cnt));
3578 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3580 * Setting ptr _does_ change cnt - we are done
3584 #else /* STDIO_PTR_LVALUE */
3586 #endif /* STDIO_PTR_LVALUE */
3589 * Now (or only) set cnt
3591 #ifdef STDIO_CNT_LVALUE
3592 PerlSIO_set_cnt(stdio, cnt);
3593 #else /* STDIO_CNT_LVALUE */
3594 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3595 PerlSIO_set_ptr(stdio,
3596 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3598 #else /* STDIO_PTR_LVAL_SETS_CNT */
3600 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3601 #endif /* STDIO_CNT_LVALUE */
3608 PerlIOStdio_fill(pTHX_ PerlIO *f)
3612 PERL_UNUSED_CONTEXT;
3613 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3615 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3618 * fflush()ing read-only streams can cause trouble on some stdio-s
3620 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3621 if (PerlSIO_fflush(stdio) != 0)
3625 c = PerlSIO_fgetc(stdio);
3628 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3630 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3635 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3637 #ifdef STDIO_BUFFER_WRITABLE
3638 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3639 /* Fake ungetc() to the real buffer in case system's ungetc
3642 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3643 SSize_t cnt = PerlSIO_get_cnt(stdio);
3644 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3645 if (ptr == base+1) {
3646 *--ptr = (STDCHAR) c;
3647 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3648 if (PerlSIO_feof(stdio))
3649 PerlSIO_clearerr(stdio);
3655 if (PerlIO_has_cntptr(f)) {
3657 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3664 /* An ungetc()d char is handled separately from the regular
3665 * buffer, so we stuff it in the buffer ourselves.
3666 * Should never get called as should hit code above
3668 *(--((*stdio)->_ptr)) = (unsigned char) c;
3671 /* If buffer snoop scheme above fails fall back to
3674 if (PerlSIO_ungetc(c, stdio) != c)
3682 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3683 sizeof(PerlIO_funcs),
3685 sizeof(PerlIOStdio),
3686 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3690 PerlIOBase_binmode, /* binmode */
3704 PerlIOStdio_clearerr,
3705 PerlIOStdio_setlinebuf,
3707 PerlIOStdio_get_base,
3708 PerlIOStdio_get_bufsiz,
3713 #ifdef USE_STDIO_PTR
3714 PerlIOStdio_get_ptr,
3715 PerlIOStdio_get_cnt,
3716 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3717 PerlIOStdio_set_ptrcnt,
3720 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3725 #endif /* USE_STDIO_PTR */
3728 /* Note that calls to PerlIO_exportFILE() are reversed using
3729 * PerlIO_releaseFILE(), not importFILE. */
3731 PerlIO_exportFILE(PerlIO * f, const char *mode)
3735 if (PerlIOValid(f)) {
3738 if (!mode || !*mode) {
3739 mode = PerlIO_modestr(f, buf);
3741 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3745 /* De-link any lower layers so new :stdio sticks */
3747 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3748 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3750 PerlIOUnix_refcnt_inc(fileno(stdio));
3751 /* Link previous lower layers under new one */
3755 /* restore layers list */
3765 PerlIO_findFILE(PerlIO *f)
3770 if (l->tab == &PerlIO_stdio) {
3771 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3774 l = *PerlIONext(&l);
3776 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3777 /* However, we're not really exporting a FILE * to someone else (who
3778 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3779 So we need to undo its reference count increase on the underlying file
3780 descriptor. We have to do this, because if the loop above returns you
3781 the FILE *, then *it* didn't increase any reference count. So there's
3782 only one way to be consistent. */
3783 stdio = PerlIO_exportFILE(f, NULL);
3785 const int fd = fileno(stdio);
3787 PerlIOUnix_refcnt_dec(fd);
3792 /* Use this to reverse PerlIO_exportFILE calls. */
3794 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3799 if (l->tab == &PerlIO_stdio) {
3800 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3801 if (s->stdio == f) { /* not in a loop */
3802 const int fd = fileno(f);
3804 PerlIOUnix_refcnt_dec(fd);
3807 PerlIO_pop(aTHX_ p);
3817 /*--------------------------------------------------------------------------------------*/
3819 * perlio buffer layer
3823 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3825 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3826 const int fd = PerlIO_fileno(f);
3827 if (fd >= 0 && PerlLIO_isatty(fd)) {
3828 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3830 if (*PerlIONext(f)) {
3831 const Off_t posn = PerlIO_tell(PerlIONext(f));
3832 if (posn != (Off_t) - 1) {
3836 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3840 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3841 IV n, const char *mode, int fd, int imode, int perm,
3842 PerlIO *f, int narg, SV **args)
3844 if (PerlIOValid(f)) {
3845 PerlIO *next = PerlIONext(f);
3847 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3848 if (tab && tab->Open)
3850 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3852 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3857 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3859 if (*mode == IoTYPE_IMPLICIT) {
3865 if (tab && tab->Open)
3866 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3869 SETERRNO(EINVAL, LIB_INVARG);
3871 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3873 * if push fails during open, open fails. close will pop us.
3878 fd = PerlIO_fileno(f);
3879 if (init && fd == 2) {
3881 * Initial stderr is unbuffered
3883 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3885 #ifdef PERLIO_USING_CRLF
3886 # ifdef PERLIO_IS_BINMODE_FD
3887 if (PERLIO_IS_BINMODE_FD(fd))
3888 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3892 * do something about failing setmode()? --jhi
3894 PerlLIO_setmode(fd, O_BINARY);
3897 /* Enable line buffering with record-oriented regular files
3898 * so we don't introduce an extraneous record boundary when
3899 * the buffer fills up.
3901 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3903 if (PerlLIO_fstat(fd, &st) == 0
3904 && S_ISREG(st.st_mode)
3905 && (st.st_fab_rfm == FAB$C_VAR
3906 || st.st_fab_rfm == FAB$C_VFC)) {
3907 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
3918 * This "flush" is akin to sfio's sync in that it handles files in either
3919 * read or write state. For write state, we put the postponed data through
3920 * the next layers. For read state, we seek() the next layers to the
3921 * offset given by current position in the buffer, and discard the buffer
3922 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3923 * in any case?). Then the pass the stick further in chain.
3926 PerlIOBuf_flush(pTHX_ PerlIO *f)
3928 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3930 PerlIO *n = PerlIONext(f);
3931 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3933 * write() the buffer
3935 const STDCHAR *buf = b->buf;
3936 const STDCHAR *p = buf;
3937 while (p < b->ptr) {
3938 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3942 else if (count < 0 || PerlIO_error(n)) {
3943 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3948 b->posn += (p - buf);
3950 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3951 STDCHAR *buf = PerlIO_get_base(f);
3953 * Note position change
3955 b->posn += (b->ptr - buf);
3956 if (b->ptr < b->end) {
3957 /* We did not consume all of it - try and seek downstream to
3958 our logical position
3960 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3961 /* Reload n as some layers may pop themselves on seek */
3962 b->posn = PerlIO_tell(n = PerlIONext(f));
3965 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3966 data is lost for good - so return saying "ok" having undone
3969 b->posn -= (b->ptr - buf);
3974 b->ptr = b->end = b->buf;
3975 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3976 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3977 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3982 /* This discards the content of the buffer after b->ptr, and rereads
3983 * the buffer from the position off in the layer downstream; here off
3984 * is at offset corresponding to b->ptr - b->buf.
3987 PerlIOBuf_fill(pTHX_ PerlIO *f)
3989 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3990 PerlIO *n = PerlIONext(f);
3993 * Down-stream flush is defined not to loose read data so is harmless.
3994 * we would not normally be fill'ing if there was data left in anycase.
3996 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
3998 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
3999 PerlIOBase_flush_linebuf(aTHX);
4002 PerlIO_get_base(f); /* allocate via vtable */
4004 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
4006 b->ptr = b->end = b->buf;
4008 if (!PerlIOValid(n)) {
4009 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4013 if (PerlIO_fast_gets(n)) {
4015 * Layer below is also buffered. We do _NOT_ want to call its
4016 * ->Read() because that will loop till it gets what we asked for
4017 * which may hang on a pipe etc. Instead take anything it has to
4018 * hand, or ask it to fill _once_.
4020 avail = PerlIO_get_cnt(n);
4022 avail = PerlIO_fill(n);
4024 avail = PerlIO_get_cnt(n);
4026 if (!PerlIO_error(n) && PerlIO_eof(n))
4031 STDCHAR *ptr = PerlIO_get_ptr(n);
4032 const SSize_t cnt = avail;
4033 if (avail > (SSize_t)b->bufsiz)
4035 Copy(ptr, b->buf, avail, STDCHAR);
4036 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4040 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4044 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4046 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4049 b->end = b->buf + avail;
4050 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4055 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4057 if (PerlIOValid(f)) {
4058 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4061 return PerlIOBase_read(aTHX_ f, vbuf, count);
4067 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4069 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4070 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4073 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4078 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4080 * Buffer is already a read buffer, we can overwrite any chars
4081 * which have been read back to buffer start
4083 avail = (b->ptr - b->buf);
4087 * Buffer is idle, set it up so whole buffer is available for
4091 b->end = b->buf + avail;
4093 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4095 * Buffer extends _back_ from where we are now
4097 b->posn -= b->bufsiz;
4099 if ((SSize_t) count >= 0 && avail > (SSize_t) count) {
4101 * If we have space for more than count, just move count
4109 * In simple stdio-like ungetc() case chars will be already
4112 if (buf != b->ptr) {
4113 Copy(buf, b->ptr, avail, STDCHAR);
4117 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4121 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4127 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4129 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4130 const STDCHAR *buf = (const STDCHAR *) vbuf;
4131 const STDCHAR *flushptr = buf;
4135 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4137 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4138 if (PerlIO_flush(f) != 0) {
4142 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4143 flushptr = buf + count;
4144 while (flushptr > buf && *(flushptr - 1) != '\n')
4148 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4149 if ((SSize_t) count >= 0 && (SSize_t) count < avail)
4151 if (flushptr > buf && flushptr <= buf + avail)
4152 avail = flushptr - buf;
4153 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4155 Copy(buf, b->ptr, avail, STDCHAR);
4160 if (buf == flushptr)
4163 if (b->ptr >= (b->buf + b->bufsiz))
4164 if (PerlIO_flush(f) == -1)
4167 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4173 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4176 if ((code = PerlIO_flush(f)) == 0) {
4177 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4178 code = PerlIO_seek(PerlIONext(f), offset, whence);
4180 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4181 b->posn = PerlIO_tell(PerlIONext(f));
4188 PerlIOBuf_tell(pTHX_ PerlIO *f)
4190 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4192 * b->posn is file position where b->buf was read, or will be written
4194 Off_t posn = b->posn;
4195 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4196 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4198 /* As O_APPEND files are normally shared in some sense it is better
4203 /* when file is NOT shared then this is sufficient */
4204 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4206 posn = b->posn = PerlIO_tell(PerlIONext(f));
4210 * If buffer is valid adjust position by amount in buffer
4212 posn += (b->ptr - b->buf);
4218 PerlIOBuf_popped(pTHX_ PerlIO *f)
4220 const IV code = PerlIOBase_popped(aTHX_ f);
4221 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4222 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4225 b->ptr = b->end = b->buf = NULL;
4226 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4231 PerlIOBuf_close(pTHX_ PerlIO *f)
4233 const IV code = PerlIOBase_close(aTHX_ f);
4234 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4235 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4238 b->ptr = b->end = b->buf = NULL;
4239 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4244 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4246 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4253 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4255 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4258 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4259 return (b->end - b->ptr);
4264 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4266 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4267 PERL_UNUSED_CONTEXT;
4271 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4272 Newxz(b->buf,b->bufsiz, STDCHAR);
4274 b->buf = (STDCHAR *) & b->oneword;
4275 b->bufsiz = sizeof(b->oneword);
4277 b->end = b->ptr = b->buf;
4283 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4285 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4288 return (b->end - b->buf);
4292 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4294 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4296 PERL_UNUSED_ARG(cnt);
4301 assert(PerlIO_get_cnt(f) == cnt);
4302 assert(b->ptr >= b->buf);
4303 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4307 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4309 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4314 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4315 sizeof(PerlIO_funcs),
4318 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4322 PerlIOBase_binmode, /* binmode */
4336 PerlIOBase_clearerr,
4337 PerlIOBase_setlinebuf,
4342 PerlIOBuf_set_ptrcnt,
4345 /*--------------------------------------------------------------------------------------*/
4347 * Temp layer to hold unread chars when cannot do it any other way
4351 PerlIOPending_fill(pTHX_ PerlIO *f)
4354 * Should never happen
4361 PerlIOPending_close(pTHX_ PerlIO *f)
4364 * A tad tricky - flush pops us, then we close new top
4367 return PerlIO_close(f);
4371 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4374 * A tad tricky - flush pops us, then we seek new top
4377 return PerlIO_seek(f, offset, whence);
4382 PerlIOPending_flush(pTHX_ PerlIO *f)
4384 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4385 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4389 PerlIO_pop(aTHX_ f);
4394 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4400 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4405 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4407 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4408 PerlIOl * const l = PerlIOBase(f);
4410 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4411 * etc. get muddled when it changes mid-string when we auto-pop.
4413 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4414 (PerlIOBase(PerlIONext(f))->
4415 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4420 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4422 SSize_t avail = PerlIO_get_cnt(f);
4424 if ((SSize_t) count >= 0 && (SSize_t)count < avail)
4427 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4428 if (got >= 0 && got < (SSize_t)count) {
4429 const SSize_t more =
4430 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4431 if (more >= 0 || got == 0)
4437 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4438 sizeof(PerlIO_funcs),
4441 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4442 PerlIOPending_pushed,
4445 PerlIOBase_binmode, /* binmode */
4454 PerlIOPending_close,
4455 PerlIOPending_flush,
4459 PerlIOBase_clearerr,
4460 PerlIOBase_setlinebuf,
4465 PerlIOPending_set_ptrcnt,
4470 /*--------------------------------------------------------------------------------------*/
4472 * crlf - translation On read translate CR,LF to "\n" we do this by
4473 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4474 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4476 * c->nl points on the first byte of CR LF pair when it is temporarily
4477 * replaced by LF, or to the last CR of the buffer. In the former case
4478 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4479 * that it ends at c->nl; these two cases can be distinguished by
4480 * *c->nl. c->nl is set during _getcnt() call, and unset during
4481 * _unread() and _flush() calls.
4482 * It only matters for read operations.
4486 PerlIOBuf base; /* PerlIOBuf stuff */
4487 STDCHAR *nl; /* Position of crlf we "lied" about in the
4491 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4492 * Otherwise the :crlf layer would always revert back to
4496 S_inherit_utf8_flag(PerlIO *f)
4498 PerlIO *g = PerlIONext(f);
4499 if (PerlIOValid(g)) {
4500 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4501 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4507 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4510 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4511 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4513 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4514 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4515 PerlIOBase(f)->flags);
4518 /* If the old top layer is a CRLF layer, reactivate it (if
4519 * necessary) and remove this new layer from the stack */
4520 PerlIO *g = PerlIONext(f);
4521 if (PerlIOValid(g)) {
4522 PerlIOl *b = PerlIOBase(g);
4523 if (b && b->tab == &PerlIO_crlf) {
4524 if (!(b->flags & PERLIO_F_CRLF))
4525 b->flags |= PERLIO_F_CRLF;
4526 S_inherit_utf8_flag(g);
4527 PerlIO_pop(aTHX_ f);
4532 S_inherit_utf8_flag(f);
4538 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4540 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4541 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4542 *(c->nl) = NATIVE_0xd;
4545 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4546 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4548 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4549 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4551 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4556 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4557 b->end = b->ptr = b->buf + b->bufsiz;
4558 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4559 b->posn -= b->bufsiz;
4561 while (count > 0 && b->ptr > b->buf) {
4562 const int ch = *--buf;
4564 if (b->ptr - 2 >= b->buf) {
4565 *--(b->ptr) = NATIVE_0xa;
4566 *--(b->ptr) = NATIVE_0xd;
4571 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4572 *--(b->ptr) = NATIVE_0xa; /* Works even if 0xa ==
4586 unread += PerlIOBase_unread(aTHX_ f, (const STDCHAR *) vbuf + unread, count);
4591 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4593 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4595 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4598 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4599 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4600 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == NATIVE_0xd)) {
4601 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4603 while (nl < b->end && *nl != NATIVE_0xd)
4605 if (nl < b->end && *nl == NATIVE_0xd) {
4607 if (nl + 1 < b->end) {
4608 if (nl[1] == NATIVE_0xa) {
4614 * Not CR,LF but just CR
4622 * Blast - found CR as last char in buffer
4627 * They may not care, defer work as long as
4631 return (nl - b->ptr);
4635 b->ptr++; /* say we have read it as far as
4636 * flush() is concerned */
4637 b->buf++; /* Leave space in front of buffer */
4638 /* Note as we have moved buf up flush's
4640 will naturally make posn point at CR
4642 b->bufsiz--; /* Buffer is thus smaller */
4643 code = PerlIO_fill(f); /* Fetch some more */
4644 b->bufsiz++; /* Restore size for next time */
4645 b->buf--; /* Point at space */
4646 b->ptr = nl = b->buf; /* Which is what we hand
4648 *nl = NATIVE_0xd; /* Fill in the CR */
4650 goto test; /* fill() call worked */
4652 * CR at EOF - just fall through
4654 /* Should we clear EOF though ??? */
4659 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4665 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4667 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4668 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4674 if (ptr == b->end && *c->nl == NATIVE_0xd) {
4675 /* Deferred CR at end of buffer case - we lied about count */
4688 * Test code - delete when it works ...
4690 IV flags = PerlIOBase(f)->flags;
4691 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4692 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == NATIVE_0xd) {
4693 /* Deferred CR at end of buffer case - we lied about count */
4699 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4700 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4701 flags, c->nl, b->end, cnt);
4708 * They have taken what we lied about
4710 *(c->nl) = NATIVE_0xd;
4716 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4720 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4722 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4723 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4725 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4726 const STDCHAR *buf = (const STDCHAR *) vbuf;
4727 const STDCHAR * const ebuf = buf + count;
4730 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4732 while (buf < ebuf) {
4733 const STDCHAR * const eptr = b->buf + b->bufsiz;
4734 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4735 while (buf < ebuf && b->ptr < eptr) {
4737 if ((b->ptr + 2) > eptr) {
4745 *(b->ptr)++ = NATIVE_0xd; /* CR */
4746 *(b->ptr)++ = NATIVE_0xa; /* LF */
4748 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4755 *(b->ptr)++ = *buf++;
4757 if (b->ptr >= eptr) {
4763 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4765 return (buf - (STDCHAR *) vbuf);
4770 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4772 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4774 *(c->nl) = NATIVE_0xd;
4777 return PerlIOBuf_flush(aTHX_ f);
4781 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4783 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4784 /* In text mode - flush any pending stuff and flip it */
4785 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4786 #ifndef PERLIO_USING_CRLF
4787 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4788 PerlIO_pop(aTHX_ f);
4794 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4795 sizeof(PerlIO_funcs),
4798 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4800 PerlIOBuf_popped, /* popped */
4802 PerlIOCrlf_binmode, /* binmode */
4806 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4807 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4808 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4816 PerlIOBase_clearerr,
4817 PerlIOBase_setlinebuf,
4822 PerlIOCrlf_set_ptrcnt,
4826 Perl_PerlIO_stdin(pTHX)
4830 PerlIO_stdstreams(aTHX);
4832 return (PerlIO*)&PL_perlio[1];
4836 Perl_PerlIO_stdout(pTHX)
4840 PerlIO_stdstreams(aTHX);
4842 return (PerlIO*)&PL_perlio[2];
4846 Perl_PerlIO_stderr(pTHX)
4850 PerlIO_stdstreams(aTHX);
4852 return (PerlIO*)&PL_perlio[3];
4855 /*--------------------------------------------------------------------------------------*/
4858 PerlIO_getname(PerlIO *f, char *buf)
4863 bool exported = FALSE;
4864 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
4866 stdio = PerlIO_exportFILE(f,0);
4870 name = fgetname(stdio, buf);
4871 if (exported) PerlIO_releaseFILE(f,stdio);
4876 PERL_UNUSED_ARG(buf);
4877 Perl_croak_nocontext("Don't know how to get file name");
4883 /*--------------------------------------------------------------------------------------*/
4885 * Functions which can be called on any kind of PerlIO implemented in
4889 #undef PerlIO_fdopen
4891 PerlIO_fdopen(int fd, const char *mode)
4894 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
4899 PerlIO_open(const char *path, const char *mode)
4902 SV *name = sv_2mortal(newSVpv(path, 0));
4903 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
4906 #undef Perlio_reopen
4908 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
4911 SV *name = sv_2mortal(newSVpv(path,0));
4912 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
4917 PerlIO_getc(PerlIO *f)
4921 if ( 1 == PerlIO_read(f, buf, 1) ) {
4922 return (unsigned char) buf[0];
4927 #undef PerlIO_ungetc
4929 PerlIO_ungetc(PerlIO *f, int ch)
4934 if (PerlIO_unread(f, &buf, 1) == 1)
4942 PerlIO_putc(PerlIO *f, int ch)
4946 return PerlIO_write(f, &buf, 1);
4951 PerlIO_puts(PerlIO *f, const char *s)
4954 return PerlIO_write(f, s, strlen(s));
4957 #undef PerlIO_rewind
4959 PerlIO_rewind(PerlIO *f)
4962 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
4966 #undef PerlIO_vprintf
4968 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
4977 Perl_va_copy(ap, apc);
4978 sv = vnewSVpvf(fmt, &apc);
4980 sv = vnewSVpvf(fmt, &ap);
4982 s = SvPV_const(sv, len);
4983 wrote = PerlIO_write(f, s, len);
4988 #undef PerlIO_printf
4990 PerlIO_printf(PerlIO *f, const char *fmt, ...)
4995 result = PerlIO_vprintf(f, fmt, ap);
5000 #undef PerlIO_stdoutf
5002 PerlIO_stdoutf(const char *fmt, ...)
5008 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5013 #undef PerlIO_tmpfile
5015 PerlIO_tmpfile(void)
5022 const int fd = win32_tmpfd();
5024 f = PerlIO_fdopen(fd, "w+b");
5026 # if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5028 char tempname[] = "/tmp/PerlIO_XXXXXX";
5029 const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
5032 * I have no idea how portable mkstemp() is ... NI-S
5034 if (tmpdir && *tmpdir) {
5035 /* if TMPDIR is set and not empty, we try that first */
5036 sv = newSVpv(tmpdir, 0);
5037 sv_catpv(sv, tempname + 4);
5038 fd = mkstemp(SvPVX(sv));
5042 /* else we try /tmp */
5043 fd = mkstemp(tempname);
5046 f = PerlIO_fdopen(fd, "w+");
5048 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5049 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5052 # else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5053 FILE * const stdio = PerlSIO_tmpfile();
5056 f = PerlIO_fdopen(fileno(stdio), "w+");
5058 # endif /* else HAS_MKSTEMP */
5059 #endif /* else WIN32 */
5066 #endif /* USE_SFIO */
5067 #endif /* PERLIO_IS_STDIO */
5069 /*======================================================================================*/
5071 * Now some functions in terms of above which may be needed even if we are
5072 * not in true PerlIO mode
5075 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5078 const char *direction = NULL;
5081 * Need to supply default layer info from open.pm
5087 if (mode && mode[0] != 'r') {
5088 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5089 direction = "open>";
5091 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5092 direction = "open<";
5097 layers = cop_hints_fetch_pvn(PL_curcop, direction, 5, 0, 0);
5100 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5105 #undef PerlIO_setpos
5107 PerlIO_setpos(PerlIO *f, SV *pos)
5112 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5113 if (f && len == sizeof(Off_t))
5114 return PerlIO_seek(f, *posn, SEEK_SET);
5116 SETERRNO(EINVAL, SS_IVCHAN);
5120 #undef PerlIO_setpos
5122 PerlIO_setpos(PerlIO *f, SV *pos)
5127 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5128 if (f && len == sizeof(Fpos_t)) {
5129 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5130 return fsetpos64(f, fpos);
5132 return fsetpos(f, fpos);
5136 SETERRNO(EINVAL, SS_IVCHAN);
5142 #undef PerlIO_getpos
5144 PerlIO_getpos(PerlIO *f, SV *pos)
5147 Off_t posn = PerlIO_tell(f);
5148 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5149 return (posn == (Off_t) - 1) ? -1 : 0;
5152 #undef PerlIO_getpos
5154 PerlIO_getpos(PerlIO *f, SV *pos)
5159 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5160 code = fgetpos64(f, &fpos);
5162 code = fgetpos(f, &fpos);
5164 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5169 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
5172 vprintf(char *pat, char *args)
5174 _doprnt(pat, args, stdout);
5175 return 0; /* wrong, but perl doesn't use the return
5180 vfprintf(FILE *fd, char *pat, char *args)
5182 _doprnt(pat, args, fd);
5183 return 0; /* wrong, but perl doesn't use the return
5191 * c-indentation-style: bsd
5193 * indent-tabs-mode: nil
5196 * ex: set ts=8 sts=4 sw=4 et: