3 * Copyright (c) 1996-2006, Nick Ing-Simmons
4 * Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public License
7 * or the Artistic License, as specified in the README file.
11 * Hour after hour for nearly three weary days he had jogged up and down,
12 * over passes, and through long dales, and across many streams.
14 * [pp.791-792 of _The Lord of the Rings_, V/iii: "The Muster of Rohan"]
17 /* This file contains the functions needed to implement PerlIO, which
18 * is Perl's private replacement for the C stdio library. This is used
19 * by default unless you compile with -Uuseperlio or run with
20 * PERLIO=:stdio (but don't do this unless you know what you're doing)
24 * If we have ActivePerl-like PERL_IMPLICIT_SYS then we need a dTHX to get
25 * at the dispatch tables, even when we do not need it for other reasons.
26 * Invent a dSYS macro to abstract this out
28 #ifdef PERL_IMPLICIT_SYS
34 #define PERLIO_NOT_STDIO 0
36 * This file provides those parts of PerlIO abstraction
37 * which are not #defined in perlio.h.
38 * Which these are depends on various Configure #ifdef's
42 #define PERL_IN_PERLIO_C
45 #ifdef PERL_IMPLICIT_CONTEXT
53 /* Missing proto on LynxOS */
61 #define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
63 /* Call the callback or PerlIOBase, and return failure. */
64 #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
65 if (PerlIOValid(f)) { \
66 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
67 if (tab && tab->callback) \
68 return (*tab->callback) args; \
70 return PerlIOBase_ ## base args; \
73 SETERRNO(EBADF, SS_IVCHAN); \
76 /* Call the callback or fail, and return failure. */
77 #define Perl_PerlIO_or_fail(f, callback, failure, args) \
78 if (PerlIOValid(f)) { \
79 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
80 if (tab && tab->callback) \
81 return (*tab->callback) args; \
82 SETERRNO(EINVAL, LIB_INVARG); \
85 SETERRNO(EBADF, SS_IVCHAN); \
88 /* Call the callback or PerlIOBase, and be void. */
89 #define Perl_PerlIO_or_Base_void(f, callback, base, args) \
90 if (PerlIOValid(f)) { \
91 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
92 if (tab && tab->callback) \
93 (*tab->callback) args; \
95 PerlIOBase_ ## base args; \
98 SETERRNO(EBADF, SS_IVCHAN)
100 /* Call the callback or fail, and be void. */
101 #define Perl_PerlIO_or_fail_void(f, callback, args) \
102 if (PerlIOValid(f)) { \
103 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
104 if (tab && tab->callback) \
105 (*tab->callback) args; \
107 SETERRNO(EINVAL, LIB_INVARG); \
110 SETERRNO(EBADF, SS_IVCHAN)
112 #if defined(__osf__) && _XOPEN_SOURCE < 500
113 extern int fseeko(FILE *, off_t, int);
114 extern off_t ftello(FILE *);
117 #define NATIVE_0xd CR_NATIVE
118 #define NATIVE_0xa LF_NATIVE
120 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
123 perlsio_binmode(FILE *fp, int iotype, int mode)
126 * This used to be contents of do_binmode in doio.c
130 PERL_UNUSED_ARG(iotype);
132 if (PerlLIO_setmode(fp, mode) != -1) {
134 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
141 # if defined(USEMYBINMODE)
143 # if defined(__CYGWIN__)
144 PERL_UNUSED_ARG(iotype);
146 if (my_binmode(fp, iotype, mode) != FALSE)
152 PERL_UNUSED_ARG(iotype);
153 PERL_UNUSED_ARG(mode);
160 #define O_ACCMODE 3 /* Assume traditional implementation */
164 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
166 const int result = rawmode & O_ACCMODE;
171 ptype = IoTYPE_RDONLY;
174 ptype = IoTYPE_WRONLY;
182 *writing = (result != O_RDONLY);
184 if (result == O_RDONLY) {
188 else if (rawmode & O_APPEND) {
190 if (result != O_WRONLY)
195 if (result == O_WRONLY)
203 /* Unless O_BINARY is different from zero, bit-and:ing
204 * with it won't do much good. */
205 if (rawmode & O_BINARY)
212 #ifndef PERLIO_LAYERS
214 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
216 if (!names || !*names
217 || strEQ(names, ":crlf")
218 || strEQ(names, ":raw")
219 || strEQ(names, ":bytes")
223 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
231 PerlIO_destruct(pTHX)
236 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
238 return perlsio_binmode(fp, iotype, mode);
242 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
244 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
247 #ifdef PERL_IMPLICIT_SYS
248 return PerlSIO_fdupopen(f);
251 return win32_fdupopen(f);
254 const int fd = PerlLIO_dup(PerlIO_fileno(f));
258 const int omode = djgpp_get_stream_mode(f);
260 const int omode = fcntl(fd, F_GETFL);
262 PerlIO_intmode2str(omode,mode,NULL);
263 /* the r+ is a hack */
264 return PerlIO_fdopen(fd, mode);
269 SETERRNO(EBADF, SS_IVCHAN);
279 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
283 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
284 int imode, int perm, PerlIO *old, int narg, SV **args)
288 Perl_croak(aTHX_ "More than one argument to open");
290 if (*args == &PL_sv_undef)
291 return PerlIO_tmpfile();
294 const char *name = SvPV_const(*args, len);
295 if (!IS_SAFE_PATHNAME(name, len, "open"))
298 if (*mode == IoTYPE_NUMERIC) {
299 fd = PerlLIO_open3(name, imode, perm);
301 return PerlIO_fdopen(fd, mode + 1);
304 return PerlIO_reopen(name, mode, old);
307 return PerlIO_open(name, mode);
312 return PerlIO_fdopen(fd, (char *) mode);
317 XS(XS_PerlIO__Layer__find); /* prototype to pass -Wmissing-prototypes */
318 XS(XS_PerlIO__Layer__find)
322 Perl_croak(aTHX_ "Usage class->find(name[,load])");
324 const char * const name = SvPV_nolen_const(ST(1));
325 ST(0) = (strEQ(name, "crlf")
326 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
333 Perl_boot_core_PerlIO(pTHX)
335 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
341 #ifdef PERLIO_IS_STDIO
348 * Does nothing (yet) except force this file to be included in perl
349 * binary. That allows this file to force inclusion of other functions
350 * that may be required by loadable extensions e.g. for
351 * FileHandle::tmpfile
355 #undef PerlIO_tmpfile
362 #else /* PERLIO_IS_STDIO */
364 /*======================================================================================*/
366 * Implement all the PerlIO interface ourselves.
372 PerlIO_debug(const char *fmt, ...)
377 if (!PL_perlio_debug_fd) {
379 PerlProc_getuid() == PerlProc_geteuid() &&
380 PerlProc_getgid() == PerlProc_getegid()) {
381 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
384 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
386 PL_perlio_debug_fd = -1;
388 /* tainting or set*id, so ignore the environment, and ensure we
389 skip these tests next time through. */
390 PL_perlio_debug_fd = -1;
393 if (PL_perlio_debug_fd > 0) {
395 const char * const s = CopFILE(PL_curcop);
396 /* Use fixed buffer as sv_catpvf etc. needs SVs */
398 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
399 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
400 PERL_UNUSED_RESULT(PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2));
402 const char *s = CopFILE(PL_curcop);
404 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
405 (IV) CopLINE(PL_curcop));
406 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
408 s = SvPV_const(sv, len);
409 PERL_UNUSED_RESULT(PerlLIO_write(PL_perlio_debug_fd, s, len));
416 /*--------------------------------------------------------------------------------------*/
419 * Inner level routines
422 /* check that the head field of each layer points back to the head */
425 # define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
427 PerlIO_verify_head(pTHX_ PerlIO *f)
431 #ifndef PERL_IMPLICIT_SYS
436 p = head = PerlIOBase(f)->head;
439 assert(p->head == head);
440 if (p == (PerlIOl*)f)
447 # define VERIFY_HEAD(f)
452 * Table of pointers to the PerlIO structs (malloc'ed)
454 #define PERLIO_TABLE_SIZE 64
457 PerlIO_init_table(pTHX)
461 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
467 PerlIO_allocate(pTHX)
471 * Find a free slot in the table, allocating new table as necessary
476 while ((f = *last)) {
478 last = (PerlIOl **) (f);
479 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
480 if (!((++f)->next)) {
481 f->flags = 0; /* lockcnt */
488 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
492 *last = (PerlIOl*) f++;
493 f->flags = 0; /* lockcnt */
499 #undef PerlIO_fdupopen
501 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
503 if (PerlIOValid(f)) {
504 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
505 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
507 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
509 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
513 SETERRNO(EBADF, SS_IVCHAN);
519 PerlIO_cleantable(pTHX_ PerlIOl **tablep)
521 PerlIOl * const table = *tablep;
524 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
525 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
526 PerlIOl * const f = table + i;
528 PerlIO_close(&(f->next));
538 PerlIO_list_alloc(pTHX)
542 Newxz(list, 1, PerlIO_list_t);
548 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
551 if (--list->refcnt == 0) {
554 for (i = 0; i < list->cur; i++)
555 SvREFCNT_dec(list->array[i].arg);
556 Safefree(list->array);
564 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
570 if (list->cur >= list->len) {
573 Renew(list->array, list->len, PerlIO_pair_t);
575 Newx(list->array, list->len, PerlIO_pair_t);
577 p = &(list->array[list->cur++]);
579 if ((p->arg = arg)) {
580 SvREFCNT_inc_simple_void_NN(arg);
585 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
587 PerlIO_list_t *list = NULL;
590 list = PerlIO_list_alloc(aTHX);
591 for (i=0; i < proto->cur; i++) {
592 SV *arg = proto->array[i].arg;
595 arg = sv_dup(arg, param);
597 PERL_UNUSED_ARG(param);
599 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
606 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
609 PerlIOl **table = &proto->Iperlio;
612 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
613 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
614 PerlIO_init_table(aTHX);
615 PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto);
616 while ((f = *table)) {
618 table = (PerlIOl **) (f++);
619 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
621 (void) fp_dup(&(f->next), 0, param);
628 PERL_UNUSED_ARG(proto);
629 PERL_UNUSED_ARG(param);
634 PerlIO_destruct(pTHX)
637 PerlIOl **table = &PL_perlio;
640 PerlIO_debug("Destruct %p\n",(void*)aTHX);
642 while ((f = *table)) {
644 table = (PerlIOl **) (f++);
645 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
646 PerlIO *x = &(f->next);
649 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
650 PerlIO_debug("Destruct popping %s\n", l->tab->name);
664 PerlIO_pop(pTHX_ PerlIO *f)
666 const PerlIOl *l = *f;
669 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f,
670 l->tab ? l->tab->name : "(Null)");
671 if (l->tab && l->tab->Popped) {
673 * If popped returns non-zero do not free its layer structure
674 * it has either done so itself, or it is shared and still in
677 if ((*l->tab->Popped) (aTHX_ f) != 0)
680 if (PerlIO_lockcnt(f)) {
681 /* we're in use; defer freeing the structure */
682 PerlIOBase(f)->flags = PERLIO_F_CLEARED;
683 PerlIOBase(f)->tab = NULL;
693 /* Return as an array the stack of layers on a filehandle. Note that
694 * the stack is returned top-first in the array, and there are three
695 * times as many array elements as there are layers in the stack: the
696 * first element of a layer triplet is the name, the second one is the
697 * arguments, and the third one is the flags. */
700 PerlIO_get_layers(pTHX_ PerlIO *f)
703 AV * const av = newAV();
705 if (PerlIOValid(f)) {
706 PerlIOl *l = PerlIOBase(f);
709 /* There is some collusion in the implementation of
710 XS_PerlIO_get_layers - it knows that name and flags are
711 generated as fresh SVs here, and takes advantage of that to
712 "copy" them by taking a reference. If it changes here, it needs
713 to change there too. */
714 SV * const name = l->tab && l->tab->name ?
715 newSVpv(l->tab->name, 0) : &PL_sv_undef;
716 SV * const arg = l->tab && l->tab->Getarg ?
717 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
720 av_push(av, newSViv((IV)l->flags));
728 /*--------------------------------------------------------------------------------------*/
730 * XS Interface for perl code
734 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
738 if ((SSize_t) len <= 0)
740 for (i = 0; i < PL_known_layers->cur; i++) {
741 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
742 const STRLEN this_len = strlen(f->name);
743 if (this_len == len && memEQ(f->name, name, len)) {
744 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
748 if (load && PL_subname && PL_def_layerlist
749 && PL_def_layerlist->cur >= 2) {
750 if (PL_in_load_module) {
751 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
754 SV * const pkgsv = newSVpvs("PerlIO");
755 SV * const layer = newSVpvn(name, len);
756 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
758 SAVEBOOL(PL_in_load_module);
760 SAVEGENERICSV(PL_warnhook);
761 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
763 PL_in_load_module = TRUE;
765 * The two SVs are magically freed by load_module
767 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
769 return PerlIO_find_layer(aTHX_ name, len, 0);
772 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
776 #ifdef USE_ATTRIBUTES_FOR_PERLIO
779 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
782 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
783 PerlIO * const ifp = IoIFP(io);
784 PerlIO * const ofp = IoOFP(io);
785 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
786 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
792 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
795 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
796 PerlIO * const ifp = IoIFP(io);
797 PerlIO * const ofp = IoOFP(io);
798 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
799 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
805 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
807 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
812 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
814 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
818 MGVTBL perlio_vtab = {
826 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES); /* prototype to pass -Wmissing-prototypes */
827 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
830 SV * const sv = SvRV(ST(1));
831 AV * const av = newAV();
835 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
837 mg = mg_find(sv, PERL_MAGIC_ext);
838 mg->mg_virtual = &perlio_vtab;
840 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
841 for (i = 2; i < items; i++) {
843 const char * const name = SvPV_const(ST(i), len);
844 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
846 av_push(av, SvREFCNT_inc_simple_NN(layer));
857 #endif /* USE_ATTIBUTES_FOR_PERLIO */
860 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
862 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
863 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
867 XS(XS_PerlIO__Layer__NoWarnings); /* prototype to pass -Wmissing-prototypes */
868 XS(XS_PerlIO__Layer__NoWarnings)
870 /* This is used as a %SIG{__WARN__} handler to suppress warnings
871 during loading of layers.
877 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
881 XS(XS_PerlIO__Layer__find); /* prototype to pass -Wmissing-prototypes */
882 XS(XS_PerlIO__Layer__find)
888 Perl_croak(aTHX_ "Usage class->find(name[,load])");
891 const char * const name = SvPV_const(ST(1), len);
892 const bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
893 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
895 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
902 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
905 if (!PL_known_layers)
906 PL_known_layers = PerlIO_list_alloc(aTHX);
907 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
908 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
912 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
916 const char *s = names;
918 while (isSPACE(*s) || *s == ':')
923 const char *as = NULL;
925 if (!isIDFIRST(*s)) {
927 * Message is consistent with how attribute lists are
928 * passed. Even though this means "foo : : bar" is
929 * seen as an invalid separator character.
931 const char q = ((*s == '\'') ? '"' : '\'');
932 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
933 "Invalid separator character %c%c%c in PerlIO layer specification %s",
935 SETERRNO(EINVAL, LIB_INVARG);
940 } while (isWORDCHAR(*e));
956 * It's a nul terminated string, not allowed
957 * to \ the terminating null. Anything other
958 * character is passed over.
968 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
969 "Argument list not closed for PerlIO layer \"%.*s\"",
981 PerlIO_funcs * const layer =
982 PerlIO_find_layer(aTHX_ s, llen, 1);
986 arg = newSVpvn(as, alen);
987 PerlIO_list_push(aTHX_ av, layer,
988 (arg) ? arg : &PL_sv_undef);
992 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1005 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1008 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1009 #ifdef PERLIO_USING_CRLF
1012 if (PerlIO_stdio.Set_ptrcnt)
1013 tab = &PerlIO_stdio;
1015 PerlIO_debug("Pushing %s\n", tab->name);
1016 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1021 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1023 return av->array[n].arg;
1027 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1029 if (n >= 0 && n < av->cur) {
1030 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1031 av->array[n].funcs->name);
1032 return av->array[n].funcs;
1035 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1040 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1042 PERL_UNUSED_ARG(mode);
1043 PERL_UNUSED_ARG(arg);
1044 PERL_UNUSED_ARG(tab);
1045 if (PerlIOValid(f)) {
1047 PerlIO_pop(aTHX_ f);
1053 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1054 sizeof(PerlIO_funcs),
1057 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1077 NULL, /* get_base */
1078 NULL, /* get_bufsiz */
1081 NULL, /* set_ptrcnt */
1085 PerlIO_default_layers(pTHX)
1088 if (!PL_def_layerlist) {
1089 const char * const s = TAINTING_get ? NULL : PerlEnv_getenv("PERLIO");
1090 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1091 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1092 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1094 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1096 osLayer = &PerlIO_win32;
1099 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1100 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1101 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1102 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1103 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1104 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1105 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1106 PerlIO_list_push(aTHX_ PL_def_layerlist,
1107 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1110 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1113 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1116 if (PL_def_layerlist->cur < 2) {
1117 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1119 return PL_def_layerlist;
1123 Perl_boot_core_PerlIO(pTHX)
1125 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1126 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1129 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1130 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1134 PerlIO_default_layer(pTHX_ I32 n)
1137 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1140 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1143 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1144 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1147 PerlIO_stdstreams(pTHX)
1151 PerlIO_init_table(aTHX);
1152 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1153 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1154 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1159 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1162 if (tab->fsize != sizeof(PerlIO_funcs)) {
1164 "%s (%"UVuf") does not match %s (%"UVuf")",
1165 "PerlIO layer function table size", (UV)tab->fsize,
1166 "size expected by this perl", (UV)sizeof(PerlIO_funcs) );
1170 if (tab->size < sizeof(PerlIOl)) {
1172 "%s (%"UVuf") smaller than %s (%"UVuf")",
1173 "PerlIO layer instance size", (UV)tab->size,
1174 "size expected by this perl", (UV)sizeof(PerlIOl) );
1176 /* Real layer with a data area */
1179 Newxz(temp, tab->size, char);
1183 l->tab = (PerlIO_funcs*) tab;
1184 l->head = ((PerlIOl*)f)->head;
1186 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1187 (void*)f, tab->name,
1188 (mode) ? mode : "(Null)", (void*)arg);
1189 if (*l->tab->Pushed &&
1191 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1192 PerlIO_pop(aTHX_ f);
1201 /* Pseudo-layer where push does its own stack adjust */
1202 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1203 (mode) ? mode : "(Null)", (void*)arg);
1205 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1213 PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1214 IV n, const char *mode, int fd, int imode, int perm,
1215 PerlIO *old, int narg, SV **args)
1217 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_layer(aTHX_ 0));
1218 if (tab && tab->Open) {
1219 PerlIO* ret = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm, old, narg, args);
1220 if (ret && PerlIO_push(aTHX_ ret, self, mode, PerlIOArg) == NULL) {
1226 SETERRNO(EINVAL, LIB_INVARG);
1231 PerlIOBase_binmode(pTHX_ PerlIO *f)
1233 if (PerlIOValid(f)) {
1234 /* Is layer suitable for raw stream ? */
1235 if (PerlIOBase(f)->tab && PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1236 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1237 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1240 /* Not suitable - pop it */
1241 PerlIO_pop(aTHX_ f);
1249 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1251 PERL_UNUSED_ARG(mode);
1252 PERL_UNUSED_ARG(arg);
1253 PERL_UNUSED_ARG(tab);
1255 if (PerlIOValid(f)) {
1260 * Strip all layers that are not suitable for a raw stream
1263 while (t && (l = *t)) {
1264 if (l->tab && l->tab->Binmode) {
1265 /* Has a handler - normal case */
1266 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1268 /* Layer still there - move down a layer */
1277 /* No handler - pop it */
1278 PerlIO_pop(aTHX_ t);
1281 if (PerlIOValid(f)) {
1282 PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1283 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)");
1291 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1292 PerlIO_list_t *layers, IV n, IV max)
1296 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1298 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1309 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1313 save_scalar(PL_errgv);
1315 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1316 code = PerlIO_parse_layers(aTHX_ layers, names);
1318 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1320 PerlIO_list_free(aTHX_ layers);
1327 /*--------------------------------------------------------------------------------------*/
1329 * Given the abstraction above the public API functions
1333 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1335 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1336 (PerlIOBase(f) && PerlIOBase(f)->tab) ?
1337 PerlIOBase(f)->tab->name : "(Null)",
1338 iotype, mode, (names) ? names : "(Null)");
1341 /* Do not flush etc. if (e.g.) switching encodings.
1342 if a pushed layer knows it needs to flush lower layers
1343 (for example :unix which is never going to call them)
1344 it can do the flush when it is pushed.
1346 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1349 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1350 #ifdef PERLIO_USING_CRLF
1351 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1352 O_BINARY so we can look for it in mode.
1354 if (!(mode & O_BINARY)) {
1356 /* FIXME?: Looking down the layer stack seems wrong,
1357 but is a way of reaching past (say) an encoding layer
1358 to flip CRLF-ness of the layer(s) below
1361 /* Perhaps we should turn on bottom-most aware layer
1362 e.g. Ilya's idea that UNIX TTY could serve
1364 if (PerlIOBase(f)->tab &&
1365 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1367 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1368 /* Not in text mode - flush any pending stuff and flip it */
1370 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1372 /* Only need to turn it on in one layer so we are done */
1377 /* Not finding a CRLF aware layer presumably means we are binary
1378 which is not what was requested - so we failed
1379 We _could_ push :crlf layer but so could caller
1384 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1385 So code that used to be here is now in PerlIORaw_pushed().
1387 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1392 PerlIO__close(pTHX_ PerlIO *f)
1394 if (PerlIOValid(f)) {
1395 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1396 if (tab && tab->Close)
1397 return (*tab->Close)(aTHX_ f);
1399 return PerlIOBase_close(aTHX_ f);
1402 SETERRNO(EBADF, SS_IVCHAN);
1408 Perl_PerlIO_close(pTHX_ PerlIO *f)
1410 const int code = PerlIO__close(aTHX_ f);
1411 while (PerlIOValid(f)) {
1412 PerlIO_pop(aTHX_ f);
1413 if (PerlIO_lockcnt(f))
1414 /* we're in use; the 'pop' deferred freeing the structure */
1421 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1424 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1428 static PerlIO_funcs *
1429 PerlIO_layer_from_ref(pTHX_ SV *sv)
1433 * For any scalar type load the handler which is bundled with perl
1435 if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
1436 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1437 /* This isn't supposed to happen, since PerlIO::scalar is core,
1438 * but could happen anyway in smaller installs or with PAR */
1440 /* diag_listed_as: Unknown PerlIO layer "%s" */
1441 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1446 * For other types allow if layer is known but don't try and load it
1448 switch (SvTYPE(sv)) {
1450 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1452 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1454 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1456 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1463 PerlIO_resolve_layers(pTHX_ const char *layers,
1464 const char *mode, int narg, SV **args)
1467 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1470 PerlIO_stdstreams(aTHX);
1472 SV * const arg = *args;
1474 * If it is a reference but not an object see if we have a handler
1477 if (SvROK(arg) && !sv_isobject(arg)) {
1478 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1480 def = PerlIO_list_alloc(aTHX);
1481 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1485 * Don't fail if handler cannot be found :via(...) etc. may do
1486 * something sensible else we will just stringfy and open
1491 if (!layers || !*layers)
1492 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1493 if (layers && *layers) {
1496 av = PerlIO_clone_list(aTHX_ def, NULL);
1501 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1505 PerlIO_list_free(aTHX_ av);
1517 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1518 int imode, int perm, PerlIO *f, int narg, SV **args)
1521 if (!f && narg == 1 && *args == &PL_sv_undef) {
1522 if ((f = PerlIO_tmpfile())) {
1523 if (!layers || !*layers)
1524 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1525 if (layers && *layers)
1526 PerlIO_apply_layers(aTHX_ f, mode, layers);
1530 PerlIO_list_t *layera;
1532 PerlIO_funcs *tab = NULL;
1533 if (PerlIOValid(f)) {
1535 * This is "reopen" - it is not tested as perl does not use it
1539 layera = PerlIO_list_alloc(aTHX);
1542 if (l->tab && l->tab->Getarg)
1543 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1544 PerlIO_list_push(aTHX_ layera, l->tab,
1545 (arg) ? arg : &PL_sv_undef);
1547 l = *PerlIONext(&l);
1551 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1557 * Start at "top" of layer stack
1559 n = layera->cur - 1;
1561 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1570 * Found that layer 'n' can do opens - call it
1572 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1573 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1575 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1576 tab->name, layers ? layers : "(Null)", mode, fd,
1577 imode, perm, (void*)f, narg, (void*)args);
1579 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1582 SETERRNO(EINVAL, LIB_INVARG);
1586 if (n + 1 < layera->cur) {
1588 * More layers above the one that we used to open -
1591 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1592 /* If pushing layers fails close the file */
1599 PerlIO_list_free(aTHX_ layera);
1606 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1608 PERL_ARGS_ASSERT_PERLIO_READ;
1610 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1614 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1616 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1618 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1622 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1624 PERL_ARGS_ASSERT_PERLIO_WRITE;
1626 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1630 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1632 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1636 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1638 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1642 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1647 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1649 if (tab && tab->Flush)
1650 return (*tab->Flush) (aTHX_ f);
1652 return 0; /* If no Flush defined, silently succeed. */
1655 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1656 SETERRNO(EBADF, SS_IVCHAN);
1662 * Is it good API design to do flush-all on NULL, a potentially
1663 * erroneous input? Maybe some magical value (PerlIO*
1664 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1665 * things on fflush(NULL), but should we be bound by their design
1668 PerlIOl **table = &PL_perlio;
1671 while ((ff = *table)) {
1673 table = (PerlIOl **) (ff++);
1674 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1675 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1685 PerlIOBase_flush_linebuf(pTHX)
1688 PerlIOl **table = &PL_perlio;
1690 while ((f = *table)) {
1692 table = (PerlIOl **) (f++);
1693 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1695 && (PerlIOBase(&(f->next))->
1696 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1697 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1698 PerlIO_flush(&(f->next));
1705 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1707 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1711 PerlIO_isutf8(PerlIO *f)
1714 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1716 SETERRNO(EBADF, SS_IVCHAN);
1722 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1724 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1728 Perl_PerlIO_error(pTHX_ PerlIO *f)
1730 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1734 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1736 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1740 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1742 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1746 PerlIO_has_base(PerlIO *f)
1748 if (PerlIOValid(f)) {
1749 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1752 return (tab->Get_base != NULL);
1759 PerlIO_fast_gets(PerlIO *f)
1761 if (PerlIOValid(f)) {
1762 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1763 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1766 return (tab->Set_ptrcnt != NULL);
1774 PerlIO_has_cntptr(PerlIO *f)
1776 if (PerlIOValid(f)) {
1777 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1780 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1787 PerlIO_canset_cnt(PerlIO *f)
1789 if (PerlIOValid(f)) {
1790 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1793 return (tab->Set_ptrcnt != NULL);
1800 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1802 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1806 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1808 /* Note that Get_bufsiz returns a Size_t */
1809 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1813 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1815 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1819 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1821 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1825 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt)
1827 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1831 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
1833 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1837 /*--------------------------------------------------------------------------------------*/
1839 * utf8 and raw dummy layers
1843 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1845 PERL_UNUSED_CONTEXT;
1846 PERL_UNUSED_ARG(mode);
1847 PERL_UNUSED_ARG(arg);
1848 if (PerlIOValid(f)) {
1849 if (tab && tab->kind & PERLIO_K_UTF8)
1850 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1852 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1858 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1859 sizeof(PerlIO_funcs),
1862 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1882 NULL, /* get_base */
1883 NULL, /* get_bufsiz */
1886 NULL, /* set_ptrcnt */
1889 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1890 sizeof(PerlIO_funcs),
1893 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1913 NULL, /* get_base */
1914 NULL, /* get_bufsiz */
1917 NULL, /* set_ptrcnt */
1920 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1921 sizeof(PerlIO_funcs),
1944 NULL, /* get_base */
1945 NULL, /* get_bufsiz */
1948 NULL, /* set_ptrcnt */
1950 /*--------------------------------------------------------------------------------------*/
1951 /*--------------------------------------------------------------------------------------*/
1953 * "Methods" of the "base class"
1957 PerlIOBase_fileno(pTHX_ PerlIO *f)
1959 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
1963 PerlIO_modestr(PerlIO * f, char *buf)
1966 if (PerlIOValid(f)) {
1967 const IV flags = PerlIOBase(f)->flags;
1968 if (flags & PERLIO_F_APPEND) {
1970 if (flags & PERLIO_F_CANREAD) {
1974 else if (flags & PERLIO_F_CANREAD) {
1976 if (flags & PERLIO_F_CANWRITE)
1979 else if (flags & PERLIO_F_CANWRITE) {
1981 if (flags & PERLIO_F_CANREAD) {
1985 #ifdef PERLIO_USING_CRLF
1986 if (!(flags & PERLIO_F_CRLF))
1996 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1998 PerlIOl * const l = PerlIOBase(f);
1999 PERL_UNUSED_CONTEXT;
2000 PERL_UNUSED_ARG(arg);
2002 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2003 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2004 if (tab && tab->Set_ptrcnt != NULL)
2005 l->flags |= PERLIO_F_FASTGETS;
2007 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2011 l->flags |= PERLIO_F_CANREAD;
2014 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2017 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2020 SETERRNO(EINVAL, LIB_INVARG);
2026 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2029 l->flags &= ~PERLIO_F_CRLF;
2032 l->flags |= PERLIO_F_CRLF;
2035 SETERRNO(EINVAL, LIB_INVARG);
2042 l->flags |= l->next->flags &
2043 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2048 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2049 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2050 l->flags, PerlIO_modestr(f, temp));
2056 PerlIOBase_popped(pTHX_ PerlIO *f)
2058 PERL_UNUSED_CONTEXT;
2064 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2067 * Save the position as current head considers it
2069 const Off_t old = PerlIO_tell(f);
2070 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2071 PerlIOSelf(f, PerlIOBuf)->posn = old;
2072 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2076 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2078 STDCHAR *buf = (STDCHAR *) vbuf;
2080 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2081 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2082 SETERRNO(EBADF, SS_IVCHAN);
2088 SSize_t avail = PerlIO_get_cnt(f);
2091 take = (((SSize_t) count >= 0) && ((SSize_t)count < avail)) ? (SSize_t)count : avail;
2093 STDCHAR *ptr = PerlIO_get_ptr(f);
2094 Copy(ptr, buf, take, STDCHAR);
2095 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2098 if (avail == 0) /* set_ptrcnt could have reset avail */
2101 if (count > 0 && avail <= 0) {
2102 if (PerlIO_fill(f) != 0)
2107 return (buf - (STDCHAR *) vbuf);
2113 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2115 PERL_UNUSED_CONTEXT;
2121 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2123 PERL_UNUSED_CONTEXT;
2129 PerlIOBase_close(pTHX_ PerlIO *f)
2132 if (PerlIOValid(f)) {
2133 PerlIO *n = PerlIONext(f);
2134 code = PerlIO_flush(f);
2135 PerlIOBase(f)->flags &=
2136 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2137 while (PerlIOValid(n)) {
2138 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2139 if (tab && tab->Close) {
2140 if ((*tab->Close)(aTHX_ n) != 0)
2145 PerlIOBase(n)->flags &=
2146 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2152 SETERRNO(EBADF, SS_IVCHAN);
2158 PerlIOBase_eof(pTHX_ PerlIO *f)
2160 PERL_UNUSED_CONTEXT;
2161 if (PerlIOValid(f)) {
2162 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2168 PerlIOBase_error(pTHX_ PerlIO *f)
2170 PERL_UNUSED_CONTEXT;
2171 if (PerlIOValid(f)) {
2172 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2178 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2180 if (PerlIOValid(f)) {
2181 PerlIO * const n = PerlIONext(f);
2182 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2189 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2191 PERL_UNUSED_CONTEXT;
2192 if (PerlIOValid(f)) {
2193 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2198 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2204 arg = sv_dup(arg, param);
2205 SvREFCNT_inc_simple_void_NN(arg);
2209 return newSVsv(arg);
2212 PERL_UNUSED_ARG(param);
2213 return newSVsv(arg);
2218 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2220 PerlIO * const nexto = PerlIONext(o);
2221 if (PerlIOValid(nexto)) {
2222 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2223 if (tab && tab->Dup)
2224 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2226 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2229 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2233 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2234 self ? self->name : "(Null)",
2235 (void*)f, (void*)o, (void*)param);
2236 if (self && self->Getarg)
2237 arg = (*self->Getarg)(aTHX_ o, param, flags);
2238 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2239 if (f && PerlIOBase(o)->flags & PERLIO_F_UTF8)
2240 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2246 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2248 /* Must be called with PL_perlio_mutex locked. */
2250 S_more_refcounted_fds(pTHX_ const int new_fd) {
2252 const int old_max = PL_perlio_fd_refcnt_size;
2253 const int new_max = 16 + (new_fd & ~15);
2256 #ifndef PERL_IMPLICIT_SYS
2257 PERL_UNUSED_CONTEXT;
2260 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2261 old_max, new_fd, new_max);
2263 if (new_fd < old_max) {
2267 assert (new_max > new_fd);
2269 /* Use plain realloc() since we need this memory to be really
2270 * global and visible to all the interpreters and/or threads. */
2271 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2275 MUTEX_UNLOCK(&PL_perlio_mutex);
2280 PL_perlio_fd_refcnt_size = new_max;
2281 PL_perlio_fd_refcnt = new_array;
2283 PerlIO_debug("Zeroing %p, %d\n",
2284 (void*)(new_array + old_max),
2287 Zero(new_array + old_max, new_max - old_max, int);
2294 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2295 PERL_UNUSED_CONTEXT;
2299 PerlIOUnix_refcnt_inc(int fd)
2306 MUTEX_LOCK(&PL_perlio_mutex);
2308 if (fd >= PL_perlio_fd_refcnt_size)
2309 S_more_refcounted_fds(aTHX_ fd);
2311 PL_perlio_fd_refcnt[fd]++;
2312 if (PL_perlio_fd_refcnt[fd] <= 0) {
2313 /* diag_listed_as: refcnt_inc: fd %d%s */
2314 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2315 fd, PL_perlio_fd_refcnt[fd]);
2317 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2318 fd, PL_perlio_fd_refcnt[fd]);
2321 MUTEX_UNLOCK(&PL_perlio_mutex);
2324 /* diag_listed_as: refcnt_inc: fd %d%s */
2325 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2330 PerlIOUnix_refcnt_dec(int fd)
2336 MUTEX_LOCK(&PL_perlio_mutex);
2338 if (fd >= PL_perlio_fd_refcnt_size) {
2339 /* diag_listed_as: refcnt_dec: fd %d%s */
2340 Perl_croak_nocontext("refcnt_dec: fd %d >= refcnt_size %d\n",
2341 fd, PL_perlio_fd_refcnt_size);
2343 if (PL_perlio_fd_refcnt[fd] <= 0) {
2344 /* diag_listed_as: refcnt_dec: fd %d%s */
2345 Perl_croak_nocontext("refcnt_dec: fd %d: %d <= 0\n",
2346 fd, PL_perlio_fd_refcnt[fd]);
2348 cnt = --PL_perlio_fd_refcnt[fd];
2349 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2351 MUTEX_UNLOCK(&PL_perlio_mutex);
2354 /* diag_listed_as: refcnt_dec: fd %d%s */
2355 Perl_croak_nocontext("refcnt_dec: fd %d < 0\n", fd);
2361 PerlIOUnix_refcnt(int fd)
2368 MUTEX_LOCK(&PL_perlio_mutex);
2370 if (fd >= PL_perlio_fd_refcnt_size) {
2371 /* diag_listed_as: refcnt: fd %d%s */
2372 Perl_croak(aTHX_ "refcnt: fd %d >= refcnt_size %d\n",
2373 fd, PL_perlio_fd_refcnt_size);
2375 if (PL_perlio_fd_refcnt[fd] <= 0) {
2376 /* diag_listed_as: refcnt: fd %d%s */
2377 Perl_croak(aTHX_ "refcnt: fd %d: %d <= 0\n",
2378 fd, PL_perlio_fd_refcnt[fd]);
2380 cnt = PL_perlio_fd_refcnt[fd];
2382 MUTEX_UNLOCK(&PL_perlio_mutex);
2385 /* diag_listed_as: refcnt: fd %d%s */
2386 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2392 PerlIO_cleanup(pTHX)
2397 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2399 PerlIO_debug("Cleanup layers\n");
2402 /* Raise STDIN..STDERR refcount so we don't close them */
2403 for (i=0; i < 3; i++)
2404 PerlIOUnix_refcnt_inc(i);
2405 PerlIO_cleantable(aTHX_ &PL_perlio);
2406 /* Restore STDIN..STDERR refcount */
2407 for (i=0; i < 3; i++)
2408 PerlIOUnix_refcnt_dec(i);
2410 if (PL_known_layers) {
2411 PerlIO_list_free(aTHX_ PL_known_layers);
2412 PL_known_layers = NULL;
2414 if (PL_def_layerlist) {
2415 PerlIO_list_free(aTHX_ PL_def_layerlist);
2416 PL_def_layerlist = NULL;
2420 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2424 /* XXX we can't rely on an interpreter being present at this late stage,
2425 XXX so we can't use a function like PerlLIO_write that relies on one
2426 being present (at least in win32) :-(.
2431 /* By now all filehandles should have been closed, so any
2432 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2434 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2435 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2436 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2438 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2439 if (PL_perlio_fd_refcnt[i]) {
2441 my_snprintf(buf, sizeof(buf),
2442 "PerlIO_teardown: fd %d refcnt=%d\n",
2443 i, PL_perlio_fd_refcnt[i]);
2444 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2450 /* Not bothering with PL_perlio_mutex since by now
2451 * all the interpreters are gone. */
2452 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2453 && PL_perlio_fd_refcnt) {
2454 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2455 PL_perlio_fd_refcnt = NULL;
2456 PL_perlio_fd_refcnt_size = 0;
2460 /*--------------------------------------------------------------------------------------*/
2462 * Bottom-most level for UNIX-like case
2466 struct _PerlIO base; /* The generic part */
2467 int fd; /* UNIX like file descriptor */
2468 int oflags; /* open/fcntl flags */
2472 S_lockcnt_dec(pTHX_ const void* f)
2474 #ifndef PERL_IMPLICIT_SYS
2475 PERL_UNUSED_CONTEXT;
2477 PerlIO_lockcnt((PerlIO*)f)--;
2481 /* call the signal handler, and if that handler happens to clear
2482 * this handle, free what we can and return true */
2485 S_perlio_async_run(pTHX_ PerlIO* f) {
2487 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2488 PerlIO_lockcnt(f)++;
2490 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) ) {
2494 /* we've just run some perl-level code that could have done
2495 * anything, including closing the file or clearing this layer.
2496 * If so, free any lower layers that have already been
2497 * cleared, then return an error. */
2498 while (PerlIOValid(f) &&
2499 (PerlIOBase(f)->flags & PERLIO_F_CLEARED))
2501 const PerlIOl *l = *f;
2510 PerlIOUnix_oflags(const char *mode)
2513 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2518 if (*++mode == '+') {
2525 oflags = O_CREAT | O_TRUNC;
2526 if (*++mode == '+') {
2535 oflags = O_CREAT | O_APPEND;
2536 if (*++mode == '+') {
2545 /* XXX TODO: PerlIO_open() test that exercises 'rb' and 'rt'. */
2547 /* Unless O_BINARY is different from O_TEXT, first bit-or:ing one
2548 * of them in, and then bit-and-masking the other them away, won't
2549 * have much of an effect. */
2552 #if O_TEXT != O_BINARY
2559 #if O_TEXT != O_BINARY
2561 oflags &= ~O_BINARY;
2567 /* bit-or:ing with zero O_BINARY would be useless. */
2569 * If neither "t" nor "b" was specified, open the file
2572 * Note that if something else than the zero byte was seen
2573 * here (e.g. bogus mode "rx"), just few lines later we will
2574 * set the errno and invalidate the flags.
2580 if (*mode || oflags == -1) {
2581 SETERRNO(EINVAL, LIB_INVARG);
2588 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2590 PERL_UNUSED_CONTEXT;
2591 return PerlIOSelf(f, PerlIOUnix)->fd;
2595 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2597 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2600 if (PerlLIO_fstat(fd, &st) == 0) {
2601 if (!S_ISREG(st.st_mode)) {
2602 PerlIO_debug("%d is not regular file\n",fd);
2603 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2606 PerlIO_debug("%d _is_ a regular file\n",fd);
2612 PerlIOUnix_refcnt_inc(fd);
2613 PERL_UNUSED_CONTEXT;
2617 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2619 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2620 if (*PerlIONext(f)) {
2621 /* We never call down so do any pending stuff now */
2622 PerlIO_flush(PerlIONext(f));
2624 * XXX could (or should) we retrieve the oflags from the open file
2625 * handle rather than believing the "mode" we are passed in? XXX
2626 * Should the value on NULL mode be 0 or -1?
2628 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2629 mode ? PerlIOUnix_oflags(mode) : -1);
2631 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2637 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2639 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2641 PERL_UNUSED_CONTEXT;
2642 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2644 SETERRNO(ESPIPE, LIB_INVARG);
2646 SETERRNO(EINVAL, LIB_INVARG);
2650 new_loc = PerlLIO_lseek(fd, offset, whence);
2651 if (new_loc == (Off_t) - 1)
2653 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2658 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2659 IV n, const char *mode, int fd, int imode,
2660 int perm, PerlIO *f, int narg, SV **args)
2662 if (PerlIOValid(f)) {
2663 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2664 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2667 if (*mode == IoTYPE_NUMERIC)
2670 imode = PerlIOUnix_oflags(mode);
2672 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2679 const char *path = SvPV_const(*args, len);
2680 if (!IS_SAFE_PATHNAME(path, len, "open"))
2682 fd = PerlLIO_open3(path, imode, perm);
2686 if (*mode == IoTYPE_IMPLICIT)
2689 f = PerlIO_allocate(aTHX);
2691 if (!PerlIOValid(f)) {
2692 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2697 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2698 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2699 if (*mode == IoTYPE_APPEND)
2700 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2707 * FIXME: pop layers ???
2715 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2717 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2719 if (flags & PERLIO_DUP_FD) {
2720 fd = PerlLIO_dup(fd);
2723 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2725 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2726 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2736 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2740 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2742 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2743 #ifdef PERLIO_STD_SPECIAL
2745 return PERLIO_STD_IN(fd, vbuf, count);
2747 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2748 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2752 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2753 if (len >= 0 || errno != EINTR) {
2755 if (errno != EAGAIN) {
2756 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2759 else if (len == 0 && count != 0) {
2760 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2766 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2773 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2777 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2779 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2780 #ifdef PERLIO_STD_SPECIAL
2781 if (fd == 1 || fd == 2)
2782 return PERLIO_STD_OUT(fd, vbuf, count);
2785 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2786 if (len >= 0 || errno != EINTR) {
2788 if (errno != EAGAIN) {
2789 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2795 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2802 PerlIOUnix_tell(pTHX_ PerlIO *f)
2804 PERL_UNUSED_CONTEXT;
2806 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2811 PerlIOUnix_close(pTHX_ PerlIO *f)
2814 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2816 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2817 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2818 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2823 SETERRNO(EBADF,SS_IVCHAN);
2826 while (PerlLIO_close(fd) != 0) {
2827 if (errno != EINTR) {
2832 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2836 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2841 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2842 sizeof(PerlIO_funcs),
2849 PerlIOBase_binmode, /* binmode */
2859 PerlIOBase_noop_ok, /* flush */
2860 PerlIOBase_noop_fail, /* fill */
2863 PerlIOBase_clearerr,
2864 PerlIOBase_setlinebuf,
2865 NULL, /* get_base */
2866 NULL, /* get_bufsiz */
2869 NULL, /* set_ptrcnt */
2872 /*--------------------------------------------------------------------------------------*/
2877 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2878 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2879 broken by the last second glibc 2.3 fix
2881 #define STDIO_BUFFER_WRITABLE
2886 struct _PerlIO base;
2887 FILE *stdio; /* The stream */
2891 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2893 PERL_UNUSED_CONTEXT;
2895 if (PerlIOValid(f)) {
2896 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2898 return PerlSIO_fileno(s);
2905 PerlIOStdio_mode(const char *mode, char *tmode)
2907 char * const ret = tmode;
2913 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2921 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2924 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2925 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2926 if (toptab == tab) {
2927 /* Top is already stdio - pop self (duplicate) and use original */
2928 PerlIO_pop(aTHX_ f);
2931 const int fd = PerlIO_fileno(n);
2934 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2935 mode = PerlIOStdio_mode(mode, tmode)))) {
2936 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2937 /* We never call down so do any pending stuff now */
2938 PerlIO_flush(PerlIONext(f));
2939 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2946 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2951 PerlIO_importFILE(FILE *stdio, const char *mode)
2957 int fd0 = fileno(stdio);
2961 if (!mode || !*mode) {
2962 /* We need to probe to see how we can open the stream
2963 so start with read/write and then try write and read
2964 we dup() so that we can fclose without loosing the fd.
2966 Note that the errno value set by a failing fdopen
2967 varies between stdio implementations.
2969 const int fd = PerlLIO_dup(fd0);
2974 f2 = PerlSIO_fdopen(fd, (mode = "r+"));
2976 f2 = PerlSIO_fdopen(fd, (mode = "w"));
2979 f2 = PerlSIO_fdopen(fd, (mode = "r"));
2982 /* Don't seem to be able to open */
2988 if ((f = PerlIO_push(aTHX_(PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
2989 s = PerlIOSelf(f, PerlIOStdio);
2991 PerlIOUnix_refcnt_inc(fileno(stdio));
2998 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2999 IV n, const char *mode, int fd, int imode,
3000 int perm, PerlIO *f, int narg, SV **args)
3003 if (PerlIOValid(f)) {
3005 const char * const path = SvPV_const(*args, len);
3006 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3008 if (!IS_SAFE_PATHNAME(path, len, "open"))
3010 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3011 stdio = PerlSIO_freopen(path, PerlIOStdio_mode(mode, tmode),
3016 PerlIOUnix_refcnt_inc(fileno(s->stdio));
3022 const char * const path = SvPV_const(*args, len);
3023 if (!IS_SAFE_PATHNAME(path, len, "open"))
3025 if (*mode == IoTYPE_NUMERIC) {
3027 fd = PerlLIO_open3(path, imode, perm);
3031 bool appended = FALSE;
3033 /* Cygwin wants its 'b' early. */
3035 mode = PerlIOStdio_mode(mode, tmode);
3037 stdio = PerlSIO_fopen(path, mode);
3040 f = PerlIO_allocate(aTHX);
3043 mode = PerlIOStdio_mode(mode, tmode);
3044 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3046 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3047 PerlIOUnix_refcnt_inc(fileno(stdio));
3049 PerlSIO_fclose(stdio);
3061 if (*mode == IoTYPE_IMPLICIT) {
3068 stdio = PerlSIO_stdin;
3071 stdio = PerlSIO_stdout;
3074 stdio = PerlSIO_stderr;
3079 stdio = PerlSIO_fdopen(fd, mode =
3080 PerlIOStdio_mode(mode, tmode));
3084 f = PerlIO_allocate(aTHX);
3086 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3087 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3088 PerlIOUnix_refcnt_inc(fileno(stdio));
3099 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3101 /* This assumes no layers underneath - which is what
3102 happens, but is not how I remember it. NI-S 2001/10/16
3104 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3105 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3106 const int fd = fileno(stdio);
3108 if (flags & PERLIO_DUP_FD) {
3109 const int dfd = PerlLIO_dup(fileno(stdio));
3111 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3116 /* FIXME: To avoid messy error recovery if dup fails
3117 re-use the existing stdio as though flag was not set
3121 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3123 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3125 PerlIOUnix_refcnt_inc(fileno(stdio));
3132 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3134 PERL_UNUSED_CONTEXT;
3136 /* XXX this could use PerlIO_canset_fileno() and
3137 * PerlIO_set_fileno() support from Configure
3139 # if defined(__UCLIBC__)
3140 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3143 # elif defined(__GLIBC__)
3144 /* There may be a better way for GLIBC:
3145 - libio.h defines a flag to not close() on cleanup
3149 # elif defined(__sun)
3152 # elif defined(__hpux)
3156 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3157 your platform does not have special entry try this one.
3158 [For OSF only have confirmation for Tru64 (alpha)
3159 but assume other OSFs will be similar.]
3161 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3164 # elif defined(__FreeBSD__)
3165 /* There may be a better way on FreeBSD:
3166 - we could insert a dummy func in the _close function entry
3167 f->_close = (int (*)(void *)) dummy_close;
3171 # elif defined(__OpenBSD__)
3172 /* There may be a better way on OpenBSD:
3173 - we could insert a dummy func in the _close function entry
3174 f->_close = (int (*)(void *)) dummy_close;
3178 # elif defined(__EMX__)
3179 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3182 # elif defined(__CYGWIN__)
3183 /* There may be a better way on CYGWIN:
3184 - we could insert a dummy func in the _close function entry
3185 f->_close = (int (*)(void *)) dummy_close;
3189 # elif defined(WIN32)
3190 # if defined(UNDER_CE)
3191 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3200 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3201 (which isn't thread safe) instead
3203 # error "Don't know how to set FILE.fileno on your platform"
3211 PerlIOStdio_close(pTHX_ PerlIO *f)
3213 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3219 const int fd = fileno(stdio);
3227 #ifdef SOCKS5_VERSION_NAME
3228 /* Socks lib overrides close() but stdio isn't linked to
3229 that library (though we are) - so we must call close()
3230 on sockets on stdio's behalf.
3233 Sock_size_t optlen = sizeof(int);
3234 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3237 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3238 that a subsequent fileno() on it returns -1. Don't want to croak()
3239 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3240 trying to close an already closed handle which somehow it still has
3241 a reference to. (via.xs, I'm looking at you). */
3242 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3243 /* File descriptor still in use */
3247 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3248 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3250 if (stdio == stdout || stdio == stderr)
3251 return PerlIO_flush(f);
3252 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3253 Use Sarathy's trick from maint-5.6 to invalidate the
3254 fileno slot of the FILE *
3256 result = PerlIO_flush(f);
3258 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3261 MUTEX_LOCK(&PL_perlio_mutex);
3262 /* Right. We need a mutex here because for a brief while we
3263 will have the situation that fd is actually closed. Hence if
3264 a second thread were to get into this block, its dup() would
3265 likely return our fd as its dupfd. (after all, it is closed)
3266 Then if we get to the dup2() first, we blat the fd back
3267 (messing up its temporary as a side effect) only for it to
3268 then close its dupfd (== our fd) in its close(dupfd) */
3270 /* There is, of course, a race condition, that any other thread
3271 trying to input/output/whatever on this fd will be stuffed
3272 for the duration of this little manoeuvrer. Perhaps we
3273 should hold an IO mutex for the duration of every IO
3274 operation if we know that invalidate doesn't work on this
3275 platform, but that would suck, and could kill performance.
3277 Except that correctness trumps speed.
3278 Advice from klortho #11912. */
3280 dupfd = PerlLIO_dup(fd);
3283 MUTEX_UNLOCK(&PL_perlio_mutex);
3284 /* Oh cXap. This isn't going to go well. Not sure if we can
3285 recover from here, or if closing this particular FILE *
3286 is a good idea now. */
3291 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3293 result = PerlSIO_fclose(stdio);
3294 /* We treat error from stdio as success if we invalidated
3295 errno may NOT be expected EBADF
3297 if (invalidate && result != 0) {
3301 #ifdef SOCKS5_VERSION_NAME
3302 /* in SOCKS' case, let close() determine return value */
3306 PerlLIO_dup2(dupfd,fd);
3307 PerlLIO_close(dupfd);
3309 MUTEX_UNLOCK(&PL_perlio_mutex);
3317 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3322 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3324 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3327 STDCHAR *buf = (STDCHAR *) vbuf;
3329 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3330 * stdio does not do that for fread()
3332 const int ch = PerlSIO_fgetc(s);
3339 got = PerlSIO_fread(vbuf, 1, count, s);
3340 if (got == 0 && PerlSIO_ferror(s))
3342 if (got >= 0 || errno != EINTR)
3344 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3346 SETERRNO(0,0); /* just in case */
3352 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3355 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3357 #ifdef STDIO_BUFFER_WRITABLE
3358 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3359 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3360 STDCHAR *base = PerlIO_get_base(f);
3361 SSize_t cnt = PerlIO_get_cnt(f);
3362 STDCHAR *ptr = PerlIO_get_ptr(f);
3363 SSize_t avail = ptr - base;
3365 if (avail > count) {
3369 Move(buf-avail,ptr,avail,STDCHAR);
3372 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3373 if (PerlSIO_feof(s) && unread >= 0)
3374 PerlSIO_clearerr(s);
3379 if (PerlIO_has_cntptr(f)) {
3380 /* We can get pointer to buffer but not its base
3381 Do ungetc() but check chars are ending up in the
3384 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3385 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3387 const int ch = *--buf & 0xFF;
3388 if (ungetc(ch,s) != ch) {
3389 /* ungetc did not work */
3392 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3393 /* Did not change pointer as expected */
3394 if (fgetc(s) != EOF) /* get char back again */
3404 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3410 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3414 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3417 got = PerlSIO_fwrite(vbuf, 1, count,
3418 PerlIOSelf(f, PerlIOStdio)->stdio);
3419 if (got >= 0 || errno != EINTR)
3421 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3423 SETERRNO(0,0); /* just in case */
3429 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3431 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3432 PERL_UNUSED_CONTEXT;
3434 return PerlSIO_fseek(stdio, offset, whence);
3438 PerlIOStdio_tell(pTHX_ PerlIO *f)
3440 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3441 PERL_UNUSED_CONTEXT;
3443 return PerlSIO_ftell(stdio);
3447 PerlIOStdio_flush(pTHX_ PerlIO *f)
3449 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3450 PERL_UNUSED_CONTEXT;
3452 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3453 return PerlSIO_fflush(stdio);
3459 * FIXME: This discards ungetc() and pre-read stuff which is not
3460 * right if this is just a "sync" from a layer above Suspect right
3461 * design is to do _this_ but not have layer above flush this
3462 * layer read-to-read
3465 * Not writeable - sync by attempting a seek
3468 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3476 PerlIOStdio_eof(pTHX_ PerlIO *f)
3478 PERL_UNUSED_CONTEXT;
3480 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3484 PerlIOStdio_error(pTHX_ PerlIO *f)
3486 PERL_UNUSED_CONTEXT;
3488 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3492 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3494 PERL_UNUSED_CONTEXT;
3496 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3500 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3502 PERL_UNUSED_CONTEXT;
3504 #ifdef HAS_SETLINEBUF
3505 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3507 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3513 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3515 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3516 return (STDCHAR*)PerlSIO_get_base(stdio);
3520 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3522 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3523 return PerlSIO_get_bufsiz(stdio);
3527 #ifdef USE_STDIO_PTR
3529 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3531 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3532 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3536 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3538 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3539 return PerlSIO_get_cnt(stdio);
3543 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3545 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3547 #ifdef STDIO_PTR_LVALUE
3548 /* This is a long-standing infamous mess. The root of the
3549 * problem is that one cannot know the signedness of char, and
3550 * more precisely the signedness of FILE._ptr. The following
3551 * things have been tried, and they have all failed (across
3552 * different compilers (remember that core needs to to build
3553 * also with c++) and compiler options:
3555 * - casting the RHS to (void*) -- works in *some* places
3556 * - casting the LHS to (void*) -- totally unportable
3558 * So let's try silencing the warning at least for gcc. */
3559 GCC_DIAG_IGNORE(-Wpointer-sign);
3560 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3562 #ifdef STDIO_PTR_LVAL_SETS_CNT
3563 assert(PerlSIO_get_cnt(stdio) == (cnt));
3565 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3567 * Setting ptr _does_ change cnt - we are done
3571 #else /* STDIO_PTR_LVALUE */
3573 #endif /* STDIO_PTR_LVALUE */
3576 * Now (or only) set cnt
3578 #ifdef STDIO_CNT_LVALUE
3579 PerlSIO_set_cnt(stdio, cnt);
3580 #else /* STDIO_CNT_LVALUE */
3581 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3582 PerlSIO_set_ptr(stdio,
3583 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3585 #else /* STDIO_PTR_LVAL_SETS_CNT */
3587 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3588 #endif /* STDIO_CNT_LVALUE */
3595 PerlIOStdio_fill(pTHX_ PerlIO *f)
3599 PERL_UNUSED_CONTEXT;
3600 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3602 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3605 * fflush()ing read-only streams can cause trouble on some stdio-s
3607 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3608 if (PerlSIO_fflush(stdio) != 0)
3612 c = PerlSIO_fgetc(stdio);
3615 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3617 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3622 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3624 #ifdef STDIO_BUFFER_WRITABLE
3625 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3626 /* Fake ungetc() to the real buffer in case system's ungetc
3629 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3630 SSize_t cnt = PerlSIO_get_cnt(stdio);
3631 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3632 if (ptr == base+1) {
3633 *--ptr = (STDCHAR) c;
3634 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3635 if (PerlSIO_feof(stdio))
3636 PerlSIO_clearerr(stdio);
3642 if (PerlIO_has_cntptr(f)) {
3644 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3650 /* If buffer snoop scheme above fails fall back to
3653 if (PerlSIO_ungetc(c, stdio) != c)
3661 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3662 sizeof(PerlIO_funcs),
3664 sizeof(PerlIOStdio),
3665 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3669 PerlIOBase_binmode, /* binmode */
3683 PerlIOStdio_clearerr,
3684 PerlIOStdio_setlinebuf,
3686 PerlIOStdio_get_base,
3687 PerlIOStdio_get_bufsiz,
3692 #ifdef USE_STDIO_PTR
3693 PerlIOStdio_get_ptr,
3694 PerlIOStdio_get_cnt,
3695 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3696 PerlIOStdio_set_ptrcnt,
3699 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3704 #endif /* USE_STDIO_PTR */
3707 /* Note that calls to PerlIO_exportFILE() are reversed using
3708 * PerlIO_releaseFILE(), not importFILE. */
3710 PerlIO_exportFILE(PerlIO * f, const char *mode)
3714 if (PerlIOValid(f)) {
3716 int fd = PerlIO_fileno(f);
3721 if (!mode || !*mode) {
3722 mode = PerlIO_modestr(f, buf);
3724 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3728 /* De-link any lower layers so new :stdio sticks */
3730 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3731 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3733 PerlIOUnix_refcnt_inc(fileno(stdio));
3734 /* Link previous lower layers under new one */
3738 /* restore layers list */
3748 PerlIO_findFILE(PerlIO *f)
3753 if (l->tab == &PerlIO_stdio) {
3754 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3757 l = *PerlIONext(&l);
3759 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3760 /* However, we're not really exporting a FILE * to someone else (who
3761 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3762 So we need to undo its reference count increase on the underlying file
3763 descriptor. We have to do this, because if the loop above returns you
3764 the FILE *, then *it* didn't increase any reference count. So there's
3765 only one way to be consistent. */
3766 stdio = PerlIO_exportFILE(f, NULL);
3768 const int fd = fileno(stdio);
3770 PerlIOUnix_refcnt_dec(fd);
3775 /* Use this to reverse PerlIO_exportFILE calls. */
3777 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3782 if (l->tab == &PerlIO_stdio) {
3783 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3784 if (s->stdio == f) { /* not in a loop */
3785 const int fd = fileno(f);
3787 PerlIOUnix_refcnt_dec(fd);
3790 PerlIO_pop(aTHX_ p);
3800 /*--------------------------------------------------------------------------------------*/
3802 * perlio buffer layer
3806 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3808 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3809 const int fd = PerlIO_fileno(f);
3810 if (fd >= 0 && PerlLIO_isatty(fd)) {
3811 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3813 if (*PerlIONext(f)) {
3814 const Off_t posn = PerlIO_tell(PerlIONext(f));
3815 if (posn != (Off_t) - 1) {
3819 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3823 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3824 IV n, const char *mode, int fd, int imode, int perm,
3825 PerlIO *f, int narg, SV **args)
3827 if (PerlIOValid(f)) {
3828 PerlIO *next = PerlIONext(f);
3830 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3831 if (tab && tab->Open)
3833 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3835 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3840 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3842 if (*mode == IoTYPE_IMPLICIT) {
3848 if (tab && tab->Open)
3849 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3852 SETERRNO(EINVAL, LIB_INVARG);
3854 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3856 * if push fails during open, open fails. close will pop us.
3861 fd = PerlIO_fileno(f);
3862 if (init && fd == 2) {
3864 * Initial stderr is unbuffered
3866 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3868 #ifdef PERLIO_USING_CRLF
3869 # ifdef PERLIO_IS_BINMODE_FD
3870 if (PERLIO_IS_BINMODE_FD(fd))
3871 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3875 * do something about failing setmode()? --jhi
3877 PerlLIO_setmode(fd, O_BINARY);
3880 /* Enable line buffering with record-oriented regular files
3881 * so we don't introduce an extraneous record boundary when
3882 * the buffer fills up.
3884 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3886 if (PerlLIO_fstat(fd, &st) == 0
3887 && S_ISREG(st.st_mode)
3888 && (st.st_fab_rfm == FAB$C_VAR
3889 || st.st_fab_rfm == FAB$C_VFC)) {
3890 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
3901 * This "flush" is akin to sfio's sync in that it handles files in either
3902 * read or write state. For write state, we put the postponed data through
3903 * the next layers. For read state, we seek() the next layers to the
3904 * offset given by current position in the buffer, and discard the buffer
3905 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3906 * in any case?). Then the pass the stick further in chain.
3909 PerlIOBuf_flush(pTHX_ PerlIO *f)
3911 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3913 PerlIO *n = PerlIONext(f);
3914 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3916 * write() the buffer
3918 const STDCHAR *buf = b->buf;
3919 const STDCHAR *p = buf;
3920 while (p < b->ptr) {
3921 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3925 else if (count < 0 || PerlIO_error(n)) {
3926 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3931 b->posn += (p - buf);
3933 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3934 STDCHAR *buf = PerlIO_get_base(f);
3936 * Note position change
3938 b->posn += (b->ptr - buf);
3939 if (b->ptr < b->end) {
3940 /* We did not consume all of it - try and seek downstream to
3941 our logical position
3943 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3944 /* Reload n as some layers may pop themselves on seek */
3945 b->posn = PerlIO_tell(n = PerlIONext(f));
3948 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3949 data is lost for good - so return saying "ok" having undone
3952 b->posn -= (b->ptr - buf);
3957 b->ptr = b->end = b->buf;
3958 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3959 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3960 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3965 /* This discards the content of the buffer after b->ptr, and rereads
3966 * the buffer from the position off in the layer downstream; here off
3967 * is at offset corresponding to b->ptr - b->buf.
3970 PerlIOBuf_fill(pTHX_ PerlIO *f)
3972 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3973 PerlIO *n = PerlIONext(f);
3976 * Down-stream flush is defined not to loose read data so is harmless.
3977 * we would not normally be fill'ing if there was data left in anycase.
3979 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
3981 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
3982 PerlIOBase_flush_linebuf(aTHX);
3985 PerlIO_get_base(f); /* allocate via vtable */
3987 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
3989 b->ptr = b->end = b->buf;
3991 if (!PerlIOValid(n)) {
3992 PerlIOBase(f)->flags |= PERLIO_F_EOF;
3996 if (PerlIO_fast_gets(n)) {
3998 * Layer below is also buffered. We do _NOT_ want to call its
3999 * ->Read() because that will loop till it gets what we asked for
4000 * which may hang on a pipe etc. Instead take anything it has to
4001 * hand, or ask it to fill _once_.
4003 avail = PerlIO_get_cnt(n);
4005 avail = PerlIO_fill(n);
4007 avail = PerlIO_get_cnt(n);
4009 if (!PerlIO_error(n) && PerlIO_eof(n))
4014 STDCHAR *ptr = PerlIO_get_ptr(n);
4015 const SSize_t cnt = avail;
4016 if (avail > (SSize_t)b->bufsiz)
4018 Copy(ptr, b->buf, avail, STDCHAR);
4019 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4023 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4027 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4029 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4032 b->end = b->buf + avail;
4033 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4038 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4040 if (PerlIOValid(f)) {
4041 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4044 return PerlIOBase_read(aTHX_ f, vbuf, count);
4050 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4052 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4053 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4056 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4061 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4063 * Buffer is already a read buffer, we can overwrite any chars
4064 * which have been read back to buffer start
4066 avail = (b->ptr - b->buf);
4070 * Buffer is idle, set it up so whole buffer is available for
4074 b->end = b->buf + avail;
4076 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4078 * Buffer extends _back_ from where we are now
4080 b->posn -= b->bufsiz;
4082 if ((SSize_t) count >= 0 && avail > (SSize_t) count) {
4084 * If we have space for more than count, just move count
4092 * In simple stdio-like ungetc() case chars will be already
4095 if (buf != b->ptr) {
4096 Copy(buf, b->ptr, avail, STDCHAR);
4100 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4104 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4110 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4112 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4113 const STDCHAR *buf = (const STDCHAR *) vbuf;
4114 const STDCHAR *flushptr = buf;
4118 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4120 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4121 if (PerlIO_flush(f) != 0) {
4125 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4126 flushptr = buf + count;
4127 while (flushptr > buf && *(flushptr - 1) != '\n')
4131 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4132 if ((SSize_t) count >= 0 && (SSize_t) count < avail)
4134 if (flushptr > buf && flushptr <= buf + avail)
4135 avail = flushptr - buf;
4136 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4138 Copy(buf, b->ptr, avail, STDCHAR);
4143 if (buf == flushptr)
4146 if (b->ptr >= (b->buf + b->bufsiz))
4147 if (PerlIO_flush(f) == -1)
4150 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4156 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4159 if ((code = PerlIO_flush(f)) == 0) {
4160 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4161 code = PerlIO_seek(PerlIONext(f), offset, whence);
4163 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4164 b->posn = PerlIO_tell(PerlIONext(f));
4171 PerlIOBuf_tell(pTHX_ PerlIO *f)
4173 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4175 * b->posn is file position where b->buf was read, or will be written
4177 Off_t posn = b->posn;
4178 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4179 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4181 /* As O_APPEND files are normally shared in some sense it is better
4186 /* when file is NOT shared then this is sufficient */
4187 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4189 posn = b->posn = PerlIO_tell(PerlIONext(f));
4193 * If buffer is valid adjust position by amount in buffer
4195 posn += (b->ptr - b->buf);
4201 PerlIOBuf_popped(pTHX_ PerlIO *f)
4203 const IV code = PerlIOBase_popped(aTHX_ f);
4204 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4205 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4208 b->ptr = b->end = b->buf = NULL;
4209 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4214 PerlIOBuf_close(pTHX_ PerlIO *f)
4216 const IV code = PerlIOBase_close(aTHX_ f);
4217 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4218 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4221 b->ptr = b->end = b->buf = NULL;
4222 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4227 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4229 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4236 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4238 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4241 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4242 return (b->end - b->ptr);
4247 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4249 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4250 PERL_UNUSED_CONTEXT;
4254 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4255 Newxz(b->buf,b->bufsiz, STDCHAR);
4257 b->buf = (STDCHAR *) & b->oneword;
4258 b->bufsiz = sizeof(b->oneword);
4260 b->end = b->ptr = b->buf;
4266 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4268 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4271 return (b->end - b->buf);
4275 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4277 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4279 PERL_UNUSED_ARG(cnt);
4284 assert(PerlIO_get_cnt(f) == cnt);
4285 assert(b->ptr >= b->buf);
4286 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4290 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4292 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4297 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4298 sizeof(PerlIO_funcs),
4301 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4305 PerlIOBase_binmode, /* binmode */
4319 PerlIOBase_clearerr,
4320 PerlIOBase_setlinebuf,
4325 PerlIOBuf_set_ptrcnt,
4328 /*--------------------------------------------------------------------------------------*/
4330 * Temp layer to hold unread chars when cannot do it any other way
4334 PerlIOPending_fill(pTHX_ PerlIO *f)
4337 * Should never happen
4344 PerlIOPending_close(pTHX_ PerlIO *f)
4347 * A tad tricky - flush pops us, then we close new top
4350 return PerlIO_close(f);
4354 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4357 * A tad tricky - flush pops us, then we seek new top
4360 return PerlIO_seek(f, offset, whence);
4365 PerlIOPending_flush(pTHX_ PerlIO *f)
4367 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4368 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4372 PerlIO_pop(aTHX_ f);
4377 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4383 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4388 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4390 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4391 PerlIOl * const l = PerlIOBase(f);
4393 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4394 * etc. get muddled when it changes mid-string when we auto-pop.
4396 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4397 (PerlIOBase(PerlIONext(f))->
4398 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4403 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4405 SSize_t avail = PerlIO_get_cnt(f);
4407 if ((SSize_t) count >= 0 && (SSize_t)count < avail)
4410 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4411 if (got >= 0 && got < (SSize_t)count) {
4412 const SSize_t more =
4413 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4414 if (more >= 0 || got == 0)
4420 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4421 sizeof(PerlIO_funcs),
4424 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4425 PerlIOPending_pushed,
4428 PerlIOBase_binmode, /* binmode */
4437 PerlIOPending_close,
4438 PerlIOPending_flush,
4442 PerlIOBase_clearerr,
4443 PerlIOBase_setlinebuf,
4448 PerlIOPending_set_ptrcnt,
4453 /*--------------------------------------------------------------------------------------*/
4455 * crlf - translation On read translate CR,LF to "\n" we do this by
4456 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4457 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4459 * c->nl points on the first byte of CR LF pair when it is temporarily
4460 * replaced by LF, or to the last CR of the buffer. In the former case
4461 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4462 * that it ends at c->nl; these two cases can be distinguished by
4463 * *c->nl. c->nl is set during _getcnt() call, and unset during
4464 * _unread() and _flush() calls.
4465 * It only matters for read operations.
4469 PerlIOBuf base; /* PerlIOBuf stuff */
4470 STDCHAR *nl; /* Position of crlf we "lied" about in the
4474 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4475 * Otherwise the :crlf layer would always revert back to
4479 S_inherit_utf8_flag(PerlIO *f)
4481 PerlIO *g = PerlIONext(f);
4482 if (PerlIOValid(g)) {
4483 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4484 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4490 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4493 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4494 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4496 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4497 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4498 PerlIOBase(f)->flags);
4501 /* If the old top layer is a CRLF layer, reactivate it (if
4502 * necessary) and remove this new layer from the stack */
4503 PerlIO *g = PerlIONext(f);
4504 if (PerlIOValid(g)) {
4505 PerlIOl *b = PerlIOBase(g);
4506 if (b && b->tab == &PerlIO_crlf) {
4507 if (!(b->flags & PERLIO_F_CRLF))
4508 b->flags |= PERLIO_F_CRLF;
4509 S_inherit_utf8_flag(g);
4510 PerlIO_pop(aTHX_ f);
4515 S_inherit_utf8_flag(f);
4521 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4523 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4524 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4525 *(c->nl) = NATIVE_0xd;
4528 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4529 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4531 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4532 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4534 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4539 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4540 b->end = b->ptr = b->buf + b->bufsiz;
4541 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4542 b->posn -= b->bufsiz;
4544 while (count > 0 && b->ptr > b->buf) {
4545 const int ch = *--buf;
4547 if (b->ptr - 2 >= b->buf) {
4548 *--(b->ptr) = NATIVE_0xa;
4549 *--(b->ptr) = NATIVE_0xd;
4554 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4555 *--(b->ptr) = NATIVE_0xa; /* Works even if 0xa ==
4569 unread += PerlIOBase_unread(aTHX_ f, (const STDCHAR *) vbuf + unread, count);
4574 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4576 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4578 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4581 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4582 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4583 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == NATIVE_0xd)) {
4584 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4586 while (nl < b->end && *nl != NATIVE_0xd)
4588 if (nl < b->end && *nl == NATIVE_0xd) {
4590 if (nl + 1 < b->end) {
4591 if (nl[1] == NATIVE_0xa) {
4597 * Not CR,LF but just CR
4605 * Blast - found CR as last char in buffer
4610 * They may not care, defer work as long as
4614 return (nl - b->ptr);
4618 b->ptr++; /* say we have read it as far as
4619 * flush() is concerned */
4620 b->buf++; /* Leave space in front of buffer */
4621 /* Note as we have moved buf up flush's
4623 will naturally make posn point at CR
4625 b->bufsiz--; /* Buffer is thus smaller */
4626 code = PerlIO_fill(f); /* Fetch some more */
4627 b->bufsiz++; /* Restore size for next time */
4628 b->buf--; /* Point at space */
4629 b->ptr = nl = b->buf; /* Which is what we hand
4631 *nl = NATIVE_0xd; /* Fill in the CR */
4633 goto test; /* fill() call worked */
4635 * CR at EOF - just fall through
4637 /* Should we clear EOF though ??? */
4642 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4648 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4650 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4651 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4657 if (ptr == b->end && *c->nl == NATIVE_0xd) {
4658 /* Deferred CR at end of buffer case - we lied about count */
4671 * Test code - delete when it works ...
4673 IV flags = PerlIOBase(f)->flags;
4674 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4675 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == NATIVE_0xd) {
4676 /* Deferred CR at end of buffer case - we lied about count */
4682 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4683 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4684 flags, c->nl, b->end, cnt);
4691 * They have taken what we lied about
4693 *(c->nl) = NATIVE_0xd;
4699 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4703 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4705 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4706 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4708 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4709 const STDCHAR *buf = (const STDCHAR *) vbuf;
4710 const STDCHAR * const ebuf = buf + count;
4713 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4715 while (buf < ebuf) {
4716 const STDCHAR * const eptr = b->buf + b->bufsiz;
4717 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4718 while (buf < ebuf && b->ptr < eptr) {
4720 if ((b->ptr + 2) > eptr) {
4728 *(b->ptr)++ = NATIVE_0xd; /* CR */
4729 *(b->ptr)++ = NATIVE_0xa; /* LF */
4731 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4738 *(b->ptr)++ = *buf++;
4740 if (b->ptr >= eptr) {
4746 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4748 return (buf - (STDCHAR *) vbuf);
4753 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4755 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4757 *(c->nl) = NATIVE_0xd;
4760 return PerlIOBuf_flush(aTHX_ f);
4764 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4766 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4767 /* In text mode - flush any pending stuff and flip it */
4768 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4769 #ifndef PERLIO_USING_CRLF
4770 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4771 PerlIO_pop(aTHX_ f);
4777 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4778 sizeof(PerlIO_funcs),
4781 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4783 PerlIOBuf_popped, /* popped */
4785 PerlIOCrlf_binmode, /* binmode */
4789 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4790 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4791 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4799 PerlIOBase_clearerr,
4800 PerlIOBase_setlinebuf,
4805 PerlIOCrlf_set_ptrcnt,
4809 Perl_PerlIO_stdin(pTHX)
4813 PerlIO_stdstreams(aTHX);
4815 return (PerlIO*)&PL_perlio[1];
4819 Perl_PerlIO_stdout(pTHX)
4823 PerlIO_stdstreams(aTHX);
4825 return (PerlIO*)&PL_perlio[2];
4829 Perl_PerlIO_stderr(pTHX)
4833 PerlIO_stdstreams(aTHX);
4835 return (PerlIO*)&PL_perlio[3];
4838 /*--------------------------------------------------------------------------------------*/
4841 PerlIO_getname(PerlIO *f, char *buf)
4846 bool exported = FALSE;
4847 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
4849 stdio = PerlIO_exportFILE(f,0);
4853 name = fgetname(stdio, buf);
4854 if (exported) PerlIO_releaseFILE(f,stdio);
4859 PERL_UNUSED_ARG(buf);
4860 Perl_croak_nocontext("Don't know how to get file name");
4866 /*--------------------------------------------------------------------------------------*/
4868 * Functions which can be called on any kind of PerlIO implemented in
4872 #undef PerlIO_fdopen
4874 PerlIO_fdopen(int fd, const char *mode)
4877 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
4882 PerlIO_open(const char *path, const char *mode)
4885 SV *name = sv_2mortal(newSVpv(path, 0));
4886 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
4889 #undef Perlio_reopen
4891 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
4894 SV *name = sv_2mortal(newSVpv(path,0));
4895 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
4900 PerlIO_getc(PerlIO *f)
4904 if ( 1 == PerlIO_read(f, buf, 1) ) {
4905 return (unsigned char) buf[0];
4910 #undef PerlIO_ungetc
4912 PerlIO_ungetc(PerlIO *f, int ch)
4917 if (PerlIO_unread(f, &buf, 1) == 1)
4925 PerlIO_putc(PerlIO *f, int ch)
4929 return PerlIO_write(f, &buf, 1);
4934 PerlIO_puts(PerlIO *f, const char *s)
4937 return PerlIO_write(f, s, strlen(s));
4940 #undef PerlIO_rewind
4942 PerlIO_rewind(PerlIO *f)
4945 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
4949 #undef PerlIO_vprintf
4951 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
4960 Perl_va_copy(ap, apc);
4961 sv = vnewSVpvf(fmt, &apc);
4964 sv = vnewSVpvf(fmt, &ap);
4966 s = SvPV_const(sv, len);
4967 wrote = PerlIO_write(f, s, len);
4972 #undef PerlIO_printf
4974 PerlIO_printf(PerlIO *f, const char *fmt, ...)
4979 result = PerlIO_vprintf(f, fmt, ap);
4984 #undef PerlIO_stdoutf
4986 PerlIO_stdoutf(const char *fmt, ...)
4992 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
4997 #undef PerlIO_tmpfile
4999 PerlIO_tmpfile(void)
5006 const int fd = win32_tmpfd();
5008 f = PerlIO_fdopen(fd, "w+b");
5010 # if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5012 char tempname[] = "/tmp/PerlIO_XXXXXX";
5013 const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
5015 int old_umask = umask(0600);
5017 * I have no idea how portable mkstemp() is ... NI-S
5019 if (tmpdir && *tmpdir) {
5020 /* if TMPDIR is set and not empty, we try that first */
5021 sv = newSVpv(tmpdir, 0);
5022 sv_catpv(sv, tempname + 4);
5023 fd = mkstemp(SvPVX(sv));
5028 /* else we try /tmp */
5029 fd = mkstemp(tempname);
5034 sv_catpv(sv, tempname + 4);
5035 fd = mkstemp(SvPVX(sv));
5039 f = PerlIO_fdopen(fd, "w+");
5041 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5042 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5045 # else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5046 FILE * const stdio = PerlSIO_tmpfile();
5049 f = PerlIO_fdopen(fileno(stdio), "w+");
5051 # endif /* else HAS_MKSTEMP */
5052 #endif /* else WIN32 */
5059 #endif /* PERLIO_IS_STDIO */
5061 /*======================================================================================*/
5063 * Now some functions in terms of above which may be needed even if we are
5064 * not in true PerlIO mode
5067 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5070 const char *direction = NULL;
5073 * Need to supply default layer info from open.pm
5079 if (mode && mode[0] != 'r') {
5080 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5081 direction = "open>";
5083 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5084 direction = "open<";
5089 layers = cop_hints_fetch_pvn(PL_curcop, direction, 5, 0, 0);
5092 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5097 #undef PerlIO_setpos
5099 PerlIO_setpos(PerlIO *f, SV *pos)
5104 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5105 if (f && len == sizeof(Off_t))
5106 return PerlIO_seek(f, *posn, SEEK_SET);
5108 SETERRNO(EINVAL, SS_IVCHAN);
5112 #undef PerlIO_setpos
5114 PerlIO_setpos(PerlIO *f, SV *pos)
5119 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5120 if (f && len == sizeof(Fpos_t)) {
5121 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5122 return fsetpos64(f, fpos);
5124 return fsetpos(f, fpos);
5128 SETERRNO(EINVAL, SS_IVCHAN);
5134 #undef PerlIO_getpos
5136 PerlIO_getpos(PerlIO *f, SV *pos)
5139 Off_t posn = PerlIO_tell(f);
5140 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5141 return (posn == (Off_t) - 1) ? -1 : 0;
5144 #undef PerlIO_getpos
5146 PerlIO_getpos(PerlIO *f, SV *pos)
5151 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5152 code = fgetpos64(f, &fpos);
5154 code = fgetpos(f, &fpos);
5156 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5161 #if !defined(HAS_VPRINTF)
5164 vprintf(char *pat, char *args)
5166 _doprnt(pat, args, stdout);
5167 return 0; /* wrong, but perl doesn't use the return
5172 vfprintf(FILE *fd, char *pat, char *args)
5174 _doprnt(pat, args, fd);
5175 return 0; /* wrong, but perl doesn't use the return
5183 * c-indentation-style: bsd
5185 * indent-tabs-mode: nil
5188 * ex: set ts=8 sts=4 sw=4 et: