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
38 # ifndef USE_CROSS_COMPILE
45 #define PERLIO_NOT_STDIO 0
46 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
52 * This file provides those parts of PerlIO abstraction
53 * which are not #defined in perlio.h.
54 * Which these are depends on various Configure #ifdef's
58 #define PERL_IN_PERLIO_C
61 #ifdef PERL_IMPLICIT_CONTEXT
69 /* Missing proto on LynxOS */
77 #define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags)
79 /* Call the callback or PerlIOBase, and return failure. */
80 #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \
81 if (PerlIOValid(f)) { \
82 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
83 if (tab && tab->callback) \
84 return (*tab->callback) args; \
86 return PerlIOBase_ ## base args; \
89 SETERRNO(EBADF, SS_IVCHAN); \
92 /* Call the callback or fail, and return failure. */
93 #define Perl_PerlIO_or_fail(f, callback, failure, args) \
94 if (PerlIOValid(f)) { \
95 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
96 if (tab && tab->callback) \
97 return (*tab->callback) args; \
98 SETERRNO(EINVAL, LIB_INVARG); \
101 SETERRNO(EBADF, SS_IVCHAN); \
104 /* Call the callback or PerlIOBase, and be void. */
105 #define Perl_PerlIO_or_Base_void(f, callback, base, args) \
106 if (PerlIOValid(f)) { \
107 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
108 if (tab && tab->callback) \
109 (*tab->callback) args; \
111 PerlIOBase_ ## base args; \
114 SETERRNO(EBADF, SS_IVCHAN)
116 /* Call the callback or fail, and be void. */
117 #define Perl_PerlIO_or_fail_void(f, callback, args) \
118 if (PerlIOValid(f)) { \
119 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;\
120 if (tab && tab->callback) \
121 (*tab->callback) args; \
123 SETERRNO(EINVAL, LIB_INVARG); \
126 SETERRNO(EBADF, SS_IVCHAN)
128 #if defined(__osf__) && _XOPEN_SOURCE < 500
129 extern int fseeko(FILE *, off_t, int);
130 extern off_t ftello(FILE *);
133 #define NATIVE_0xd CR_NATIVE
134 #define NATIVE_0xa LF_NATIVE
138 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
141 perlsio_binmode(FILE *fp, int iotype, int mode)
144 * This used to be contents of do_binmode in doio.c
148 PERL_UNUSED_ARG(iotype);
150 if (PerlLIO_setmode(fp, mode) != -1) {
152 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
159 # if defined(USEMYBINMODE)
161 # if defined(__CYGWIN__)
162 PERL_UNUSED_ARG(iotype);
164 if (my_binmode(fp, iotype, mode) != FALSE)
170 PERL_UNUSED_ARG(iotype);
171 PERL_UNUSED_ARG(mode);
179 #define O_ACCMODE 3 /* Assume traditional implementation */
183 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
185 const int result = rawmode & O_ACCMODE;
190 ptype = IoTYPE_RDONLY;
193 ptype = IoTYPE_WRONLY;
201 *writing = (result != O_RDONLY);
203 if (result == O_RDONLY) {
207 else if (rawmode & O_APPEND) {
209 if (result != O_WRONLY)
214 if (result == O_WRONLY)
221 if (rawmode & O_BINARY)
227 #ifndef PERLIO_LAYERS
229 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
231 if (!names || !*names
232 || strEQ(names, ":crlf")
233 || strEQ(names, ":raw")
234 || strEQ(names, ":bytes")
238 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
246 PerlIO_destruct(pTHX)
251 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
254 PERL_UNUSED_ARG(iotype);
255 PERL_UNUSED_ARG(mode);
256 PERL_UNUSED_ARG(names);
259 return perlsio_binmode(fp, iotype, mode);
264 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
266 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
269 #ifdef PERL_IMPLICIT_SYS
270 return PerlSIO_fdupopen(f);
273 return win32_fdupopen(f);
276 const int fd = PerlLIO_dup(PerlIO_fileno(f));
280 const int omode = djgpp_get_stream_mode(f);
282 const int omode = fcntl(fd, F_GETFL);
284 PerlIO_intmode2str(omode,mode,NULL);
285 /* the r+ is a hack */
286 return PerlIO_fdopen(fd, mode);
291 SETERRNO(EBADF, SS_IVCHAN);
301 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
305 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
306 int imode, int perm, PerlIO *old, int narg, SV **args)
310 Perl_croak(aTHX_ "More than one argument to open");
312 if (*args == &PL_sv_undef)
313 return PerlIO_tmpfile();
315 const char *name = SvPV_nolen_const(*args);
316 if (!IS_SAFE_PATHNAME(*args, "open"))
319 if (*mode == IoTYPE_NUMERIC) {
320 fd = PerlLIO_open3(name, imode, perm);
322 return PerlIO_fdopen(fd, mode + 1);
325 return PerlIO_reopen(name, mode, old);
328 return PerlIO_open(name, mode);
333 return PerlIO_fdopen(fd, (char *) mode);
338 XS(XS_PerlIO__Layer__find)
342 Perl_croak(aTHX_ "Usage class->find(name[,load])");
344 const char * const name = SvPV_nolen_const(ST(1));
345 ST(0) = (strEQ(name, "crlf")
346 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
353 Perl_boot_core_PerlIO(pTHX)
355 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
361 #ifdef PERLIO_IS_STDIO
368 * Does nothing (yet) except force this file to be included in perl
369 * binary. That allows this file to force inclusion of other functions
370 * that may be required by loadable extensions e.g. for
371 * FileHandle::tmpfile
375 #undef PerlIO_tmpfile
382 #else /* PERLIO_IS_STDIO */
390 * This section is just to make sure these functions get pulled in from
394 #undef PerlIO_tmpfile
406 * Force this file to be included in perl binary. Which allows this
407 * file to force inclusion of other functions that may be required by
408 * loadable extensions e.g. for FileHandle::tmpfile
412 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
413 * results in a lot of lseek()s to regular files and lot of small
416 sfset(sfstdout, SF_SHARE, 0);
419 /* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
421 PerlIO_importFILE(FILE *stdio, const char *mode)
423 const int fd = fileno(stdio);
424 if (!mode || !*mode) {
427 return PerlIO_fdopen(fd, mode);
431 PerlIO_findFILE(PerlIO *pio)
433 const int fd = PerlIO_fileno(pio);
434 FILE * const f = fdopen(fd, "r+");
436 if (!f && errno == EINVAL)
438 if (!f && errno == EINVAL)
445 /*======================================================================================*/
447 * Implement all the PerlIO interface ourselves.
453 PerlIO_debug(const char *fmt, ...)
458 if (!PL_perlio_debug_fd) {
460 PerlProc_getuid() == PerlProc_geteuid() &&
461 PerlProc_getgid() == PerlProc_getegid()) {
462 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
465 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
467 PL_perlio_debug_fd = -1;
469 /* tainting or set*id, so ignore the environment, and ensure we
470 skip these tests next time through. */
471 PL_perlio_debug_fd = -1;
474 if (PL_perlio_debug_fd > 0) {
476 const char * const s = CopFILE(PL_curcop);
477 /* Use fixed buffer as sv_catpvf etc. needs SVs */
479 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
480 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
481 PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2);
483 const char *s = CopFILE(PL_curcop);
485 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
486 (IV) CopLINE(PL_curcop));
487 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
489 s = SvPV_const(sv, len);
490 PerlLIO_write(PL_perlio_debug_fd, s, len);
497 /*--------------------------------------------------------------------------------------*/
500 * Inner level routines
503 /* check that the head field of each layer points back to the head */
506 # define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
508 PerlIO_verify_head(pTHX_ PerlIO *f)
514 p = head = PerlIOBase(f)->head;
517 assert(p->head == head);
518 if (p == (PerlIOl*)f)
525 # define VERIFY_HEAD(f)
530 * Table of pointers to the PerlIO structs (malloc'ed)
532 #define PERLIO_TABLE_SIZE 64
535 PerlIO_init_table(pTHX)
539 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
545 PerlIO_allocate(pTHX)
549 * Find a free slot in the table, allocating new table as necessary
554 while ((f = *last)) {
556 last = (PerlIOl **) (f);
557 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
558 if (!((++f)->next)) {
559 f->flags = 0; /* lockcnt */
566 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
570 *last = (PerlIOl*) f++;
571 f->flags = 0; /* lockcnt */
577 #undef PerlIO_fdupopen
579 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
581 if (PerlIOValid(f)) {
582 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
583 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
585 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
587 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
591 SETERRNO(EBADF, SS_IVCHAN);
597 PerlIO_cleantable(pTHX_ PerlIOl **tablep)
599 PerlIOl * const table = *tablep;
602 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
603 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
604 PerlIOl * const f = table + i;
606 PerlIO_close(&(f->next));
616 PerlIO_list_alloc(pTHX)
620 Newxz(list, 1, PerlIO_list_t);
626 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
629 if (--list->refcnt == 0) {
632 for (i = 0; i < list->cur; i++)
633 SvREFCNT_dec(list->array[i].arg);
634 Safefree(list->array);
642 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
648 if (list->cur >= list->len) {
651 Renew(list->array, list->len, PerlIO_pair_t);
653 Newx(list->array, list->len, PerlIO_pair_t);
655 p = &(list->array[list->cur++]);
657 if ((p->arg = arg)) {
658 SvREFCNT_inc_simple_void_NN(arg);
663 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
665 PerlIO_list_t *list = NULL;
668 list = PerlIO_list_alloc(aTHX);
669 for (i=0; i < proto->cur; i++) {
670 SV *arg = proto->array[i].arg;
673 arg = sv_dup(arg, param);
675 PERL_UNUSED_ARG(param);
677 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
684 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
687 PerlIOl **table = &proto->Iperlio;
690 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
691 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
692 PerlIO_init_table(aTHX);
693 PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto);
694 while ((f = *table)) {
696 table = (PerlIOl **) (f++);
697 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
699 (void) fp_dup(&(f->next), 0, param);
706 PERL_UNUSED_ARG(proto);
707 PERL_UNUSED_ARG(param);
712 PerlIO_destruct(pTHX)
715 PerlIOl **table = &PL_perlio;
718 PerlIO_debug("Destruct %p\n",(void*)aTHX);
720 while ((f = *table)) {
722 table = (PerlIOl **) (f++);
723 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
724 PerlIO *x = &(f->next);
727 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
728 PerlIO_debug("Destruct popping %s\n", l->tab->name);
742 PerlIO_pop(pTHX_ PerlIO *f)
744 const PerlIOl *l = *f;
747 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f,
748 l->tab ? l->tab->name : "(Null)");
749 if (l->tab && l->tab->Popped) {
751 * If popped returns non-zero do not free its layer structure
752 * it has either done so itself, or it is shared and still in
755 if ((*l->tab->Popped) (aTHX_ f) != 0)
758 if (PerlIO_lockcnt(f)) {
759 /* we're in use; defer freeing the structure */
760 PerlIOBase(f)->flags = PERLIO_F_CLEARED;
761 PerlIOBase(f)->tab = NULL;
771 /* Return as an array the stack of layers on a filehandle. Note that
772 * the stack is returned top-first in the array, and there are three
773 * times as many array elements as there are layers in the stack: the
774 * first element of a layer triplet is the name, the second one is the
775 * arguments, and the third one is the flags. */
778 PerlIO_get_layers(pTHX_ PerlIO *f)
781 AV * const av = newAV();
783 if (PerlIOValid(f)) {
784 PerlIOl *l = PerlIOBase(f);
787 /* There is some collusion in the implementation of
788 XS_PerlIO_get_layers - it knows that name and flags are
789 generated as fresh SVs here, and takes advantage of that to
790 "copy" them by taking a reference. If it changes here, it needs
791 to change there too. */
792 SV * const name = l->tab && l->tab->name ?
793 newSVpv(l->tab->name, 0) : &PL_sv_undef;
794 SV * const arg = l->tab && l->tab->Getarg ?
795 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
798 av_push(av, newSViv((IV)l->flags));
806 /*--------------------------------------------------------------------------------------*/
808 * XS Interface for perl code
812 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
816 if ((SSize_t) len <= 0)
818 for (i = 0; i < PL_known_layers->cur; i++) {
819 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
820 const STRLEN this_len = strlen(f->name);
821 if (this_len == len && memEQ(f->name, name, len)) {
822 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
826 if (load && PL_subname && PL_def_layerlist
827 && PL_def_layerlist->cur >= 2) {
828 if (PL_in_load_module) {
829 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
832 SV * const pkgsv = newSVpvs("PerlIO");
833 SV * const layer = newSVpvn(name, len);
834 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
836 SAVEBOOL(PL_in_load_module);
838 SAVEGENERICSV(PL_warnhook);
839 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
841 PL_in_load_module = TRUE;
843 * The two SVs are magically freed by load_module
845 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
847 return PerlIO_find_layer(aTHX_ name, len, 0);
850 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
854 #ifdef USE_ATTRIBUTES_FOR_PERLIO
857 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
860 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
861 PerlIO * const ifp = IoIFP(io);
862 PerlIO * const ofp = IoOFP(io);
863 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
864 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
870 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
873 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
874 PerlIO * const ifp = IoIFP(io);
875 PerlIO * const ofp = IoOFP(io);
876 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
877 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
883 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
885 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
890 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
892 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
896 MGVTBL perlio_vtab = {
904 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
907 SV * const sv = SvRV(ST(1));
908 AV * const av = newAV();
912 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
914 mg = mg_find(sv, PERL_MAGIC_ext);
915 mg->mg_virtual = &perlio_vtab;
917 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
918 for (i = 2; i < items; i++) {
920 const char * const name = SvPV_const(ST(i), len);
921 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
923 av_push(av, SvREFCNT_inc_simple_NN(layer));
934 #endif /* USE_ATTIBUTES_FOR_PERLIO */
937 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
939 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
940 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
944 XS(XS_PerlIO__Layer__NoWarnings)
946 /* This is used as a %SIG{__WARN__} handler to suppress warnings
947 during loading of layers.
953 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
957 XS(XS_PerlIO__Layer__find)
963 Perl_croak(aTHX_ "Usage class->find(name[,load])");
966 const char * const name = SvPV_const(ST(1), len);
967 const bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
968 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
970 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
977 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
980 if (!PL_known_layers)
981 PL_known_layers = PerlIO_list_alloc(aTHX);
982 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
983 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
987 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
991 const char *s = names;
993 while (isSPACE(*s) || *s == ':')
998 const char *as = NULL;
1000 if (!isIDFIRST(*s)) {
1002 * Message is consistent with how attribute lists are
1003 * passed. Even though this means "foo : : bar" is
1004 * seen as an invalid separator character.
1006 const char q = ((*s == '\'') ? '"' : '\'');
1007 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1008 "Invalid separator character %c%c%c in PerlIO layer specification %s",
1010 SETERRNO(EINVAL, LIB_INVARG);
1015 } while (isWORDCHAR(*e));
1024 alen = (e - 1) - as;
1031 * It's a nul terminated string, not allowed
1032 * to \ the terminating null. Anything other
1033 * character is passed over.
1043 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1044 "Argument list not closed for PerlIO layer \"%.*s\"",
1056 PerlIO_funcs * const layer =
1057 PerlIO_find_layer(aTHX_ s, llen, 1);
1061 arg = newSVpvn(as, alen);
1062 PerlIO_list_push(aTHX_ av, layer,
1063 (arg) ? arg : &PL_sv_undef);
1067 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1080 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1083 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1084 #ifdef PERLIO_USING_CRLF
1087 if (PerlIO_stdio.Set_ptrcnt)
1088 tab = &PerlIO_stdio;
1090 PerlIO_debug("Pushing %s\n", tab->name);
1091 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1096 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1098 return av->array[n].arg;
1102 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1104 if (n >= 0 && n < av->cur) {
1105 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1106 av->array[n].funcs->name);
1107 return av->array[n].funcs;
1110 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1115 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1117 PERL_UNUSED_ARG(mode);
1118 PERL_UNUSED_ARG(arg);
1119 PERL_UNUSED_ARG(tab);
1120 if (PerlIOValid(f)) {
1122 PerlIO_pop(aTHX_ f);
1128 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1129 sizeof(PerlIO_funcs),
1132 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1152 NULL, /* get_base */
1153 NULL, /* get_bufsiz */
1156 NULL, /* set_ptrcnt */
1160 PerlIO_default_layers(pTHX)
1163 if (!PL_def_layerlist) {
1164 const char * const s = TAINTING_get ? NULL : PerlEnv_getenv("PERLIO");
1165 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1166 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1167 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1169 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1171 osLayer = &PerlIO_win32;
1174 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1175 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1176 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1177 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1178 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1179 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1180 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1181 PerlIO_list_push(aTHX_ PL_def_layerlist,
1182 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1185 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1188 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1191 if (PL_def_layerlist->cur < 2) {
1192 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1194 return PL_def_layerlist;
1198 Perl_boot_core_PerlIO(pTHX)
1200 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1201 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1204 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1205 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1209 PerlIO_default_layer(pTHX_ I32 n)
1212 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1215 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1218 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1219 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1222 PerlIO_stdstreams(pTHX)
1226 PerlIO_init_table(aTHX);
1227 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1228 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1229 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1234 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1237 if (tab->fsize != sizeof(PerlIO_funcs)) {
1239 "%s (%"UVuf") does not match %s (%"UVuf")",
1240 "PerlIO layer function table size", (UV)tab->fsize,
1241 "size expected by this perl", (UV)sizeof(PerlIO_funcs) );
1245 if (tab->size < sizeof(PerlIOl)) {
1247 "%s (%"UVuf") smaller than %s (%"UVuf")",
1248 "PerlIO layer instance size", (UV)tab->size,
1249 "size expected by this perl", (UV)sizeof(PerlIOl) );
1251 /* Real layer with a data area */
1254 Newxz(temp, tab->size, char);
1258 l->tab = (PerlIO_funcs*) tab;
1259 l->head = ((PerlIOl*)f)->head;
1261 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1262 (void*)f, tab->name,
1263 (mode) ? mode : "(Null)", (void*)arg);
1264 if (*l->tab->Pushed &&
1266 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1267 PerlIO_pop(aTHX_ f);
1276 /* Pseudo-layer where push does its own stack adjust */
1277 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1278 (mode) ? mode : "(Null)", (void*)arg);
1280 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1288 PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1289 IV n, const char *mode, int fd, int imode, int perm,
1290 PerlIO *old, int narg, SV **args)
1292 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_layer(aTHX_ 0));
1293 if (tab && tab->Open) {
1294 PerlIO* ret = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm, old, narg, args);
1295 if (ret && PerlIO_push(aTHX_ ret, self, mode, PerlIOArg) == NULL) {
1301 SETERRNO(EINVAL, LIB_INVARG);
1306 PerlIOBase_binmode(pTHX_ PerlIO *f)
1308 if (PerlIOValid(f)) {
1309 /* Is layer suitable for raw stream ? */
1310 if (PerlIOBase(f)->tab && PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1311 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1312 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1315 /* Not suitable - pop it */
1316 PerlIO_pop(aTHX_ f);
1324 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1326 PERL_UNUSED_ARG(mode);
1327 PERL_UNUSED_ARG(arg);
1328 PERL_UNUSED_ARG(tab);
1330 if (PerlIOValid(f)) {
1335 * Strip all layers that are not suitable for a raw stream
1338 while (t && (l = *t)) {
1339 if (l->tab && l->tab->Binmode) {
1340 /* Has a handler - normal case */
1341 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1343 /* Layer still there - move down a layer */
1352 /* No handler - pop it */
1353 PerlIO_pop(aTHX_ t);
1356 if (PerlIOValid(f)) {
1357 PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1358 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)");
1366 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1367 PerlIO_list_t *layers, IV n, IV max)
1371 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1373 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1384 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1388 save_scalar(PL_errgv);
1390 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1391 code = PerlIO_parse_layers(aTHX_ layers, names);
1393 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1395 PerlIO_list_free(aTHX_ layers);
1402 /*--------------------------------------------------------------------------------------*/
1404 * Given the abstraction above the public API functions
1408 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1410 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1411 (PerlIOBase(f) && PerlIOBase(f)->tab) ?
1412 PerlIOBase(f)->tab->name : "(Null)",
1413 iotype, mode, (names) ? names : "(Null)");
1416 /* Do not flush etc. if (e.g.) switching encodings.
1417 if a pushed layer knows it needs to flush lower layers
1418 (for example :unix which is never going to call them)
1419 it can do the flush when it is pushed.
1421 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1424 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1425 #ifdef PERLIO_USING_CRLF
1426 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1427 O_BINARY so we can look for it in mode.
1429 if (!(mode & O_BINARY)) {
1431 /* FIXME?: Looking down the layer stack seems wrong,
1432 but is a way of reaching past (say) an encoding layer
1433 to flip CRLF-ness of the layer(s) below
1436 /* Perhaps we should turn on bottom-most aware layer
1437 e.g. Ilya's idea that UNIX TTY could serve
1439 if (PerlIOBase(f)->tab &&
1440 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1442 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1443 /* Not in text mode - flush any pending stuff and flip it */
1445 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1447 /* Only need to turn it on in one layer so we are done */
1452 /* Not finding a CRLF aware layer presumably means we are binary
1453 which is not what was requested - so we failed
1454 We _could_ push :crlf layer but so could caller
1459 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1460 So code that used to be here is now in PerlIORaw_pushed().
1462 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1467 PerlIO__close(pTHX_ PerlIO *f)
1469 if (PerlIOValid(f)) {
1470 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1471 if (tab && tab->Close)
1472 return (*tab->Close)(aTHX_ f);
1474 return PerlIOBase_close(aTHX_ f);
1477 SETERRNO(EBADF, SS_IVCHAN);
1483 Perl_PerlIO_close(pTHX_ PerlIO *f)
1485 const int code = PerlIO__close(aTHX_ f);
1486 while (PerlIOValid(f)) {
1487 PerlIO_pop(aTHX_ f);
1488 if (PerlIO_lockcnt(f))
1489 /* we're in use; the 'pop' deferred freeing the structure */
1496 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1499 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1503 static PerlIO_funcs *
1504 PerlIO_layer_from_ref(pTHX_ SV *sv)
1508 * For any scalar type load the handler which is bundled with perl
1510 if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
1511 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1512 /* This isn't supposed to happen, since PerlIO::scalar is core,
1513 * but could happen anyway in smaller installs or with PAR */
1515 /* diag_listed_as: Unknown PerlIO layer "%s" */
1516 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1521 * For other types allow if layer is known but don't try and load it
1523 switch (SvTYPE(sv)) {
1525 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1527 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1529 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1531 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1538 PerlIO_resolve_layers(pTHX_ const char *layers,
1539 const char *mode, int narg, SV **args)
1542 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1545 PerlIO_stdstreams(aTHX);
1547 SV * const arg = *args;
1549 * If it is a reference but not an object see if we have a handler
1552 if (SvROK(arg) && !sv_isobject(arg)) {
1553 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1555 def = PerlIO_list_alloc(aTHX);
1556 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1560 * Don't fail if handler cannot be found :via(...) etc. may do
1561 * something sensible else we will just stringfy and open
1566 if (!layers || !*layers)
1567 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1568 if (layers && *layers) {
1571 av = PerlIO_clone_list(aTHX_ def, NULL);
1576 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1580 PerlIO_list_free(aTHX_ av);
1592 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1593 int imode, int perm, PerlIO *f, int narg, SV **args)
1596 if (!f && narg == 1 && *args == &PL_sv_undef) {
1597 if ((f = PerlIO_tmpfile())) {
1598 if (!layers || !*layers)
1599 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1600 if (layers && *layers)
1601 PerlIO_apply_layers(aTHX_ f, mode, layers);
1605 PerlIO_list_t *layera;
1607 PerlIO_funcs *tab = NULL;
1608 if (PerlIOValid(f)) {
1610 * This is "reopen" - it is not tested as perl does not use it
1614 layera = PerlIO_list_alloc(aTHX);
1617 if (l->tab && l->tab->Getarg)
1618 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1619 PerlIO_list_push(aTHX_ layera, l->tab,
1620 (arg) ? arg : &PL_sv_undef);
1622 l = *PerlIONext(&l);
1626 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1632 * Start at "top" of layer stack
1634 n = layera->cur - 1;
1636 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1645 * Found that layer 'n' can do opens - call it
1647 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1648 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1650 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1651 tab->name, layers ? layers : "(Null)", mode, fd,
1652 imode, perm, (void*)f, narg, (void*)args);
1654 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1657 SETERRNO(EINVAL, LIB_INVARG);
1661 if (n + 1 < layera->cur) {
1663 * More layers above the one that we used to open -
1666 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1667 /* If pushing layers fails close the file */
1674 PerlIO_list_free(aTHX_ layera);
1681 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1683 PERL_ARGS_ASSERT_PERLIO_READ;
1685 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1689 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1691 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1693 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1697 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1699 PERL_ARGS_ASSERT_PERLIO_WRITE;
1701 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1705 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1707 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1711 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1713 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1717 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1722 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1724 if (tab && tab->Flush)
1725 return (*tab->Flush) (aTHX_ f);
1727 return 0; /* If no Flush defined, silently succeed. */
1730 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1731 SETERRNO(EBADF, SS_IVCHAN);
1737 * Is it good API design to do flush-all on NULL, a potentially
1738 * erroneous input? Maybe some magical value (PerlIO*
1739 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1740 * things on fflush(NULL), but should we be bound by their design
1743 PerlIOl **table = &PL_perlio;
1746 while ((ff = *table)) {
1748 table = (PerlIOl **) (ff++);
1749 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1750 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1760 PerlIOBase_flush_linebuf(pTHX)
1763 PerlIOl **table = &PL_perlio;
1765 while ((f = *table)) {
1767 table = (PerlIOl **) (f++);
1768 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1770 && (PerlIOBase(&(f->next))->
1771 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1772 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1773 PerlIO_flush(&(f->next));
1780 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1782 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1786 PerlIO_isutf8(PerlIO *f)
1789 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1791 SETERRNO(EBADF, SS_IVCHAN);
1797 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1799 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1803 Perl_PerlIO_error(pTHX_ PerlIO *f)
1805 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1809 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1811 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1815 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1817 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1821 PerlIO_has_base(PerlIO *f)
1823 if (PerlIOValid(f)) {
1824 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1827 return (tab->Get_base != NULL);
1834 PerlIO_fast_gets(PerlIO *f)
1836 if (PerlIOValid(f)) {
1837 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1838 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1841 return (tab->Set_ptrcnt != NULL);
1849 PerlIO_has_cntptr(PerlIO *f)
1851 if (PerlIOValid(f)) {
1852 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1855 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1862 PerlIO_canset_cnt(PerlIO *f)
1864 if (PerlIOValid(f)) {
1865 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1868 return (tab->Set_ptrcnt != NULL);
1875 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1877 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1881 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1883 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1887 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1889 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1893 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1895 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1899 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1901 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1905 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1907 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1911 /*--------------------------------------------------------------------------------------*/
1913 * utf8 and raw dummy layers
1917 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1919 PERL_UNUSED_CONTEXT;
1920 PERL_UNUSED_ARG(mode);
1921 PERL_UNUSED_ARG(arg);
1922 if (PerlIOValid(f)) {
1923 if (tab && tab->kind & PERLIO_K_UTF8)
1924 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1926 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1932 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1933 sizeof(PerlIO_funcs),
1936 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1956 NULL, /* get_base */
1957 NULL, /* get_bufsiz */
1960 NULL, /* set_ptrcnt */
1963 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1964 sizeof(PerlIO_funcs),
1967 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1987 NULL, /* get_base */
1988 NULL, /* get_bufsiz */
1991 NULL, /* set_ptrcnt */
1994 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1995 sizeof(PerlIO_funcs),
2018 NULL, /* get_base */
2019 NULL, /* get_bufsiz */
2022 NULL, /* set_ptrcnt */
2024 /*--------------------------------------------------------------------------------------*/
2025 /*--------------------------------------------------------------------------------------*/
2027 * "Methods" of the "base class"
2031 PerlIOBase_fileno(pTHX_ PerlIO *f)
2033 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
2037 PerlIO_modestr(PerlIO * f, char *buf)
2040 if (PerlIOValid(f)) {
2041 const IV flags = PerlIOBase(f)->flags;
2042 if (flags & PERLIO_F_APPEND) {
2044 if (flags & PERLIO_F_CANREAD) {
2048 else if (flags & PERLIO_F_CANREAD) {
2050 if (flags & PERLIO_F_CANWRITE)
2053 else if (flags & PERLIO_F_CANWRITE) {
2055 if (flags & PERLIO_F_CANREAD) {
2059 #ifdef PERLIO_USING_CRLF
2060 if (!(flags & PERLIO_F_CRLF))
2070 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2072 PerlIOl * const l = PerlIOBase(f);
2073 PERL_UNUSED_CONTEXT;
2074 PERL_UNUSED_ARG(arg);
2076 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2077 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2078 if (tab && tab->Set_ptrcnt != NULL)
2079 l->flags |= PERLIO_F_FASTGETS;
2081 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2085 l->flags |= PERLIO_F_CANREAD;
2088 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2091 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2094 SETERRNO(EINVAL, LIB_INVARG);
2100 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2103 l->flags &= ~PERLIO_F_CRLF;
2106 l->flags |= PERLIO_F_CRLF;
2109 SETERRNO(EINVAL, LIB_INVARG);
2116 l->flags |= l->next->flags &
2117 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2122 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2123 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2124 l->flags, PerlIO_modestr(f, temp));
2130 PerlIOBase_popped(pTHX_ PerlIO *f)
2132 PERL_UNUSED_CONTEXT;
2138 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2141 * Save the position as current head considers it
2143 const Off_t old = PerlIO_tell(f);
2144 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2145 PerlIOSelf(f, PerlIOBuf)->posn = old;
2146 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2150 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2152 STDCHAR *buf = (STDCHAR *) vbuf;
2154 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2155 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2156 SETERRNO(EBADF, SS_IVCHAN);
2162 SSize_t avail = PerlIO_get_cnt(f);
2165 take = (((SSize_t) count >= 0) && ((SSize_t)count < avail)) ? (SSize_t)count : avail;
2167 STDCHAR *ptr = PerlIO_get_ptr(f);
2168 Copy(ptr, buf, take, STDCHAR);
2169 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2172 if (avail == 0) /* set_ptrcnt could have reset avail */
2175 if (count > 0 && avail <= 0) {
2176 if (PerlIO_fill(f) != 0)
2181 return (buf - (STDCHAR *) vbuf);
2187 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2189 PERL_UNUSED_CONTEXT;
2195 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2197 PERL_UNUSED_CONTEXT;
2203 PerlIOBase_close(pTHX_ PerlIO *f)
2206 if (PerlIOValid(f)) {
2207 PerlIO *n = PerlIONext(f);
2208 code = PerlIO_flush(f);
2209 PerlIOBase(f)->flags &=
2210 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2211 while (PerlIOValid(n)) {
2212 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2213 if (tab && tab->Close) {
2214 if ((*tab->Close)(aTHX_ n) != 0)
2219 PerlIOBase(n)->flags &=
2220 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2226 SETERRNO(EBADF, SS_IVCHAN);
2232 PerlIOBase_eof(pTHX_ PerlIO *f)
2234 PERL_UNUSED_CONTEXT;
2235 if (PerlIOValid(f)) {
2236 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2242 PerlIOBase_error(pTHX_ PerlIO *f)
2244 PERL_UNUSED_CONTEXT;
2245 if (PerlIOValid(f)) {
2246 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2252 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2254 if (PerlIOValid(f)) {
2255 PerlIO * const n = PerlIONext(f);
2256 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2263 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2265 PERL_UNUSED_CONTEXT;
2266 if (PerlIOValid(f)) {
2267 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2272 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2278 arg = sv_dup(arg, param);
2279 SvREFCNT_inc_simple_void_NN(arg);
2283 return newSVsv(arg);
2286 PERL_UNUSED_ARG(param);
2287 return newSVsv(arg);
2292 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2294 PerlIO * const nexto = PerlIONext(o);
2295 if (PerlIOValid(nexto)) {
2296 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2297 if (tab && tab->Dup)
2298 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2300 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2303 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2306 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2307 self ? self->name : "(Null)",
2308 (void*)f, (void*)o, (void*)param);
2309 if (self && self->Getarg)
2310 arg = (*self->Getarg)(aTHX_ o, param, flags);
2311 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2312 if (PerlIOBase(o)->flags & PERLIO_F_UTF8)
2313 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2319 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2321 /* Must be called with PL_perlio_mutex locked. */
2323 S_more_refcounted_fds(pTHX_ const int new_fd) {
2325 const int old_max = PL_perlio_fd_refcnt_size;
2326 const int new_max = 16 + (new_fd & ~15);
2329 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2330 old_max, new_fd, new_max);
2332 if (new_fd < old_max) {
2336 assert (new_max > new_fd);
2338 /* Use plain realloc() since we need this memory to be really
2339 * global and visible to all the interpreters and/or threads. */
2340 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2344 MUTEX_UNLOCK(&PL_perlio_mutex);
2349 PL_perlio_fd_refcnt_size = new_max;
2350 PL_perlio_fd_refcnt = new_array;
2352 PerlIO_debug("Zeroing %p, %d\n",
2353 (void*)(new_array + old_max),
2356 Zero(new_array + old_max, new_max - old_max, int);
2363 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2364 PERL_UNUSED_CONTEXT;
2368 PerlIOUnix_refcnt_inc(int fd)
2375 MUTEX_LOCK(&PL_perlio_mutex);
2377 if (fd >= PL_perlio_fd_refcnt_size)
2378 S_more_refcounted_fds(aTHX_ fd);
2380 PL_perlio_fd_refcnt[fd]++;
2381 if (PL_perlio_fd_refcnt[fd] <= 0) {
2382 /* diag_listed_as: refcnt_inc: fd %d%s */
2383 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2384 fd, PL_perlio_fd_refcnt[fd]);
2386 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2387 fd, PL_perlio_fd_refcnt[fd]);
2390 MUTEX_UNLOCK(&PL_perlio_mutex);
2393 /* diag_listed_as: refcnt_inc: fd %d%s */
2394 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2399 PerlIOUnix_refcnt_dec(int fd)
2405 MUTEX_LOCK(&PL_perlio_mutex);
2407 if (fd >= PL_perlio_fd_refcnt_size) {
2408 /* diag_listed_as: refcnt_dec: fd %d%s */
2409 Perl_croak_nocontext("refcnt_dec: fd %d >= refcnt_size %d\n",
2410 fd, PL_perlio_fd_refcnt_size);
2412 if (PL_perlio_fd_refcnt[fd] <= 0) {
2413 /* diag_listed_as: refcnt_dec: fd %d%s */
2414 Perl_croak_nocontext("refcnt_dec: fd %d: %d <= 0\n",
2415 fd, PL_perlio_fd_refcnt[fd]);
2417 cnt = --PL_perlio_fd_refcnt[fd];
2418 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2420 MUTEX_UNLOCK(&PL_perlio_mutex);
2423 /* diag_listed_as: refcnt_dec: fd %d%s */
2424 Perl_croak_nocontext("refcnt_dec: fd %d < 0\n", fd);
2430 PerlIOUnix_refcnt(int fd)
2437 MUTEX_LOCK(&PL_perlio_mutex);
2439 if (fd >= PL_perlio_fd_refcnt_size) {
2440 /* diag_listed_as: refcnt: fd %d%s */
2441 Perl_croak(aTHX_ "refcnt: fd %d >= refcnt_size %d\n",
2442 fd, PL_perlio_fd_refcnt_size);
2444 if (PL_perlio_fd_refcnt[fd] <= 0) {
2445 /* diag_listed_as: refcnt: fd %d%s */
2446 Perl_croak(aTHX_ "refcnt: fd %d: %d <= 0\n",
2447 fd, PL_perlio_fd_refcnt[fd]);
2449 cnt = PL_perlio_fd_refcnt[fd];
2451 MUTEX_UNLOCK(&PL_perlio_mutex);
2454 /* diag_listed_as: refcnt: fd %d%s */
2455 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2461 PerlIO_cleanup(pTHX)
2466 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2468 PerlIO_debug("Cleanup layers\n");
2471 /* Raise STDIN..STDERR refcount so we don't close them */
2472 for (i=0; i < 3; i++)
2473 PerlIOUnix_refcnt_inc(i);
2474 PerlIO_cleantable(aTHX_ &PL_perlio);
2475 /* Restore STDIN..STDERR refcount */
2476 for (i=0; i < 3; i++)
2477 PerlIOUnix_refcnt_dec(i);
2479 if (PL_known_layers) {
2480 PerlIO_list_free(aTHX_ PL_known_layers);
2481 PL_known_layers = NULL;
2483 if (PL_def_layerlist) {
2484 PerlIO_list_free(aTHX_ PL_def_layerlist);
2485 PL_def_layerlist = NULL;
2489 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2493 /* XXX we can't rely on an interpreter being present at this late stage,
2494 XXX so we can't use a function like PerlLIO_write that relies on one
2495 being present (at least in win32) :-(.
2500 /* By now all filehandles should have been closed, so any
2501 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2503 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2504 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2505 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2507 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2508 if (PL_perlio_fd_refcnt[i]) {
2510 my_snprintf(buf, sizeof(buf),
2511 "PerlIO_teardown: fd %d refcnt=%d\n",
2512 i, PL_perlio_fd_refcnt[i]);
2513 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2519 /* Not bothering with PL_perlio_mutex since by now
2520 * all the interpreters are gone. */
2521 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2522 && PL_perlio_fd_refcnt) {
2523 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2524 PL_perlio_fd_refcnt = NULL;
2525 PL_perlio_fd_refcnt_size = 0;
2529 /*--------------------------------------------------------------------------------------*/
2531 * Bottom-most level for UNIX-like case
2535 struct _PerlIO base; /* The generic part */
2536 int fd; /* UNIX like file descriptor */
2537 int oflags; /* open/fcntl flags */
2541 S_lockcnt_dec(pTHX_ const void* f)
2543 PerlIO_lockcnt((PerlIO*)f)--;
2547 /* call the signal handler, and if that handler happens to clear
2548 * this handle, free what we can and return true */
2551 S_perlio_async_run(pTHX_ PerlIO* f) {
2553 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2554 PerlIO_lockcnt(f)++;
2556 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) ) {
2560 /* we've just run some perl-level code that could have done
2561 * anything, including closing the file or clearing this layer.
2562 * If so, free any lower layers that have already been
2563 * cleared, then return an error. */
2564 while (PerlIOValid(f) &&
2565 (PerlIOBase(f)->flags & PERLIO_F_CLEARED))
2567 const PerlIOl *l = *f;
2576 PerlIOUnix_oflags(const char *mode)
2579 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2584 if (*++mode == '+') {
2591 oflags = O_CREAT | O_TRUNC;
2592 if (*++mode == '+') {
2601 oflags = O_CREAT | O_APPEND;
2602 if (*++mode == '+') {
2615 else if (*mode == 't') {
2617 oflags &= ~O_BINARY;
2621 #ifdef PERLIO_USING_CRLF
2623 * If neither "t" nor "b" was specified, open the file
2629 if (*mode || oflags == -1) {
2630 SETERRNO(EINVAL, LIB_INVARG);
2637 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2639 PERL_UNUSED_CONTEXT;
2640 return PerlIOSelf(f, PerlIOUnix)->fd;
2644 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2646 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2649 if (PerlLIO_fstat(fd, &st) == 0) {
2650 if (!S_ISREG(st.st_mode)) {
2651 PerlIO_debug("%d is not regular file\n",fd);
2652 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2655 PerlIO_debug("%d _is_ a regular file\n",fd);
2661 PerlIOUnix_refcnt_inc(fd);
2662 PERL_UNUSED_CONTEXT;
2666 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2668 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2669 if (*PerlIONext(f)) {
2670 /* We never call down so do any pending stuff now */
2671 PerlIO_flush(PerlIONext(f));
2673 * XXX could (or should) we retrieve the oflags from the open file
2674 * handle rather than believing the "mode" we are passed in? XXX
2675 * Should the value on NULL mode be 0 or -1?
2677 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2678 mode ? PerlIOUnix_oflags(mode) : -1);
2680 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2686 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2688 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2690 PERL_UNUSED_CONTEXT;
2691 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2693 SETERRNO(ESPIPE, LIB_INVARG);
2695 SETERRNO(EINVAL, LIB_INVARG);
2699 new_loc = PerlLIO_lseek(fd, offset, whence);
2700 if (new_loc == (Off_t) - 1)
2702 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2707 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2708 IV n, const char *mode, int fd, int imode,
2709 int perm, PerlIO *f, int narg, SV **args)
2711 if (PerlIOValid(f)) {
2712 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2713 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2716 if (*mode == IoTYPE_NUMERIC)
2719 imode = PerlIOUnix_oflags(mode);
2721 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2727 const char *path = SvPV_nolen_const(*args);
2728 if (!IS_SAFE_PATHNAME(*args, "open"))
2730 fd = PerlLIO_open3(path, imode, perm);
2734 if (*mode == IoTYPE_IMPLICIT)
2737 f = PerlIO_allocate(aTHX);
2739 if (!PerlIOValid(f)) {
2740 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2744 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2745 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2746 if (*mode == IoTYPE_APPEND)
2747 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2754 * FIXME: pop layers ???
2762 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2764 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2766 if (flags & PERLIO_DUP_FD) {
2767 fd = PerlLIO_dup(fd);
2770 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2772 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2773 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2782 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2786 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2788 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2789 #ifdef PERLIO_STD_SPECIAL
2791 return PERLIO_STD_IN(fd, vbuf, count);
2793 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2794 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2798 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2799 if (len >= 0 || errno != EINTR) {
2801 if (errno != EAGAIN) {
2802 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2805 else if (len == 0 && count != 0) {
2806 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2812 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2819 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2823 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2825 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2826 #ifdef PERLIO_STD_SPECIAL
2827 if (fd == 1 || fd == 2)
2828 return PERLIO_STD_OUT(fd, vbuf, count);
2831 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2832 if (len >= 0 || errno != EINTR) {
2834 if (errno != EAGAIN) {
2835 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2841 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2848 PerlIOUnix_tell(pTHX_ PerlIO *f)
2850 PERL_UNUSED_CONTEXT;
2852 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2857 PerlIOUnix_close(pTHX_ PerlIO *f)
2860 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2862 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2863 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2864 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2869 SETERRNO(EBADF,SS_IVCHAN);
2872 while (PerlLIO_close(fd) != 0) {
2873 if (errno != EINTR) {
2878 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2882 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2887 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2888 sizeof(PerlIO_funcs),
2895 PerlIOBase_binmode, /* binmode */
2905 PerlIOBase_noop_ok, /* flush */
2906 PerlIOBase_noop_fail, /* fill */
2909 PerlIOBase_clearerr,
2910 PerlIOBase_setlinebuf,
2911 NULL, /* get_base */
2912 NULL, /* get_bufsiz */
2915 NULL, /* set_ptrcnt */
2918 /*--------------------------------------------------------------------------------------*/
2923 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2924 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2925 broken by the last second glibc 2.3 fix
2927 #define STDIO_BUFFER_WRITABLE
2932 struct _PerlIO base;
2933 FILE *stdio; /* The stream */
2937 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2939 PERL_UNUSED_CONTEXT;
2941 if (PerlIOValid(f)) {
2942 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2944 return PerlSIO_fileno(s);
2951 PerlIOStdio_mode(const char *mode, char *tmode)
2953 char * const ret = tmode;
2959 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2967 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2970 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2971 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2972 if (toptab == tab) {
2973 /* Top is already stdio - pop self (duplicate) and use original */
2974 PerlIO_pop(aTHX_ f);
2977 const int fd = PerlIO_fileno(n);
2980 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2981 mode = PerlIOStdio_mode(mode, tmode)))) {
2982 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2983 /* We never call down so do any pending stuff now */
2984 PerlIO_flush(PerlIONext(f));
2991 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2996 PerlIO_importFILE(FILE *stdio, const char *mode)
3002 if (!mode || !*mode) {
3003 /* We need to probe to see how we can open the stream
3004 so start with read/write and then try write and read
3005 we dup() so that we can fclose without loosing the fd.
3007 Note that the errno value set by a failing fdopen
3008 varies between stdio implementations.
3010 const int fd = PerlLIO_dup(fileno(stdio));
3011 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
3013 f2 = PerlSIO_fdopen(fd, (mode = "w"));
3016 f2 = PerlSIO_fdopen(fd, (mode = "r"));
3019 /* Don't seem to be able to open */
3025 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
3026 s = PerlIOSelf(f, PerlIOStdio);
3028 PerlIOUnix_refcnt_inc(fileno(stdio));
3035 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3036 IV n, const char *mode, int fd, int imode,
3037 int perm, PerlIO *f, int narg, SV **args)
3040 if (PerlIOValid(f)) {
3041 const char * const path = SvPV_nolen_const(*args);
3042 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3044 if (!IS_SAFE_PATHNAME(*args, "open"))
3046 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3047 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
3052 PerlIOUnix_refcnt_inc(fileno(s->stdio));
3057 const char * const path = SvPV_nolen_const(*args);
3058 if (!IS_SAFE_PATHNAME(*args, "open"))
3060 if (*mode == IoTYPE_NUMERIC) {
3062 fd = PerlLIO_open3(path, imode, perm);
3066 bool appended = FALSE;
3068 /* Cygwin wants its 'b' early. */
3070 mode = PerlIOStdio_mode(mode, tmode);
3072 stdio = PerlSIO_fopen(path, mode);
3075 f = PerlIO_allocate(aTHX);
3078 mode = PerlIOStdio_mode(mode, tmode);
3079 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3081 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3082 PerlIOUnix_refcnt_inc(fileno(stdio));
3084 PerlSIO_fclose(stdio);
3096 if (*mode == IoTYPE_IMPLICIT) {
3103 stdio = PerlSIO_stdin;
3106 stdio = PerlSIO_stdout;
3109 stdio = PerlSIO_stderr;
3114 stdio = PerlSIO_fdopen(fd, mode =
3115 PerlIOStdio_mode(mode, tmode));
3119 f = PerlIO_allocate(aTHX);
3121 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3122 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3123 PerlIOUnix_refcnt_inc(fileno(stdio));
3133 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3135 /* This assumes no layers underneath - which is what
3136 happens, but is not how I remember it. NI-S 2001/10/16
3138 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3139 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3140 const int fd = fileno(stdio);
3142 if (flags & PERLIO_DUP_FD) {
3143 const int dfd = PerlLIO_dup(fileno(stdio));
3145 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3150 /* FIXME: To avoid messy error recovery if dup fails
3151 re-use the existing stdio as though flag was not set
3155 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3157 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3159 PerlIOUnix_refcnt_inc(fileno(stdio));
3166 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3168 PERL_UNUSED_CONTEXT;
3170 /* XXX this could use PerlIO_canset_fileno() and
3171 * PerlIO_set_fileno() support from Configure
3173 # if defined(__UCLIBC__)
3174 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3177 # elif defined(__GLIBC__)
3178 /* There may be a better way for GLIBC:
3179 - libio.h defines a flag to not close() on cleanup
3183 # elif defined(__sun__)
3186 # elif defined(__hpux)
3190 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3191 your platform does not have special entry try this one.
3192 [For OSF only have confirmation for Tru64 (alpha)
3193 but assume other OSFs will be similar.]
3195 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3198 # elif defined(__FreeBSD__)
3199 /* There may be a better way on FreeBSD:
3200 - we could insert a dummy func in the _close function entry
3201 f->_close = (int (*)(void *)) dummy_close;
3205 # elif defined(__OpenBSD__)
3206 /* There may be a better way on OpenBSD:
3207 - we could insert a dummy func in the _close function entry
3208 f->_close = (int (*)(void *)) dummy_close;
3212 # elif defined(__EMX__)
3213 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3216 # elif defined(__CYGWIN__)
3217 /* There may be a better way on CYGWIN:
3218 - we could insert a dummy func in the _close function entry
3219 f->_close = (int (*)(void *)) dummy_close;
3223 # elif defined(WIN32)
3224 # if defined(UNDER_CE)
3225 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3234 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3235 (which isn't thread safe) instead
3237 # error "Don't know how to set FILE.fileno on your platform"
3245 PerlIOStdio_close(pTHX_ PerlIO *f)
3247 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3253 const int fd = fileno(stdio);
3261 #ifdef SOCKS5_VERSION_NAME
3262 /* Socks lib overrides close() but stdio isn't linked to
3263 that library (though we are) - so we must call close()
3264 on sockets on stdio's behalf.
3267 Sock_size_t optlen = sizeof(int);
3268 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3271 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3272 that a subsequent fileno() on it returns -1. Don't want to croak()
3273 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3274 trying to close an already closed handle which somehow it still has
3275 a reference to. (via.xs, I'm looking at you). */
3276 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3277 /* File descriptor still in use */
3281 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3282 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3284 if (stdio == stdout || stdio == stderr)
3285 return PerlIO_flush(f);
3286 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3287 Use Sarathy's trick from maint-5.6 to invalidate the
3288 fileno slot of the FILE *
3290 result = PerlIO_flush(f);
3292 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3295 MUTEX_LOCK(&PL_perlio_mutex);
3296 /* Right. We need a mutex here because for a brief while we
3297 will have the situation that fd is actually closed. Hence if
3298 a second thread were to get into this block, its dup() would
3299 likely return our fd as its dupfd. (after all, it is closed)
3300 Then if we get to the dup2() first, we blat the fd back
3301 (messing up its temporary as a side effect) only for it to
3302 then close its dupfd (== our fd) in its close(dupfd) */
3304 /* There is, of course, a race condition, that any other thread
3305 trying to input/output/whatever on this fd will be stuffed
3306 for the duration of this little manoeuvrer. Perhaps we
3307 should hold an IO mutex for the duration of every IO
3308 operation if we know that invalidate doesn't work on this
3309 platform, but that would suck, and could kill performance.
3311 Except that correctness trumps speed.
3312 Advice from klortho #11912. */
3314 dupfd = PerlLIO_dup(fd);
3317 MUTEX_UNLOCK(&PL_perlio_mutex);
3318 /* Oh cXap. This isn't going to go well. Not sure if we can
3319 recover from here, or if closing this particular FILE *
3320 is a good idea now. */
3325 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3327 result = PerlSIO_fclose(stdio);
3328 /* We treat error from stdio as success if we invalidated
3329 errno may NOT be expected EBADF
3331 if (invalidate && result != 0) {
3335 #ifdef SOCKS5_VERSION_NAME
3336 /* in SOCKS' case, let close() determine return value */
3340 PerlLIO_dup2(dupfd,fd);
3341 PerlLIO_close(dupfd);
3343 MUTEX_UNLOCK(&PL_perlio_mutex);
3351 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3356 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3358 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3361 STDCHAR *buf = (STDCHAR *) vbuf;
3363 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3364 * stdio does not do that for fread()
3366 const int ch = PerlSIO_fgetc(s);
3373 got = PerlSIO_fread(vbuf, 1, count, s);
3374 if (got == 0 && PerlSIO_ferror(s))
3376 if (got >= 0 || errno != EINTR)
3378 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3380 SETERRNO(0,0); /* just in case */
3386 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3389 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3391 #ifdef STDIO_BUFFER_WRITABLE
3392 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3393 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3394 STDCHAR *base = PerlIO_get_base(f);
3395 SSize_t cnt = PerlIO_get_cnt(f);
3396 STDCHAR *ptr = PerlIO_get_ptr(f);
3397 SSize_t avail = ptr - base;
3399 if (avail > count) {
3403 Move(buf-avail,ptr,avail,STDCHAR);
3406 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3407 if (PerlSIO_feof(s) && unread >= 0)
3408 PerlSIO_clearerr(s);
3413 if (PerlIO_has_cntptr(f)) {
3414 /* We can get pointer to buffer but not its base
3415 Do ungetc() but check chars are ending up in the
3418 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3419 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3421 const int ch = *--buf & 0xFF;
3422 if (ungetc(ch,s) != ch) {
3423 /* ungetc did not work */
3426 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3427 /* Did not change pointer as expected */
3428 fgetc(s); /* get char back again */
3438 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3444 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3448 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3451 got = PerlSIO_fwrite(vbuf, 1, count,
3452 PerlIOSelf(f, PerlIOStdio)->stdio);
3453 if (got >= 0 || errno != EINTR)
3455 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3457 SETERRNO(0,0); /* just in case */
3463 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3465 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3466 PERL_UNUSED_CONTEXT;
3468 return PerlSIO_fseek(stdio, offset, whence);
3472 PerlIOStdio_tell(pTHX_ PerlIO *f)
3474 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3475 PERL_UNUSED_CONTEXT;
3477 return PerlSIO_ftell(stdio);
3481 PerlIOStdio_flush(pTHX_ PerlIO *f)
3483 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3484 PERL_UNUSED_CONTEXT;
3486 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3487 return PerlSIO_fflush(stdio);
3493 * FIXME: This discards ungetc() and pre-read stuff which is not
3494 * right if this is just a "sync" from a layer above Suspect right
3495 * design is to do _this_ but not have layer above flush this
3496 * layer read-to-read
3499 * Not writeable - sync by attempting a seek
3502 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3510 PerlIOStdio_eof(pTHX_ PerlIO *f)
3512 PERL_UNUSED_CONTEXT;
3514 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3518 PerlIOStdio_error(pTHX_ PerlIO *f)
3520 PERL_UNUSED_CONTEXT;
3522 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3526 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3528 PERL_UNUSED_CONTEXT;
3530 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3534 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3536 PERL_UNUSED_CONTEXT;
3538 #ifdef HAS_SETLINEBUF
3539 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3541 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3547 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3549 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3550 return (STDCHAR*)PerlSIO_get_base(stdio);
3554 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3556 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3557 return PerlSIO_get_bufsiz(stdio);
3561 #ifdef USE_STDIO_PTR
3563 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3565 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3566 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3570 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3572 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3573 return PerlSIO_get_cnt(stdio);
3577 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3579 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3581 #ifdef STDIO_PTR_LVALUE
3582 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3583 #ifdef STDIO_PTR_LVAL_SETS_CNT
3584 assert(PerlSIO_get_cnt(stdio) == (cnt));
3586 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3588 * Setting ptr _does_ change cnt - we are done
3592 #else /* STDIO_PTR_LVALUE */
3594 #endif /* STDIO_PTR_LVALUE */
3597 * Now (or only) set cnt
3599 #ifdef STDIO_CNT_LVALUE
3600 PerlSIO_set_cnt(stdio, cnt);
3601 #else /* STDIO_CNT_LVALUE */
3602 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3603 PerlSIO_set_ptr(stdio,
3604 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3606 #else /* STDIO_PTR_LVAL_SETS_CNT */
3608 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3609 #endif /* STDIO_CNT_LVALUE */
3616 PerlIOStdio_fill(pTHX_ PerlIO *f)
3620 PERL_UNUSED_CONTEXT;
3621 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3623 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3626 * fflush()ing read-only streams can cause trouble on some stdio-s
3628 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3629 if (PerlSIO_fflush(stdio) != 0)
3633 c = PerlSIO_fgetc(stdio);
3636 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3638 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3643 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3645 #ifdef STDIO_BUFFER_WRITABLE
3646 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3647 /* Fake ungetc() to the real buffer in case system's ungetc
3650 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3651 SSize_t cnt = PerlSIO_get_cnt(stdio);
3652 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3653 if (ptr == base+1) {
3654 *--ptr = (STDCHAR) c;
3655 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3656 if (PerlSIO_feof(stdio))
3657 PerlSIO_clearerr(stdio);
3663 if (PerlIO_has_cntptr(f)) {
3665 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3672 /* An ungetc()d char is handled separately from the regular
3673 * buffer, so we stuff it in the buffer ourselves.
3674 * Should never get called as should hit code above
3676 *(--((*stdio)->_ptr)) = (unsigned char) c;
3679 /* If buffer snoop scheme above fails fall back to
3682 if (PerlSIO_ungetc(c, stdio) != c)
3690 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3691 sizeof(PerlIO_funcs),
3693 sizeof(PerlIOStdio),
3694 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3698 PerlIOBase_binmode, /* binmode */
3712 PerlIOStdio_clearerr,
3713 PerlIOStdio_setlinebuf,
3715 PerlIOStdio_get_base,
3716 PerlIOStdio_get_bufsiz,
3721 #ifdef USE_STDIO_PTR
3722 PerlIOStdio_get_ptr,
3723 PerlIOStdio_get_cnt,
3724 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3725 PerlIOStdio_set_ptrcnt,
3728 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3733 #endif /* USE_STDIO_PTR */
3736 /* Note that calls to PerlIO_exportFILE() are reversed using
3737 * PerlIO_releaseFILE(), not importFILE. */
3739 PerlIO_exportFILE(PerlIO * f, const char *mode)
3743 if (PerlIOValid(f)) {
3746 if (!mode || !*mode) {
3747 mode = PerlIO_modestr(f, buf);
3749 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3753 /* De-link any lower layers so new :stdio sticks */
3755 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3756 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3758 PerlIOUnix_refcnt_inc(fileno(stdio));
3759 /* Link previous lower layers under new one */
3763 /* restore layers list */
3773 PerlIO_findFILE(PerlIO *f)
3778 if (l->tab == &PerlIO_stdio) {
3779 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3782 l = *PerlIONext(&l);
3784 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3785 /* However, we're not really exporting a FILE * to someone else (who
3786 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3787 So we need to undo its reference count increase on the underlying file
3788 descriptor. We have to do this, because if the loop above returns you
3789 the FILE *, then *it* didn't increase any reference count. So there's
3790 only one way to be consistent. */
3791 stdio = PerlIO_exportFILE(f, NULL);
3793 const int fd = fileno(stdio);
3795 PerlIOUnix_refcnt_dec(fd);
3800 /* Use this to reverse PerlIO_exportFILE calls. */
3802 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3807 if (l->tab == &PerlIO_stdio) {
3808 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3809 if (s->stdio == f) { /* not in a loop */
3810 const int fd = fileno(f);
3812 PerlIOUnix_refcnt_dec(fd);
3815 PerlIO_pop(aTHX_ p);
3825 /*--------------------------------------------------------------------------------------*/
3827 * perlio buffer layer
3831 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3833 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3834 const int fd = PerlIO_fileno(f);
3835 if (fd >= 0 && PerlLIO_isatty(fd)) {
3836 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3838 if (*PerlIONext(f)) {
3839 const Off_t posn = PerlIO_tell(PerlIONext(f));
3840 if (posn != (Off_t) - 1) {
3844 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3848 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3849 IV n, const char *mode, int fd, int imode, int perm,
3850 PerlIO *f, int narg, SV **args)
3852 if (PerlIOValid(f)) {
3853 PerlIO *next = PerlIONext(f);
3855 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3856 if (tab && tab->Open)
3858 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3860 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3865 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3867 if (*mode == IoTYPE_IMPLICIT) {
3873 if (tab && tab->Open)
3874 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3877 SETERRNO(EINVAL, LIB_INVARG);
3879 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3881 * if push fails during open, open fails. close will pop us.
3886 fd = PerlIO_fileno(f);
3887 if (init && fd == 2) {
3889 * Initial stderr is unbuffered
3891 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3893 #ifdef PERLIO_USING_CRLF
3894 # ifdef PERLIO_IS_BINMODE_FD
3895 if (PERLIO_IS_BINMODE_FD(fd))
3896 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3900 * do something about failing setmode()? --jhi
3902 PerlLIO_setmode(fd, O_BINARY);
3905 /* Enable line buffering with record-oriented regular files
3906 * so we don't introduce an extraneous record boundary when
3907 * the buffer fills up.
3909 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3911 if (PerlLIO_fstat(fd, &st) == 0
3912 && S_ISREG(st.st_mode)
3913 && (st.st_fab_rfm == FAB$C_VAR
3914 || st.st_fab_rfm == FAB$C_VFC)) {
3915 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
3926 * This "flush" is akin to sfio's sync in that it handles files in either
3927 * read or write state. For write state, we put the postponed data through
3928 * the next layers. For read state, we seek() the next layers to the
3929 * offset given by current position in the buffer, and discard the buffer
3930 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3931 * in any case?). Then the pass the stick further in chain.
3934 PerlIOBuf_flush(pTHX_ PerlIO *f)
3936 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3938 PerlIO *n = PerlIONext(f);
3939 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3941 * write() the buffer
3943 const STDCHAR *buf = b->buf;
3944 const STDCHAR *p = buf;
3945 while (p < b->ptr) {
3946 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3950 else if (count < 0 || PerlIO_error(n)) {
3951 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3956 b->posn += (p - buf);
3958 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3959 STDCHAR *buf = PerlIO_get_base(f);
3961 * Note position change
3963 b->posn += (b->ptr - buf);
3964 if (b->ptr < b->end) {
3965 /* We did not consume all of it - try and seek downstream to
3966 our logical position
3968 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3969 /* Reload n as some layers may pop themselves on seek */
3970 b->posn = PerlIO_tell(n = PerlIONext(f));
3973 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3974 data is lost for good - so return saying "ok" having undone
3977 b->posn -= (b->ptr - buf);
3982 b->ptr = b->end = b->buf;
3983 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3984 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3985 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3990 /* This discards the content of the buffer after b->ptr, and rereads
3991 * the buffer from the position off in the layer downstream; here off
3992 * is at offset corresponding to b->ptr - b->buf.
3995 PerlIOBuf_fill(pTHX_ PerlIO *f)
3997 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3998 PerlIO *n = PerlIONext(f);
4001 * Down-stream flush is defined not to loose read data so is harmless.
4002 * we would not normally be fill'ing if there was data left in anycase.
4004 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
4006 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
4007 PerlIOBase_flush_linebuf(aTHX);
4010 PerlIO_get_base(f); /* allocate via vtable */
4012 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
4014 b->ptr = b->end = b->buf;
4016 if (!PerlIOValid(n)) {
4017 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4021 if (PerlIO_fast_gets(n)) {
4023 * Layer below is also buffered. We do _NOT_ want to call its
4024 * ->Read() because that will loop till it gets what we asked for
4025 * which may hang on a pipe etc. Instead take anything it has to
4026 * hand, or ask it to fill _once_.
4028 avail = PerlIO_get_cnt(n);
4030 avail = PerlIO_fill(n);
4032 avail = PerlIO_get_cnt(n);
4034 if (!PerlIO_error(n) && PerlIO_eof(n))
4039 STDCHAR *ptr = PerlIO_get_ptr(n);
4040 const SSize_t cnt = avail;
4041 if (avail > (SSize_t)b->bufsiz)
4043 Copy(ptr, b->buf, avail, STDCHAR);
4044 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4048 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4052 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4054 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4057 b->end = b->buf + avail;
4058 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4063 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4065 if (PerlIOValid(f)) {
4066 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4069 return PerlIOBase_read(aTHX_ f, vbuf, count);
4075 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4077 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4078 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4081 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4086 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4088 * Buffer is already a read buffer, we can overwrite any chars
4089 * which have been read back to buffer start
4091 avail = (b->ptr - b->buf);
4095 * Buffer is idle, set it up so whole buffer is available for
4099 b->end = b->buf + avail;
4101 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4103 * Buffer extends _back_ from where we are now
4105 b->posn -= b->bufsiz;
4107 if ((SSize_t) count >= 0 && avail > (SSize_t) count) {
4109 * If we have space for more than count, just move count
4117 * In simple stdio-like ungetc() case chars will be already
4120 if (buf != b->ptr) {
4121 Copy(buf, b->ptr, avail, STDCHAR);
4125 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4129 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4135 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4137 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4138 const STDCHAR *buf = (const STDCHAR *) vbuf;
4139 const STDCHAR *flushptr = buf;
4143 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4145 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4146 if (PerlIO_flush(f) != 0) {
4150 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4151 flushptr = buf + count;
4152 while (flushptr > buf && *(flushptr - 1) != '\n')
4156 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4157 if ((SSize_t) count >= 0 && (SSize_t) count < avail)
4159 if (flushptr > buf && flushptr <= buf + avail)
4160 avail = flushptr - buf;
4161 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4163 Copy(buf, b->ptr, avail, STDCHAR);
4168 if (buf == flushptr)
4171 if (b->ptr >= (b->buf + b->bufsiz))
4172 if (PerlIO_flush(f) == -1)
4175 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4181 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4184 if ((code = PerlIO_flush(f)) == 0) {
4185 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4186 code = PerlIO_seek(PerlIONext(f), offset, whence);
4188 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4189 b->posn = PerlIO_tell(PerlIONext(f));
4196 PerlIOBuf_tell(pTHX_ PerlIO *f)
4198 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4200 * b->posn is file position where b->buf was read, or will be written
4202 Off_t posn = b->posn;
4203 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4204 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4206 /* As O_APPEND files are normally shared in some sense it is better
4211 /* when file is NOT shared then this is sufficient */
4212 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4214 posn = b->posn = PerlIO_tell(PerlIONext(f));
4218 * If buffer is valid adjust position by amount in buffer
4220 posn += (b->ptr - b->buf);
4226 PerlIOBuf_popped(pTHX_ PerlIO *f)
4228 const IV code = PerlIOBase_popped(aTHX_ f);
4229 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4230 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4233 b->ptr = b->end = b->buf = NULL;
4234 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4239 PerlIOBuf_close(pTHX_ PerlIO *f)
4241 const IV code = PerlIOBase_close(aTHX_ f);
4242 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4243 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4246 b->ptr = b->end = b->buf = NULL;
4247 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4252 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4254 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4261 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4263 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4266 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4267 return (b->end - b->ptr);
4272 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4274 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4275 PERL_UNUSED_CONTEXT;
4279 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4280 Newxz(b->buf,b->bufsiz, STDCHAR);
4282 b->buf = (STDCHAR *) & b->oneword;
4283 b->bufsiz = sizeof(b->oneword);
4285 b->end = b->ptr = b->buf;
4291 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4293 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4296 return (b->end - b->buf);
4300 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4302 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4304 PERL_UNUSED_ARG(cnt);
4309 assert(PerlIO_get_cnt(f) == cnt);
4310 assert(b->ptr >= b->buf);
4311 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4315 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4317 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4322 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4323 sizeof(PerlIO_funcs),
4326 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4330 PerlIOBase_binmode, /* binmode */
4344 PerlIOBase_clearerr,
4345 PerlIOBase_setlinebuf,
4350 PerlIOBuf_set_ptrcnt,
4353 /*--------------------------------------------------------------------------------------*/
4355 * Temp layer to hold unread chars when cannot do it any other way
4359 PerlIOPending_fill(pTHX_ PerlIO *f)
4362 * Should never happen
4369 PerlIOPending_close(pTHX_ PerlIO *f)
4372 * A tad tricky - flush pops us, then we close new top
4375 return PerlIO_close(f);
4379 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4382 * A tad tricky - flush pops us, then we seek new top
4385 return PerlIO_seek(f, offset, whence);
4390 PerlIOPending_flush(pTHX_ PerlIO *f)
4392 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4393 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4397 PerlIO_pop(aTHX_ f);
4402 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4408 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4413 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4415 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4416 PerlIOl * const l = PerlIOBase(f);
4418 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4419 * etc. get muddled when it changes mid-string when we auto-pop.
4421 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4422 (PerlIOBase(PerlIONext(f))->
4423 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4428 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4430 SSize_t avail = PerlIO_get_cnt(f);
4432 if ((SSize_t) count >= 0 && (SSize_t)count < avail)
4435 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4436 if (got >= 0 && got < (SSize_t)count) {
4437 const SSize_t more =
4438 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4439 if (more >= 0 || got == 0)
4445 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4446 sizeof(PerlIO_funcs),
4449 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4450 PerlIOPending_pushed,
4453 PerlIOBase_binmode, /* binmode */
4462 PerlIOPending_close,
4463 PerlIOPending_flush,
4467 PerlIOBase_clearerr,
4468 PerlIOBase_setlinebuf,
4473 PerlIOPending_set_ptrcnt,
4478 /*--------------------------------------------------------------------------------------*/
4480 * crlf - translation On read translate CR,LF to "\n" we do this by
4481 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4482 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4484 * c->nl points on the first byte of CR LF pair when it is temporarily
4485 * replaced by LF, or to the last CR of the buffer. In the former case
4486 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4487 * that it ends at c->nl; these two cases can be distinguished by
4488 * *c->nl. c->nl is set during _getcnt() call, and unset during
4489 * _unread() and _flush() calls.
4490 * It only matters for read operations.
4494 PerlIOBuf base; /* PerlIOBuf stuff */
4495 STDCHAR *nl; /* Position of crlf we "lied" about in the
4499 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4500 * Otherwise the :crlf layer would always revert back to
4504 S_inherit_utf8_flag(PerlIO *f)
4506 PerlIO *g = PerlIONext(f);
4507 if (PerlIOValid(g)) {
4508 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4509 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4515 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4518 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4519 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4521 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4522 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4523 PerlIOBase(f)->flags);
4526 /* If the old top layer is a CRLF layer, reactivate it (if
4527 * necessary) and remove this new layer from the stack */
4528 PerlIO *g = PerlIONext(f);
4529 if (PerlIOValid(g)) {
4530 PerlIOl *b = PerlIOBase(g);
4531 if (b && b->tab == &PerlIO_crlf) {
4532 if (!(b->flags & PERLIO_F_CRLF))
4533 b->flags |= PERLIO_F_CRLF;
4534 S_inherit_utf8_flag(g);
4535 PerlIO_pop(aTHX_ f);
4540 S_inherit_utf8_flag(f);
4546 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4548 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4549 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4550 *(c->nl) = NATIVE_0xd;
4553 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4554 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4556 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4557 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4559 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4564 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4565 b->end = b->ptr = b->buf + b->bufsiz;
4566 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4567 b->posn -= b->bufsiz;
4569 while (count > 0 && b->ptr > b->buf) {
4570 const int ch = *--buf;
4572 if (b->ptr - 2 >= b->buf) {
4573 *--(b->ptr) = NATIVE_0xa;
4574 *--(b->ptr) = NATIVE_0xd;
4579 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4580 *--(b->ptr) = NATIVE_0xa; /* Works even if 0xa ==
4594 unread += PerlIOBase_unread(aTHX_ f, (const STDCHAR *) vbuf + unread, count);
4599 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4601 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4603 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4606 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4607 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4608 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == NATIVE_0xd)) {
4609 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4611 while (nl < b->end && *nl != NATIVE_0xd)
4613 if (nl < b->end && *nl == NATIVE_0xd) {
4615 if (nl + 1 < b->end) {
4616 if (nl[1] == NATIVE_0xa) {
4622 * Not CR,LF but just CR
4630 * Blast - found CR as last char in buffer
4635 * They may not care, defer work as long as
4639 return (nl - b->ptr);
4643 b->ptr++; /* say we have read it as far as
4644 * flush() is concerned */
4645 b->buf++; /* Leave space in front of buffer */
4646 /* Note as we have moved buf up flush's
4648 will naturally make posn point at CR
4650 b->bufsiz--; /* Buffer is thus smaller */
4651 code = PerlIO_fill(f); /* Fetch some more */
4652 b->bufsiz++; /* Restore size for next time */
4653 b->buf--; /* Point at space */
4654 b->ptr = nl = b->buf; /* Which is what we hand
4656 *nl = NATIVE_0xd; /* Fill in the CR */
4658 goto test; /* fill() call worked */
4660 * CR at EOF - just fall through
4662 /* Should we clear EOF though ??? */
4667 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4673 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4675 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4676 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4682 if (ptr == b->end && *c->nl == NATIVE_0xd) {
4683 /* Deferred CR at end of buffer case - we lied about count */
4696 * Test code - delete when it works ...
4698 IV flags = PerlIOBase(f)->flags;
4699 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4700 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == NATIVE_0xd) {
4701 /* Deferred CR at end of buffer case - we lied about count */
4707 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4708 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4709 flags, c->nl, b->end, cnt);
4716 * They have taken what we lied about
4718 *(c->nl) = NATIVE_0xd;
4724 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4728 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4730 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4731 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4733 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4734 const STDCHAR *buf = (const STDCHAR *) vbuf;
4735 const STDCHAR * const ebuf = buf + count;
4738 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4740 while (buf < ebuf) {
4741 const STDCHAR * const eptr = b->buf + b->bufsiz;
4742 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4743 while (buf < ebuf && b->ptr < eptr) {
4745 if ((b->ptr + 2) > eptr) {
4753 *(b->ptr)++ = NATIVE_0xd; /* CR */
4754 *(b->ptr)++ = NATIVE_0xa; /* LF */
4756 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4763 *(b->ptr)++ = *buf++;
4765 if (b->ptr >= eptr) {
4771 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4773 return (buf - (STDCHAR *) vbuf);
4778 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4780 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4782 *(c->nl) = NATIVE_0xd;
4785 return PerlIOBuf_flush(aTHX_ f);
4789 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4791 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4792 /* In text mode - flush any pending stuff and flip it */
4793 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4794 #ifndef PERLIO_USING_CRLF
4795 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4796 PerlIO_pop(aTHX_ f);
4802 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4803 sizeof(PerlIO_funcs),
4806 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4808 PerlIOBuf_popped, /* popped */
4810 PerlIOCrlf_binmode, /* binmode */
4814 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4815 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4816 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4824 PerlIOBase_clearerr,
4825 PerlIOBase_setlinebuf,
4830 PerlIOCrlf_set_ptrcnt,
4834 Perl_PerlIO_stdin(pTHX)
4838 PerlIO_stdstreams(aTHX);
4840 return (PerlIO*)&PL_perlio[1];
4844 Perl_PerlIO_stdout(pTHX)
4848 PerlIO_stdstreams(aTHX);
4850 return (PerlIO*)&PL_perlio[2];
4854 Perl_PerlIO_stderr(pTHX)
4858 PerlIO_stdstreams(aTHX);
4860 return (PerlIO*)&PL_perlio[3];
4863 /*--------------------------------------------------------------------------------------*/
4866 PerlIO_getname(PerlIO *f, char *buf)
4871 bool exported = FALSE;
4872 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
4874 stdio = PerlIO_exportFILE(f,0);
4878 name = fgetname(stdio, buf);
4879 if (exported) PerlIO_releaseFILE(f,stdio);
4884 PERL_UNUSED_ARG(buf);
4885 Perl_croak_nocontext("Don't know how to get file name");
4891 /*--------------------------------------------------------------------------------------*/
4893 * Functions which can be called on any kind of PerlIO implemented in
4897 #undef PerlIO_fdopen
4899 PerlIO_fdopen(int fd, const char *mode)
4902 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
4907 PerlIO_open(const char *path, const char *mode)
4910 SV *name = sv_2mortal(newSVpv(path, 0));
4911 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
4914 #undef Perlio_reopen
4916 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
4919 SV *name = sv_2mortal(newSVpv(path,0));
4920 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
4925 PerlIO_getc(PerlIO *f)
4929 if ( 1 == PerlIO_read(f, buf, 1) ) {
4930 return (unsigned char) buf[0];
4935 #undef PerlIO_ungetc
4937 PerlIO_ungetc(PerlIO *f, int ch)
4942 if (PerlIO_unread(f, &buf, 1) == 1)
4950 PerlIO_putc(PerlIO *f, int ch)
4954 return PerlIO_write(f, &buf, 1);
4959 PerlIO_puts(PerlIO *f, const char *s)
4962 return PerlIO_write(f, s, strlen(s));
4965 #undef PerlIO_rewind
4967 PerlIO_rewind(PerlIO *f)
4970 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
4974 #undef PerlIO_vprintf
4976 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
4985 Perl_va_copy(ap, apc);
4986 sv = vnewSVpvf(fmt, &apc);
4988 sv = vnewSVpvf(fmt, &ap);
4990 s = SvPV_const(sv, len);
4991 wrote = PerlIO_write(f, s, len);
4996 #undef PerlIO_printf
4998 PerlIO_printf(PerlIO *f, const char *fmt, ...)
5003 result = PerlIO_vprintf(f, fmt, ap);
5008 #undef PerlIO_stdoutf
5010 PerlIO_stdoutf(const char *fmt, ...)
5016 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5021 #undef PerlIO_tmpfile
5023 PerlIO_tmpfile(void)
5030 const int fd = win32_tmpfd();
5032 f = PerlIO_fdopen(fd, "w+b");
5034 # if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5036 char tempname[] = "/tmp/PerlIO_XXXXXX";
5037 const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
5040 * I have no idea how portable mkstemp() is ... NI-S
5042 if (tmpdir && *tmpdir) {
5043 /* if TMPDIR is set and not empty, we try that first */
5044 sv = newSVpv(tmpdir, 0);
5045 sv_catpv(sv, tempname + 4);
5046 fd = mkstemp(SvPVX(sv));
5050 /* else we try /tmp */
5051 fd = mkstemp(tempname);
5054 f = PerlIO_fdopen(fd, "w+");
5056 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5057 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5060 # else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5061 FILE * const stdio = PerlSIO_tmpfile();
5064 f = PerlIO_fdopen(fileno(stdio), "w+");
5066 # endif /* else HAS_MKSTEMP */
5067 #endif /* else WIN32 */
5074 #endif /* USE_SFIO */
5075 #endif /* PERLIO_IS_STDIO */
5077 /*======================================================================================*/
5079 * Now some functions in terms of above which may be needed even if we are
5080 * not in true PerlIO mode
5083 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5086 const char *direction = NULL;
5089 * Need to supply default layer info from open.pm
5095 if (mode && mode[0] != 'r') {
5096 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5097 direction = "open>";
5099 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5100 direction = "open<";
5105 layers = cop_hints_fetch_pvn(PL_curcop, direction, 5, 0, 0);
5108 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5113 #undef PerlIO_setpos
5115 PerlIO_setpos(PerlIO *f, SV *pos)
5120 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5121 if (f && len == sizeof(Off_t))
5122 return PerlIO_seek(f, *posn, SEEK_SET);
5124 SETERRNO(EINVAL, SS_IVCHAN);
5128 #undef PerlIO_setpos
5130 PerlIO_setpos(PerlIO *f, SV *pos)
5135 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5136 if (f && len == sizeof(Fpos_t)) {
5137 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5138 return fsetpos64(f, fpos);
5140 return fsetpos(f, fpos);
5144 SETERRNO(EINVAL, SS_IVCHAN);
5150 #undef PerlIO_getpos
5152 PerlIO_getpos(PerlIO *f, SV *pos)
5155 Off_t posn = PerlIO_tell(f);
5156 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5157 return (posn == (Off_t) - 1) ? -1 : 0;
5160 #undef PerlIO_getpos
5162 PerlIO_getpos(PerlIO *f, SV *pos)
5167 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5168 code = fgetpos64(f, &fpos);
5170 code = fgetpos(f, &fpos);
5172 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5177 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
5180 vprintf(char *pat, char *args)
5182 _doprnt(pat, args, stdout);
5183 return 0; /* wrong, but perl doesn't use the return
5188 vfprintf(FILE *fd, char *pat, char *args)
5190 _doprnt(pat, args, fd);
5191 return 0; /* wrong, but perl doesn't use the return
5197 #ifndef PerlIO_vsprintf
5199 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
5202 const int val = my_vsnprintf(s, n > 0 ? n : 0, fmt, ap);
5203 PERL_UNUSED_CONTEXT;
5205 #ifndef PERL_MY_VSNPRINTF_GUARDED
5206 if (val < 0 || (n > 0 ? val >= n : 0)) {
5207 Perl_croak(aTHX_ "panic: my_vsnprintf overflow in PerlIO_vsprintf\n");
5214 #ifndef PerlIO_sprintf
5216 PerlIO_sprintf(char *s, int n, const char *fmt, ...)
5221 result = PerlIO_vsprintf(s, n, fmt, ap);
5229 * c-indentation-style: bsd
5231 * indent-tabs-mode: nil
5234 * ex: set ts=8 sts=4 sw=4 et: