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 *);
135 EXTERN_C int perlsio_binmode(FILE *fp, int iotype, int mode);
138 perlsio_binmode(FILE *fp, int iotype, int mode)
141 * This used to be contents of do_binmode in doio.c
145 PERL_UNUSED_ARG(iotype);
147 if (PerlLIO_setmode(fp, mode) != -1) {
149 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
156 # if defined(USEMYBINMODE)
158 # if defined(__CYGWIN__)
159 PERL_UNUSED_ARG(iotype);
161 if (my_binmode(fp, iotype, mode) != FALSE)
167 PERL_UNUSED_ARG(iotype);
168 PERL_UNUSED_ARG(mode);
176 #define O_ACCMODE 3 /* Assume traditional implementation */
180 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
182 const int result = rawmode & O_ACCMODE;
187 ptype = IoTYPE_RDONLY;
190 ptype = IoTYPE_WRONLY;
198 *writing = (result != O_RDONLY);
200 if (result == O_RDONLY) {
204 else if (rawmode & O_APPEND) {
206 if (result != O_WRONLY)
211 if (result == O_WRONLY)
218 if (rawmode & O_BINARY)
224 #ifndef PERLIO_LAYERS
226 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
228 if (!names || !*names
229 || strEQ(names, ":crlf")
230 || strEQ(names, ":raw")
231 || strEQ(names, ":bytes")
235 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
243 PerlIO_destruct(pTHX)
248 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
251 PERL_UNUSED_ARG(iotype);
252 PERL_UNUSED_ARG(mode);
253 PERL_UNUSED_ARG(names);
256 return perlsio_binmode(fp, iotype, mode);
261 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
263 #if defined(PERL_MICRO) || defined(__SYMBIAN32__)
266 #ifdef PERL_IMPLICIT_SYS
267 return PerlSIO_fdupopen(f);
270 return win32_fdupopen(f);
273 const int fd = PerlLIO_dup(PerlIO_fileno(f));
277 const int omode = djgpp_get_stream_mode(f);
279 const int omode = fcntl(fd, F_GETFL);
281 PerlIO_intmode2str(omode,mode,NULL);
282 /* the r+ is a hack */
283 return PerlIO_fdopen(fd, mode);
288 SETERRNO(EBADF, SS_IVCHAN);
298 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
302 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
303 int imode, int perm, PerlIO *old, int narg, SV **args)
307 Perl_croak(aTHX_ "More than one argument to open");
309 if (*args == &PL_sv_undef)
310 return PerlIO_tmpfile();
312 const char *name = SvPV_nolen_const(*args);
313 if (*mode == IoTYPE_NUMERIC) {
314 fd = PerlLIO_open3(name, imode, perm);
316 return PerlIO_fdopen(fd, mode + 1);
319 return PerlIO_reopen(name, mode, old);
322 return PerlIO_open(name, mode);
327 return PerlIO_fdopen(fd, (char *) mode);
332 XS(XS_PerlIO__Layer__find)
336 Perl_croak(aTHX_ "Usage class->find(name[,load])");
338 const char * const name = SvPV_nolen_const(ST(1));
339 ST(0) = (strEQ(name, "crlf")
340 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
347 Perl_boot_core_PerlIO(pTHX)
349 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
355 #ifdef PERLIO_IS_STDIO
362 * Does nothing (yet) except force this file to be included in perl
363 * binary. That allows this file to force inclusion of other functions
364 * that may be required by loadable extensions e.g. for
365 * FileHandle::tmpfile
369 #undef PerlIO_tmpfile
376 #else /* PERLIO_IS_STDIO */
384 * This section is just to make sure these functions get pulled in from
388 #undef PerlIO_tmpfile
400 * Force this file to be included in perl binary. Which allows this
401 * file to force inclusion of other functions that may be required by
402 * loadable extensions e.g. for FileHandle::tmpfile
406 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
407 * results in a lot of lseek()s to regular files and lot of small
410 sfset(sfstdout, SF_SHARE, 0);
413 /* This is not the reverse of PerlIO_exportFILE(), PerlIO_releaseFILE() is. */
415 PerlIO_importFILE(FILE *stdio, const char *mode)
417 const int fd = fileno(stdio);
418 if (!mode || !*mode) {
421 return PerlIO_fdopen(fd, mode);
425 PerlIO_findFILE(PerlIO *pio)
427 const int fd = PerlIO_fileno(pio);
428 FILE * const f = fdopen(fd, "r+");
430 if (!f && errno == EINVAL)
432 if (!f && errno == EINVAL)
439 /*======================================================================================*/
441 * Implement all the PerlIO interface ourselves.
447 PerlIO_debug(const char *fmt, ...)
452 if (!PL_perlio_debug_fd) {
454 PerlProc_getuid() == PerlProc_geteuid() &&
455 PerlProc_getgid() == PerlProc_getegid()) {
456 const char * const s = PerlEnv_getenv("PERLIO_DEBUG");
459 = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
461 PL_perlio_debug_fd = -1;
463 /* tainting or set*id, so ignore the environment, and ensure we
464 skip these tests next time through. */
465 PL_perlio_debug_fd = -1;
468 if (PL_perlio_debug_fd > 0) {
470 const char * const s = CopFILE(PL_curcop);
471 /* Use fixed buffer as sv_catpvf etc. needs SVs */
473 const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop));
474 const STRLEN len2 = my_vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap);
475 PerlLIO_write(PL_perlio_debug_fd, buffer, len1 + len2);
477 const char *s = CopFILE(PL_curcop);
479 SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)",
480 (IV) CopLINE(PL_curcop));
481 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
483 s = SvPV_const(sv, len);
484 PerlLIO_write(PL_perlio_debug_fd, s, len);
491 /*--------------------------------------------------------------------------------------*/
494 * Inner level routines
497 /* check that the head field of each layer points back to the head */
500 # define VERIFY_HEAD(f) PerlIO_verify_head(aTHX_ f)
502 PerlIO_verify_head(pTHX_ PerlIO *f)
508 p = head = PerlIOBase(f)->head;
511 assert(p->head == head);
512 if (p == (PerlIOl*)f)
519 # define VERIFY_HEAD(f)
524 * Table of pointers to the PerlIO structs (malloc'ed)
526 #define PERLIO_TABLE_SIZE 64
529 PerlIO_init_table(pTHX)
533 Newxz(PL_perlio, PERLIO_TABLE_SIZE, PerlIOl);
539 PerlIO_allocate(pTHX)
543 * Find a free slot in the table, allocating new table as necessary
548 while ((f = *last)) {
550 last = (PerlIOl **) (f);
551 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
552 if (!((++f)->next)) {
553 f->flags = 0; /* lockcnt */
560 Newxz(f,PERLIO_TABLE_SIZE,PerlIOl);
564 *last = (PerlIOl*) f++;
565 f->flags = 0; /* lockcnt */
571 #undef PerlIO_fdupopen
573 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
575 if (PerlIOValid(f)) {
576 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
577 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
579 return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
581 return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
585 SETERRNO(EBADF, SS_IVCHAN);
591 PerlIO_cleantable(pTHX_ PerlIOl **tablep)
593 PerlIOl * const table = *tablep;
596 PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0]));
597 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
598 PerlIOl * const f = table + i;
600 PerlIO_close(&(f->next));
610 PerlIO_list_alloc(pTHX)
614 Newxz(list, 1, PerlIO_list_t);
620 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
623 if (--list->refcnt == 0) {
626 for (i = 0; i < list->cur; i++)
627 SvREFCNT_dec(list->array[i].arg);
628 Safefree(list->array);
636 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
642 if (list->cur >= list->len) {
645 Renew(list->array, list->len, PerlIO_pair_t);
647 Newx(list->array, list->len, PerlIO_pair_t);
649 p = &(list->array[list->cur++]);
651 if ((p->arg = arg)) {
652 SvREFCNT_inc_simple_void_NN(arg);
657 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
659 PerlIO_list_t *list = NULL;
662 list = PerlIO_list_alloc(aTHX);
663 for (i=0; i < proto->cur; i++) {
664 SV *arg = proto->array[i].arg;
667 arg = sv_dup(arg, param);
669 PERL_UNUSED_ARG(param);
671 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
678 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
681 PerlIOl **table = &proto->Iperlio;
684 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
685 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
686 PerlIO_init_table(aTHX);
687 PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto);
688 while ((f = *table)) {
690 table = (PerlIOl **) (f++);
691 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
693 (void) fp_dup(&(f->next), 0, param);
700 PERL_UNUSED_ARG(proto);
701 PERL_UNUSED_ARG(param);
706 PerlIO_destruct(pTHX)
709 PerlIOl **table = &PL_perlio;
712 PerlIO_debug("Destruct %p\n",(void*)aTHX);
714 while ((f = *table)) {
716 table = (PerlIOl **) (f++);
717 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
718 PerlIO *x = &(f->next);
721 if (l->tab && l->tab->kind & PERLIO_K_DESTRUCT) {
722 PerlIO_debug("Destruct popping %s\n", l->tab->name);
736 PerlIO_pop(pTHX_ PerlIO *f)
738 const PerlIOl *l = *f;
741 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f,
742 l->tab ? l->tab->name : "(Null)");
743 if (l->tab && l->tab->Popped) {
745 * If popped returns non-zero do not free its layer structure
746 * it has either done so itself, or it is shared and still in
749 if ((*l->tab->Popped) (aTHX_ f) != 0)
752 if (PerlIO_lockcnt(f)) {
753 /* we're in use; defer freeing the structure */
754 PerlIOBase(f)->flags = PERLIO_F_CLEARED;
755 PerlIOBase(f)->tab = NULL;
765 /* Return as an array the stack of layers on a filehandle. Note that
766 * the stack is returned top-first in the array, and there are three
767 * times as many array elements as there are layers in the stack: the
768 * first element of a layer triplet is the name, the second one is the
769 * arguments, and the third one is the flags. */
772 PerlIO_get_layers(pTHX_ PerlIO *f)
775 AV * const av = newAV();
777 if (PerlIOValid(f)) {
778 PerlIOl *l = PerlIOBase(f);
781 /* There is some collusion in the implementation of
782 XS_PerlIO_get_layers - it knows that name and flags are
783 generated as fresh SVs here, and takes advantage of that to
784 "copy" them by taking a reference. If it changes here, it needs
785 to change there too. */
786 SV * const name = l->tab && l->tab->name ?
787 newSVpv(l->tab->name, 0) : &PL_sv_undef;
788 SV * const arg = l->tab && l->tab->Getarg ?
789 (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
792 av_push(av, newSViv((IV)l->flags));
800 /*--------------------------------------------------------------------------------------*/
802 * XS Interface for perl code
806 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
810 if ((SSize_t) len <= 0)
812 for (i = 0; i < PL_known_layers->cur; i++) {
813 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
814 const STRLEN this_len = strlen(f->name);
815 if (this_len == len && memEQ(f->name, name, len)) {
816 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
820 if (load && PL_subname && PL_def_layerlist
821 && PL_def_layerlist->cur >= 2) {
822 if (PL_in_load_module) {
823 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
826 SV * const pkgsv = newSVpvs("PerlIO");
827 SV * const layer = newSVpvn(name, len);
828 CV * const cv = get_cvs("PerlIO::Layer::NoWarnings", 0);
830 SAVEBOOL(PL_in_load_module);
832 SAVEGENERICSV(PL_warnhook);
833 PL_warnhook = MUTABLE_SV((SvREFCNT_inc_simple_NN(cv)));
835 PL_in_load_module = TRUE;
837 * The two SVs are magically freed by load_module
839 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
841 return PerlIO_find_layer(aTHX_ name, len, 0);
844 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
848 #ifdef USE_ATTRIBUTES_FOR_PERLIO
851 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
854 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
855 PerlIO * const ifp = IoIFP(io);
856 PerlIO * const ofp = IoOFP(io);
857 Perl_warn(aTHX_ "set %" SVf " %p %p %p",
858 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
864 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
867 IO * const io = GvIOn(MUTABLE_GV(SvRV(sv)));
868 PerlIO * const ifp = IoIFP(io);
869 PerlIO * const ofp = IoOFP(io);
870 Perl_warn(aTHX_ "get %" SVf " %p %p %p",
871 SVfARG(sv), (void*)io, (void*)ifp, (void*)ofp);
877 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
879 Perl_warn(aTHX_ "clear %" SVf, SVfARG(sv));
884 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
886 Perl_warn(aTHX_ "free %" SVf, SVfARG(sv));
890 MGVTBL perlio_vtab = {
898 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
901 SV * const sv = SvRV(ST(1));
902 AV * const av = newAV();
906 sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
908 mg = mg_find(sv, PERL_MAGIC_ext);
909 mg->mg_virtual = &perlio_vtab;
911 Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
912 for (i = 2; i < items; i++) {
914 const char * const name = SvPV_const(ST(i), len);
915 SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
917 av_push(av, SvREFCNT_inc_simple_NN(layer));
928 #endif /* USE_ATTIBUTES_FOR_PERLIO */
931 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
933 HV * const stash = gv_stashpvs("PerlIO::Layer", GV_ADD);
934 SV * const sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
938 XS(XS_PerlIO__Layer__NoWarnings)
940 /* This is used as a %SIG{__WARN__} handler to suppress warnings
941 during loading of layers.
947 PerlIO_debug("warning:%s\n",SvPV_nolen_const(ST(0)));
951 XS(XS_PerlIO__Layer__find)
957 Perl_croak(aTHX_ "Usage class->find(name[,load])");
960 const char * const name = SvPV_const(ST(1), len);
961 const bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
962 PerlIO_funcs * const layer = PerlIO_find_layer(aTHX_ name, len, load);
964 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
971 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
974 if (!PL_known_layers)
975 PL_known_layers = PerlIO_list_alloc(aTHX);
976 PerlIO_list_push(aTHX_ PL_known_layers, tab, NULL);
977 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
981 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
985 const char *s = names;
987 while (isSPACE(*s) || *s == ':')
992 const char *as = NULL;
994 if (!isIDFIRST(*s)) {
996 * Message is consistent with how attribute lists are
997 * passed. Even though this means "foo : : bar" is
998 * seen as an invalid separator character.
1000 const char q = ((*s == '\'') ? '"' : '\'');
1001 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1002 "Invalid separator character %c%c%c in PerlIO layer specification %s",
1004 SETERRNO(EINVAL, LIB_INVARG);
1009 } while (isWORDCHAR(*e));
1018 alen = (e - 1) - as;
1025 * It's a nul terminated string, not allowed
1026 * to \ the terminating null. Anything other
1027 * character is passed over.
1037 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER),
1038 "Argument list not closed for PerlIO layer \"%.*s\"",
1050 PerlIO_funcs * const layer =
1051 PerlIO_find_layer(aTHX_ s, llen, 1);
1055 arg = newSVpvn(as, alen);
1056 PerlIO_list_push(aTHX_ av, layer,
1057 (arg) ? arg : &PL_sv_undef);
1061 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
1074 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
1077 PERLIO_FUNCS_DECL(*tab) = &PerlIO_perlio;
1078 #ifdef PERLIO_USING_CRLF
1081 if (PerlIO_stdio.Set_ptrcnt)
1082 tab = &PerlIO_stdio;
1084 PerlIO_debug("Pushing %s\n", tab->name);
1085 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
1090 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
1092 return av->array[n].arg;
1096 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
1098 if (n >= 0 && n < av->cur) {
1099 PerlIO_debug("Layer %" IVdf " is %s\n", n,
1100 av->array[n].funcs->name);
1101 return av->array[n].funcs;
1104 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
1109 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1111 PERL_UNUSED_ARG(mode);
1112 PERL_UNUSED_ARG(arg);
1113 PERL_UNUSED_ARG(tab);
1114 if (PerlIOValid(f)) {
1116 PerlIO_pop(aTHX_ f);
1122 PERLIO_FUNCS_DECL(PerlIO_remove) = {
1123 sizeof(PerlIO_funcs),
1126 PERLIO_K_DUMMY | PERLIO_K_UTF8,
1146 NULL, /* get_base */
1147 NULL, /* get_bufsiz */
1150 NULL, /* set_ptrcnt */
1154 PerlIO_default_layers(pTHX)
1157 if (!PL_def_layerlist) {
1158 const char * const s = TAINTING_get ? NULL : PerlEnv_getenv("PERLIO");
1159 PERLIO_FUNCS_DECL(*osLayer) = &PerlIO_unix;
1160 PL_def_layerlist = PerlIO_list_alloc(aTHX);
1161 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_unix));
1163 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_win32));
1165 osLayer = &PerlIO_win32;
1168 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_raw));
1169 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
1170 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
1171 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
1172 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
1173 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
1174 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
1175 PerlIO_list_push(aTHX_ PL_def_layerlist,
1176 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
1179 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
1182 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1185 if (PL_def_layerlist->cur < 2) {
1186 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
1188 return PL_def_layerlist;
1192 Perl_boot_core_PerlIO(pTHX)
1194 #ifdef USE_ATTRIBUTES_FOR_PERLIO
1195 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
1198 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
1199 newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
1203 PerlIO_default_layer(pTHX_ I32 n)
1206 PerlIO_list_t * const av = PerlIO_default_layers(aTHX);
1209 return PerlIO_layer_fetch(aTHX_ av, n, PERLIO_FUNCS_CAST(&PerlIO_stdio));
1212 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
1213 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
1216 PerlIO_stdstreams(pTHX)
1220 PerlIO_init_table(aTHX);
1221 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
1222 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
1223 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
1228 PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab), const char *mode, SV *arg)
1231 if (tab->fsize != sizeof(PerlIO_funcs)) {
1233 "%s (%"UVuf") does not match %s (%"UVuf")",
1234 "PerlIO layer function table size", (UV)tab->fsize,
1235 "size expected by this perl", (UV)sizeof(PerlIO_funcs) );
1239 if (tab->size < sizeof(PerlIOl)) {
1241 "%s (%"UVuf") smaller than %s (%"UVuf")",
1242 "PerlIO layer instance size", (UV)tab->size,
1243 "size expected by this perl", (UV)sizeof(PerlIOl) );
1245 /* Real layer with a data area */
1248 Newxz(temp, tab->size, char);
1252 l->tab = (PerlIO_funcs*) tab;
1253 l->head = ((PerlIOl*)f)->head;
1255 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",
1256 (void*)f, tab->name,
1257 (mode) ? mode : "(Null)", (void*)arg);
1258 if (*l->tab->Pushed &&
1260 (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1261 PerlIO_pop(aTHX_ f);
1270 /* Pseudo-layer where push does its own stack adjust */
1271 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
1272 (mode) ? mode : "(Null)", (void*)arg);
1274 (*tab->Pushed) (aTHX_ f, mode, arg, (PerlIO_funcs*) tab) != 0) {
1282 PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1283 IV n, const char *mode, int fd, int imode, int perm,
1284 PerlIO *old, int narg, SV **args)
1286 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_layer(aTHX_ 0));
1287 if (tab && tab->Open) {
1288 PerlIO* ret = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm, old, narg, args);
1289 if (ret && PerlIO_push(aTHX_ ret, self, mode, PerlIOArg) == NULL) {
1295 SETERRNO(EINVAL, LIB_INVARG);
1300 PerlIOBase_binmode(pTHX_ PerlIO *f)
1302 if (PerlIOValid(f)) {
1303 /* Is layer suitable for raw stream ? */
1304 if (PerlIOBase(f)->tab && PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
1305 /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
1306 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1309 /* Not suitable - pop it */
1310 PerlIO_pop(aTHX_ f);
1318 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1320 PERL_UNUSED_ARG(mode);
1321 PERL_UNUSED_ARG(arg);
1322 PERL_UNUSED_ARG(tab);
1324 if (PerlIOValid(f)) {
1329 * Strip all layers that are not suitable for a raw stream
1332 while (t && (l = *t)) {
1333 if (l->tab && l->tab->Binmode) {
1334 /* Has a handler - normal case */
1335 if ((*l->tab->Binmode)(aTHX_ t) == 0) {
1337 /* Layer still there - move down a layer */
1346 /* No handler - pop it */
1347 PerlIO_pop(aTHX_ t);
1350 if (PerlIOValid(f)) {
1351 PerlIO_debug(":raw f=%p :%s\n", (void*)f,
1352 PerlIOBase(f)->tab ? PerlIOBase(f)->tab->name : "(Null)");
1360 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1361 PerlIO_list_t *layers, IV n, IV max)
1365 PerlIO_funcs * const tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1367 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1378 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1382 save_scalar(PL_errgv);
1384 PerlIO_list_t * const layers = PerlIO_list_alloc(aTHX);
1385 code = PerlIO_parse_layers(aTHX_ layers, names);
1387 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1389 PerlIO_list_free(aTHX_ layers);
1396 /*--------------------------------------------------------------------------------------*/
1398 * Given the abstraction above the public API functions
1402 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1404 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", (void*)f,
1405 (PerlIOBase(f) && PerlIOBase(f)->tab) ?
1406 PerlIOBase(f)->tab->name : "(Null)",
1407 iotype, mode, (names) ? names : "(Null)");
1410 /* Do not flush etc. if (e.g.) switching encodings.
1411 if a pushed layer knows it needs to flush lower layers
1412 (for example :unix which is never going to call them)
1413 it can do the flush when it is pushed.
1415 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1418 /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
1419 #ifdef PERLIO_USING_CRLF
1420 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1421 O_BINARY so we can look for it in mode.
1423 if (!(mode & O_BINARY)) {
1425 /* FIXME?: Looking down the layer stack seems wrong,
1426 but is a way of reaching past (say) an encoding layer
1427 to flip CRLF-ness of the layer(s) below
1430 /* Perhaps we should turn on bottom-most aware layer
1431 e.g. Ilya's idea that UNIX TTY could serve
1433 if (PerlIOBase(f)->tab &&
1434 PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF)
1436 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1437 /* Not in text mode - flush any pending stuff and flip it */
1439 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1441 /* Only need to turn it on in one layer so we are done */
1446 /* Not finding a CRLF aware layer presumably means we are binary
1447 which is not what was requested - so we failed
1448 We _could_ push :crlf layer but so could caller
1453 /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
1454 So code that used to be here is now in PerlIORaw_pushed().
1456 return PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_raw), NULL, NULL) ? TRUE : FALSE;
1461 PerlIO__close(pTHX_ PerlIO *f)
1463 if (PerlIOValid(f)) {
1464 PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1465 if (tab && tab->Close)
1466 return (*tab->Close)(aTHX_ f);
1468 return PerlIOBase_close(aTHX_ f);
1471 SETERRNO(EBADF, SS_IVCHAN);
1477 Perl_PerlIO_close(pTHX_ PerlIO *f)
1479 const int code = PerlIO__close(aTHX_ f);
1480 while (PerlIOValid(f)) {
1481 PerlIO_pop(aTHX_ f);
1482 if (PerlIO_lockcnt(f))
1483 /* we're in use; the 'pop' deferred freeing the structure */
1490 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1493 Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
1497 static PerlIO_funcs *
1498 PerlIO_layer_from_ref(pTHX_ SV *sv)
1502 * For any scalar type load the handler which is bundled with perl
1504 if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
1505 PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
1506 /* This isn't supposed to happen, since PerlIO::scalar is core,
1507 * but could happen anyway in smaller installs or with PAR */
1509 /* diag_listed_as: Unknown PerlIO layer "%s" */
1510 Perl_ck_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"scalar\"");
1515 * For other types allow if layer is known but don't try and load it
1517 switch (SvTYPE(sv)) {
1519 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Array"), 0);
1521 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Hash"), 0);
1523 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Code"), 0);
1525 return PerlIO_find_layer(aTHX_ STR_WITH_LEN("Glob"), 0);
1532 PerlIO_resolve_layers(pTHX_ const char *layers,
1533 const char *mode, int narg, SV **args)
1536 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1539 PerlIO_stdstreams(aTHX);
1541 SV * const arg = *args;
1543 * If it is a reference but not an object see if we have a handler
1546 if (SvROK(arg) && !sv_isobject(arg)) {
1547 PerlIO_funcs * const handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1549 def = PerlIO_list_alloc(aTHX);
1550 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1554 * Don't fail if handler cannot be found :via(...) etc. may do
1555 * something sensible else we will just stringfy and open
1560 if (!layers || !*layers)
1561 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1562 if (layers && *layers) {
1565 av = PerlIO_clone_list(aTHX_ def, NULL);
1570 if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
1574 PerlIO_list_free(aTHX_ av);
1586 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1587 int imode, int perm, PerlIO *f, int narg, SV **args)
1590 if (!f && narg == 1 && *args == &PL_sv_undef) {
1591 if ((f = PerlIO_tmpfile())) {
1592 if (!layers || !*layers)
1593 layers = Perl_PerlIO_context_layers(aTHX_ mode);
1594 if (layers && *layers)
1595 PerlIO_apply_layers(aTHX_ f, mode, layers);
1599 PerlIO_list_t *layera;
1601 PerlIO_funcs *tab = NULL;
1602 if (PerlIOValid(f)) {
1604 * This is "reopen" - it is not tested as perl does not use it
1608 layera = PerlIO_list_alloc(aTHX);
1611 if (l->tab && l->tab->Getarg)
1612 arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
1613 PerlIO_list_push(aTHX_ layera, l->tab,
1614 (arg) ? arg : &PL_sv_undef);
1616 l = *PerlIONext(&l);
1620 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1626 * Start at "top" of layer stack
1628 n = layera->cur - 1;
1630 PerlIO_funcs * const t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1639 * Found that layer 'n' can do opens - call it
1641 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1642 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1644 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1645 tab->name, layers ? layers : "(Null)", mode, fd,
1646 imode, perm, (void*)f, narg, (void*)args);
1648 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1651 SETERRNO(EINVAL, LIB_INVARG);
1655 if (n + 1 < layera->cur) {
1657 * More layers above the one that we used to open -
1660 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1661 /* If pushing layers fails close the file */
1668 PerlIO_list_free(aTHX_ layera);
1675 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1677 PERL_ARGS_ASSERT_PERLIO_READ;
1679 Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
1683 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1685 PERL_ARGS_ASSERT_PERLIO_UNREAD;
1687 Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
1691 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1693 PERL_ARGS_ASSERT_PERLIO_WRITE;
1695 Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
1699 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1701 Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
1705 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1707 Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
1711 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1716 const PerlIO_funcs *tab = PerlIOBase(f)->tab;
1718 if (tab && tab->Flush)
1719 return (*tab->Flush) (aTHX_ f);
1721 return 0; /* If no Flush defined, silently succeed. */
1724 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1725 SETERRNO(EBADF, SS_IVCHAN);
1731 * Is it good API design to do flush-all on NULL, a potentially
1732 * erroneous input? Maybe some magical value (PerlIO*
1733 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1734 * things on fflush(NULL), but should we be bound by their design
1737 PerlIOl **table = &PL_perlio;
1740 while ((ff = *table)) {
1742 table = (PerlIOl **) (ff++);
1743 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1744 if (ff->next && PerlIO_flush(&(ff->next)) != 0)
1754 PerlIOBase_flush_linebuf(pTHX)
1757 PerlIOl **table = &PL_perlio;
1759 while ((f = *table)) {
1761 table = (PerlIOl **) (f++);
1762 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1764 && (PerlIOBase(&(f->next))->
1765 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1766 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1767 PerlIO_flush(&(f->next));
1774 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1776 Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
1780 PerlIO_isutf8(PerlIO *f)
1783 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1785 SETERRNO(EBADF, SS_IVCHAN);
1791 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1793 Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
1797 Perl_PerlIO_error(pTHX_ PerlIO *f)
1799 Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
1803 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1805 Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
1809 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1811 Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
1815 PerlIO_has_base(PerlIO *f)
1817 if (PerlIOValid(f)) {
1818 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1821 return (tab->Get_base != NULL);
1828 PerlIO_fast_gets(PerlIO *f)
1830 if (PerlIOValid(f)) {
1831 if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1832 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1835 return (tab->Set_ptrcnt != NULL);
1843 PerlIO_has_cntptr(PerlIO *f)
1845 if (PerlIOValid(f)) {
1846 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1849 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1856 PerlIO_canset_cnt(PerlIO *f)
1858 if (PerlIOValid(f)) {
1859 const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
1862 return (tab->Set_ptrcnt != NULL);
1869 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1871 Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
1875 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1877 Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
1881 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1883 Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
1887 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1889 Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
1893 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1895 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
1899 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1901 Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
1905 /*--------------------------------------------------------------------------------------*/
1907 * utf8 and raw dummy layers
1911 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
1913 PERL_UNUSED_CONTEXT;
1914 PERL_UNUSED_ARG(mode);
1915 PERL_UNUSED_ARG(arg);
1916 if (PerlIOValid(f)) {
1917 if (tab && tab->kind & PERLIO_K_UTF8)
1918 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1920 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1926 PERLIO_FUNCS_DECL(PerlIO_utf8) = {
1927 sizeof(PerlIO_funcs),
1930 PERLIO_K_DUMMY | PERLIO_K_UTF8 | PERLIO_K_MULTIARG,
1950 NULL, /* get_base */
1951 NULL, /* get_bufsiz */
1954 NULL, /* set_ptrcnt */
1957 PERLIO_FUNCS_DECL(PerlIO_byte) = {
1958 sizeof(PerlIO_funcs),
1961 PERLIO_K_DUMMY | PERLIO_K_MULTIARG,
1981 NULL, /* get_base */
1982 NULL, /* get_bufsiz */
1985 NULL, /* set_ptrcnt */
1988 PERLIO_FUNCS_DECL(PerlIO_raw) = {
1989 sizeof(PerlIO_funcs),
2012 NULL, /* get_base */
2013 NULL, /* get_bufsiz */
2016 NULL, /* set_ptrcnt */
2018 /*--------------------------------------------------------------------------------------*/
2019 /*--------------------------------------------------------------------------------------*/
2021 * "Methods" of the "base class"
2025 PerlIOBase_fileno(pTHX_ PerlIO *f)
2027 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
2031 PerlIO_modestr(PerlIO * f, char *buf)
2034 if (PerlIOValid(f)) {
2035 const IV flags = PerlIOBase(f)->flags;
2036 if (flags & PERLIO_F_APPEND) {
2038 if (flags & PERLIO_F_CANREAD) {
2042 else if (flags & PERLIO_F_CANREAD) {
2044 if (flags & PERLIO_F_CANWRITE)
2047 else if (flags & PERLIO_F_CANWRITE) {
2049 if (flags & PERLIO_F_CANREAD) {
2053 #ifdef PERLIO_USING_CRLF
2054 if (!(flags & PERLIO_F_CRLF))
2064 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2066 PerlIOl * const l = PerlIOBase(f);
2067 PERL_UNUSED_CONTEXT;
2068 PERL_UNUSED_ARG(arg);
2070 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
2071 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
2072 if (tab && tab->Set_ptrcnt != NULL)
2073 l->flags |= PERLIO_F_FASTGETS;
2075 if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
2079 l->flags |= PERLIO_F_CANREAD;
2082 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
2085 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
2088 SETERRNO(EINVAL, LIB_INVARG);
2094 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
2097 l->flags &= ~PERLIO_F_CRLF;
2100 l->flags |= PERLIO_F_CRLF;
2103 SETERRNO(EINVAL, LIB_INVARG);
2110 l->flags |= l->next->flags &
2111 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
2116 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
2117 (void*)f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
2118 l->flags, PerlIO_modestr(f, temp));
2124 PerlIOBase_popped(pTHX_ PerlIO *f)
2126 PERL_UNUSED_CONTEXT;
2132 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2135 * Save the position as current head considers it
2137 const Off_t old = PerlIO_tell(f);
2138 PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_pending), "r", NULL);
2139 PerlIOSelf(f, PerlIOBuf)->posn = old;
2140 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
2144 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2146 STDCHAR *buf = (STDCHAR *) vbuf;
2148 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
2149 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2150 SETERRNO(EBADF, SS_IVCHAN);
2156 SSize_t avail = PerlIO_get_cnt(f);
2159 take = (((SSize_t) count >= 0) && ((SSize_t)count < avail)) ? (SSize_t)count : avail;
2161 STDCHAR *ptr = PerlIO_get_ptr(f);
2162 Copy(ptr, buf, take, STDCHAR);
2163 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
2166 if (avail == 0) /* set_ptrcnt could have reset avail */
2169 if (count > 0 && avail <= 0) {
2170 if (PerlIO_fill(f) != 0)
2175 return (buf - (STDCHAR *) vbuf);
2181 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
2183 PERL_UNUSED_CONTEXT;
2189 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
2191 PERL_UNUSED_CONTEXT;
2197 PerlIOBase_close(pTHX_ PerlIO *f)
2200 if (PerlIOValid(f)) {
2201 PerlIO *n = PerlIONext(f);
2202 code = PerlIO_flush(f);
2203 PerlIOBase(f)->flags &=
2204 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2205 while (PerlIOValid(n)) {
2206 const PerlIO_funcs * const tab = PerlIOBase(n)->tab;
2207 if (tab && tab->Close) {
2208 if ((*tab->Close)(aTHX_ n) != 0)
2213 PerlIOBase(n)->flags &=
2214 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
2220 SETERRNO(EBADF, SS_IVCHAN);
2226 PerlIOBase_eof(pTHX_ PerlIO *f)
2228 PERL_UNUSED_CONTEXT;
2229 if (PerlIOValid(f)) {
2230 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
2236 PerlIOBase_error(pTHX_ PerlIO *f)
2238 PERL_UNUSED_CONTEXT;
2239 if (PerlIOValid(f)) {
2240 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
2246 PerlIOBase_clearerr(pTHX_ PerlIO *f)
2248 if (PerlIOValid(f)) {
2249 PerlIO * const n = PerlIONext(f);
2250 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
2257 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
2259 PERL_UNUSED_CONTEXT;
2260 if (PerlIOValid(f)) {
2261 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2266 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2272 arg = sv_dup(arg, param);
2273 SvREFCNT_inc_simple_void_NN(arg);
2277 return newSVsv(arg);
2280 PERL_UNUSED_ARG(param);
2281 return newSVsv(arg);
2286 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2288 PerlIO * const nexto = PerlIONext(o);
2289 if (PerlIOValid(nexto)) {
2290 const PerlIO_funcs * const tab = PerlIOBase(nexto)->tab;
2291 if (tab && tab->Dup)
2292 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2294 f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
2297 PerlIO_funcs * const self = PerlIOBase(o)->tab;
2300 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2301 self ? self->name : "(Null)",
2302 (void*)f, (void*)o, (void*)param);
2303 if (self && self->Getarg)
2304 arg = (*self->Getarg)(aTHX_ o, param, flags);
2305 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2306 if (PerlIOBase(o)->flags & PERLIO_F_UTF8)
2307 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
2313 /* PL_perlio_fd_refcnt[] is in intrpvar.h */
2315 /* Must be called with PL_perlio_mutex locked. */
2317 S_more_refcounted_fds(pTHX_ const int new_fd) {
2319 const int old_max = PL_perlio_fd_refcnt_size;
2320 const int new_max = 16 + (new_fd & ~15);
2323 PerlIO_debug("More fds - old=%d, need %d, new=%d\n",
2324 old_max, new_fd, new_max);
2326 if (new_fd < old_max) {
2330 assert (new_max > new_fd);
2332 /* Use plain realloc() since we need this memory to be really
2333 * global and visible to all the interpreters and/or threads. */
2334 new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
2338 MUTEX_UNLOCK(&PL_perlio_mutex);
2343 PL_perlio_fd_refcnt_size = new_max;
2344 PL_perlio_fd_refcnt = new_array;
2346 PerlIO_debug("Zeroing %p, %d\n",
2347 (void*)(new_array + old_max),
2350 Zero(new_array + old_max, new_max - old_max, int);
2357 /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
2358 PERL_UNUSED_CONTEXT;
2362 PerlIOUnix_refcnt_inc(int fd)
2369 MUTEX_LOCK(&PL_perlio_mutex);
2371 if (fd >= PL_perlio_fd_refcnt_size)
2372 S_more_refcounted_fds(aTHX_ fd);
2374 PL_perlio_fd_refcnt[fd]++;
2375 if (PL_perlio_fd_refcnt[fd] <= 0) {
2376 /* diag_listed_as: refcnt_inc: fd %d%s */
2377 Perl_croak(aTHX_ "refcnt_inc: fd %d: %d <= 0\n",
2378 fd, PL_perlio_fd_refcnt[fd]);
2380 PerlIO_debug("refcnt_inc: fd %d refcnt=%d\n",
2381 fd, PL_perlio_fd_refcnt[fd]);
2384 MUTEX_UNLOCK(&PL_perlio_mutex);
2387 /* diag_listed_as: refcnt_inc: fd %d%s */
2388 Perl_croak(aTHX_ "refcnt_inc: fd %d < 0\n", fd);
2393 PerlIOUnix_refcnt_dec(int fd)
2399 MUTEX_LOCK(&PL_perlio_mutex);
2401 if (fd >= PL_perlio_fd_refcnt_size) {
2402 /* diag_listed_as: refcnt_dec: fd %d%s */
2403 Perl_croak_nocontext("refcnt_dec: fd %d >= refcnt_size %d\n",
2404 fd, PL_perlio_fd_refcnt_size);
2406 if (PL_perlio_fd_refcnt[fd] <= 0) {
2407 /* diag_listed_as: refcnt_dec: fd %d%s */
2408 Perl_croak_nocontext("refcnt_dec: fd %d: %d <= 0\n",
2409 fd, PL_perlio_fd_refcnt[fd]);
2411 cnt = --PL_perlio_fd_refcnt[fd];
2412 PerlIO_debug("refcnt_dec: fd %d refcnt=%d\n", fd, cnt);
2414 MUTEX_UNLOCK(&PL_perlio_mutex);
2417 /* diag_listed_as: refcnt_dec: fd %d%s */
2418 Perl_croak_nocontext("refcnt_dec: fd %d < 0\n", fd);
2424 PerlIOUnix_refcnt(int fd)
2431 MUTEX_LOCK(&PL_perlio_mutex);
2433 if (fd >= PL_perlio_fd_refcnt_size) {
2434 /* diag_listed_as: refcnt: fd %d%s */
2435 Perl_croak(aTHX_ "refcnt: fd %d >= refcnt_size %d\n",
2436 fd, PL_perlio_fd_refcnt_size);
2438 if (PL_perlio_fd_refcnt[fd] <= 0) {
2439 /* diag_listed_as: refcnt: fd %d%s */
2440 Perl_croak(aTHX_ "refcnt: fd %d: %d <= 0\n",
2441 fd, PL_perlio_fd_refcnt[fd]);
2443 cnt = PL_perlio_fd_refcnt[fd];
2445 MUTEX_UNLOCK(&PL_perlio_mutex);
2448 /* diag_listed_as: refcnt: fd %d%s */
2449 Perl_croak(aTHX_ "refcnt: fd %d < 0\n", fd);
2455 PerlIO_cleanup(pTHX)
2460 PerlIO_debug("Cleanup layers for %p\n",(void*)aTHX);
2462 PerlIO_debug("Cleanup layers\n");
2465 /* Raise STDIN..STDERR refcount so we don't close them */
2466 for (i=0; i < 3; i++)
2467 PerlIOUnix_refcnt_inc(i);
2468 PerlIO_cleantable(aTHX_ &PL_perlio);
2469 /* Restore STDIN..STDERR refcount */
2470 for (i=0; i < 3; i++)
2471 PerlIOUnix_refcnt_dec(i);
2473 if (PL_known_layers) {
2474 PerlIO_list_free(aTHX_ PL_known_layers);
2475 PL_known_layers = NULL;
2477 if (PL_def_layerlist) {
2478 PerlIO_list_free(aTHX_ PL_def_layerlist);
2479 PL_def_layerlist = NULL;
2483 void PerlIO_teardown(void) /* Call only from PERL_SYS_TERM(). */
2487 /* XXX we can't rely on an interpreter being present at this late stage,
2488 XXX so we can't use a function like PerlLIO_write that relies on one
2489 being present (at least in win32) :-(.
2494 /* By now all filehandles should have been closed, so any
2495 * stray (non-STD-)filehandles indicate *possible* (PerlIO)
2497 #define PERLIO_TEARDOWN_MESSAGE_BUF_SIZE 64
2498 #define PERLIO_TEARDOWN_MESSAGE_FD 2
2499 char buf[PERLIO_TEARDOWN_MESSAGE_BUF_SIZE];
2501 for (i = 3; i < PL_perlio_fd_refcnt_size; i++) {
2502 if (PL_perlio_fd_refcnt[i]) {
2504 my_snprintf(buf, sizeof(buf),
2505 "PerlIO_teardown: fd %d refcnt=%d\n",
2506 i, PL_perlio_fd_refcnt[i]);
2507 PerlLIO_write(PERLIO_TEARDOWN_MESSAGE_FD, buf, len);
2513 /* Not bothering with PL_perlio_mutex since by now
2514 * all the interpreters are gone. */
2515 if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
2516 && PL_perlio_fd_refcnt) {
2517 free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
2518 PL_perlio_fd_refcnt = NULL;
2519 PL_perlio_fd_refcnt_size = 0;
2523 /*--------------------------------------------------------------------------------------*/
2525 * Bottom-most level for UNIX-like case
2529 struct _PerlIO base; /* The generic part */
2530 int fd; /* UNIX like file descriptor */
2531 int oflags; /* open/fcntl flags */
2535 S_lockcnt_dec(pTHX_ const void* f)
2537 PerlIO_lockcnt((PerlIO*)f)--;
2541 /* call the signal handler, and if that handler happens to clear
2542 * this handle, free what we can and return true */
2545 S_perlio_async_run(pTHX_ PerlIO* f) {
2547 SAVEDESTRUCTOR_X(S_lockcnt_dec, (void*)f);
2548 PerlIO_lockcnt(f)++;
2550 if ( !(PerlIOBase(f)->flags & PERLIO_F_CLEARED) ) {
2554 /* we've just run some perl-level code that could have done
2555 * anything, including closing the file or clearing this layer.
2556 * If so, free any lower layers that have already been
2557 * cleared, then return an error. */
2558 while (PerlIOValid(f) &&
2559 (PerlIOBase(f)->flags & PERLIO_F_CLEARED))
2561 const PerlIOl *l = *f;
2570 PerlIOUnix_oflags(const char *mode)
2573 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
2578 if (*++mode == '+') {
2585 oflags = O_CREAT | O_TRUNC;
2586 if (*++mode == '+') {
2595 oflags = O_CREAT | O_APPEND;
2596 if (*++mode == '+') {
2609 else if (*mode == 't') {
2611 oflags &= ~O_BINARY;
2615 #ifdef PERLIO_USING_CRLF
2617 * If neither "t" nor "b" was specified, open the file
2623 if (*mode || oflags == -1) {
2624 SETERRNO(EINVAL, LIB_INVARG);
2631 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2633 PERL_UNUSED_CONTEXT;
2634 return PerlIOSelf(f, PerlIOUnix)->fd;
2638 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
2640 PerlIOUnix * const s = PerlIOSelf(f, PerlIOUnix);
2643 if (PerlLIO_fstat(fd, &st) == 0) {
2644 if (!S_ISREG(st.st_mode)) {
2645 PerlIO_debug("%d is not regular file\n",fd);
2646 PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
2649 PerlIO_debug("%d _is_ a regular file\n",fd);
2655 PerlIOUnix_refcnt_inc(fd);
2656 PERL_UNUSED_CONTEXT;
2660 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2662 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2663 if (*PerlIONext(f)) {
2664 /* We never call down so do any pending stuff now */
2665 PerlIO_flush(PerlIONext(f));
2667 * XXX could (or should) we retrieve the oflags from the open file
2668 * handle rather than believing the "mode" we are passed in? XXX
2669 * Should the value on NULL mode be 0 or -1?
2671 PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
2672 mode ? PerlIOUnix_oflags(mode) : -1);
2674 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2680 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2682 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2684 PERL_UNUSED_CONTEXT;
2685 if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
2687 SETERRNO(ESPIPE, LIB_INVARG);
2689 SETERRNO(EINVAL, LIB_INVARG);
2693 new_loc = PerlLIO_lseek(fd, offset, whence);
2694 if (new_loc == (Off_t) - 1)
2696 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2701 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2702 IV n, const char *mode, int fd, int imode,
2703 int perm, PerlIO *f, int narg, SV **args)
2705 if (PerlIOValid(f)) {
2706 if (PerlIOBase(f)->tab && PerlIOBase(f)->flags & PERLIO_F_OPEN)
2707 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2710 if (*mode == IoTYPE_NUMERIC)
2713 imode = PerlIOUnix_oflags(mode);
2715 perm = 0777; /* preserve RMS defaults, ACL inheritance, etc. */
2721 const char *path = SvPV_nolen_const(*args);
2722 fd = PerlLIO_open3(path, imode, perm);
2726 if (*mode == IoTYPE_IMPLICIT)
2729 f = PerlIO_allocate(aTHX);
2731 if (!PerlIOValid(f)) {
2732 if (!(f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
2736 PerlIOUnix_setfd(aTHX_ f, fd, imode);
2737 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2738 if (*mode == IoTYPE_APPEND)
2739 PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
2746 * FIXME: pop layers ???
2754 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2756 const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
2758 if (flags & PERLIO_DUP_FD) {
2759 fd = PerlLIO_dup(fd);
2762 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2764 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2765 PerlIOUnix_setfd(aTHX_ f, fd, os->oflags);
2774 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2778 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2780 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2781 #ifdef PERLIO_STD_SPECIAL
2783 return PERLIO_STD_IN(fd, vbuf, count);
2785 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
2786 PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
2790 const SSize_t len = PerlLIO_read(fd, vbuf, count);
2791 if (len >= 0 || errno != EINTR) {
2793 if (errno != EAGAIN) {
2794 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2797 else if (len == 0 && count != 0) {
2798 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2804 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2811 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2815 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
2817 fd = PerlIOSelf(f, PerlIOUnix)->fd;
2818 #ifdef PERLIO_STD_SPECIAL
2819 if (fd == 1 || fd == 2)
2820 return PERLIO_STD_OUT(fd, vbuf, count);
2823 const SSize_t len = PerlLIO_write(fd, vbuf, count);
2824 if (len >= 0 || errno != EINTR) {
2826 if (errno != EAGAIN) {
2827 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2833 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2840 PerlIOUnix_tell(pTHX_ PerlIO *f)
2842 PERL_UNUSED_CONTEXT;
2844 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2849 PerlIOUnix_close(pTHX_ PerlIO *f)
2852 const int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2854 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2855 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2856 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2861 SETERRNO(EBADF,SS_IVCHAN);
2864 while (PerlLIO_close(fd) != 0) {
2865 if (errno != EINTR) {
2870 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
2874 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2879 PERLIO_FUNCS_DECL(PerlIO_unix) = {
2880 sizeof(PerlIO_funcs),
2887 PerlIOBase_binmode, /* binmode */
2897 PerlIOBase_noop_ok, /* flush */
2898 PerlIOBase_noop_fail, /* fill */
2901 PerlIOBase_clearerr,
2902 PerlIOBase_setlinebuf,
2903 NULL, /* get_base */
2904 NULL, /* get_bufsiz */
2907 NULL, /* set_ptrcnt */
2910 /*--------------------------------------------------------------------------------------*/
2915 #if defined(VMS) && !defined(STDIO_BUFFER_WRITABLE)
2916 /* perl5.8 - This ensures the last minute VMS ungetc fix is not
2917 broken by the last second glibc 2.3 fix
2919 #define STDIO_BUFFER_WRITABLE
2924 struct _PerlIO base;
2925 FILE *stdio; /* The stream */
2929 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2931 PERL_UNUSED_CONTEXT;
2933 if (PerlIOValid(f)) {
2934 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
2936 return PerlSIO_fileno(s);
2943 PerlIOStdio_mode(const char *mode, char *tmode)
2945 char * const ret = tmode;
2951 #if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
2959 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
2962 if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
2963 PerlIO_funcs * const toptab = PerlIOBase(n)->tab;
2964 if (toptab == tab) {
2965 /* Top is already stdio - pop self (duplicate) and use original */
2966 PerlIO_pop(aTHX_ f);
2969 const int fd = PerlIO_fileno(n);
2972 if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
2973 mode = PerlIOStdio_mode(mode, tmode)))) {
2974 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2975 /* We never call down so do any pending stuff now */
2976 PerlIO_flush(PerlIONext(f));
2983 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
2988 PerlIO_importFILE(FILE *stdio, const char *mode)
2994 if (!mode || !*mode) {
2995 /* We need to probe to see how we can open the stream
2996 so start with read/write and then try write and read
2997 we dup() so that we can fclose without loosing the fd.
2999 Note that the errno value set by a failing fdopen
3000 varies between stdio implementations.
3002 const int fd = PerlLIO_dup(fileno(stdio));
3003 FILE *f2 = PerlSIO_fdopen(fd, (mode = "r+"));
3005 f2 = PerlSIO_fdopen(fd, (mode = "w"));
3008 f2 = PerlSIO_fdopen(fd, (mode = "r"));
3011 /* Don't seem to be able to open */
3017 if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), PERLIO_FUNCS_CAST(&PerlIO_stdio), mode, NULL))) {
3018 s = PerlIOSelf(f, PerlIOStdio);
3020 PerlIOUnix_refcnt_inc(fileno(stdio));
3027 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3028 IV n, const char *mode, int fd, int imode,
3029 int perm, PerlIO *f, int narg, SV **args)
3032 if (PerlIOValid(f)) {
3033 const char * const path = SvPV_nolen_const(*args);
3034 PerlIOStdio * const s = PerlIOSelf(f, PerlIOStdio);
3036 PerlIOUnix_refcnt_dec(fileno(s->stdio));
3037 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
3042 PerlIOUnix_refcnt_inc(fileno(s->stdio));
3047 const char * const path = SvPV_nolen_const(*args);
3048 if (*mode == IoTYPE_NUMERIC) {
3050 fd = PerlLIO_open3(path, imode, perm);
3054 bool appended = FALSE;
3056 /* Cygwin wants its 'b' early. */
3058 mode = PerlIOStdio_mode(mode, tmode);
3060 stdio = PerlSIO_fopen(path, mode);
3063 f = PerlIO_allocate(aTHX);
3066 mode = PerlIOStdio_mode(mode, tmode);
3067 f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
3069 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3070 PerlIOUnix_refcnt_inc(fileno(stdio));
3072 PerlSIO_fclose(stdio);
3084 if (*mode == IoTYPE_IMPLICIT) {
3091 stdio = PerlSIO_stdin;
3094 stdio = PerlSIO_stdout;
3097 stdio = PerlSIO_stderr;
3102 stdio = PerlSIO_fdopen(fd, mode =
3103 PerlIOStdio_mode(mode, tmode));
3107 f = PerlIO_allocate(aTHX);
3109 if ((f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg))) {
3110 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3111 PerlIOUnix_refcnt_inc(fileno(stdio));
3121 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3123 /* This assumes no layers underneath - which is what
3124 happens, but is not how I remember it. NI-S 2001/10/16
3126 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
3127 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
3128 const int fd = fileno(stdio);
3130 if (flags & PERLIO_DUP_FD) {
3131 const int dfd = PerlLIO_dup(fileno(stdio));
3133 stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
3138 /* FIXME: To avoid messy error recovery if dup fails
3139 re-use the existing stdio as though flag was not set
3143 stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
3145 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
3147 PerlIOUnix_refcnt_inc(fileno(stdio));
3154 PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
3156 PERL_UNUSED_CONTEXT;
3158 /* XXX this could use PerlIO_canset_fileno() and
3159 * PerlIO_set_fileno() support from Configure
3161 # if defined(__UCLIBC__)
3162 /* uClibc must come before glibc because it defines __GLIBC__ as well. */
3165 # elif defined(__GLIBC__)
3166 /* There may be a better way for GLIBC:
3167 - libio.h defines a flag to not close() on cleanup
3171 # elif defined(__sun__)
3174 # elif defined(__hpux)
3178 /* Next one ->_file seems to be a reasonable fallback, i.e. if
3179 your platform does not have special entry try this one.
3180 [For OSF only have confirmation for Tru64 (alpha)
3181 but assume other OSFs will be similar.]
3183 # elif defined(_AIX) || defined(__osf__) || defined(__irix__)
3186 # elif defined(__FreeBSD__)
3187 /* There may be a better way on FreeBSD:
3188 - we could insert a dummy func in the _close function entry
3189 f->_close = (int (*)(void *)) dummy_close;
3193 # elif defined(__OpenBSD__)
3194 /* There may be a better way on OpenBSD:
3195 - we could insert a dummy func in the _close function entry
3196 f->_close = (int (*)(void *)) dummy_close;
3200 # elif defined(__EMX__)
3201 /* f->_flags &= ~_IOOPEN; */ /* Will leak stream->_buffer */
3204 # elif defined(__CYGWIN__)
3205 /* There may be a better way on CYGWIN:
3206 - we could insert a dummy func in the _close function entry
3207 f->_close = (int (*)(void *)) dummy_close;
3211 # elif defined(WIN32)
3212 # if defined(UNDER_CE)
3213 /* WIN_CE does not have access to FILE internals, it hardly has FILE
3222 /* Sarathy's code did this - we fall back to a dup/dup2 hack
3223 (which isn't thread safe) instead
3225 # error "Don't know how to set FILE.fileno on your platform"
3233 PerlIOStdio_close(pTHX_ PerlIO *f)
3235 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3241 const int fd = fileno(stdio);
3249 #ifdef SOCKS5_VERSION_NAME
3250 /* Socks lib overrides close() but stdio isn't linked to
3251 that library (though we are) - so we must call close()
3252 on sockets on stdio's behalf.
3255 Sock_size_t optlen = sizeof(int);
3256 if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0)
3259 /* Test for -1, as *BSD stdio (at least) on fclose sets the FILE* such
3260 that a subsequent fileno() on it returns -1. Don't want to croak()
3261 from within PerlIOUnix_refcnt_dec() if some buggy caller code is
3262 trying to close an already closed handle which somehow it still has
3263 a reference to. (via.xs, I'm looking at you). */
3264 if (fd != -1 && PerlIOUnix_refcnt_dec(fd) > 0) {
3265 /* File descriptor still in use */
3269 /* For STD* handles, don't close stdio, since we shared the FILE *, too. */
3270 if (stdio == stdin) /* Some stdios are buggy fflush-ing inputs */
3272 if (stdio == stdout || stdio == stderr)
3273 return PerlIO_flush(f);
3274 /* Tricky - must fclose(stdio) to free memory but not close(fd)
3275 Use Sarathy's trick from maint-5.6 to invalidate the
3276 fileno slot of the FILE *
3278 result = PerlIO_flush(f);
3280 invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio);
3283 MUTEX_LOCK(&PL_perlio_mutex);
3284 /* Right. We need a mutex here because for a brief while we
3285 will have the situation that fd is actually closed. Hence if
3286 a second thread were to get into this block, its dup() would
3287 likely return our fd as its dupfd. (after all, it is closed)
3288 Then if we get to the dup2() first, we blat the fd back
3289 (messing up its temporary as a side effect) only for it to
3290 then close its dupfd (== our fd) in its close(dupfd) */
3292 /* There is, of course, a race condition, that any other thread
3293 trying to input/output/whatever on this fd will be stuffed
3294 for the duration of this little manoeuvrer. Perhaps we
3295 should hold an IO mutex for the duration of every IO
3296 operation if we know that invalidate doesn't work on this
3297 platform, but that would suck, and could kill performance.
3299 Except that correctness trumps speed.
3300 Advice from klortho #11912. */
3302 dupfd = PerlLIO_dup(fd);
3305 MUTEX_UNLOCK(&PL_perlio_mutex);
3306 /* Oh cXap. This isn't going to go well. Not sure if we can
3307 recover from here, or if closing this particular FILE *
3308 is a good idea now. */
3313 SAVE_ERRNO; /* This is here only to silence compiler warnings */
3315 result = PerlSIO_fclose(stdio);
3316 /* We treat error from stdio as success if we invalidated
3317 errno may NOT be expected EBADF
3319 if (invalidate && result != 0) {
3323 #ifdef SOCKS5_VERSION_NAME
3324 /* in SOCKS' case, let close() determine return value */
3328 PerlLIO_dup2(dupfd,fd);
3329 PerlLIO_close(dupfd);
3331 MUTEX_UNLOCK(&PL_perlio_mutex);
3339 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3344 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3346 s = PerlIOSelf(f, PerlIOStdio)->stdio;
3349 STDCHAR *buf = (STDCHAR *) vbuf;
3351 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
3352 * stdio does not do that for fread()
3354 const int ch = PerlSIO_fgetc(s);
3361 got = PerlSIO_fread(vbuf, 1, count, s);
3362 if (got == 0 && PerlSIO_ferror(s))
3364 if (got >= 0 || errno != EINTR)
3366 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3368 SETERRNO(0,0); /* just in case */
3374 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3377 FILE * const s = PerlIOSelf(f, PerlIOStdio)->stdio;
3379 #ifdef STDIO_BUFFER_WRITABLE
3380 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3381 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3382 STDCHAR *base = PerlIO_get_base(f);
3383 SSize_t cnt = PerlIO_get_cnt(f);
3384 STDCHAR *ptr = PerlIO_get_ptr(f);
3385 SSize_t avail = ptr - base;
3387 if (avail > count) {
3391 Move(buf-avail,ptr,avail,STDCHAR);
3394 PerlIO_set_ptrcnt(f,ptr,cnt+avail);
3395 if (PerlSIO_feof(s) && unread >= 0)
3396 PerlSIO_clearerr(s);
3401 if (PerlIO_has_cntptr(f)) {
3402 /* We can get pointer to buffer but not its base
3403 Do ungetc() but check chars are ending up in the
3406 STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3407 STDCHAR *buf = ((STDCHAR *) vbuf) + count;
3409 const int ch = *--buf & 0xFF;
3410 if (ungetc(ch,s) != ch) {
3411 /* ungetc did not work */
3414 if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3415 /* Did not change pointer as expected */
3416 fgetc(s); /* get char back again */
3426 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
3432 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3436 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3439 got = PerlSIO_fwrite(vbuf, 1, count,
3440 PerlIOSelf(f, PerlIOStdio)->stdio);
3441 if (got >= 0 || errno != EINTR)
3443 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3445 SETERRNO(0,0); /* just in case */
3451 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3453 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3454 PERL_UNUSED_CONTEXT;
3456 return PerlSIO_fseek(stdio, offset, whence);
3460 PerlIOStdio_tell(pTHX_ PerlIO *f)
3462 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3463 PERL_UNUSED_CONTEXT;
3465 return PerlSIO_ftell(stdio);
3469 PerlIOStdio_flush(pTHX_ PerlIO *f)
3471 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3472 PERL_UNUSED_CONTEXT;
3474 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3475 return PerlSIO_fflush(stdio);
3481 * FIXME: This discards ungetc() and pre-read stuff which is not
3482 * right if this is just a "sync" from a layer above Suspect right
3483 * design is to do _this_ but not have layer above flush this
3484 * layer read-to-read
3487 * Not writeable - sync by attempting a seek
3490 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
3498 PerlIOStdio_eof(pTHX_ PerlIO *f)
3500 PERL_UNUSED_CONTEXT;
3502 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
3506 PerlIOStdio_error(pTHX_ PerlIO *f)
3508 PERL_UNUSED_CONTEXT;
3510 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
3514 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
3516 PERL_UNUSED_CONTEXT;
3518 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
3522 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
3524 PERL_UNUSED_CONTEXT;
3526 #ifdef HAS_SETLINEBUF
3527 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
3529 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, NULL, _IOLBF, 0);
3535 PerlIOStdio_get_base(pTHX_ PerlIO *f)
3537 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3538 return (STDCHAR*)PerlSIO_get_base(stdio);
3542 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
3544 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3545 return PerlSIO_get_bufsiz(stdio);
3549 #ifdef USE_STDIO_PTR
3551 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
3553 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3554 return (STDCHAR*)PerlSIO_get_ptr(stdio);
3558 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
3560 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3561 return PerlSIO_get_cnt(stdio);
3565 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3567 FILE * const stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3569 #ifdef STDIO_PTR_LVALUE
3570 PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3571 #ifdef STDIO_PTR_LVAL_SETS_CNT
3572 assert(PerlSIO_get_cnt(stdio) == (cnt));
3574 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
3576 * Setting ptr _does_ change cnt - we are done
3580 #else /* STDIO_PTR_LVALUE */
3582 #endif /* STDIO_PTR_LVALUE */
3585 * Now (or only) set cnt
3587 #ifdef STDIO_CNT_LVALUE
3588 PerlSIO_set_cnt(stdio, cnt);
3589 #else /* STDIO_CNT_LVALUE */
3590 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
3591 PerlSIO_set_ptr(stdio,
3592 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
3594 #else /* STDIO_PTR_LVAL_SETS_CNT */
3596 #endif /* STDIO_PTR_LVAL_SETS_CNT */
3597 #endif /* STDIO_CNT_LVALUE */
3604 PerlIOStdio_fill(pTHX_ PerlIO *f)
3608 PERL_UNUSED_CONTEXT;
3609 if (PerlIO_lockcnt(f)) /* in use: abort ungracefully */
3611 stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3614 * fflush()ing read-only streams can cause trouble on some stdio-s
3616 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
3617 if (PerlSIO_fflush(stdio) != 0)
3621 c = PerlSIO_fgetc(stdio);
3624 if (! PerlSIO_ferror(stdio) || errno != EINTR)
3626 if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
3631 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
3633 #ifdef STDIO_BUFFER_WRITABLE
3634 if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
3635 /* Fake ungetc() to the real buffer in case system's ungetc
3638 STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
3639 SSize_t cnt = PerlSIO_get_cnt(stdio);
3640 STDCHAR *ptr = (STDCHAR*)PerlSIO_get_ptr(stdio);
3641 if (ptr == base+1) {
3642 *--ptr = (STDCHAR) c;
3643 PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
3644 if (PerlSIO_feof(stdio))
3645 PerlSIO_clearerr(stdio);
3651 if (PerlIO_has_cntptr(f)) {
3653 if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
3660 /* An ungetc()d char is handled separately from the regular
3661 * buffer, so we stuff it in the buffer ourselves.
3662 * Should never get called as should hit code above
3664 *(--((*stdio)->_ptr)) = (unsigned char) c;
3667 /* If buffer snoop scheme above fails fall back to
3670 if (PerlSIO_ungetc(c, stdio) != c)
3678 PERLIO_FUNCS_DECL(PerlIO_stdio) = {
3679 sizeof(PerlIO_funcs),
3681 sizeof(PerlIOStdio),
3682 PERLIO_K_BUFFERED|PERLIO_K_RAW,
3686 PerlIOBase_binmode, /* binmode */
3700 PerlIOStdio_clearerr,
3701 PerlIOStdio_setlinebuf,
3703 PerlIOStdio_get_base,
3704 PerlIOStdio_get_bufsiz,
3709 #ifdef USE_STDIO_PTR
3710 PerlIOStdio_get_ptr,
3711 PerlIOStdio_get_cnt,
3712 # if defined(HAS_FAST_STDIO) && defined(USE_FAST_STDIO)
3713 PerlIOStdio_set_ptrcnt,
3716 # endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
3721 #endif /* USE_STDIO_PTR */
3724 /* Note that calls to PerlIO_exportFILE() are reversed using
3725 * PerlIO_releaseFILE(), not importFILE. */
3727 PerlIO_exportFILE(PerlIO * f, const char *mode)
3731 if (PerlIOValid(f)) {
3734 if (!mode || !*mode) {
3735 mode = PerlIO_modestr(f, buf);
3737 stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
3741 /* De-link any lower layers so new :stdio sticks */
3743 if ((f2 = PerlIO_push(aTHX_ f, PERLIO_FUNCS_CAST(&PerlIO_stdio), buf, NULL))) {
3744 PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
3746 PerlIOUnix_refcnt_inc(fileno(stdio));
3747 /* Link previous lower layers under new one */
3751 /* restore layers list */
3761 PerlIO_findFILE(PerlIO *f)
3766 if (l->tab == &PerlIO_stdio) {
3767 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3770 l = *PerlIONext(&l);
3772 /* Uses fallback "mode" via PerlIO_modestr() in PerlIO_exportFILE */
3773 /* However, we're not really exporting a FILE * to someone else (who
3774 becomes responsible for closing it, or calling PerlIO_releaseFILE())
3775 So we need to undo its reference count increase on the underlying file
3776 descriptor. We have to do this, because if the loop above returns you
3777 the FILE *, then *it* didn't increase any reference count. So there's
3778 only one way to be consistent. */
3779 stdio = PerlIO_exportFILE(f, NULL);
3781 const int fd = fileno(stdio);
3783 PerlIOUnix_refcnt_dec(fd);
3788 /* Use this to reverse PerlIO_exportFILE calls. */
3790 PerlIO_releaseFILE(PerlIO *p, FILE *f)
3795 if (l->tab == &PerlIO_stdio) {
3796 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
3797 if (s->stdio == f) { /* not in a loop */
3798 const int fd = fileno(f);
3800 PerlIOUnix_refcnt_dec(fd);
3803 PerlIO_pop(aTHX_ p);
3813 /*--------------------------------------------------------------------------------------*/
3815 * perlio buffer layer
3819 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
3821 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3822 const int fd = PerlIO_fileno(f);
3823 if (fd >= 0 && PerlLIO_isatty(fd)) {
3824 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
3826 if (*PerlIONext(f)) {
3827 const Off_t posn = PerlIO_tell(PerlIONext(f));
3828 if (posn != (Off_t) - 1) {
3832 return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
3836 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
3837 IV n, const char *mode, int fd, int imode, int perm,
3838 PerlIO *f, int narg, SV **args)
3840 if (PerlIOValid(f)) {
3841 PerlIO *next = PerlIONext(f);
3843 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
3844 if (tab && tab->Open)
3846 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3848 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
3853 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
3855 if (*mode == IoTYPE_IMPLICIT) {
3861 if (tab && tab->Open)
3862 f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
3865 SETERRNO(EINVAL, LIB_INVARG);
3867 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
3869 * if push fails during open, open fails. close will pop us.
3874 fd = PerlIO_fileno(f);
3875 if (init && fd == 2) {
3877 * Initial stderr is unbuffered
3879 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
3881 #ifdef PERLIO_USING_CRLF
3882 # ifdef PERLIO_IS_BINMODE_FD
3883 if (PERLIO_IS_BINMODE_FD(fd))
3884 PerlIO_binmode(aTHX_ f, '<'/*not used*/, O_BINARY, NULL);
3888 * do something about failing setmode()? --jhi
3890 PerlLIO_setmode(fd, O_BINARY);
3893 /* Enable line buffering with record-oriented regular files
3894 * so we don't introduce an extraneous record boundary when
3895 * the buffer fills up.
3897 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
3899 if (PerlLIO_fstat(fd, &st) == 0
3900 && S_ISREG(st.st_mode)
3901 && (st.st_fab_rfm == FAB$C_VAR
3902 || st.st_fab_rfm == FAB$C_VFC)) {
3903 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
3914 * This "flush" is akin to sfio's sync in that it handles files in either
3915 * read or write state. For write state, we put the postponed data through
3916 * the next layers. For read state, we seek() the next layers to the
3917 * offset given by current position in the buffer, and discard the buffer
3918 * state (XXXX supposed to be for seek()able buffers only, but now it is done
3919 * in any case?). Then the pass the stick further in chain.
3922 PerlIOBuf_flush(pTHX_ PerlIO *f)
3924 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3926 PerlIO *n = PerlIONext(f);
3927 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
3929 * write() the buffer
3931 const STDCHAR *buf = b->buf;
3932 const STDCHAR *p = buf;
3933 while (p < b->ptr) {
3934 SSize_t count = PerlIO_write(n, p, b->ptr - p);
3938 else if (count < 0 || PerlIO_error(n)) {
3939 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3944 b->posn += (p - buf);
3946 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3947 STDCHAR *buf = PerlIO_get_base(f);
3949 * Note position change
3951 b->posn += (b->ptr - buf);
3952 if (b->ptr < b->end) {
3953 /* We did not consume all of it - try and seek downstream to
3954 our logical position
3956 if (PerlIOValid(n) && PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
3957 /* Reload n as some layers may pop themselves on seek */
3958 b->posn = PerlIO_tell(n = PerlIONext(f));
3961 /* Seek failed (e.g. pipe or tty). Do NOT clear buffer or pre-read
3962 data is lost for good - so return saying "ok" having undone
3965 b->posn -= (b->ptr - buf);
3970 b->ptr = b->end = b->buf;
3971 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3972 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
3973 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
3978 /* This discards the content of the buffer after b->ptr, and rereads
3979 * the buffer from the position off in the layer downstream; here off
3980 * is at offset corresponding to b->ptr - b->buf.
3983 PerlIOBuf_fill(pTHX_ PerlIO *f)
3985 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
3986 PerlIO *n = PerlIONext(f);
3989 * Down-stream flush is defined not to loose read data so is harmless.
3990 * we would not normally be fill'ing if there was data left in anycase.
3992 if (PerlIO_flush(f) != 0) /* XXXX Check that its seek() succeeded?! */
3994 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
3995 PerlIOBase_flush_linebuf(aTHX);
3998 PerlIO_get_base(f); /* allocate via vtable */
4000 assert(b->buf); /* The b->buf does get allocated via the vtable system. */
4002 b->ptr = b->end = b->buf;
4004 if (!PerlIOValid(n)) {
4005 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4009 if (PerlIO_fast_gets(n)) {
4011 * Layer below is also buffered. We do _NOT_ want to call its
4012 * ->Read() because that will loop till it gets what we asked for
4013 * which may hang on a pipe etc. Instead take anything it has to
4014 * hand, or ask it to fill _once_.
4016 avail = PerlIO_get_cnt(n);
4018 avail = PerlIO_fill(n);
4020 avail = PerlIO_get_cnt(n);
4022 if (!PerlIO_error(n) && PerlIO_eof(n))
4027 STDCHAR *ptr = PerlIO_get_ptr(n);
4028 const SSize_t cnt = avail;
4029 if (avail > (SSize_t)b->bufsiz)
4031 Copy(ptr, b->buf, avail, STDCHAR);
4032 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
4036 avail = PerlIO_read(n, b->ptr, b->bufsiz);
4040 PerlIOBase(f)->flags |= PERLIO_F_EOF;
4042 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
4045 b->end = b->buf + avail;
4046 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4051 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4053 if (PerlIOValid(f)) {
4054 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4057 return PerlIOBase_read(aTHX_ f, vbuf, count);
4063 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4065 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4066 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4069 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4074 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4076 * Buffer is already a read buffer, we can overwrite any chars
4077 * which have been read back to buffer start
4079 avail = (b->ptr - b->buf);
4083 * Buffer is idle, set it up so whole buffer is available for
4087 b->end = b->buf + avail;
4089 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4091 * Buffer extends _back_ from where we are now
4093 b->posn -= b->bufsiz;
4095 if ((SSize_t) count >= 0 && avail > (SSize_t) count) {
4097 * If we have space for more than count, just move count
4105 * In simple stdio-like ungetc() case chars will be already
4108 if (buf != b->ptr) {
4109 Copy(buf, b->ptr, avail, STDCHAR);
4113 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4117 unread += PerlIOBase_unread(aTHX_ f, vbuf, count);
4123 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4125 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4126 const STDCHAR *buf = (const STDCHAR *) vbuf;
4127 const STDCHAR *flushptr = buf;
4131 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4133 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4134 if (PerlIO_flush(f) != 0) {
4138 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4139 flushptr = buf + count;
4140 while (flushptr > buf && *(flushptr - 1) != '\n')
4144 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
4145 if ((SSize_t) count >= 0 && (SSize_t) count < avail)
4147 if (flushptr > buf && flushptr <= buf + avail)
4148 avail = flushptr - buf;
4149 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4151 Copy(buf, b->ptr, avail, STDCHAR);
4156 if (buf == flushptr)
4159 if (b->ptr >= (b->buf + b->bufsiz))
4160 if (PerlIO_flush(f) == -1)
4163 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4169 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4172 if ((code = PerlIO_flush(f)) == 0) {
4173 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
4174 code = PerlIO_seek(PerlIONext(f), offset, whence);
4176 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4177 b->posn = PerlIO_tell(PerlIONext(f));
4184 PerlIOBuf_tell(pTHX_ PerlIO *f)
4186 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4188 * b->posn is file position where b->buf was read, or will be written
4190 Off_t posn = b->posn;
4191 if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
4192 (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
4194 /* As O_APPEND files are normally shared in some sense it is better
4199 /* when file is NOT shared then this is sufficient */
4200 PerlIO_seek(PerlIONext(f),0, SEEK_END);
4202 posn = b->posn = PerlIO_tell(PerlIONext(f));
4206 * If buffer is valid adjust position by amount in buffer
4208 posn += (b->ptr - b->buf);
4214 PerlIOBuf_popped(pTHX_ PerlIO *f)
4216 const IV code = PerlIOBase_popped(aTHX_ f);
4217 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4218 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4221 b->ptr = b->end = b->buf = NULL;
4222 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4227 PerlIOBuf_close(pTHX_ PerlIO *f)
4229 const IV code = PerlIOBase_close(aTHX_ f);
4230 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4231 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4234 b->ptr = b->end = b->buf = NULL;
4235 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
4240 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
4242 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4249 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
4251 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4254 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
4255 return (b->end - b->ptr);
4260 PerlIOBuf_get_base(pTHX_ PerlIO *f)
4262 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4263 PERL_UNUSED_CONTEXT;
4267 b->bufsiz = PERLIOBUF_DEFAULT_BUFSIZ;
4268 Newxz(b->buf,b->bufsiz, STDCHAR);
4270 b->buf = (STDCHAR *) & b->oneword;
4271 b->bufsiz = sizeof(b->oneword);
4273 b->end = b->ptr = b->buf;
4279 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
4281 const PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4284 return (b->end - b->buf);
4288 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4290 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4292 PERL_UNUSED_ARG(cnt);
4297 assert(PerlIO_get_cnt(f) == cnt);
4298 assert(b->ptr >= b->buf);
4299 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4303 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
4305 return PerlIOBase_dup(aTHX_ f, o, param, flags);
4310 PERLIO_FUNCS_DECL(PerlIO_perlio) = {
4311 sizeof(PerlIO_funcs),
4314 PERLIO_K_BUFFERED|PERLIO_K_RAW,
4318 PerlIOBase_binmode, /* binmode */
4332 PerlIOBase_clearerr,
4333 PerlIOBase_setlinebuf,
4338 PerlIOBuf_set_ptrcnt,
4341 /*--------------------------------------------------------------------------------------*/
4343 * Temp layer to hold unread chars when cannot do it any other way
4347 PerlIOPending_fill(pTHX_ PerlIO *f)
4350 * Should never happen
4357 PerlIOPending_close(pTHX_ PerlIO *f)
4360 * A tad tricky - flush pops us, then we close new top
4363 return PerlIO_close(f);
4367 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
4370 * A tad tricky - flush pops us, then we seek new top
4373 return PerlIO_seek(f, offset, whence);
4378 PerlIOPending_flush(pTHX_ PerlIO *f)
4380 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4381 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
4385 PerlIO_pop(aTHX_ f);
4390 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4396 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
4401 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4403 const IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
4404 PerlIOl * const l = PerlIOBase(f);
4406 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
4407 * etc. get muddled when it changes mid-string when we auto-pop.
4409 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
4410 (PerlIOBase(PerlIONext(f))->
4411 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
4416 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
4418 SSize_t avail = PerlIO_get_cnt(f);
4420 if ((SSize_t) count >= 0 && (SSize_t)count < avail)
4423 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
4424 if (got >= 0 && got < (SSize_t)count) {
4425 const SSize_t more =
4426 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
4427 if (more >= 0 || got == 0)
4433 PERLIO_FUNCS_DECL(PerlIO_pending) = {
4434 sizeof(PerlIO_funcs),
4437 PERLIO_K_BUFFERED|PERLIO_K_RAW, /* not sure about RAW here */
4438 PerlIOPending_pushed,
4441 PerlIOBase_binmode, /* binmode */
4450 PerlIOPending_close,
4451 PerlIOPending_flush,
4455 PerlIOBase_clearerr,
4456 PerlIOBase_setlinebuf,
4461 PerlIOPending_set_ptrcnt,
4466 /*--------------------------------------------------------------------------------------*/
4468 * crlf - translation On read translate CR,LF to "\n" we do this by
4469 * overriding ptr/cnt entries to hand back a line at a time and keeping a
4470 * record of which nl we "lied" about. On write translate "\n" to CR,LF
4472 * c->nl points on the first byte of CR LF pair when it is temporarily
4473 * replaced by LF, or to the last CR of the buffer. In the former case
4474 * the caller thinks that the buffer ends at c->nl + 1, in the latter
4475 * that it ends at c->nl; these two cases can be distinguished by
4476 * *c->nl. c->nl is set during _getcnt() call, and unset during
4477 * _unread() and _flush() calls.
4478 * It only matters for read operations.
4482 PerlIOBuf base; /* PerlIOBuf stuff */
4483 STDCHAR *nl; /* Position of crlf we "lied" about in the
4487 /* Inherit the PERLIO_F_UTF8 flag from previous layer.
4488 * Otherwise the :crlf layer would always revert back to
4492 S_inherit_utf8_flag(PerlIO *f)
4494 PerlIO *g = PerlIONext(f);
4495 if (PerlIOValid(g)) {
4496 if (PerlIOBase(g)->flags & PERLIO_F_UTF8) {
4497 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
4503 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
4506 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
4507 code = PerlIOBuf_pushed(aTHX_ f, mode, arg, tab);
4509 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
4510 (void*)f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
4511 PerlIOBase(f)->flags);
4514 /* If the old top layer is a CRLF layer, reactivate it (if
4515 * necessary) and remove this new layer from the stack */
4516 PerlIO *g = PerlIONext(f);
4517 if (PerlIOValid(g)) {
4518 PerlIOl *b = PerlIOBase(g);
4519 if (b && b->tab == &PerlIO_crlf) {
4520 if (!(b->flags & PERLIO_F_CRLF))
4521 b->flags |= PERLIO_F_CRLF;
4522 S_inherit_utf8_flag(g);
4523 PerlIO_pop(aTHX_ f);
4528 S_inherit_utf8_flag(f);
4534 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4536 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4537 if (c->nl) { /* XXXX Shouldn't it be done only if b->ptr > c->nl? */
4541 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4542 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
4544 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
4545 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
4547 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
4552 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
4553 b->end = b->ptr = b->buf + b->bufsiz;
4554 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4555 b->posn -= b->bufsiz;
4557 while (count > 0 && b->ptr > b->buf) {
4558 const int ch = *--buf;
4560 if (b->ptr - 2 >= b->buf) {
4567 /* If b->ptr - 1 == b->buf, we are undoing reading 0xa */
4568 *--(b->ptr) = 0xa; /* Works even if 0xa == '\r' */
4581 unread += PerlIOBase_unread(aTHX_ f, (const STDCHAR *) vbuf + unread, count);
4586 /* XXXX This code assumes that buffer size >=2, but does not check it... */
4588 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
4590 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4593 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
4594 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4595 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == 0xd)) {
4596 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
4598 while (nl < b->end && *nl != 0xd)
4600 if (nl < b->end && *nl == 0xd) {
4602 if (nl + 1 < b->end) {
4609 * Not CR,LF but just CR
4617 * Blast - found CR as last char in buffer
4622 * They may not care, defer work as long as
4626 return (nl - b->ptr);
4630 b->ptr++; /* say we have read it as far as
4631 * flush() is concerned */
4632 b->buf++; /* Leave space in front of buffer */
4633 /* Note as we have moved buf up flush's
4635 will naturally make posn point at CR
4637 b->bufsiz--; /* Buffer is thus smaller */
4638 code = PerlIO_fill(f); /* Fetch some more */
4639 b->bufsiz++; /* Restore size for next time */
4640 b->buf--; /* Point at space */
4641 b->ptr = nl = b->buf; /* Which is what we hand
4643 *nl = 0xd; /* Fill in the CR */
4645 goto test; /* fill() call worked */
4647 * CR at EOF - just fall through
4649 /* Should we clear EOF though ??? */
4654 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
4660 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
4662 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4663 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4669 if (ptr == b->end && *c->nl == 0xd) {
4670 /* Deferred CR at end of buffer case - we lied about count */
4683 * Test code - delete when it works ...
4685 IV flags = PerlIOBase(f)->flags;
4686 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
4687 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == 0xd) {
4688 /* Deferred CR at end of buffer case - we lied about count */
4694 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
4695 " nl=%p e=%p for %d", (void*)ptr, (void*)chk,
4696 flags, c->nl, b->end, cnt);
4703 * They have taken what we lied about
4711 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
4715 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
4717 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
4718 return PerlIOBuf_write(aTHX_ f, vbuf, count);
4720 PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
4721 const STDCHAR *buf = (const STDCHAR *) vbuf;
4722 const STDCHAR * const ebuf = buf + count;
4725 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
4727 while (buf < ebuf) {
4728 const STDCHAR * const eptr = b->buf + b->bufsiz;
4729 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
4730 while (buf < ebuf && b->ptr < eptr) {
4732 if ((b->ptr + 2) > eptr) {
4740 *(b->ptr)++ = 0xd; /* CR */
4741 *(b->ptr)++ = 0xa; /* LF */
4743 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
4750 *(b->ptr)++ = *buf++;
4752 if (b->ptr >= eptr) {
4758 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
4760 return (buf - (STDCHAR *) vbuf);
4765 PerlIOCrlf_flush(pTHX_ PerlIO *f)
4767 PerlIOCrlf * const c = PerlIOSelf(f, PerlIOCrlf);
4772 return PerlIOBuf_flush(aTHX_ f);
4776 PerlIOCrlf_binmode(pTHX_ PerlIO *f)
4778 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
4779 /* In text mode - flush any pending stuff and flip it */
4780 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
4781 #ifndef PERLIO_USING_CRLF
4782 /* CRLF is unusual case - if this is just the :crlf layer pop it */
4783 PerlIO_pop(aTHX_ f);
4789 PERLIO_FUNCS_DECL(PerlIO_crlf) = {
4790 sizeof(PerlIO_funcs),
4793 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
4795 PerlIOBuf_popped, /* popped */
4797 PerlIOCrlf_binmode, /* binmode */
4801 PerlIOBuf_read, /* generic read works with ptr/cnt lies */
4802 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
4803 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
4811 PerlIOBase_clearerr,
4812 PerlIOBase_setlinebuf,
4817 PerlIOCrlf_set_ptrcnt,
4821 Perl_PerlIO_stdin(pTHX)
4825 PerlIO_stdstreams(aTHX);
4827 return (PerlIO*)&PL_perlio[1];
4831 Perl_PerlIO_stdout(pTHX)
4835 PerlIO_stdstreams(aTHX);
4837 return (PerlIO*)&PL_perlio[2];
4841 Perl_PerlIO_stderr(pTHX)
4845 PerlIO_stdstreams(aTHX);
4847 return (PerlIO*)&PL_perlio[3];
4850 /*--------------------------------------------------------------------------------------*/
4853 PerlIO_getname(PerlIO *f, char *buf)
4858 bool exported = FALSE;
4859 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
4861 stdio = PerlIO_exportFILE(f,0);
4865 name = fgetname(stdio, buf);
4866 if (exported) PerlIO_releaseFILE(f,stdio);
4871 PERL_UNUSED_ARG(buf);
4872 Perl_croak_nocontext("Don't know how to get file name");
4878 /*--------------------------------------------------------------------------------------*/
4880 * Functions which can be called on any kind of PerlIO implemented in
4884 #undef PerlIO_fdopen
4886 PerlIO_fdopen(int fd, const char *mode)
4889 return PerlIO_openn(aTHX_ NULL, mode, fd, 0, 0, NULL, 0, NULL);
4894 PerlIO_open(const char *path, const char *mode)
4897 SV *name = sv_2mortal(newSVpv(path, 0));
4898 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, NULL, 1, &name);
4901 #undef Perlio_reopen
4903 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
4906 SV *name = sv_2mortal(newSVpv(path,0));
4907 return PerlIO_openn(aTHX_ NULL, mode, -1, 0, 0, f, 1, &name);
4912 PerlIO_getc(PerlIO *f)
4916 if ( 1 == PerlIO_read(f, buf, 1) ) {
4917 return (unsigned char) buf[0];
4922 #undef PerlIO_ungetc
4924 PerlIO_ungetc(PerlIO *f, int ch)
4929 if (PerlIO_unread(f, &buf, 1) == 1)
4937 PerlIO_putc(PerlIO *f, int ch)
4941 return PerlIO_write(f, &buf, 1);
4946 PerlIO_puts(PerlIO *f, const char *s)
4949 return PerlIO_write(f, s, strlen(s));
4952 #undef PerlIO_rewind
4954 PerlIO_rewind(PerlIO *f)
4957 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
4961 #undef PerlIO_vprintf
4963 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
4972 Perl_va_copy(ap, apc);
4973 sv = vnewSVpvf(fmt, &apc);
4975 sv = vnewSVpvf(fmt, &ap);
4977 s = SvPV_const(sv, len);
4978 wrote = PerlIO_write(f, s, len);
4983 #undef PerlIO_printf
4985 PerlIO_printf(PerlIO *f, const char *fmt, ...)
4990 result = PerlIO_vprintf(f, fmt, ap);
4995 #undef PerlIO_stdoutf
4997 PerlIO_stdoutf(const char *fmt, ...)
5003 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
5008 #undef PerlIO_tmpfile
5010 PerlIO_tmpfile(void)
5017 const int fd = win32_tmpfd();
5019 f = PerlIO_fdopen(fd, "w+b");
5021 # if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
5023 char tempname[] = "/tmp/PerlIO_XXXXXX";
5024 const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
5027 * I have no idea how portable mkstemp() is ... NI-S
5029 if (tmpdir && *tmpdir) {
5030 /* if TMPDIR is set and not empty, we try that first */
5031 sv = newSVpv(tmpdir, 0);
5032 sv_catpv(sv, tempname + 4);
5033 fd = mkstemp(SvPVX(sv));
5037 /* else we try /tmp */
5038 fd = mkstemp(tempname);
5041 f = PerlIO_fdopen(fd, "w+");
5043 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
5044 PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
5047 # else /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
5048 FILE * const stdio = PerlSIO_tmpfile();
5051 f = PerlIO_fdopen(fileno(stdio), "w+");
5053 # endif /* else HAS_MKSTEMP */
5054 #endif /* else WIN32 */
5061 #endif /* USE_SFIO */
5062 #endif /* PERLIO_IS_STDIO */
5064 /*======================================================================================*/
5066 * Now some functions in terms of above which may be needed even if we are
5067 * not in true PerlIO mode
5070 Perl_PerlIO_context_layers(pTHX_ const char *mode)
5073 const char *direction = NULL;
5076 * Need to supply default layer info from open.pm
5082 if (mode && mode[0] != 'r') {
5083 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_OUT)
5084 direction = "open>";
5086 if (PL_curcop->cop_hints & HINT_LEXICAL_IO_IN)
5087 direction = "open<";
5092 layers = cop_hints_fetch_pvn(PL_curcop, direction, 5, 0, 0);
5095 return SvOK(layers) ? SvPV_nolen_const(layers) : NULL;
5100 #undef PerlIO_setpos
5102 PerlIO_setpos(PerlIO *f, SV *pos)
5107 const Off_t * const posn = (Off_t *) SvPV(pos, len);
5108 if (f && len == sizeof(Off_t))
5109 return PerlIO_seek(f, *posn, SEEK_SET);
5111 SETERRNO(EINVAL, SS_IVCHAN);
5115 #undef PerlIO_setpos
5117 PerlIO_setpos(PerlIO *f, SV *pos)
5122 Fpos_t * const fpos = (Fpos_t *) SvPV(pos, len);
5123 if (f && len == sizeof(Fpos_t)) {
5124 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5125 return fsetpos64(f, fpos);
5127 return fsetpos(f, fpos);
5131 SETERRNO(EINVAL, SS_IVCHAN);
5137 #undef PerlIO_getpos
5139 PerlIO_getpos(PerlIO *f, SV *pos)
5142 Off_t posn = PerlIO_tell(f);
5143 sv_setpvn(pos, (char *) &posn, sizeof(posn));
5144 return (posn == (Off_t) - 1) ? -1 : 0;
5147 #undef PerlIO_getpos
5149 PerlIO_getpos(PerlIO *f, SV *pos)
5154 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
5155 code = fgetpos64(f, &fpos);
5157 code = fgetpos(f, &fpos);
5159 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
5164 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
5167 vprintf(char *pat, char *args)
5169 _doprnt(pat, args, stdout);
5170 return 0; /* wrong, but perl doesn't use the return
5175 vfprintf(FILE *fd, char *pat, char *args)
5177 _doprnt(pat, args, fd);
5178 return 0; /* wrong, but perl doesn't use the return
5184 #ifndef PerlIO_vsprintf
5186 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
5189 const int val = my_vsnprintf(s, n > 0 ? n : 0, fmt, ap);
5190 PERL_UNUSED_CONTEXT;
5192 #ifndef PERL_MY_VSNPRINTF_GUARDED
5193 if (val < 0 || (n > 0 ? val >= n : 0)) {
5194 Perl_croak(aTHX_ "panic: my_vsnprintf overflow in PerlIO_vsprintf\n");
5201 #ifndef PerlIO_sprintf
5203 PerlIO_sprintf(char *s, int n, const char *fmt, ...)
5208 result = PerlIO_vsprintf(s, n, fmt, ap);
5216 * c-indentation-style: bsd
5218 * indent-tabs-mode: nil
5221 * ex: set ts=8 sts=4 sw=4 et: