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
56 #define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
58 /* Call the callback or PerlIOBase, and return failure. */
59 #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
60 if (PerlIOValid(f)) { \
61 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
62 if (tab && tab->callback) \
63 return (*tab->callback) args; \
65 return PerlIOBase_ ## base args; \
68 SETERRNO(EBADF, SS_IVCHAN); \
71 /* Call the callback or fail, and return failure. */
72 #define Perl_PerlIO_or_fail(f, callback, failure, args) \
73 if (PerlIOValid(f)) { \
74 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
75 if (tab && tab->callback) \
76 return (*tab->callback) args; \
77 SETERRNO(EINVAL, LIB_INVARG); \
80 SETERRNO(EBADF, SS_IVCHAN); \
83 /* Call the callback or PerlIOBase, and be void. */
84 #define Perl_PerlIO_or_Base_void(f, callback, base, args) \
85 if (PerlIOValid(f)) { \
86 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
87 if (tab && tab->callback) \
88 (*tab->callback) args; \
90 PerlIOBase_ ## base args; \
93 SETERRNO(EBADF, SS_IVCHAN)
95 /* Call the callback or fail, and be void. */
96 #define Perl_PerlIO_or_fail_void(f, callback, args) \
97 if (PerlIOValid(f)) { \
98 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
99 if (tab && tab->callback) \
100 (*tab->callback) args; \
102 SETERRNO(EINVAL, LIB_INVARG); \
105 SETERRNO(EBADF, SS_IVCHAN)
107 #if defined(__osf__) && _XOPEN_SOURCE < 500
108 extern int fseeko(FILE *, off_t, int);
109 extern off_t ftello(FILE *);
112 #define NATIVE_0xd CR_NATIVE
113 #define NATIVE_0xa LF_NATIVE
115 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
118 perlsio_binmode(FILE *fp, int iotype, int mode)
121 * This used to be contents of do_binmode in doio.c
125 PERL_UNUSED_ARG(iotype);
126 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
132 # if defined(USEMYBINMODE)
134 # if defined(__CYGWIN__)
135 PERL_UNUSED_ARG(iotype);
137 if (my_binmode(fp, iotype, mode) != FALSE)
143 PERL_UNUSED_ARG(iotype);
144 PERL_UNUSED_ARG(mode);
151 # define O_ACCMODE 3 /* Assume traditional implementation */
155 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
157 const int result = rawmode & O_ACCMODE;
162 ptype = IoTYPE_RDONLY;
165 ptype = IoTYPE_WRONLY;
173 *writing = (result != O_RDONLY);
175 if (result == O_RDONLY) {
179 else if (rawmode & O_APPEND) {
181 if (result != O_WRONLY)
186 if (result == O_WRONLY)
194 /* Unless O_BINARY is different from zero, bit-and:ing
195 * with it won't do much good. */
196 if (rawmode & O_BINARY)
203 #ifndef PERLIO_LAYERS
205 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
207 if (!names || !*names
208 || strEQ(names, ":crlf")
209 || strEQ(names, ":raw")
210 || strEQ(names, ":bytes")
214 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
222 PerlIO_destruct(pTHX)
227 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
229 return perlsio_binmode(fp, iotype, mode);
233 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
235 # if defined(PERL_MICRO)
237 # elif defined(PERL_IMPLICIT_SYS)
238 return PerlSIO_fdupopen(f);
241 return win32_fdupopen(f);
244 const int fd = PerlLIO_dup_cloexec(PerlIO_fileno(f));
247 const int omode = fcntl(fd, F_GETFL);
248 PerlIO_intmode2str(omode,mode,NULL);
249 /* the r+ is a hack */
250 return PerlIO_fdopen(fd, mode);
255 SETERRNO(EBADF, SS_IVCHAN);
264 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
268 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
269 int imode, int perm, PerlIO *old, int narg, SV **args)
273 Perl_croak(aTHX_ "More than one argument to open");
275 if (*args == &PL_sv_undef)
276 return PerlIO_tmpfile();
279 const char *name = SvPV_const(*args, len);
280 if (!IS_SAFE_PATHNAME(name, len, "open"))
283 if (*mode == IoTYPE_NUMERIC) {
284 fd = PerlLIO_open3_cloexec(name, imode, perm);
286 return PerlIO_fdopen(fd, mode + 1);
289 return PerlIO_reopen(name, mode, old);
292 return PerlIO_open(name, mode);
297 return PerlIO_fdopen(fd, (char *) mode);
302 XS(XS_PerlIO__Layer__find); /* prototype to pass -Wmissing-prototypes */
303 XS(XS_PerlIO__Layer__find)
307 Perl_croak(aTHX_ "Usage class->find(name[,load])");
309 const char * const name = SvPV_nolen_const(ST(1));
310 ST(0) = (strEQ(name, "crlf")
311 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
318 Perl_boot_core_PerlIO(pTHX)
320 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
326 /*======================================================================================*/
328 * Implement all the PerlIO interface ourselves.
334 PerlIO_debug(const char *fmt, ...)
344 if (!PL_perlio_debug_fd) {
346 PerlProc_getuid() == PerlProc_geteuid() &&
347 PerlProc_getgid() == PerlProc_getegid()) {
348 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
350 PL_perlio_debug_fd = PerlLIO_open3_cloexec(s,
351 O_WRONLY | O_CREAT | O_APPEND, 0666);
353 PL_perlio_debug_fd = PerlLIO_dup_cloexec(2); /* stderr */
355 /* tainting or set*id, so ignore the environment and send the
356 debug output to stderr, like other -D switches. */
357 PL_perlio_debug_fd = PerlLIO_dup_cloexec(2); /* stderr */
360 if (PL_perlio_debug_fd > 0) {
362 const char * const s = CopFILE(PL_curcop);
363 /* Use fixed buffer as sv_catpvf etc. needs SVs */
365 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
367 # ifdef HAS_VSNPRINTF
368 /* my_vsnprintf() isn't available with quadmath, but the native vsnprintf()
369 should be, otherwise the system isn't likely to support quadmath.
370 Nothing should be calling PerlIO_debug() with floating point anyway.
372 const STRLEN len2 = vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
374 STATIC_ASSERT_STMT(0);
377 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
379 PERL_UNUSED_RESULT(PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2));
381 const char *s = CopFILE(PL_curcop);
383 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
384 (IV) CopLINE(PL_curcop));
385 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
387 s = SvPV_const(sv, len);
388 PERL_UNUSED_RESULT(PerlLIO_write(PL_perlio_debug_fd, s, len));
395 /*--------------------------------------------------------------------------------------*/
398 * Inner level routines
401 /* check that the head field of each layer points back to the head */
404 # define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
406 PerlIO_verify_head(pTHX_ PerlIO *f)
410 # ifndef PERL_IMPLICIT_SYS
415 p = head = PerlIOBase(f)->head;
418 assert(p->head == head);
419 if (p == (PerlIOl*)f)
426 # define VERIFY_HEAD(f)
431 * Table of pointers to the PerlIO structs (malloc'ed)
433 #define PERLIO_TABLE_SIZE 64
436 PerlIO_init_table(pTHX)
440 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
446 PerlIO_allocate(pTHX)
449 * Find a free slot in the table, allocating new table as necessary
454 while ((f = *last)) {
456 last = (PerlIOl **) (f);
457 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
458 if (!((++f)->next)) {
463 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
467 *last = (PerlIOl*) f++;
470 f->flags = 0; /* lockcnt */
476 #undef PerlIO_fdupopen
478 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
480 if (PerlIOValid(f)) {
481 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
482 DEBUG_i( PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param) );
484 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
486 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
490 SETERRNO(EBADF, SS_IVCHAN);
496 PerlIO_cleantable(pTHX_ PerlIOl **tablep)
498 PerlIOl * const table = *tablep;
501 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
502 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
503 PerlIOl * const f = table + i;
505 PerlIO_close(&(f->next));
515 PerlIO_list_alloc(pTHX)
519 Newxz(list, 1, PerlIO_list_t);
525 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
528 if (--list->refcnt == 0) {
531 for (i = 0; i < list->cur; i++)
532 SvREFCNT_dec(list->array[i].arg);
533 Safefree(list->array);
541 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
546 if (list->cur >= list->len) {
547 const IV new_len = list->len + 8;
549 Renew(list->array, new_len, PerlIO_pair_t);
551 Newx(list->array, new_len, PerlIO_pair_t);
554 p = &(list->array[list->cur++]);
556 if ((p->arg = arg)) {
557 SvREFCNT_inc_simple_void_NN(arg);
562 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
564 PerlIO_list_t *list = NULL;
567 list = PerlIO_list_alloc(aTHX);
568 for (i=0; i < proto->cur; i++) {
569 SV *arg = proto->array[i].arg;
572 arg = sv_dup(arg, param);
574 PERL_UNUSED_ARG(param);
576 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
583 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
586 PerlIOl **table = &proto->Iperlio;
589 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
590 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
591 PerlIO_init_table(aTHX);
592 DEBUG_i( PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto) );
593 while ((f = *table)) {
595 table = (PerlIOl **) (f++);
596 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
598 (void) fp_dup(&(f->next), 0, param);
605 PERL_UNUSED_ARG(proto);
606 PERL_UNUSED_ARG(param);
611 PerlIO_destruct(pTHX)
613 PerlIOl **table = &PL_perlio;
616 DEBUG_i( PerlIO_debug("Destruct %p\n",(void*)aTHX) );
618 while ((f = *table)) {
620 table = (PerlIOl **) (f++);
621 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
622 PerlIO *x = &(f->next);
625 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
626 DEBUG_i( PerlIO_debug("Destruct popping %s\n", l->tab->name) );
640 PerlIO_pop(pTHX_ PerlIO *f)
642 const PerlIOl *l = *f;
645 DEBUG_i( PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f,
646 l->tab ? l->tab->name : "(Null)") );
647 if (l->tab && l->tab->Popped) {
649 * If popped returns non-zero do not free its layer structure
650 * it has either done so itself, or it is shared and still in
653 if ((*l->tab->Popped) (aTHX_ f) != 0)
656 if (PerlIO_lockcnt(f)) {
657 /* we're in use; defer freeing the structure */
658 PerlIOBase(f)->flags = PERLIO_F_CLEARED;
659 PerlIOBase(f)->tab = NULL;
669 /* Return as an array the stack of layers on a filehandle. Note that
670 * the stack is returned top-first in the array, and there are three
671 * times as many array elements as there are layers in the stack: the
672 * first element of a layer triplet is the name, the second one is the
673 * arguments, and the third one is the flags. */
676 PerlIO_get_layers(pTHX_ PerlIO *f)
678 AV * const av = newAV();
680 if (PerlIOValid(f)) {
681 PerlIOl *l = PerlIOBase(f);
684 /* There is some collusion in the implementation of
685 XS_PerlIO_get_layers - it knows that name and flags are
686 generated as fresh SVs here, and takes advantage of that to
687 "copy" them by taking a reference. If it changes here, it needs
688 to change there too. */
689 SV * const name = l->tab && l->tab->name ?
690 newSVpv(l->tab->name, 0) : &PL_sv_undef;
691 SV * const arg = l->tab && l->tab->Getarg ?
692 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
693 av_push_simple(av, name);
694 av_push_simple(av, arg);
695 av_push_simple(av, newSViv((IV)l->flags));
703 /*--------------------------------------------------------------------------------------*/
705 * XS Interface for perl code
709 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
713 if ((SSize_t) len <= 0)
715 for (i = 0; i < PL_known_layers->cur; i++) {
716 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
717 const STRLEN this_len = strlen(f->name);
718 if (this_len == len && memEQ(f->name, name, len)) {
719 DEBUG_i( PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f) );
723 if (load && PL_subname && PL_def_layerlist
724 && PL_def_layerlist->cur >= 2) {
725 if (PL_in_load_module) {
726 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
729 SV * const pkgsv = newSVpvs("PerlIO");
730 SV * const layer = newSVpvn(name, len);
731 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
733 SAVEBOOL(PL_in_load_module);
735 SAVEGENERICSV(PL_warnhook);
736 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
738 PL_in_load_module = TRUE;
740 * The two SVs are magically freed by load_module
742 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
744 return PerlIO_find_layer(aTHX_ name, len, 0);
747 DEBUG_i( PerlIO_debug("Cannot find %.*s\n", (int) len, name) );
751 #ifdef USE_ATTRIBUTES_FOR_PERLIO
754 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
757 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
758 PerlIO * const ifp = IoIFP(io);
759 PerlIO * const ofp = IoOFP(io);
760 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
761 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
767 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
770 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
771 PerlIO * const ifp = IoIFP(io);
772 PerlIO * const ofp = IoOFP(io);
773 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
774 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
780 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
782 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
787 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
789 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
793 MGVTBL perlio_vtab = {
801 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES); /* prototype to pass -Wmissing-prototypes */
802 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
805 SV * const sv = SvRV(ST(1));
806 AV * const av = newAV();
810 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
812 mg = mg_find(sv, PERL_MAGIC_ext);
813 mg->mg_virtual = &perlio_vtab;
815 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
816 for (i = 2; i < items; i++) {
818 const char * const name = SvPV_const(ST(i), len);
819 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
821 av_push_simple(av, SvREFCNT_inc_simple_NN(layer));
832 #endif /* USE_ATTRIBUTES_FOR_PERLIO */
835 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
837 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
838 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
842 XS(XS_PerlIO__Layer__NoWarnings); /* prototype to pass -Wmissing-prototypes */
843 XS(XS_PerlIO__Layer__NoWarnings)
845 /* This is used as a %SIG{__WARN__} handler to suppress warnings
846 during loading of layers.
849 PERL_UNUSED_VAR(items);
852 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0))) );
856 XS(XS_PerlIO__Layer__find); /* prototype to pass -Wmissing-prototypes */
857 XS(XS_PerlIO__Layer__find)
861 Perl_croak(aTHX_ "Usage class->find(name[,load])");
864 const char * const name = SvPV_const(ST(1), len);
865 const bool load = (items > 2) ? SvTRUE_NN(ST(2)) : 0;
866 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
868 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
875 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
877 if (!PL_known_layers)
878 PL_known_layers = PerlIO_list_alloc(aTHX);
879 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
880 DEBUG_i( PerlIO_debug("define %s %p\n", tab->name, (void*)tab) );
884 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
887 const char *s = names;
889 while (isSPACE(*s) || *s == ':')
894 const char *as = NULL;
896 if (!isIDFIRST(*s)) {
898 * Message is consistent with how attribute lists are
899 * passed. Even though this means "foo : : bar" is
900 * seen as an invalid separator character.
902 const char q = ((*s == '\'') ? '"' : '\'');
903 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
904 "Invalid separator character %c%c%c in PerlIO layer specification %s",
906 SETERRNO(EINVAL, LIB_INVARG);
911 } while (isWORDCHAR(*e));
927 * It's a nul terminated string, not allowed
928 * to \ the terminating null. Anything other
929 * character is passed over.
937 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
938 "Argument list not closed for PerlIO layer \"%.*s\"",
950 PerlIO_funcs * const layer =
951 PerlIO_find_layer(aTHX_ s, llen, 1);
955 arg = newSVpvn(as, alen);
956 PerlIO_list_push(aTHX_ av, layer,
957 (arg) ? arg : &PL_sv_undef);
961 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
974 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
976 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
977 #ifdef PERLIO_USING_CRLF
980 if (PerlIO_stdio.Set_ptrcnt)
983 DEBUG_i( PerlIO_debug("Pushing %s\n", tab->name) );
984 PerlIO_list_push(aTHX_ av, (PerlIO_funcs *)tab, &PL_sv_undef);
988 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
990 return av->array[n].arg;
994 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
996 if (n >= 0 && n < av->cur) {
997 DEBUG_i( PerlIO_debug("Layer %" IVdf " is %s\n", n,
998 av->array[n].funcs->name) );
999 return av->array[n].funcs;
1002 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1007 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1009 PERL_UNUSED_ARG(mode);
1010 PERL_UNUSED_ARG(arg);
1011 PERL_UNUSED_ARG(tab);
1012 if (PerlIOValid(f)) {
1014 PerlIO_pop(aTHX_ f);
1020 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1021 sizeof(PerlIO_funcs),
1024 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1044 NULL, /* get_base */
1045 NULL, /* get_bufsiz */
1048 NULL, /* set_ptrcnt */
1052 PerlIO_default_layers(pTHX)
1054 if (!PL_def_layerlist) {
1055 const char * const s = TAINTING_get ? NULL : PerlEnv_getenv("PERLIO");
1056 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1057 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1058 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1059 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1060 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1061 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1062 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1063 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1064 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1065 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1066 PerlIO_list_push(aTHX_ PL_def_layerlist, (PerlIO_funcs *)osLayer,
1069 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1072 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1075 if (PL_def_layerlist->cur < 2) {
1076 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1078 return PL_def_layerlist;
1082 Perl_boot_core_PerlIO(pTHX)
1084 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1085 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1088 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1089 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1093 PerlIO_default_layer(pTHX_ I32 n)
1095 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1098 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1101 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1102 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1105 PerlIO_stdstreams(pTHX)
1108 PerlIO_init_table(aTHX);
1109 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1110 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1111 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1116 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1119 if (tab->fsize != sizeof(PerlIO_funcs)) {
1121 "%s (%" UVuf ") does not match %s (%" UVuf ")",
1122 "PerlIO layer function table size", (UV)tab->fsize,
1123 "size expected by this perl", (UV)sizeof(PerlIO_funcs) );
1127 if (tab->size < sizeof(PerlIOl)) {
1129 "%s (%" UVuf ") smaller than %s (%" UVuf ")",
1130 "PerlIO layer instance size", (UV)tab->size,
1131 "size expected by this perl", (UV)sizeof(PerlIOl) );
1133 /* Real layer with a data area */
1136 Newxz(temp, tab->size, char);
1140 l->tab = (PerlIO_funcs*) tab;
1141 l->head = ((PerlIOl*)f)->head;
1143 DEBUG_i( PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1144 (void*)f, tab->name,
1145 (mode) ? mode : "(Null)", (void*)arg) );
1146 if (*l->tab->Pushed &&
1148 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1149 PerlIO_pop(aTHX_ f);
1158 /* Pseudo-layer where push does its own stack adjust */
1159 DEBUG_i( PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1160 (mode) ? mode : "(Null)", (void*)arg) );
1162 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1170 PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1171 IV n, const char *mode, int fd, int imode, int perm,
1172 PerlIO *old, int narg, SV **args)
1174 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_layer(aTHX_ 0));
1175 if (tab && tab->Open) {
1176 PerlIO* ret = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm, old, narg, args);
1177 if (ret && PerlIO_push(aTHX_ ret, self, mode, PerlIOArg) == NULL) {
1183 SETERRNO(EINVAL, LIB_INVARG);
1188 PerlIOBase_binmode(pTHX_ PerlIO *f)
1190 if (PerlIOValid(f)) {
1191 /* Is layer suitable for raw stream ? */
1192 if (PerlIOBase(f)->tab && PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1193 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1194 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1197 /* Not suitable - pop it */
1198 PerlIO_pop(aTHX_ f);
1206 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1208 PERL_UNUSED_ARG(mode);
1209 PERL_UNUSED_ARG(arg);
1210 PERL_UNUSED_ARG(tab);
1212 if (PerlIOValid(f)) {
1217 * Strip all layers that are not suitable for a raw stream
1220 while (t && (l = *t)) {
1221 if (l->tab && l->tab->Binmode) {
1222 /* Has a handler - normal case */
1223 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1225 /* Layer still there - move down a layer */
1234 /* No handler - pop it */
1235 PerlIO_pop(aTHX_ t);
1238 if (PerlIOValid(f)) {
1239 DEBUG_i( PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1240 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)") );
1248 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1249 PerlIO_list_t *layers, IV n, IV max)
1253 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1255 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1266 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1270 save_scalar(PL_errgv);
1272 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1273 code = PerlIO_parse_layers(aTHX_ layers, names);
1275 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1277 PerlIO_list_free(aTHX_ layers);
1284 /*--------------------------------------------------------------------------------------*/
1286 * Given the abstraction above the public API functions
1290 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1292 PERL_UNUSED_ARG(iotype);
1293 PERL_UNUSED_ARG(mode);
1296 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1297 (PerlIOBase(f) && PerlIOBase(f)->tab) ?
1298 PerlIOBase(f)->tab->name : "(Null)",
1299 iotype, mode, (names) ? names : "(Null)") );
1302 /* Do not flush etc. if (e.g.) switching encodings.
1303 if a pushed layer knows it needs to flush lower layers
1304 (for example :unix which is never going to call them)
1305 it can do the flush when it is pushed.
1307 return cBOOL(PerlIO_apply_layers(aTHX_ f, NULL, names) == 0);
1310 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1311 #ifdef PERLIO_USING_CRLF
1312 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1313 O_BINARY so we can look for it in mode.
1315 if (!(mode & O_BINARY)) {
1317 /* FIXME?: Looking down the layer stack seems wrong,
1318 but is a way of reaching past (say) an encoding layer
1319 to flip CRLF-ness of the layer(s) below
1322 /* Perhaps we should turn on bottom-most aware layer
1323 e.g. Ilya's idea that UNIX TTY could serve
1325 if (PerlIOBase(f)->tab &&
1326 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1328 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1329 /* Not in text mode - flush any pending stuff and flip it */
1331 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1333 /* Only need to turn it on in one layer so we are done */
1338 /* Not finding a CRLF aware layer presumably means we are binary
1339 which is not what was requested - so we failed
1340 We _could_ push :crlf layer but so could caller
1345 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1346 So code that used to be here is now in PerlIORaw_pushed().
1348 return cBOOL(PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL));
1353 PerlIO__close(pTHX_ PerlIO *f)
1355 if (PerlIOValid(f)) {
1356 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1357 if (tab && tab->Close)
1358 return (*tab->Close)(aTHX_ f);
1360 return PerlIOBase_close(aTHX_ f);
1363 SETERRNO(EBADF, SS_IVCHAN);
1369 Perl_PerlIO_close(pTHX_ PerlIO *f)
1371 const int code = PerlIO__close(aTHX_ f);
1372 while (PerlIOValid(f)) {
1373 PerlIO_pop(aTHX_ f);
1374 if (PerlIO_lockcnt(f))
1375 /* we're in use; the 'pop' deferred freeing the structure */
1382 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1384 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1388 static PerlIO_funcs *
1389 PerlIO_layer_from_ref(pTHX_ SV *sv)
1392 * For any scalar type load the handler which is bundled with perl
1394 if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
1395 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1396 /* This isn't supposed to happen, since PerlIO::scalar is core,
1397 * but could happen anyway in smaller installs or with PAR */
1399 /* diag_listed_as: Unknown PerlIO layer "%s" */
1400 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1405 * For other types allow if layer is known but don't try and load it
1407 switch (SvTYPE(sv)) {
1409 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1411 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1413 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1415 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1422 PerlIO_resolve_layers(pTHX_ const char *layers,
1423 const char *mode, int narg, SV **args)
1425 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1428 PerlIO_stdstreams(aTHX);
1430 SV * const arg = *args;
1432 * If it is a reference but not an object see if we have a handler
1435 if (SvROK(arg) && !SvOBJECT(SvRV(arg))) {
1436 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1438 def = PerlIO_list_alloc(aTHX);
1439 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1443 * Don't fail if handler cannot be found :via(...) etc. may do
1444 * something sensible else we will just stringfy and open
1449 if (!layers || !*layers)
1450 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1451 if (layers && *layers) {
1454 av = PerlIO_clone_list(aTHX_ def, NULL);
1459 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1463 PerlIO_list_free(aTHX_ av);
1475 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1476 int imode, int perm, PerlIO *f, int narg, SV **args)
1478 if (!f && narg == 1 && *args == &PL_sv_undef) {
1479 imode = PerlIOUnix_oflags(mode);
1481 if (imode != -1 && (f = PerlIO_tmpfile_flags(imode))) {
1482 if (!layers || !*layers)
1483 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1484 if (layers && *layers)
1485 PerlIO_apply_layers(aTHX_ f, mode, layers);
1489 PerlIO_list_t *layera;
1491 PerlIO_funcs *tab = NULL;
1492 if (PerlIOValid(f)) {
1494 * This is "reopen" - it is not tested as perl does not use it
1498 layera = PerlIO_list_alloc(aTHX);
1501 if (l->tab && l->tab->Getarg)
1502 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1503 PerlIO_list_push(aTHX_ layera, l->tab,
1504 (arg) ? arg : &PL_sv_undef);
1506 l = *PerlIONext(&l);
1510 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1516 * Start at "top" of layer stack
1518 n = layera->cur - 1;
1520 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1529 * Found that layer 'n' can do opens - call it
1531 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1532 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1534 DEBUG_i( PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1535 tab->name, layers ? layers : "(Null)", mode, fd,
1536 imode, perm, (void*)f, narg, (void*)args) );
1538 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1541 SETERRNO(EINVAL, LIB_INVARG);
1545 if (n + 1 < layera->cur) {
1547 * More layers above the one that we used to open -
1550 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1551 /* If pushing layers fails close the file */
1558 PerlIO_list_free(aTHX_ layera);
1565 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1567 PERL_ARGS_ASSERT_PERLIO_READ;
1569 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1573 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1575 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1577 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1581 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1583 PERL_ARGS_ASSERT_PERLIO_WRITE;
1585 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1589 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1591 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1595 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1597 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1601 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1605 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1607 if (tab && tab->Flush)
1608 return (*tab->Flush) (aTHX_ f);
1610 return 0; /* If no Flush defined, silently succeed. */
1613 DEBUG_i( PerlIO_debug("Cannot flush f=%p\n", (void*)f) );
1614 SETERRNO(EBADF, SS_IVCHAN);
1620 * Is it good API design to do flush-all on NULL, a potentially
1621 * erroneous input? Maybe some magical value (PerlIO*
1622 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1623 * things on fflush(NULL), but should we be bound by their design
1626 PerlIOl **table = &PL_perlio;
1629 while ((ff = *table)) {
1631 table = (PerlIOl **) (ff++);
1632 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1633 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1643 PerlIOBase_flush_linebuf(pTHX)
1645 PerlIOl **table = &PL_perlio;
1647 while ((f = *table)) {
1649 table = (PerlIOl **) (f++);
1650 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1652 && (PerlIOBase(&(f->next))->
1653 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1654 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1655 PerlIO_flush(&(f->next));
1662 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1664 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1668 PerlIO_isutf8(PerlIO *f)
1671 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1673 SETERRNO(EBADF, SS_IVCHAN);
1679 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1681 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1685 Perl_PerlIO_error(pTHX_ PerlIO *f)
1687 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1691 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1693 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1697 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1699 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1703 PerlIO_has_base(PerlIO *f)
1705 if (PerlIOValid(f)) {
1706 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1709 return (tab->Get_base != NULL);
1716 PerlIO_fast_gets(PerlIO *f)
1718 if (PerlIOValid(f)) {
1719 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1720 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1723 return (tab->Set_ptrcnt != NULL);
1731 PerlIO_has_cntptr(PerlIO *f)
1733 if (PerlIOValid(f)) {
1734 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1737 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1744 PerlIO_canset_cnt(PerlIO *f)
1746 if (PerlIOValid(f)) {
1747 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1750 return (tab->Set_ptrcnt != NULL);
1757 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1759 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1763 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1765 /* Note that Get_bufsiz returns a Size_t */
1766 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1770 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1772 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1776 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1778 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1782 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt)
1784 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1788 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
1790 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1794 /*--------------------------------------------------------------------------------------*/
1796 * utf8 and raw dummy layers
1800 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1802 PERL_UNUSED_CONTEXT;
1803 PERL_UNUSED_ARG(mode);
1804 PERL_UNUSED_ARG(arg);
1805 if (PerlIOValid(f)) {
1806 if (tab && tab->kind & PERLIO_K_UTF8)
1807 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1809 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1815 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1816 sizeof(PerlIO_funcs),
1819 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1839 NULL, /* get_base */
1840 NULL, /* get_bufsiz */
1843 NULL, /* set_ptrcnt */
1846 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1847 sizeof(PerlIO_funcs),
1850 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1870 NULL, /* get_base */
1871 NULL, /* get_bufsiz */
1874 NULL, /* set_ptrcnt */
1877 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1878 sizeof(PerlIO_funcs),
1901 NULL, /* get_base */
1902 NULL, /* get_bufsiz */
1905 NULL, /* set_ptrcnt */
1907 /*--------------------------------------------------------------------------------------*/
1908 /*--------------------------------------------------------------------------------------*/
1910 * "Methods" of the "base class"
1914 PerlIOBase_fileno(pTHX_ PerlIO *f)
1916 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
1920 PerlIO_modestr(PerlIO * f, char *buf)
1923 if (PerlIOValid(f)) {
1924 const IV flags = PerlIOBase(f)->flags;
1925 if (flags & PERLIO_F_APPEND) {
1927 if (flags & PERLIO_F_CANREAD) {
1931 else if (flags & PERLIO_F_CANREAD) {
1933 if (flags & PERLIO_F_CANWRITE)
1936 else if (flags & PERLIO_F_CANWRITE) {
1938 if (flags & PERLIO_F_CANREAD) {
1942 #ifdef PERLIO_USING_CRLF
1943 if (!(flags & PERLIO_F_CRLF))
1953 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1955 PerlIOl * const l = PerlIOBase(f);
1956 PERL_UNUSED_CONTEXT;
1957 PERL_UNUSED_ARG(arg);
1959 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
1960 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
1961 if (tab && tab->Set_ptrcnt != NULL)
1962 l->flags |= PERLIO_F_FASTGETS;
1964 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
1968 l->flags |= PERLIO_F_CANREAD;
1971 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
1974 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
1977 SETERRNO(EINVAL, LIB_INVARG);
1980 #ifdef __MVS__ /* XXX Perhaps should be be OEMVS instead of __MVS__ */
1982 /* The mode variable contains one positional parameter followed by
1983 * optional keyword parameters. The positional parameters must be
1984 * passed as lowercase characters. The keyword parameters can be
1985 * passed in mixed case. They must be separated by commas. Only one
1986 * instance of a keyword can be specified. */
1992 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
1996 l->flags &= ~PERLIO_F_CRLF;
2000 l->flags |= PERLIO_F_CRLF;
2014 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2017 l->flags &= ~PERLIO_F_CRLF;
2020 l->flags |= PERLIO_F_CRLF;
2023 SETERRNO(EINVAL, LIB_INVARG);
2031 l->flags |= l->next->flags &
2032 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2038 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2039 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2040 l->flags, PerlIO_modestr(f, temp));
2047 PerlIOBase_popped(pTHX_ PerlIO *f)
2049 PERL_UNUSED_CONTEXT;
2055 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2058 * Save the position as current head considers it
2060 const Off_t old = PerlIO_tell(f);
2061 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2062 PerlIOSelf(f, PerlIOBuf)->posn = old;
2063 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2067 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2069 STDCHAR *buf = (STDCHAR *) vbuf;
2071 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2072 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2073 SETERRNO(EBADF, SS_IVCHAN);
2074 PerlIO_save_errno(f);
2080 SSize_t avail = PerlIO_get_cnt(f);
2083 take = (((SSize_t) count >= 0) && ((SSize_t)count < avail)) ? (SSize_t)count : avail;
2085 STDCHAR *ptr = PerlIO_get_ptr(f);
2086 Copy(ptr, buf, take, STDCHAR);
2087 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2090 if (avail == 0) /* set_ptrcnt could have reset avail */
2093 if (count > 0 && avail <= 0) {
2094 if (PerlIO_fill(f) != 0)
2099 return (buf - (STDCHAR *) vbuf);
2105 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2107 PERL_UNUSED_CONTEXT;
2113 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2115 PERL_UNUSED_CONTEXT;
2121 PerlIOBase_close(pTHX_ PerlIO *f)
2124 if (PerlIOValid(f)) {
2125 PerlIO *n = PerlIONext(f);
2126 code = PerlIO_flush(f);
2127 PerlIOBase(f)->flags &=
2128 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2129 while (PerlIOValid(n)) {
2130 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2131 if (tab && tab->Close) {
2132 if ((*tab->Close)(aTHX_ n) != 0)
2137 PerlIOBase(n)->flags &=
2138 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2144 SETERRNO(EBADF, SS_IVCHAN);
2150 PerlIOBase_eof(pTHX_ PerlIO *f)
2152 PERL_UNUSED_CONTEXT;
2153 if (PerlIOValid(f)) {
2154 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2160 PerlIOBase_error(pTHX_ PerlIO *f)
2162 PERL_UNUSED_CONTEXT;
2163 if (PerlIOValid(f)) {
2164 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2170 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2172 if (PerlIOValid(f)) {
2173 PerlIO * const n = PerlIONext(f);
2174 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2181 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2183 PERL_UNUSED_CONTEXT;
2184 if (PerlIOValid(f)) {
2185 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2190 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2196 arg = sv_dup(arg, param);
2197 SvREFCNT_inc_simple_void_NN(arg);
2201 return newSVsv(arg);
2204 PERL_UNUSED_ARG(param);
2205 return newSVsv(arg);
2210 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2212 PerlIO * const nexto = PerlIONext(o);
2213 if (PerlIOValid(nexto)) {
2214 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2215 if (tab && tab->Dup)
2216 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2218 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2221 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2225 DEBUG_i(PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2227 (void*)f, (void*)o, (void*)param) );
2229 arg = (*self->Getarg)(aTHX_ o, param, flags);
2230 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2231 if (f && PerlIOBase(o)->flags & PERLIO_F_UTF8)
2232 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2238 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2240 /* Must be called with PL_perlio_mutex locked. */
2242 S_more_refcounted_fds(pTHX_ const int new_fd)
2243 PERL_TSA_REQUIRES(PL_perlio_mutex)
2245 const int old_max = PL_perlio_fd_refcnt_size;
2246 const int new_max = 16 + (new_fd & ~15);
2249 #ifndef PERL_IMPLICIT_SYS
2250 PERL_UNUSED_CONTEXT;
2253 DEBUG_i( PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2254 old_max, new_fd, new_max) );
2256 if (new_fd < old_max) {
2260 assert (new_max > new_fd);
2262 /* Use plain realloc() since we need this memory to be really
2263 * global and visible to all the interpreters and/or threads. */
2264 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2267 MUTEX_UNLOCK(&PL_perlio_mutex);
2271 PL_perlio_fd_refcnt_size = new_max;
2272 PL_perlio_fd_refcnt = new_array;
2274 DEBUG_i( PerlIO_debug("Zeroing %p, %d\n",
2275 (void*)(new_array + old_max),
2276 new_max - old_max) );
2278 Zero(new_array + old_max, new_max - old_max, int);
2285 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2286 PERL_UNUSED_CONTEXT;
2290 PerlIOUnix_refcnt_inc(int fd)
2295 MUTEX_LOCK(&PL_perlio_mutex);
2296 if (fd >= PL_perlio_fd_refcnt_size)
2297 S_more_refcounted_fds(aTHX_ fd);
2299 PL_perlio_fd_refcnt[fd]++;
2300 if (PL_perlio_fd_refcnt[fd] <= 0) {
2301 /* diag_listed_as: refcnt_inc: fd %d%s */
2302 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2303 fd, PL_perlio_fd_refcnt[fd]);
2305 DEBUG_i( PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2306 fd, PL_perlio_fd_refcnt[fd]) );
2308 MUTEX_UNLOCK(&PL_perlio_mutex);
2310 /* diag_listed_as: refcnt_inc: fd %d%s */
2311 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2316 PerlIOUnix_refcnt_dec(int fd)
2323 MUTEX_LOCK(&PL_perlio_mutex);
2324 if (fd >= PL_perlio_fd_refcnt_size) {
2325 /* diag_listed_as: refcnt_dec: fd %d%s */
2326 Perl_croak_nocontext("refcnt_dec: fd %d >= refcnt_size %d\n",
2327 fd, PL_perlio_fd_refcnt_size);
2329 if (PL_perlio_fd_refcnt[fd] <= 0) {
2330 /* diag_listed_as: refcnt_dec: fd %d%s */
2331 Perl_croak_nocontext("refcnt_dec: fd %d: %d <= 0\n",
2332 fd, PL_perlio_fd_refcnt[fd]);
2334 cnt = --PL_perlio_fd_refcnt[fd];
2335 DEBUG_i( PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt) );
2336 MUTEX_UNLOCK(&PL_perlio_mutex);
2338 /* diag_listed_as: refcnt_dec: fd %d%s */
2339 Perl_croak_nocontext("refcnt_dec: fd %d < 0\n", fd);
2345 PerlIOUnix_refcnt(int fd)
2350 MUTEX_LOCK(&PL_perlio_mutex);
2351 if (fd >= PL_perlio_fd_refcnt_size) {
2352 /* diag_listed_as: refcnt: fd %d%s */
2353 Perl_croak(aTHX_ "refcnt: fd %d >= refcnt_size %d\n",
2354 fd, PL_perlio_fd_refcnt_size);
2356 if (PL_perlio_fd_refcnt[fd] <= 0) {
2357 /* diag_listed_as: refcnt: fd %d%s */
2358 Perl_croak(aTHX_ "refcnt: fd %d: %d <= 0\n",
2359 fd, PL_perlio_fd_refcnt[fd]);
2361 cnt = PL_perlio_fd_refcnt[fd];
2362 MUTEX_UNLOCK(&PL_perlio_mutex);
2364 /* diag_listed_as: refcnt: fd %d%s */
2365 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2371 PerlIO_cleanup(pTHX)
2375 DEBUG_i( PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX) );
2377 DEBUG_i( PerlIO_debug("Cleanup layers\n") );
2380 /* Raise STDIN..STDERR refcount so we don't close them */
2381 for (i=0; i < 3; i++)
2382 PerlIOUnix_refcnt_inc(i);
2383 PerlIO_cleantable(aTHX_ &PL_perlio);
2384 /* Restore STDIN..STDERR refcount */
2385 for (i=0; i < 3; i++)
2386 PerlIOUnix_refcnt_dec(i);
2388 if (PL_known_layers) {
2389 PerlIO_list_free(aTHX_ PL_known_layers);
2390 PL_known_layers = NULL;
2392 if (PL_def_layerlist) {
2393 PerlIO_list_free(aTHX_ PL_def_layerlist);
2394 PL_def_layerlist = NULL;
2398 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2401 /* XXX we can't rely on an interpreter being present at this late stage,
2402 XXX so we can't use a function like PerlLIO_write that relies on one
2403 being present (at least in win32) :-(.
2408 /* By now all filehandles should have been closed, so any
2409 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2411 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2412 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2413 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2415 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2416 if (PL_perlio_fd_refcnt[i]) {
2418 my_snprintf(buf, sizeof(buf),
2419 "PerlIO_teardown: fd %d refcnt=%d\n",
2420 i, PL_perlio_fd_refcnt[i]);
2421 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2427 /* Not bothering with PL_perlio_mutex since by now
2428 * all the interpreters are gone. */
2429 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2430 && PL_perlio_fd_refcnt) {
2431 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2432 PL_perlio_fd_refcnt = NULL;
2433 PL_perlio_fd_refcnt_size = 0;
2437 /*--------------------------------------------------------------------------------------*/
2439 * Bottom-most level for UNIX-like case
2443 struct _PerlIO base; /* The generic part */
2444 int fd; /* UNIX like file descriptor */
2445 int oflags; /* open/fcntl flags */
2449 S_lockcnt_dec(pTHX_ const void* f)
2451 #ifndef PERL_IMPLICIT_SYS
2452 PERL_UNUSED_CONTEXT;
2454 PerlIO_lockcnt((PerlIO*)f)--;
2458 /* call the signal handler, and if that handler happens to clear
2459 * this handle, free what we can and return true */
2462 S_perlio_async_run(pTHX_ PerlIO* f) {
2464 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2465 PerlIO_lockcnt(f)++;
2467 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) ) {
2471 /* we've just run some perl-level code that could have done
2472 * anything, including closing the file or clearing this layer.
2473 * If so, free any lower layers that have already been
2474 * cleared, then return an error. */
2475 while (PerlIOValid(f) &&
2476 (PerlIOBase(f)->flags & PERLIO_F_CLEARED))
2478 const PerlIOl *l = *f;
2487 PerlIOUnix_oflags(const char *mode)
2490 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2495 if (*++mode == '+') {
2502 oflags = O_CREAT | O_TRUNC;
2503 if (*++mode == '+') {
2512 oflags = O_CREAT | O_APPEND;
2513 if (*++mode == '+') {
2522 /* XXX TODO: PerlIO_open() test that exercises 'rb' and 'rt'. */
2524 /* Unless O_BINARY is different from O_TEXT, first bit-or:ing one
2525 * of them in, and then bit-and-masking the other them away, won't
2526 * have much of an effect. */
2529 #if O_TEXT != O_BINARY
2536 #if O_TEXT != O_BINARY
2538 oflags &= ~O_BINARY;
2544 /* bit-or:ing with zero O_BINARY would be useless. */
2546 * If neither "t" nor "b" was specified, open the file
2549 * Note that if something else than the zero byte was seen
2550 * here (e.g. bogus mode "rx"), just few lines later we will
2551 * set the errno and invalidate the flags.
2557 if (*mode || oflags == -1) {
2558 SETERRNO(EINVAL, LIB_INVARG);
2565 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2567 PERL_UNUSED_CONTEXT;
2568 return PerlIOSelf(f, PerlIOUnix)->fd;
2572 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2574 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2577 if (PerlLIO_fstat(fd, &st) == 0) {
2578 if (!S_ISREG(st.st_mode)) {
2579 DEBUG_i( PerlIO_debug("%d is not regular file\n",fd) );
2580 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2583 DEBUG_i( PerlIO_debug("%d _is_ a regular file\n",fd) );
2589 PerlIOUnix_refcnt_inc(fd);
2590 PERL_UNUSED_CONTEXT;
2594 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2596 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2597 if (*PerlIONext(f)) {
2598 /* We never call down so do any pending stuff now */
2599 PerlIO_flush(PerlIONext(f));
2601 * XXX could (or should) we retrieve the oflags from the open file
2602 * handle rather than believing the "mode" we are passed in? XXX
2603 * Should the value on NULL mode be 0 or -1?
2605 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2606 mode ? PerlIOUnix_oflags(mode) : -1);
2608 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2614 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2616 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2618 PERL_UNUSED_CONTEXT;
2619 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2621 SETERRNO(ESPIPE, LIB_INVARG);
2623 SETERRNO(EINVAL, LIB_INVARG);
2627 new_loc = PerlLIO_lseek(fd, offset, whence);
2628 if (new_loc == (Off_t) - 1)
2630 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2635 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2636 IV n, const char *mode, int fd, int imode,
2637 int perm, PerlIO *f, int narg, SV **args)
2639 bool known_cloexec = 0;
2640 if (PerlIOValid(f)) {
2641 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2642 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2645 if (*mode == IoTYPE_NUMERIC)
2648 imode = PerlIOUnix_oflags(mode);
2650 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2657 const char *path = SvPV_const(*args, len);
2658 if (!IS_SAFE_PATHNAME(path, len, "open"))
2660 fd = PerlLIO_open3_cloexec(path, imode, perm);
2666 setfd_inhexec_for_sysfd(fd);
2668 setfd_cloexec_or_inhexec_by_sysfdness(fd);
2669 if (*mode == IoTYPE_IMPLICIT)
2672 f = PerlIO_allocate(aTHX);
2674 if (!PerlIOValid(f)) {
2675 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2680 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2681 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2682 if (*mode == IoTYPE_APPEND)
2683 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2690 * FIXME: pop layers ???
2698 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2700 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2702 if (flags & PERLIO_DUP_FD) {
2703 fd = PerlLIO_dup_cloexec(fd);
2705 setfd_inhexec_for_sysfd(fd);
2708 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2710 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2711 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2721 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2724 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2726 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2727 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2728 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2732 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2733 if (len >= 0 || errno != EINTR) {
2735 if (errno != EAGAIN) {
2736 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2737 PerlIO_save_errno(f);
2740 else if (len == 0 && count != 0) {
2741 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2747 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2750 NOT_REACHED; /*NOTREACHED*/
2754 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2757 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2759 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2761 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2762 if (len >= 0 || errno != EINTR) {
2764 if (errno != EAGAIN) {
2765 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2766 PerlIO_save_errno(f);
2772 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2775 NOT_REACHED; /*NOTREACHED*/
2779 PerlIOUnix_tell(pTHX_ PerlIO *f)
2781 PERL_UNUSED_CONTEXT;
2783 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2788 PerlIOUnix_close(pTHX_ PerlIO *f)
2790 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2792 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2793 code = PerlIOBase_close(aTHX_ f);
2794 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2795 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2800 SETERRNO(EBADF,SS_IVCHAN);
2803 while (PerlLIO_close(fd) != 0) {
2804 if (errno != EINTR) {
2809 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2813 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2818 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2819 sizeof(PerlIO_funcs),
2826 PerlIOBase_binmode, /* binmode */
2836 PerlIOBase_noop_ok, /* flush */
2837 PerlIOBase_noop_fail, /* fill */
2840 PerlIOBase_clearerr,
2841 PerlIOBase_setlinebuf,
2842 NULL, /* get_base */
2843 NULL, /* get_bufsiz */
2846 NULL, /* set_ptrcnt */
2849 /*--------------------------------------------------------------------------------------*/
2854 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2855 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2856 broken by the last second glibc 2.3 fix
2858 # define STDIO_BUFFER_WRITABLE
2863 struct _PerlIO base;
2864 FILE *stdio; /* The stream */
2868 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2870 PERL_UNUSED_CONTEXT;
2872 if (PerlIOValid(f)) {
2873 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2875 return PerlSIO_fileno(s);
2882 PerlIOStdio_mode(const char *mode, char *tmode)
2884 char * const ret = tmode;
2890 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2898 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2901 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2902 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2903 if (toptab == tab) {
2904 /* Top is already stdio - pop self (duplicate) and use original */
2905 PerlIO_pop(aTHX_ f);
2908 const int fd = PerlIO_fileno(n);
2911 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2912 mode = PerlIOStdio_mode(mode, tmode)))) {
2913 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2914 /* We never call down so do any pending stuff now */
2915 PerlIO_flush(PerlIONext(f));
2916 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2923 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2928 PerlIO_importFILE(FILE *stdio, const char *mode)
2934 char filename[FILENAME_MAX];
2939 int fd0 = fileno(stdio);
2942 rc = fldata(stdio,filename,&fileinfo);
2946 if(fileinfo.__dsorgHFS){
2949 /*This MVS dataset , OK!*/
2954 if (!mode || !*mode) {
2955 /* We need to probe to see how we can open the stream
2956 so start with read/write and then try write and read
2957 we dup() so that we can fclose without loosing the fd.
2959 Note that the errno value set by a failing fdopen
2960 varies between stdio implementations.
2962 const int fd = PerlLIO_dup_cloexec(fd0);
2967 f2 = PerlSIO_fdopen(fd, (mode = "r+"));
2969 f2 = PerlSIO_fdopen(fd, (mode = "w"));
2972 f2 = PerlSIO_fdopen(fd, (mode = "r"));
2975 /* Don't seem to be able to open */
2981 if ((f = PerlIO_push(aTHX_(PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
2982 s = PerlIOSelf(f, PerlIOStdio);
2984 fd0 = fileno(stdio);
2986 PerlIOUnix_refcnt_inc(fd0);
2987 setfd_cloexec_or_inhexec_by_sysfdness(fd0);
2991 rc = fldata(stdio,filename,&fileinfo);
2993 PerlIOUnix_refcnt_inc(fd0);
2995 if(fileinfo.__dsorgHFS){
2996 PerlIOUnix_refcnt_inc(fd0);
2998 /*This MVS dataset , OK!*/
3007 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3008 IV n, const char *mode, int fd, int imode,
3009 int perm, PerlIO *f, int narg, SV **args)
3012 if (PerlIOValid(f)) {
3014 const char * const path = SvPV_const(*args, len);
3015 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3017 if (!IS_SAFE_PATHNAME(path, len, "open"))
3019 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3020 stdio = PerlSIO_freopen(path, PerlIOStdio_mode(mode, tmode),
3026 PerlIOUnix_refcnt_inc(fd);
3027 setfd_cloexec_or_inhexec_by_sysfdness(fd);
3033 const char * const path = SvPV_const(*args, len);
3034 if (!IS_SAFE_PATHNAME(path, len, "open"))
3036 if (*mode == IoTYPE_NUMERIC) {
3038 fd = PerlLIO_open3_cloexec(path, imode, perm);
3042 bool appended = FALSE;
3044 /* Cygwin wants its 'b' early. */
3046 mode = PerlIOStdio_mode(mode, tmode);
3048 stdio = PerlSIO_fopen(path, mode);
3051 f = PerlIO_allocate(aTHX);
3054 mode = PerlIOStdio_mode(mode, tmode);
3055 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3057 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3059 PerlIOUnix_refcnt_inc(fd);
3060 setfd_cloexec_or_inhexec_by_sysfdness(fd);
3062 PerlSIO_fclose(stdio);
3074 if (*mode == IoTYPE_IMPLICIT) {
3081 stdio = PerlSIO_stdin;
3084 stdio = PerlSIO_stdout;
3087 stdio = PerlSIO_stderr;
3092 stdio = PerlSIO_fdopen(fd, mode =
3093 PerlIOStdio_mode(mode, tmode));
3097 f = PerlIO_allocate(aTHX);
3099 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3100 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3102 PerlIOUnix_refcnt_inc(fd);
3103 setfd_cloexec_or_inhexec_by_sysfdness(fd);
3114 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3116 /* This assumes no layers underneath - which is what
3117 happens, but is not how I remember it. NI-S 2001/10/16
3119 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3120 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3121 const int fd = fileno(stdio);
3123 if (flags & PERLIO_DUP_FD) {
3124 const int dfd = PerlLIO_dup_cloexec(fileno(stdio));
3126 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3131 /* FIXME: To avoid messy error recovery if dup fails
3132 re-use the existing stdio as though flag was not set
3136 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3138 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3140 int fd = fileno(stdio);
3141 PerlIOUnix_refcnt_inc(fd);
3142 setfd_cloexec_or_inhexec_by_sysfdness(fd);
3149 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3151 PERL_UNUSED_CONTEXT;
3153 /* XXX this could use PerlIO_canset_fileno() and
3154 * PerlIO_set_fileno() support from Configure
3156 #if defined(HAS_FDCLOSE)
3157 return fdclose(f, NULL) == 0 ? 1 : 0;
3158 #elif defined(__UCLIBC__)
3159 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3162 #elif defined(__GLIBC__)
3163 /* There may be a better way for GLIBC:
3164 - libio.h defines a flag to not close() on cleanup
3168 #elif defined(__sun)
3171 #elif defined(__hpux)
3175 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3176 your platform does not have special entry try this one.
3177 [For OSF only have confirmation for Tru64 (alpha)
3178 but assume other OSFs will be similar.]
3180 #elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3183 #elif defined(__FreeBSD__)
3184 /* There may be a better way on FreeBSD:
3185 - we could insert a dummy func in the _close function entry
3186 f->_close = (int (*)(void *)) dummy_close;
3190 #elif defined(__OpenBSD__)
3191 /* There may be a better way on OpenBSD:
3192 - we could insert a dummy func in the _close function entry
3193 f->_close = (int (*)(void *)) dummy_close;
3197 #elif defined(__EMX__)
3198 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3201 #elif defined(__CYGWIN__)
3202 /* There may be a better way on CYGWIN:
3203 - we could insert a dummy func in the _close function entry
3204 f->_close = (int (*)(void *)) dummy_close;
3208 #elif defined(WIN32)
3209 PERLIO_FILE_file(f) = -1;
3213 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3214 (which isn't thread safe) instead
3216 # error "Don't know how to set FILE.fileno on your platform"
3224 PerlIOStdio_close(pTHX_ PerlIO *f)
3226 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3232 const int fd = fileno(stdio);
3237 #ifdef SOCKS5_VERSION_NAME
3238 /* Socks lib overrides close() but stdio isn't linked to
3239 that library (though we are) - so we must call close()
3240 on sockets on stdio's behalf.
3243 Sock_size_t optlen = sizeof(int);
3244 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3247 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3248 that a subsequent fileno() on it returns -1. Don't want to croak()
3249 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3250 trying to close an already closed handle which somehow it still has
3251 a reference to. (via.xs, I'm looking at you). */
3252 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3253 /* File descriptor still in use */
3257 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3258 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3260 if (stdio == stdout || stdio == stderr)
3261 return PerlIO_flush(f);
3263 MUTEX_LOCK(&PL_perlio_mutex);
3264 /* Right. We need a mutex here because for a brief while we
3265 will have the situation that fd is actually closed. Hence if
3266 a second thread were to get into this block, its dup() would
3267 likely return our fd as its dupfd. (after all, it is closed)
3268 Then if we get to the dup2() first, we blat the fd back
3269 (messing up its temporary as a side effect) only for it to
3270 then close its dupfd (== our fd) in its close(dupfd) */
3272 /* There is, of course, a race condition, that any other thread
3273 trying to input/output/whatever on this fd will be stuffed
3274 for the duration of this little manoeuvrer. Perhaps we
3275 should hold an IO mutex for the duration of every IO
3276 operation if we know that invalidate doesn't work on this
3277 platform, but that would suck, and could kill performance.
3279 Except that correctness trumps speed.
3280 Advice from klortho #11912. */
3282 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3283 Use Sarathy's trick from maint-5.6 to invalidate the
3284 fileno slot of the FILE *
3286 result = PerlIO_flush(f);
3288 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3290 dupfd = PerlLIO_dup_cloexec(fd);
3293 /* Oh cXap. This isn't going to go well. Not sure if we can
3294 recover from here, or if closing this particular FILE *
3295 is a good idea now. */
3300 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3302 result = PerlSIO_fclose(stdio);
3303 /* We treat error from stdio as success if we invalidated
3304 errno may NOT be expected EBADF
3306 if (invalidate && result != 0) {
3310 #ifdef SOCKS5_VERSION_NAME
3311 /* in SOCKS' case, let close() determine return value */
3315 PerlLIO_dup2_cloexec(dupfd, fd);
3316 setfd_inhexec_for_sysfd(fd);
3317 PerlLIO_close(dupfd);
3319 MUTEX_UNLOCK(&PL_perlio_mutex);
3325 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3329 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3331 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3334 STDCHAR *buf = (STDCHAR *) vbuf;
3336 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3337 * stdio does not do that for fread()
3339 const int ch = PerlSIO_fgetc(s);
3346 got = PerlSIO_fread(vbuf, 1, count, s);
3347 if (got == 0 && PerlSIO_ferror(s))
3349 if (got >= 0 || errno != EINTR)
3351 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3353 SETERRNO(0,0); /* just in case */
3356 /* Under some circumstances IRIX stdio fgetc() and fread()
3357 * set the errno to ENOENT, which makes no sense according
3358 * to either IRIX or POSIX. [rt.perl.org #123977] */
3359 if (errno == ENOENT) SETERRNO(0,0);
3365 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3368 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3370 #ifdef STDIO_BUFFER_WRITABLE
3371 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3372 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3373 STDCHAR *base = PerlIO_get_base(f);
3374 SSize_t cnt = PerlIO_get_cnt(f);
3375 STDCHAR *ptr = PerlIO_get_ptr(f);
3376 SSize_t avail = ptr - base;
3378 if (avail > count) {
3382 Move(buf-avail,ptr,avail,STDCHAR);
3385 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3386 if (PerlSIO_feof(s) && unread >= 0)
3387 PerlSIO_clearerr(s);
3392 if (PerlIO_has_cntptr(f)) {
3393 /* We can get pointer to buffer but not its base
3394 Do ungetc() but check chars are ending up in the
3397 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3398 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3400 const int ch = (U8) *--buf;
3401 if (ungetc(ch,s) != ch) {
3402 /* ungetc did not work */
3405 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || (((U8) *eptr) != ch)) {
3406 /* Did not change pointer as expected */
3407 if (fgetc(s) != EOF) /* get char back again */
3417 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3423 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3426 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3429 got = PerlSIO_fwrite(vbuf, 1, count,
3430 PerlIOSelf(f, PerlIOStdio)->stdio);
3431 if (got >= 0 || errno != EINTR)
3433 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3435 SETERRNO(0,0); /* just in case */
3441 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3443 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3444 PERL_UNUSED_CONTEXT;
3446 return PerlSIO_fseek(stdio, offset, whence);
3450 PerlIOStdio_tell(pTHX_ PerlIO *f)
3452 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3453 PERL_UNUSED_CONTEXT;
3455 return PerlSIO_ftell(stdio);
3459 PerlIOStdio_flush(pTHX_ PerlIO *f)
3461 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3462 PERL_UNUSED_CONTEXT;
3464 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3465 return PerlSIO_fflush(stdio);
3471 * FIXME: This discards ungetc() and pre-read stuff which is not
3472 * right if this is just a "sync" from a layer above Suspect right
3473 * design is to do _this_ but not have layer above flush this
3474 * layer read-to-read
3477 * Not writeable - sync by attempting a seek
3480 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3488 PerlIOStdio_eof(pTHX_ PerlIO *f)
3490 PERL_UNUSED_CONTEXT;
3492 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3496 PerlIOStdio_error(pTHX_ PerlIO *f)
3498 PERL_UNUSED_CONTEXT;
3500 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3504 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3506 PERL_UNUSED_CONTEXT;
3508 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3512 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3514 PERL_UNUSED_CONTEXT;
3516 #ifdef HAS_SETLINEBUF
3517 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3519 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3525 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3527 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3528 PERL_UNUSED_CONTEXT;
3529 return (STDCHAR*)PerlSIO_get_base(stdio);
3533 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3535 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3536 PERL_UNUSED_CONTEXT;
3537 return PerlSIO_get_bufsiz(stdio);
3541 #ifdef USE_STDIO_PTR
3543 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3545 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3546 PERL_UNUSED_CONTEXT;
3547 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3551 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3553 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3554 PERL_UNUSED_CONTEXT;
3555 return PerlSIO_get_cnt(stdio);
3559 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3561 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3562 PERL_UNUSED_CONTEXT;
3564 # ifdef STDIO_PTR_LVALUE
3565 /* This is a long-standing infamous mess. The root of the
3566 * problem is that one cannot know the signedness of char, and
3567 * more precisely the signedness of FILE._ptr. The following
3568 * things have been tried, and they have all failed (across
3569 * different compilers (remember that core needs to to build
3570 * also with c++) and compiler options:
3572 * - casting the RHS to (void*) -- works in *some* places
3573 * - casting the LHS to (void*) -- totally unportable
3575 * So let's try silencing the warning at least for gcc. */
3576 GCC_DIAG_IGNORE_STMT(-Wpointer-sign);
3577 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3578 GCC_DIAG_RESTORE_STMT;
3579 # ifdef STDIO_PTR_LVAL_SETS_CNT
3580 assert(PerlSIO_get_cnt(stdio) == (cnt));
3582 # if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3584 * Setting ptr _does_ change cnt - we are done
3588 # else /* STDIO_PTR_LVALUE */
3590 # endif /* STDIO_PTR_LVALUE */
3593 * Now (or only) set cnt
3595 # ifdef STDIO_CNT_LVALUE
3596 PerlSIO_set_cnt(stdio, cnt);
3597 # elif (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3598 PerlSIO_set_ptr(stdio,
3599 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3601 # else /* STDIO_PTR_LVAL_SETS_CNT */
3603 # endif /* STDIO_CNT_LVALUE */
3610 PerlIOStdio_fill(pTHX_ PerlIO *f)
3614 PERL_UNUSED_CONTEXT;
3615 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3617 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3620 * fflush()ing read-only streams can cause trouble on some stdio-s
3622 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3623 if (PerlSIO_fflush(stdio) != 0)
3627 c = PerlSIO_fgetc(stdio);
3630 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3632 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3637 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3639 # ifdef STDIO_BUFFER_WRITABLE
3640 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3641 /* Fake ungetc() to the real buffer in case system's ungetc
3644 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3645 SSize_t cnt = PerlSIO_get_cnt(stdio);
3646 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3647 if (ptr == base+1) {
3648 *--ptr = (STDCHAR) c;
3649 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3650 if (PerlSIO_feof(stdio))
3651 PerlSIO_clearerr(stdio);
3657 if (PerlIO_has_cntptr(f)) {
3659 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3665 /* If buffer snoop scheme above fails fall back to
3668 if (PerlSIO_ungetc(c, stdio) != c)
3676 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3677 sizeof(PerlIO_funcs),
3679 sizeof(PerlIOStdio),
3680 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3684 PerlIOBase_binmode, /* binmode */
3698 PerlIOStdio_clearerr,
3699 PerlIOStdio_setlinebuf,
3701 PerlIOStdio_get_base,
3702 PerlIOStdio_get_bufsiz,
3707 #ifdef USE_STDIO_PTR
3708 PerlIOStdio_get_ptr,
3709 PerlIOStdio_get_cnt,
3710 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3711 PerlIOStdio_set_ptrcnt,
3714 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3719 #endif /* USE_STDIO_PTR */
3722 /* Note that calls to PerlIO_exportFILE() are reversed using
3723 * PerlIO_releaseFILE(), not importFILE. */
3725 PerlIO_exportFILE(PerlIO * f, const char *mode)
3729 if (PerlIOValid(f)) {
3731 int fd = PerlIO_fileno(f);
3736 if (!mode || !*mode) {
3737 mode = PerlIO_modestr(f, buf);
3739 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3743 /* De-link any lower layers so new :stdio sticks */
3745 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3746 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3748 PerlIOUnix_refcnt_inc(fileno(stdio));
3749 /* Link previous lower layers under new one */
3753 /* restore layers list */
3763 PerlIO_findFILE(PerlIO *f)
3768 if (l->tab == &PerlIO_stdio) {
3769 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3772 l = *PerlIONext(&l);
3774 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3775 /* However, we're not really exporting a FILE * to someone else (who
3776 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3777 So we need to undo its reference count increase on the underlying file
3778 descriptor. We have to do this, because if the loop above returns you
3779 the FILE *, then *it* didn't increase any reference count. So there's
3780 only one way to be consistent. */
3781 stdio = PerlIO_exportFILE(f, NULL);
3783 const int fd = fileno(stdio);
3785 PerlIOUnix_refcnt_dec(fd);
3790 /* Use this to reverse PerlIO_exportFILE calls. */
3792 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3796 if (l->tab == &PerlIO_stdio) {
3797 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3798 if (s->stdio == f) { /* not in a loop */
3799 const int fd = fileno(f);
3801 PerlIOUnix_refcnt_dec(fd);
3804 PerlIO_pop(aTHX_ p);
3814 /*--------------------------------------------------------------------------------------*/
3816 * perlio buffer layer
3820 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3822 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3823 const int fd = PerlIO_fileno(f);
3824 if (fd >= 0 && PerlLIO_isatty(fd)) {
3825 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3827 if (*PerlIONext(f)) {
3828 const Off_t posn = PerlIO_tell(PerlIONext(f));
3829 if (posn != (Off_t) - 1) {
3833 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3837 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3838 IV n, const char *mode, int fd, int imode, int perm,
3839 PerlIO *f, int narg, SV **args)
3841 if (PerlIOValid(f)) {
3842 PerlIO *next = PerlIONext(f);
3844 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3845 if (tab && tab->Open)
3847 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3849 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3854 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3856 if (*mode == IoTYPE_IMPLICIT) {
3862 if (tab && tab->Open)
3863 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3866 SETERRNO(EINVAL, LIB_INVARG);
3868 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3870 * if push fails during open, open fails. close will pop us.
3875 fd = PerlIO_fileno(f);
3876 if (init && fd == 2) {
3878 * Initial stderr is unbuffered
3880 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3882 #ifdef PERLIO_USING_CRLF
3883 # ifdef PERLIO_IS_BINMODE_FD
3884 if (PERLIO_IS_BINMODE_FD(fd))
3885 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3889 * do something about failing setmode()? --jhi
3891 PerlLIO_setmode(fd, O_BINARY);
3894 /* Enable line buffering with record-oriented regular files
3895 * so we don't introduce an extraneous record boundary when
3896 * the buffer fills up.
3898 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3900 if (PerlLIO_fstat(fd, &st) == 0
3901 && S_ISREG(st.st_mode)
3902 && (st.st_fab_rfm == FAB$C_VAR
3903 || st.st_fab_rfm == FAB$C_VFC)) {
3904 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
3915 * This "flush" is akin to sfio's sync in that it handles files in either
3916 * read or write state. For write state, we put the postponed data through
3917 * the next layers. For read state, we seek() the next layers to the
3918 * offset given by current position in the buffer, and discard the buffer
3919 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3920 * in any case?). Then the pass the stick further in chain.
3923 PerlIOBuf_flush(pTHX_ PerlIO *f)
3925 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3927 PerlIO *n = PerlIONext(f);
3928 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3930 * write() the buffer
3932 const STDCHAR *buf = b->buf;
3933 const STDCHAR *p = buf;
3934 while (p < b->ptr) {
3935 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3939 else if (count < 0 || PerlIO_error(n)) {
3940 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3941 PerlIO_save_errno(f);
3946 b->posn += (p - buf);
3948 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3949 STDCHAR *buf = PerlIO_get_base(f);
3951 * Note position change
3953 b->posn += (b->ptr - buf);
3954 if (b->ptr < b->end) {
3955 /* We did not consume all of it - try and seek downstream to
3956 our logical position
3958 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3959 /* Reload n as some layers may pop themselves on seek */
3960 b->posn = PerlIO_tell(n = PerlIONext(f));
3963 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3964 data is lost for good - so return saying "ok" having undone
3967 b->posn -= (b->ptr - buf);
3972 b->ptr = b->end = b->buf;
3973 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3974 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3975 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3980 /* This discards the content of the buffer after b->ptr, and rereads
3981 * the buffer from the position off in the layer downstream; here off
3982 * is at offset corresponding to b->ptr - b->buf.
3985 PerlIOBuf_fill(pTHX_ PerlIO *f)
3987 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3988 PerlIO *n = PerlIONext(f);
3991 * Down-stream flush is defined not to loose read data so is harmless.
3992 * we would not normally be fill'ing if there was data left in anycase.
3994 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
3996 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
3997 PerlIOBase_flush_linebuf(aTHX);
4000 PerlIO_get_base(f); /* allocate via vtable */
4002 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
4004 b->ptr = b->end = b->buf;
4006 if (!PerlIOValid(n)) {
4007 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4011 if (PerlIO_fast_gets(n)) {
4013 * Layer below is also buffered. We do _NOT_ want to call its
4014 * ->Read() because that will loop till it gets what we asked for
4015 * which may hang on a pipe etc. Instead take anything it has to
4016 * hand, or ask it to fill _once_.
4018 avail = PerlIO_get_cnt(n);
4020 avail = PerlIO_fill(n);
4022 avail = PerlIO_get_cnt(n);
4024 if (!PerlIO_error(n) && PerlIO_eof(n))
4029 STDCHAR *ptr = PerlIO_get_ptr(n);
4030 const SSize_t cnt = avail;
4031 if (avail > (SSize_t)b->bufsiz)
4033 Copy(ptr, b->buf, avail, STDCHAR);
4034 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4038 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4042 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4045 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4046 PerlIO_save_errno(f);
4050 b->end = b->buf + avail;
4051 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4056 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4058 if (PerlIOValid(f)) {
4059 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4062 return PerlIOBase_read(aTHX_ f, vbuf, count);
4068 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4070 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4071 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4074 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4079 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4081 * Buffer is already a read buffer, we can overwrite any chars
4082 * which have been read back to buffer start
4084 avail = (b->ptr - b->buf);
4088 * Buffer is idle, set it up so whole buffer is available for
4092 b->end = b->buf + avail;
4094 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4096 * Buffer extends _back_ from where we are now
4098 b->posn -= b->bufsiz;
4100 if ((SSize_t) count >= 0 && avail > (SSize_t) count) {
4102 * If we have space for more than count, just move count
4110 * In simple stdio-like ungetc() case chars will be already
4113 if (buf != b->ptr) {
4114 Copy(buf, b->ptr, avail, STDCHAR);
4118 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4122 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4128 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4130 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4131 const STDCHAR *buf = (const STDCHAR *) vbuf;
4132 const STDCHAR *flushptr = buf;
4136 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4138 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4139 if (PerlIO_flush(f) != 0) {
4143 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4144 flushptr = buf + count;
4145 while (flushptr > buf && *(flushptr - 1) != '\n')
4149 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4150 if ((SSize_t) count >= 0 && (SSize_t) count < avail)
4152 if (flushptr > buf && flushptr <= buf + avail)
4153 avail = flushptr - buf;
4154 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4156 Copy(buf, b->ptr, avail, STDCHAR);
4161 if (buf == flushptr)
4164 if (b->ptr >= (b->buf + b->bufsiz))
4165 if (PerlIO_flush(f) == -1)
4168 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4174 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4177 if ((code = PerlIO_flush(f)) == 0) {
4178 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4179 code = PerlIO_seek(PerlIONext(f), offset, whence);
4181 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4182 b->posn = PerlIO_tell(PerlIONext(f));
4189 PerlIOBuf_tell(pTHX_ PerlIO *f)
4191 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4193 * b->posn is file position where b->buf was read, or will be written
4195 Off_t posn = b->posn;
4196 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4197 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4199 /* As O_APPEND files are normally shared in some sense it is better
4204 /* when file is NOT shared then this is sufficient */
4205 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4207 posn = b->posn = PerlIO_tell(PerlIONext(f));
4211 * If buffer is valid adjust position by amount in buffer
4213 posn += (b->ptr - b->buf);
4219 PerlIOBuf_popped(pTHX_ PerlIO *f)
4221 const IV code = PerlIOBase_popped(aTHX_ f);
4222 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4223 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4226 b->ptr = b->end = b->buf = NULL;
4227 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4232 PerlIOBuf_close(pTHX_ PerlIO *f)
4234 const IV code = PerlIOBase_close(aTHX_ f);
4235 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4236 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4239 b->ptr = b->end = b->buf = NULL;
4240 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4245 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4247 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4254 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4256 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4259 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4260 return (b->end - b->ptr);
4265 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4267 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4268 PERL_UNUSED_CONTEXT;
4272 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4273 Newx(b->buf,b->bufsiz, STDCHAR);
4275 b->buf = (STDCHAR *) & b->oneword;
4276 b->bufsiz = sizeof(b->oneword);
4278 b->end = b->ptr = b->buf;
4284 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4286 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4289 return (b->end - b->buf);
4293 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4295 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4297 PERL_UNUSED_ARG(cnt);
4302 assert(PerlIO_get_cnt(f) == cnt);
4303 assert(b->ptr >= b->buf);
4304 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4308 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4310 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4315 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4316 sizeof(PerlIO_funcs),
4319 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4323 PerlIOBase_binmode, /* binmode */
4337 PerlIOBase_clearerr,
4338 PerlIOBase_setlinebuf,
4343 PerlIOBuf_set_ptrcnt,
4346 /*--------------------------------------------------------------------------------------*/
4348 * Temp layer to hold unread chars when cannot do it any other way
4352 PerlIOPending_fill(pTHX_ PerlIO *f)
4355 * Should never happen
4362 PerlIOPending_close(pTHX_ PerlIO *f)
4365 * A tad tricky - flush pops us, then we close new top
4368 return PerlIO_close(f);
4372 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4375 * A tad tricky - flush pops us, then we seek new top
4378 return PerlIO_seek(f, offset, whence);
4383 PerlIOPending_flush(pTHX_ PerlIO *f)
4385 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4386 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4390 PerlIO_pop(aTHX_ f);
4395 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4401 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4406 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4408 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4409 PerlIOl * const l = PerlIOBase(f);
4411 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4412 * etc. get muddled when it changes mid-string when we auto-pop.
4414 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4415 (PerlIOBase(PerlIONext(f))->
4416 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4421 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4423 SSize_t avail = PerlIO_get_cnt(f);
4425 if ((SSize_t) count >= 0 && (SSize_t)count < avail)
4428 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4429 if (got >= 0 && got < (SSize_t)count) {
4430 const SSize_t more =
4431 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4432 if (more >= 0 || got == 0)
4438 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4439 sizeof(PerlIO_funcs),
4442 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4443 PerlIOPending_pushed,
4446 PerlIOBase_binmode, /* binmode */
4455 PerlIOPending_close,
4456 PerlIOPending_flush,
4460 PerlIOBase_clearerr,
4461 PerlIOBase_setlinebuf,
4466 PerlIOPending_set_ptrcnt,
4471 /*--------------------------------------------------------------------------------------*/
4473 * crlf - translation On read translate CR,LF to "\n" we do this by
4474 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4475 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4477 * c->nl points on the first byte of CR LF pair when it is temporarily
4478 * replaced by LF, or to the last CR of the buffer. In the former case
4479 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4480 * that it ends at c->nl; these two cases can be distinguished by
4481 * *c->nl. c->nl is set during _getcnt() call, and unset during
4482 * _unread() and _flush() calls.
4483 * It only matters for read operations.
4487 PerlIOBuf base; /* PerlIOBuf stuff */
4488 STDCHAR *nl; /* Position of crlf we "lied" about in the
4492 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4493 * Otherwise the :crlf layer would always revert back to
4497 S_inherit_utf8_flag(PerlIO *f)
4499 PerlIO *g = PerlIONext(f);
4500 if (PerlIOValid(g)) {
4501 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4502 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4508 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4511 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4512 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4515 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4516 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4517 PerlIOBase(f)->flags);
4521 /* If the old top layer is a CRLF layer, reactivate it (if
4522 * necessary) and remove this new layer from the stack */
4523 PerlIO *g = PerlIONext(f);
4524 if (PerlIOValid(g)) {
4525 PerlIOl *b = PerlIOBase(g);
4526 if (b && b->tab == &PerlIO_crlf) {
4527 if (!(b->flags & PERLIO_F_CRLF))
4528 b->flags |= PERLIO_F_CRLF;
4529 S_inherit_utf8_flag(g);
4530 PerlIO_pop(aTHX_ f);
4535 S_inherit_utf8_flag(f);
4541 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4543 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4544 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4545 *(c->nl) = NATIVE_0xd;
4548 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4549 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4551 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4552 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4554 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4559 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4560 b->end = b->ptr = b->buf + b->bufsiz;
4561 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4562 b->posn -= b->bufsiz;
4564 while (count > 0 && b->ptr > b->buf) {
4565 const int ch = *--buf;
4567 if (b->ptr - 2 >= b->buf) {
4568 *--(b->ptr) = NATIVE_0xa;
4569 *--(b->ptr) = NATIVE_0xd;
4574 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4575 *--(b->ptr) = NATIVE_0xa; /* Works even if 0xa ==
4589 unread += PerlIOBase_unread(aTHX_ f, (const STDCHAR *) vbuf + unread, count);
4594 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4596 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4598 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4601 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4602 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4603 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == NATIVE_0xd)) {
4604 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4606 while (nl < b->end && *nl != NATIVE_0xd)
4608 if (nl < b->end && *nl == NATIVE_0xd) {
4610 if (nl + 1 < b->end) {
4611 if (nl[1] == NATIVE_0xa) {
4617 * Not CR,LF but just CR
4625 * Blast - found CR as last char in buffer
4630 * They may not care, defer work as long as
4634 return (nl - b->ptr);
4638 b->ptr++; /* say we have read it as far as
4639 * flush() is concerned */
4640 b->buf++; /* Leave space in front of buffer */
4641 /* Note as we have moved buf up flush's
4643 will naturally make posn point at CR
4645 b->bufsiz--; /* Buffer is thus smaller */
4646 code = PerlIO_fill(f); /* Fetch some more */
4647 b->bufsiz++; /* Restore size for next time */
4648 b->buf--; /* Point at space */
4649 b->ptr = nl = b->buf; /* Which is what we hand
4651 *nl = NATIVE_0xd; /* Fill in the CR */
4653 goto test; /* fill() call worked */
4655 * CR at EOF - just fall through
4657 /* Should we clear EOF though ??? */
4662 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4668 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4670 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4671 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4677 if (ptr == b->end && *c->nl == NATIVE_0xd) {
4678 /* Deferred CR at end of buffer case - we lied about count */
4691 * Test code - delete when it works ...
4693 IV flags = PerlIOBase(f)->flags;
4694 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4695 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == NATIVE_0xd) {
4696 /* Deferred CR at end of buffer case - we lied about count */
4702 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4703 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4704 flags, c->nl, b->end, cnt);
4711 * They have taken what we lied about
4713 *(c->nl) = NATIVE_0xd;
4719 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4723 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4725 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4726 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4728 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4729 const STDCHAR *buf = (const STDCHAR *) vbuf;
4730 const STDCHAR * const ebuf = buf + count;
4733 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4735 while (buf < ebuf) {
4736 const STDCHAR * const eptr = b->buf + b->bufsiz;
4737 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4738 while (buf < ebuf && b->ptr < eptr) {
4740 if ((b->ptr + 2) > eptr) {
4748 *(b->ptr)++ = NATIVE_0xd; /* CR */
4749 *(b->ptr)++ = NATIVE_0xa; /* LF */
4751 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4758 *(b->ptr)++ = *buf++;
4760 if (b->ptr >= eptr) {
4766 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4768 return (buf - (STDCHAR *) vbuf);
4773 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4775 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4777 *(c->nl) = NATIVE_0xd;
4780 return PerlIOBuf_flush(aTHX_ f);
4784 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4786 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4787 /* In text mode - flush any pending stuff and flip it */
4788 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4789 #ifndef PERLIO_USING_CRLF
4790 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4791 PerlIO_pop(aTHX_ f);
4794 return PerlIOBase_binmode(aTHX_ f);
4797 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4798 sizeof(PerlIO_funcs),
4801 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4803 PerlIOBuf_popped, /* popped */
4805 PerlIOCrlf_binmode, /* binmode */
4809 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4810 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4811 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4819 PerlIOBase_clearerr,
4820 PerlIOBase_setlinebuf,
4825 PerlIOCrlf_set_ptrcnt,
4829 Perl_PerlIO_stdin(pTHX)
4832 PerlIO_stdstreams(aTHX);
4834 return (PerlIO*)&PL_perlio[1];
4838 Perl_PerlIO_stdout(pTHX)
4841 PerlIO_stdstreams(aTHX);
4843 return (PerlIO*)&PL_perlio[2];
4847 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 = newSVpvn_flags(path, path == NULL ? 0 : strlen(path), SVs_TEMP);
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 = newSVpvn_flags(path, path == NULL ? 0 : strlen(path), SVs_TEMP);
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);
4981 sv = vnewSVpvf(fmt, &ap);
4983 s = SvPV_const(sv, len);
4984 wrote = PerlIO_write(f, s, len);
4989 #undef PerlIO_printf
4991 PerlIO_printf(PerlIO *f, const char *fmt, ...)
4996 result = PerlIO_vprintf(f, fmt, ap);
5001 #undef PerlIO_stdoutf
5003 PerlIO_stdoutf(const char *fmt, ...)
5009 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5014 #undef PerlIO_tmpfile
5016 PerlIO_tmpfile(void)
5018 return PerlIO_tmpfile_flags(0);
5021 #define MKOSTEMP_MODES ( O_RDWR | O_CREAT | O_EXCL )
5022 #define MKOSTEMP_MODE_MASK ( O_ACCMODE | O_CREAT | O_EXCL | O_TRUNC )
5025 PerlIO_tmpfile_flags(int imode)
5032 const int fd = win32_tmpfd_mode(imode);
5034 f = PerlIO_fdopen(fd, "w+b");
5035 #elif ! defined(OS2)
5037 char tempname[] = "/tmp/PerlIO_XXXXXX";
5038 const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
5040 int old_umask = umask(0177);
5041 imode &= ~MKOSTEMP_MODE_MASK;
5042 if (tmpdir && *tmpdir) {
5043 /* if TMPDIR is set and not empty, we try that first */
5044 sv = newSVpv(tmpdir, 0);
5045 sv_catpv(sv, tempname + 4);
5046 fd = Perl_my_mkostemp_cloexec(SvPVX(sv), imode | O_VMS_DELETEONCLOSE);
5051 /* else we try /tmp */
5052 fd = Perl_my_mkostemp_cloexec(tempname, imode | O_VMS_DELETEONCLOSE);
5057 sv_catpv(sv, tempname + 4);
5058 fd = Perl_my_mkostemp_cloexec(SvPVX(sv), imode | O_VMS_DELETEONCLOSE);
5062 /* fdopen() with a numeric mode */
5065 (void)PerlIO_intmode2str(imode | MKOSTEMP_MODES, mode, &writing);
5066 f = PerlIO_fdopen(fd, mode);
5068 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5070 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5074 #else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5075 FILE * const stdio = PerlSIO_tmpfile();
5078 f = PerlIO_fdopen(fileno(stdio), "w+");
5080 #endif /* else WIN32 */
5085 Perl_PerlIO_save_errno(pTHX_ PerlIO *f)
5087 PERL_UNUSED_CONTEXT;
5088 if (!PerlIOValid(f))
5090 PerlIOBase(f)->err = errno;
5092 PerlIOBase(f)->os_err = vaxc$errno;
5094 PerlIOBase(f)->os_err = Perl_rc;
5095 #elif defined(WIN32)
5096 PerlIOBase(f)->os_err = GetLastError();
5101 Perl_PerlIO_restore_errno(pTHX_ PerlIO *f)
5103 PERL_UNUSED_CONTEXT;
5104 if (!PerlIOValid(f))
5106 SETERRNO(PerlIOBase(f)->err, PerlIOBase(f)->os_err);
5108 Perl_rc = PerlIOBase(f)->os_err);
5109 #elif defined(WIN32)
5110 SetLastError(PerlIOBase(f)->os_err);
5118 /*======================================================================================*/
5120 * Now some functions in terms of above which may be needed even if we are
5121 * not in true PerlIO mode
5124 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5126 /* Returns the layers set by "use open" */
5128 const char *direction = NULL;
5131 * Need to supply default layer info from open.pm
5137 if (mode && mode[0] != 'r') {
5138 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5139 direction = "open>";
5141 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5142 direction = "open<";
5147 layers = cop_hints_fetch_pvn(PL_curcop, direction, 5, 0, 0);
5150 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5155 # undef PerlIO_setpos
5157 PerlIO_setpos(PerlIO *f, SV *pos)
5163 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5164 if(len == sizeof(Off_t))
5165 return PerlIO_seek(f, *posn, SEEK_SET);
5168 SETERRNO(EINVAL, SS_IVCHAN);
5172 # undef PerlIO_setpos
5174 PerlIO_setpos(PerlIO *f, SV *pos)
5180 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5181 if(len == sizeof(Fpos_t))
5182 # if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5183 return fsetpos64(f, fpos);
5185 return fsetpos(f, fpos);
5189 SETERRNO(EINVAL, SS_IVCHAN);
5195 # undef PerlIO_getpos
5197 PerlIO_getpos(PerlIO *f, SV *pos)
5200 Off_t posn = PerlIO_tell(f);
5201 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5202 return (posn == (Off_t) - 1) ? -1 : 0;
5205 # undef PerlIO_getpos
5207 PerlIO_getpos(PerlIO *f, SV *pos)
5212 # if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5213 code = fgetpos64(f, &fpos);
5215 code = fgetpos(f, &fpos);
5217 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5222 /* print a failure format string message to stderr and fail exit the process
5223 using only libc without depending on any perl data structures being
5228 Perl_noperl_die(const char* pat, ...)
5231 PERL_ARGS_ASSERT_NOPERL_DIE;
5232 va_start(arglist, pat);
5233 vfprintf(stderr, pat, arglist);
5239 * ex: set ts=8 sts=4 sw=4 et: