This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
remove the platform dependencies of the write.t tests introduced
[perl5.git] / perlio.c
index cada420..87ac75f 100644 (file)
--- a/perlio.c
+++ b/perlio.c
 
 #include "XSUB.h"
 
+#ifdef __Lynx__
+/* Missing proto on LynxOS */
+int mkstemp(char*);
+#endif
+
 /* Call the callback or PerlIOBase, and return failure. */
 #define Perl_PerlIO_or_Base(f, callback, base, failure, args)  \
        if (PerlIOValid(f)) {                                   \
@@ -155,7 +160,7 @@ perlsio_binmode(FILE *fp, int iotype, int mode)
 }
 
 #ifndef O_ACCMODE
-#define O_ACCMODE 3            /* Assume traditional implementation */
+#define O_ACCMODE 3             /* Assume traditional implementation */
 #endif
 
 int
@@ -207,10 +212,11 @@ PerlIO_intmode2str(int rawmode, char *mode, int *writing)
 int
 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
 {
-    if (!names || !*names || strEQ(names, ":crlf")
-       || strEQ(names, ":raw")
-       || strEQ(names, ":bytes")
-       ) {
+    if (!names || !*names
+        || strEQ(names, ":crlf")
+        || strEQ(names, ":raw")
+        || strEQ(names, ":bytes")
+       ) {
        return 0;
     }
     Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
@@ -255,7 +261,7 @@ PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
 #ifdef DJGPP
            omode = djgpp_get_stream_mode(f);
 #endif
-           PerlIO_intmode2str(omode, mode, NULL);
+           PerlIO_intmode2str(omode,mode,NULL);
            /* the r+ is a hack */
            return PerlIO_fdopen(fd, mode);
        }
@@ -287,7 +293,7 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
            return PerlIO_tmpfile();
        else {
            char *name = SvPV_nolen(*args);
-           if (*mode == '#') {
+           if (*mode == IoTYPE_NUMERIC) {
                fd = PerlLIO_open3(name, imode, perm);
                if (fd >= 0)
                    return PerlIO_fdopen(fd, (char *) mode + 1);
@@ -349,7 +355,7 @@ PerlIO_tmpfile(void)
     return tmpfile();
 }
 
-#else                          /* PERLIO_IS_STDIO */
+#else                           /* PERLIO_IS_STDIO */
 
 #ifdef USE_SFIO
 
@@ -410,7 +416,7 @@ PerlIO_findFILE(PerlIO *pio)
 }
 
 
-#else                          /* USE_SFIO */
+#else                           /* USE_SFIO */
 /*======================================================================================*/
 /*
  * Implement all the PerlIO interface ourselves.
@@ -429,6 +435,11 @@ PerlIO_findFILE(PerlIO *pio)
 #include <sys/mman.h>
 #endif
 
+/*
+ * Why is this here - not in perlio.h?  RMB
+ */
+void PerlIO_debug(const char *fmt, ...)
+    __attribute__format__(__printf__, 1, 2);
 
 void
 PerlIO_debug(const char *fmt, ...)
@@ -456,7 +467,7 @@ PerlIO_debug(const char *fmt, ...)
            s = "(none)";
        sprintf(buffer, "%s:%" IVdf " ", s, (IV) CopLINE(PL_curcop));
        len = strlen(buffer);
-       vsprintf(buffer + len, fmt, ap);
+       vsprintf(buffer+len, fmt, ap);
        PerlLIO_write(dbg, buffer, strlen(buffer));
 #else
        SV *sv = newSVpvn("", 0);
@@ -506,7 +517,7 @@ PerlIO_allocate(pTHX)
            }
        }
     }
-    Newz('I', f, PERLIO_TABLE_SIZE, PerlIO);
+    Newz('I',f,PERLIO_TABLE_SIZE,PerlIO);
     if (!f) {
        return NULL;
     }
@@ -520,18 +531,15 @@ PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
 {
     if (PerlIOValid(f)) {
        PerlIO_funcs *tab = PerlIOBase(f)->tab;
-       PerlIO_debug("fdupopen f=%p param=%p\n", (void *) f,
-                    (void *) param);
+       PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
        if (tab && tab->Dup)
-           return (*tab->Dup) (aTHX_ PerlIO_allocate(aTHX), f, param,
-                               flags);
+            return (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
        else {
-           return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param,
-                                 flags);
+            return PerlIOBase_dup(aTHX_ PerlIO_allocate(aTHX), f, param, flags);
        }
     }
     else
-       SETERRNO(EBADF, SS_IVCHAN);
+        SETERRNO(EBADF, SS_IVCHAN);
 
     return NULL;
 }
@@ -607,10 +615,10 @@ PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
     if (proto) {
        int i;
        list = PerlIO_list_alloc(aTHX);
-       for (i = 0; i < proto->cur; i++) {
+       for (i=0; i < proto->cur; i++) {
            SV *arg = Nullsv;
            if (proto->array[i].arg)
-               arg = PerlIO_sv_dup(aTHX_ proto->array[i].arg, param);
+               arg = PerlIO_sv_dup(aTHX_ proto->array[i].arg,param);
            PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
        }
     }
@@ -625,20 +633,19 @@ PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
     PerlIO *f;
     PL_perlio = NULL;
     PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
-    PL_def_layerlist =
-       PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
-    PerlIO_allocate(aTHX);     /* root slot is never used */
-    PerlIO_debug("Clone %p from %p\n", aTHX, proto);
+    PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
+    PerlIO_allocate(aTHX); /* root slot is never used */
+    PerlIO_debug("Clone %p from %p\n",aTHX,proto);
     while ((f = *table)) {
-       int i;
-       table = (PerlIO **) (f++);
-       for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
-           if (*f) {
-               (void) fp_dup(f, 0, param);
+           int i;
+           table = (PerlIO **) (f++);
+           for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
+               if (*f) {
+                   (void) fp_dup(f, 0, param);
+               }
+               f++;
            }
-           f++;
        }
-    }
 #endif
 }
 
@@ -648,7 +655,7 @@ PerlIO_destruct(pTHX)
     PerlIO **table = &PL_perlio;
     PerlIO *f;
 #ifdef USE_ITHREADS
-    PerlIO_debug("Destruct %p\n", aTHX);
+    PerlIO_debug("Destruct %p\n",aTHX);
 #endif
     while ((f = *table)) {
        int i;
@@ -676,7 +683,7 @@ PerlIO_pop(pTHX_ PerlIO *f)
 {
     PerlIOl *l = *f;
     if (l) {
-       PerlIO_debug("PerlIO_pop f=%p %s\n", (void *) f, l->tab->name);
+       PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f, l->tab->name);
        if (l->tab->Popped) {
            /*
             * If popped returns non-zero do not free its layer structure
@@ -700,24 +707,24 @@ PerlIO_pop(pTHX_ PerlIO *f)
 AV *
 PerlIO_get_layers(pTHX_ PerlIO *f)
 {
-    AV *av = newAV();
+     AV *av = newAV();
 
-    if (PerlIOValid(f)) {
-       PerlIOl *l = PerlIOBase(f);
-
-       while (l) {
-           SV *name = l->tab && l->tab->name ?
-               newSVpv(l->tab->name, 0) : &PL_sv_undef;
-           SV *arg = l->tab && l->tab->Getarg ?
-               (*l->tab->Getarg) (aTHX_ & l, 0, 0) : &PL_sv_undef;
-           av_push(av, name);
-           av_push(av, arg);
-           av_push(av, newSViv((IV) l->flags));
-           l = l->next;
-       }
-    }
+     if (PerlIOValid(f)) {
+         PerlIOl *l = PerlIOBase(f);
+
+         while (l) {
+              SV *name = l->tab && l->tab->name ?
+                   newSVpv(l->tab->name, 0) : &PL_sv_undef;
+              SV *arg = l->tab && l->tab->Getarg ?
+                   (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef;
+              av_push(av, name);
+              av_push(av, arg);
+              av_push(av, newSViv((IV)l->flags));
+              l = l->next;
+         }
+     }
 
-    return av;
+     return av;
 }
 
 /*--------------------------------------------------------------------------------------*/
@@ -733,26 +740,24 @@ PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
        len = strlen(name);
     for (i = 0; i < PL_known_layers->cur; i++) {
        PerlIO_funcs *f = PL_known_layers->array[i].funcs;
-       if (memEQ(f->name, name, len)) {
-           PerlIO_debug("%.*s => %p\n", (int) len, name, (void *) f);
+       if (memEQ(f->name, name, len) && f->name[len] == 0) {
+           PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
            return f;
        }
     }
     if (load && PL_subname && PL_def_layerlist
        && PL_def_layerlist->cur >= 2) {
        if (PL_in_load_module) {
-           Perl_croak(aTHX_
-                      "Recursive call to Perl_load_module in PerlIO_find_layer");
+           Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
            return NULL;
-       }
-       else {
+       } else {
            SV *pkgsv = newSVpvn("PerlIO", 6);
            SV *layer = newSVpvn(name, len);
-           CV *cv = get_cv("PerlIO::Layer::NoWarnings", FALSE);
-           ENTER;
+           CV *cv  = get_cv("PerlIO::Layer::NoWarnings", FALSE);
+           ENTER;
            SAVEINT(PL_in_load_module);
            if (cv) {
-               SAVESPTR(PL_warnhook);
+               SAVESPTR(PL_warnhook);
                PL_warnhook = (SV *) cv;
            }
            PL_in_load_module++;
@@ -812,7 +817,7 @@ perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
 MGVTBL perlio_vtab = {
     perlio_mg_get,
     perlio_mg_set,
-    NULL,                      /* len */
+    NULL,                       /* len */
     perlio_mg_clear,
     perlio_mg_free
 };
@@ -847,7 +852,7 @@ XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
     XSRETURN(count);
 }
 
-#endif                         /* USE_ATTIBUTES_FOR_PERLIO */
+#endif                          /* USE_ATTIBUTES_FOR_PERLIO */
 
 SV *
 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
@@ -864,7 +869,7 @@ XS(XS_PerlIO__Layer__NoWarnings)
      */
     dXSARGS;
     if (items)
-       PerlIO_debug("warning:%s\n", SvPV_nolen(ST(0)));
+       PerlIO_debug("warning:%s\n",SvPV_nolen(ST(0)));
     XSRETURN(0);
 }
 
@@ -891,7 +896,7 @@ PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
     if (!PL_known_layers)
        PL_known_layers = PerlIO_list_alloc(aTHX);
     PerlIO_list_push(aTHX_ PL_known_layers, tab, Nullsv);
-    PerlIO_debug("define %s %p\n", tab->name, (void *) tab);
+    PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
 }
 
 int
@@ -916,8 +921,8 @@ PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
                    char q = ((*s == '\'') ? '"' : '\'');
                    if (ckWARN(WARN_LAYER))
                        Perl_warner(aTHX_ packWARN(WARN_LAYER),
-                                   "perlio: invalid separator character %c%c%c in layer specification list %s",
-                                   q, *s, q, s);
+                             "Invalid separator character %c%c%c in PerlIO layer specification %s",
+                             q, *s, q, s);
                    SETERRNO(EINVAL, LIB_INVARG);
                    return -1;
                }
@@ -953,8 +958,8 @@ PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
                            e--;
                            if (ckWARN(WARN_LAYER))
                                Perl_warner(aTHX_ packWARN(WARN_LAYER),
-                                           "perlio: argument list not closed for layer \"%.*s\"",
-                                           (int) (e - s), s);
+                                     "Argument list not closed for PerlIO layer \"%.*s\"",
+                                     (int) (e - s), s);
                            return -1;
                        default:
                            /*
@@ -976,9 +981,8 @@ PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
                    }
                    else {
                        if (warn_layer)
-                           Perl_warner(aTHX_ packWARN(WARN_LAYER),
-                                       "perlio: unknown layer \"%.*s\"",
-                                       (int) llen, s);
+                           Perl_warner(aTHX_ packWARN(WARN_LAYER), "Unknown PerlIO layer \"%.*s\"",
+                                 (int) llen, s);
                        return -1;
                    }
                }
@@ -1023,30 +1027,8 @@ PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
     return def;
 }
 
-PerlIO *
-PerlIO_syslayer(pTHX_ PerlIO *f)
-{
-    if (PerlIOValid(f)) {
-       PerlIOl *l;
-       while (*PerlIONext(f)) {
-           f = PerlIONext(f);
-       }
-       l = *f;
-#if 0
-       Perl_warn(aTHX_ "syslayer %s", l->tab->name);
-#endif
-       return f;
-    }
-    else {
-       SETERRNO(EBADF, SS_IVCHAN);
-       return NULL;
-    }
-}
-
-
 IV
-PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                PerlIO_funcs *tab)
+PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     if (PerlIOValid(f)) {
        PerlIO_flush(f);
@@ -1072,17 +1054,17 @@ PerlIO_funcs PerlIO_remove = {
     NULL,
     NULL,
     NULL,
-    NULL,                      /* flush */
-    NULL,                      /* fill */
+    NULL,                       /* flush */
+    NULL,                       /* fill */
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL,                      /* get_base */
-    NULL,                      /* get_bufsiz */
-    NULL,                      /* get_ptr */
-    NULL,                      /* get_cnt */
-    NULL,                      /* set_ptrcnt */
+    NULL,                       /* get_base */
+    NULL,                       /* get_bufsiz */
+    NULL,                       /* get_ptr */
+    NULL,                       /* get_cnt */
+    NULL,                       /* set_ptrcnt */
 };
 
 PerlIO_list_t *
@@ -1093,7 +1075,7 @@ PerlIO_default_layers(pTHX)
        PerlIO_funcs *osLayer = &PerlIO_unix;
        PL_def_layerlist = PerlIO_list_alloc(aTHX);
        PerlIO_define_layer(aTHX_ & PerlIO_unix);
-#if defined(WIN32) && !defined(UNDER_CE)
+#if defined(WIN32)
        PerlIO_define_layer(aTHX_ & PerlIO_win32);
 #if 0
        osLayer = &PerlIO_win32;
@@ -1133,8 +1115,7 @@ Perl_boot_core_PerlIO(pTHX)
          __FILE__);
 #endif
     newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
-    newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings,
-         __FILE__);
+    newXS("PerlIO::Layer::NoWarnings", XS_PerlIO__Layer__NoWarnings, __FILE__);
 }
 
 PerlIO_funcs *
@@ -1173,17 +1154,16 @@ PerlIO_push(pTHX_ PerlIO *f, PerlIO_funcs *tab, const char *mode, SV *arg)
            goto mismatch;
        }
        /* Real layer with a data area */
-       Newc('L', l, tab->size, char, PerlIOl);
+       Newc('L',l,tab->size,char,PerlIOl);
        if (l && f) {
            Zero(l, tab->size, char);
            l->next = *f;
            l->tab = tab;
            *f = l;
-           PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void *) f,
-                        tab->name, (mode) ? mode : "(Null)",
-                        (void *) arg);
-           if (*l->tab->Pushed
-               && (*l->tab->Pushed) (aTHX_ f, mode, arg, tab) != 0) {
+           PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
+                       (mode) ? mode : "(Null)", (void*)arg);
+           if (*l->tab->Pushed &&
+               (*l->tab->Pushed) (aTHX_ f, mode, arg, tab) != 0) {
                PerlIO_pop(aTHX_ f);
                return NULL;
            }
@@ -1191,10 +1171,11 @@ PerlIO_push(pTHX_ PerlIO *f, PerlIO_funcs *tab, const char *mode, SV *arg)
     }
     else if (f) {
        /* Pseudo-layer where push does its own stack adjust */
-       PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void *) f, tab->name,
-                    (mode) ? mode : "(Null)", (void *) arg);
-       if (tab->Pushed && (*tab->Pushed) (aTHX_ f, mode, arg, tab) != 0) {
-           return NULL;
+       PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
+                    (mode) ? mode : "(Null)", (void*)arg);
+       if (tab->Pushed &&
+           (*tab->Pushed) (aTHX_ f, mode, arg, tab) != 0) {
+            return NULL;
        }
     }
     return f;
@@ -1203,7 +1184,7 @@ PerlIO_push(pTHX_ PerlIO *f, PerlIO_funcs *tab, const char *mode, SV *arg)
 IV
 PerlIOBase_binmode(pTHX_ PerlIO *f)
 {
-    if (PerlIOValid(f)) {
+   if (PerlIOValid(f)) {
        /* Is layer suitable for raw stream ? */
        if (PerlIOBase(f)->tab->kind & PERLIO_K_RAW) {
            /* Yes - turn off UTF-8-ness, to undo UTF-8 locale effects */
@@ -1214,13 +1195,12 @@ PerlIOBase_binmode(pTHX_ PerlIO *f)
            PerlIO_pop(aTHX_ f);
        }
        return 0;
-    }
-    return -1;
+   }
+   return -1;
 }
 
 IV
-PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                PerlIO_funcs *tab)
+PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
 
     if (PerlIOValid(f)) {
@@ -1234,7 +1214,7 @@ PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
        while (t && (l = *t)) {
            if (l->tab->Binmode) {
                /* Has a handler - normal case */
-               if ((*l->tab->Binmode) (aTHX_ f) == 0) {
+               if ((*l->tab->Binmode)(aTHX_ f) == 0) {
                    if (*t == l) {
                        /* Layer still there - move down a layer */
                        t = PerlIONext(t);
@@ -1250,8 +1230,7 @@ PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
            }
        }
        if (PerlIOValid(f)) {
-           PerlIO_debug(":raw f=%p :%s\n", (void *) f,
-                        PerlIOBase(f)->tab->name);
+           PerlIO_debug(":raw f=%p :%s\n", (void*)f, PerlIOBase(f)->tab->name);
            return 0;
        }
     }
@@ -1284,8 +1263,7 @@ PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
        PerlIO_list_t *layers = PerlIO_list_alloc(aTHX);
        code = PerlIO_parse_layers(aTHX_ layers, names);
        if (code == 0) {
-           code =
-               PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
+           code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
        }
        PerlIO_list_free(aTHX_ layers);
     }
@@ -1302,7 +1280,7 @@ int
 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
 {
     PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
-                (void *) f, PerlIOBase(f)->tab->name, iotype, mode,
+                (void*)f, PerlIOBase(f)->tab->name, iotype, mode,
                 (names) ? names : "(Null)");
     if (names) {
        /* Do not flush etc. if (e.g.) switching encodings.
@@ -1310,8 +1288,7 @@ PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
           (for example :unix which is never going to call them)
           it can do the flush when it is pushed.
         */
-       return PerlIO_apply_layers(aTHX_ f, NULL,
-                                  names) == 0 ? TRUE : FALSE;
+       return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
     }
     else {
        /* Fake 5.6 legacy of using this call to turn ON O_TEXT */
@@ -1350,8 +1327,7 @@ PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
        /* Legacy binmode is now _defined_ as being equivalent to pushing :raw
           So code that used to be here is now in PerlIORaw_pushed().
         */
-       return PerlIO_push(aTHX_ f, &PerlIO_raw, Nullch,
-                          Nullsv) ? TRUE : FALSE;
+       return PerlIO_push(aTHX_ f, &PerlIO_raw, Nullch, Nullsv) ? TRUE : FALSE;
     }
 }
 
@@ -1361,7 +1337,7 @@ PerlIO__close(pTHX_ PerlIO *f)
     if (PerlIOValid(f)) {
        PerlIO_funcs *tab = PerlIOBase(f)->tab;
        if (tab && tab->Close)
-           return (*tab->Close) (aTHX_ f);
+           return (*tab->Close)(aTHX_ f);
        else
            return PerlIOBase_close(aTHX_ f);
     }
@@ -1384,7 +1360,7 @@ Perl_PerlIO_close(pTHX_ PerlIO *f)
 int
 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
+     Perl_PerlIO_or_Base(f, Fileno, fileno, -1, (aTHX_ f));
 }
 
 static const char *
@@ -1404,7 +1380,7 @@ PerlIO_context_layers(pTHX_ const char *mode)
                 * Skip to write part
                 */
                const char *s = strchr(type, 0);
-               if (s && (STRLEN) (s - type) < len) {
+               if (s && (STRLEN)(s - type) < len) {
                    type = s + 1;
                }
            }
@@ -1482,7 +1458,7 @@ PerlIO_resolve_layers(pTHX_ const char *layers,
            av = def;
        }
        if (PerlIO_parse_layers(aTHX_ av, layers) == 0) {
-           return av;
+            return av;
        }
        else {
            PerlIO_list_free(aTHX_ av);
@@ -1521,8 +1497,8 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
            layera = PerlIO_list_alloc(aTHX);
            while (l) {
                SV *arg = (l->tab->Getarg)
-                   ? (*l->tab->Getarg) (aTHX_ & l, NULL, 0)
-                   : &PL_sv_undef;
+                       ? (*l->tab->Getarg) (aTHX_ &l, NULL, 0)
+                       : &PL_sv_undef;
                PerlIO_list_push(aTHX_ layera, l->tab, arg);
                l = *PerlIONext(&l);
            }
@@ -1550,18 +1526,17 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
             * Found that layer 'n' can do opens - call it
             */
            if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
-               Perl_croak(aTHX_ "More than one argument to open(,':%s')",
-                          tab->name);
+               Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
            }
            PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
                         tab->name, layers, mode, fd, imode, perm,
-                        (void *) f, narg, (void *) args);
+                        (void*)f, narg, (void*)args);
            if (tab->Open)
-               f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode,
-                                 perm, f, narg, args);
+                f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
+                                  f, narg, args);
            else {
-               SETERRNO(EINVAL, LIB_INVARG);
-               f = NULL;
+                SETERRNO(EINVAL, LIB_INVARG);
+                f = NULL;
            }
            if (f) {
                if (n + 1 < layera->cur) {
@@ -1569,8 +1544,7 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
                     * More layers above the one that we used to open -
                     * apply them now
                     */
-                   if (PerlIO_apply_layera
-                       (aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
+                   if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
                        /* If pushing layers fails close the file */
                        PerlIO_close(f);
                        f = NULL;
@@ -1587,89 +1561,31 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
 SSize_t
 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
 {
-    if (PerlIOValid(f)) {
-       if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
-           PerlIOBase(f)->flags |= PERLIO_F_ERROR;
-       }
-       else {
-           PerlIO_funcs *tab = PerlIOBase(f)->tab;
-           if (PerlIO_eof(f) || PerlIO_error(f)) {
-               return 0;
-           }
-           while (1) {
-               SSize_t len;
-               if (tab && tab->Read)
-                   len = (*tab->Read) (aTHX_ f, vbuf, count);
-               else
-                   len = PerlIOBase_read(aTHX_ f, vbuf, count);
-               if (len >= 0 || errno != EINTR) {
-                   if (len < 0) {
-                       if (errno != EAGAIN) {
-                           PerlIOBase(f)->flags |= PERLIO_F_ERROR;
-                       }
-                   }
-                   else if (len == 0 && count != 0) {
-                       PerlIOBase(f)->flags |= PERLIO_F_EOF;
-                       SETERRNO(0, 0);
-                   }
-                   return len;
-               }
-               PERL_ASYNC_CHECK();
-           }
-       }
-    }
-    SETERRNO(EBADF, SS_IVCHAN);
-    return -1;
+     Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
 }
 
 SSize_t
 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
 {
-    Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
+     Perl_PerlIO_or_Base(f, Unread, unread, -1, (aTHX_ f, vbuf, count));
 }
 
 SSize_t
 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
 {
-    if (PerlIOValid(f)) {
-       PerlIO_funcs *tab = PerlIOBase(f)->tab;
-       if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE) || !tab
-           || !tab->Write) {
-           PerlIOBase(f)->flags |= PERLIO_F_ERROR;
-       }
-       else {
-           while (1) {
-               SSize_t len = (*tab->Write) (aTHX_ f, vbuf, count);
-               if (len >= 0 || errno != EINTR) {
-                   if (len < 0) {
-                       if (errno != EAGAIN) {
-                           PerlIOBase(f)->flags |= PERLIO_F_ERROR;
-                       }
-                   }
-                   else if (len == 0 && count != 0) {
-                       PerlIOBase(f)->flags |= PERLIO_F_EOF;
-                       SETERRNO(0, 0);
-                   }
-                   return len;
-               }
-               PERL_ASYNC_CHECK();
-           }
-       }
-    }
-    SETERRNO(EBADF, SS_IVCHAN);
-    return -1;
+     Perl_PerlIO_or_fail(f, Write, -1, (aTHX_ f, vbuf, count));
 }
 
 int
 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
 {
-    Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
+     Perl_PerlIO_or_fail(f, Seek, -1, (aTHX_ f, offset, whence));
 }
 
 Off_t
 Perl_PerlIO_tell(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
+     Perl_PerlIO_or_fail(f, Tell, -1, (aTHX_ f));
 }
 
 int
@@ -1682,10 +1598,10 @@ Perl_PerlIO_flush(pTHX_ PerlIO *f)
            if (tab && tab->Flush)
                return (*tab->Flush) (aTHX_ f);
            else
-               return 0;       /* If no Flush defined, silently succeed. */
+                return 0; /* If no Flush defined, silently succeed. */
        }
        else {
-           PerlIO_debug("Cannot flush f=%p\n", (void *) f);
+           PerlIO_debug("Cannot flush f=%p\n", (void*)f);
            SETERRNO(EBADF, SS_IVCHAN);
            return -1;
        }
@@ -1735,70 +1651,72 @@ PerlIOBase_flush_linebuf(pTHX)
 int
 Perl_PerlIO_fill(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
+     Perl_PerlIO_or_fail(f, Fill, -1, (aTHX_ f));
 }
 
 int
 PerlIO_isutf8(PerlIO *f)
 {
-    if (PerlIOValid(f))
-       return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
-    else
-       return 0;
+     if (PerlIOValid(f))
+         return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
+     else
+         SETERRNO(EBADF, SS_IVCHAN);
+
+     return -1;
 }
 
 int
 Perl_PerlIO_eof(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
+     Perl_PerlIO_or_Base(f, Eof, eof, -1, (aTHX_ f));
 }
 
 int
 Perl_PerlIO_error(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
+     Perl_PerlIO_or_Base(f, Error, error, -1, (aTHX_ f));
 }
 
 void
 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
+     Perl_PerlIO_or_Base_void(f, Clearerr, clearerr, (aTHX_ f));
 }
 
 void
 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
+     Perl_PerlIO_or_Base_void(f, Setlinebuf, setlinebuf, (aTHX_ f));
 }
 
 int
 PerlIO_has_base(PerlIO *f)
 {
-    if (PerlIOValid(f)) {
-       PerlIO_funcs *tab = PerlIOBase(f)->tab;
+     if (PerlIOValid(f)) {
+         PerlIO_funcs *tab = PerlIOBase(f)->tab;
 
-       if (tab)
-           return (tab->Get_base != NULL);
-       SETERRNO(EINVAL, LIB_INVARG);
-    }
-    else
-       SETERRNO(EBADF, SS_IVCHAN);
+         if (tab)
+              return (tab->Get_base != NULL);
+         SETERRNO(EINVAL, LIB_INVARG);
+     }
+     else
+         SETERRNO(EBADF, SS_IVCHAN);
 
-    return 0;
+     return 0;
 }
 
 int
 PerlIO_fast_gets(PerlIO *f)
 {
     if (PerlIOValid(f) && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS)) {
-       PerlIO_funcs *tab = PerlIOBase(f)->tab;
+        PerlIO_funcs *tab = PerlIOBase(f)->tab;
 
-       if (tab)
-           return (tab->Set_ptrcnt != NULL);
-       SETERRNO(EINVAL, LIB_INVARG);
+        if (tab)
+             return (tab->Set_ptrcnt != NULL);
+        SETERRNO(EINVAL, LIB_INVARG);
     }
     else
-       SETERRNO(EBADF, SS_IVCHAN);
+        SETERRNO(EBADF, SS_IVCHAN);
 
     return 0;
 }
@@ -1810,11 +1728,11 @@ PerlIO_has_cntptr(PerlIO *f)
        PerlIO_funcs *tab = PerlIOBase(f)->tab;
 
        if (tab)
-           return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
-       SETERRNO(EINVAL, LIB_INVARG);
+            return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
+         SETERRNO(EINVAL, LIB_INVARG);
     }
     else
-       SETERRNO(EBADF, SS_IVCHAN);
+        SETERRNO(EBADF, SS_IVCHAN);
 
     return 0;
 }
@@ -1823,14 +1741,14 @@ int
 PerlIO_canset_cnt(PerlIO *f)
 {
     if (PerlIOValid(f)) {
-       PerlIO_funcs *tab = PerlIOBase(f)->tab;
+         PerlIO_funcs *tab = PerlIOBase(f)->tab;
 
-       if (tab)
-           return (tab->Set_ptrcnt != NULL);
-       SETERRNO(EINVAL, LIB_INVARG);
+         if (tab)
+              return (tab->Set_ptrcnt != NULL);
+         SETERRNO(EINVAL, LIB_INVARG);
     }
     else
-       SETERRNO(EBADF, SS_IVCHAN);
+        SETERRNO(EBADF, SS_IVCHAN);
 
     return 0;
 }
@@ -1838,37 +1756,37 @@ PerlIO_canset_cnt(PerlIO *f)
 STDCHAR *
 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
+     Perl_PerlIO_or_fail(f, Get_base, NULL, (aTHX_ f));
 }
 
 int
 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
+     Perl_PerlIO_or_fail(f, Get_bufsiz, -1, (aTHX_ f));
 }
 
 STDCHAR *
 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
+     Perl_PerlIO_or_fail(f, Get_ptr, NULL, (aTHX_ f));
 }
 
 int
 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
 {
-    Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
+     Perl_PerlIO_or_fail(f, Get_cnt, -1, (aTHX_ f));
 }
 
 void
 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
 {
-    Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
+     Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, NULL, cnt));
 }
 
 void
 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
 {
-    Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
+     Perl_PerlIO_or_fail_void(f, Set_ptrcnt, (aTHX_ f, ptr, cnt));
 }
 
 
@@ -1878,8 +1796,7 @@ Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
  */
 
 IV
-PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                 PerlIO_funcs *tab)
+PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     if (PerlIOValid(f)) {
        if (tab->kind & PERLIO_K_UTF8)
@@ -1907,17 +1824,17 @@ PerlIO_funcs PerlIO_utf8 = {
     NULL,
     NULL,
     NULL,
-    NULL,                      /* flush */
-    NULL,                      /* fill */
+    NULL,                       /* flush */
+    NULL,                       /* fill */
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL,                      /* get_base */
-    NULL,                      /* get_bufsiz */
-    NULL,                      /* get_ptr */
-    NULL,                      /* get_cnt */
-    NULL,                      /* set_ptrcnt */
+    NULL,                       /* get_base */
+    NULL,                       /* get_bufsiz */
+    NULL,                       /* get_ptr */
+    NULL,                       /* get_cnt */
+    NULL,                       /* set_ptrcnt */
 };
 
 PerlIO_funcs PerlIO_byte = {
@@ -1936,17 +1853,17 @@ PerlIO_funcs PerlIO_byte = {
     NULL,
     NULL,
     NULL,
-    NULL,                      /* flush */
-    NULL,                      /* fill */
+    NULL,                       /* flush */
+    NULL,                       /* fill */
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL,                      /* get_base */
-    NULL,                      /* get_bufsiz */
-    NULL,                      /* get_ptr */
-    NULL,                      /* get_cnt */
-    NULL,                      /* set_ptrcnt */
+    NULL,                       /* get_base */
+    NULL,                       /* get_bufsiz */
+    NULL,                       /* get_ptr */
+    NULL,                       /* get_cnt */
+    NULL,                       /* set_ptrcnt */
 };
 
 PerlIO *
@@ -1956,8 +1873,8 @@ PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
 {
     PerlIO_funcs *tab = PerlIO_default_btm();
     if (tab && tab->Open)
-       return (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode,
-                            perm, old, narg, args);
+        return (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
+                             old, narg, args);
     SETERRNO(EINVAL, LIB_INVARG);
     return NULL;
 }
@@ -1978,17 +1895,17 @@ PerlIO_funcs PerlIO_raw = {
     NULL,
     NULL,
     NULL,
-    NULL,                      /* flush */
-    NULL,                      /* fill */
+    NULL,                       /* flush */
+    NULL,                       /* fill */
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL,                      /* get_base */
-    NULL,                      /* get_bufsiz */
-    NULL,                      /* get_ptr */
-    NULL,                      /* get_cnt */
-    NULL,                      /* set_ptrcnt */
+    NULL,                       /* get_base */
+    NULL,                       /* get_bufsiz */
+    NULL,                       /* get_ptr */
+    NULL,                       /* get_cnt */
+    NULL,                       /* set_ptrcnt */
 };
 /*--------------------------------------------------------------------------------------*/
 /*--------------------------------------------------------------------------------------*/
@@ -2003,7 +1920,7 @@ PerlIOBase_fileno(pTHX_ PerlIO *f)
 }
 
 char *
-PerlIO_modestr(PerlIO *f, char *buf)
+PerlIO_modestr(PerlIO * f, char *buf)
 {
     char *s = buf;
     if (PerlIOValid(f)) {
@@ -2036,8 +1953,7 @@ PerlIO_modestr(PerlIO *f, char *buf)
 
 
 IV
-PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                 PerlIO_funcs *tab)
+PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     PerlIOl *l = PerlIOBase(f);
 #if 0
@@ -2049,7 +1965,7 @@ PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
     if (tab->Set_ptrcnt != NULL)
        l->flags |= PERLIO_F_FASTGETS;
     if (mode) {
-       if (*mode == '#' || *mode == 'I')
+       if (*mode == IoTYPE_NUMERIC || *mode == IoTYPE_IMPLICIT)
            mode++;
        switch (*mode++) {
        case 'r':
@@ -2094,10 +2010,6 @@ PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
                 f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
                 l->flags, PerlIO_modestr(f, temp));
 #endif
-    if (l->next) {
-       l->flags |= l->next->flags &
-           (PERLIO_F_TTY | PERLIO_F_NOTREG | PERLIO_F_SOCKET);
-    }
     return 0;
 }
 
@@ -2125,33 +2037,32 @@ SSize_t
 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
 {
     STDCHAR *buf = (STDCHAR *) vbuf;
-    if (PerlIOValid(f)) {
-       if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
+    if (f) {
+        if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
            PerlIOBase(f)->flags |= PERLIO_F_ERROR;
+           SETERRNO(EBADF, SS_IVCHAN);
+           return 0;
        }
-       else {
-           while (count > 0) {
-               SSize_t avail = PerlIO_get_cnt(f);
-               SSize_t take = 0;
-               if (avail > 0)
-                   take = ((SSize_t) count < avail) ? count : avail;
-               if (take > 0) {
-                   STDCHAR *ptr = PerlIO_get_ptr(f);
-                   Copy(ptr, buf, take, STDCHAR);
-                   PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
-                   count -= take;
-                   buf += take;
-               }
-               if (count > 0 && avail <= 0) {
-                   if (PerlIO_fill(f) != 0)
-                       break;
-               }
+       while (count > 0) {
+           SSize_t avail = PerlIO_get_cnt(f);
+           SSize_t take = 0;
+           if (avail > 0)
+               take = ((SSize_t)count < avail) ? count : avail;
+           if (take > 0) {
+               STDCHAR *ptr = PerlIO_get_ptr(f);
+               Copy(ptr, buf, take, STDCHAR);
+               PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
+               count -= take;
+               buf += take;
+           }
+           if (count > 0 && avail <= 0) {
+               if (PerlIO_fill(f) != 0)
+                   break;
            }
-           return (buf - (STDCHAR *) vbuf);
        }
+       return (buf - (STDCHAR *) vbuf);
     }
-    SETERRNO(EBADF, SS_IVCHAN);
-    return -1;
+    return 0;
 }
 
 IV
@@ -2174,18 +2085,17 @@ PerlIOBase_close(pTHX_ PerlIO *f)
        PerlIO *n = PerlIONext(f);
        code = PerlIO_flush(f);
        PerlIOBase(f)->flags &=
-           ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
+          ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
        while (PerlIOValid(n)) {
            PerlIO_funcs *tab = PerlIOBase(n)->tab;
            if (tab && tab->Close) {
-               if ((*tab->Close) (aTHX_ n) != 0)
+               if ((*tab->Close)(aTHX_ n) != 0)
                    code = -1;
                break;
            }
            else {
                PerlIOBase(n)->flags &=
-                   ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
-                     PERLIO_F_OPEN);
+                   ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
            }
            n = PerlIONext(n);
        }
@@ -2257,7 +2167,7 @@ PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
     if (PerlIOValid(nexto)) {
        PerlIO_funcs *tab = PerlIOBase(nexto)->tab;
        if (tab && tab->Dup)
-           f = (*tab->Dup) (aTHX_ f, nexto, param, flags);
+           f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
        else
            f = PerlIOBase_dup(aTHX_ f, nexto, param, flags);
     }
@@ -2266,13 +2176,13 @@ PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
        SV *arg;
        char buf[8];
        PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
-                    self->name, (void *) f, (void *) o, (void *) param);
+                    self->name, (void*)f, (void*)o, (void*)param);
        if (self->Getarg)
-           arg = (*self->Getarg) (aTHX_ o, param, flags);
+           arg = (*self->Getarg)(aTHX_ o, param, flags);
        else {
            arg = Nullsv;
        }
-       f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o, buf), arg);
+       f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
        if (arg) {
            SvREFCNT_dec(arg);
        }
@@ -2289,9 +2199,9 @@ int PerlIO_fd_refcnt[PERLIO_MAX_REFCOUNTABLE_FD];
 void
 PerlIO_init(pTHX)
 {
   /* Place holder for stdstreams call ??? */
+ /* Place holder for stdstreams call ??? */
 #ifdef USE_THREADS
   MUTEX_INIT(&PerlIO_mutex);
+ MUTEX_INIT(&PerlIO_mutex);
 #endif
 }
 
@@ -2303,7 +2213,7 @@ PerlIOUnix_refcnt_inc(int fd)
        MUTEX_LOCK(&PerlIO_mutex);
 #endif
        PerlIO_fd_refcnt[fd]++;
-       PerlIO_debug("fd %d refcnt=%d\n", fd, PerlIO_fd_refcnt[fd]);
+       PerlIO_debug("fd %d refcnt=%d\n",fd,PerlIO_fd_refcnt[fd]);
 #ifdef USE_THREADS
        MUTEX_UNLOCK(&PerlIO_mutex);
 #endif
@@ -2319,7 +2229,7 @@ PerlIOUnix_refcnt_dec(int fd)
        MUTEX_LOCK(&PerlIO_mutex);
 #endif
        cnt = --PerlIO_fd_refcnt[fd];
-       PerlIO_debug("fd %d refcnt=%d\n", fd, cnt);
+       PerlIO_debug("fd %d refcnt=%d\n",fd,cnt);
 #ifdef USE_THREADS
        MUTEX_UNLOCK(&PerlIO_mutex);
 #endif
@@ -2332,23 +2242,23 @@ PerlIO_cleanup(pTHX)
 {
     int i;
 #ifdef USE_ITHREADS
-    PerlIO_debug("Cleanup layers for %p\n", aTHX);
+    PerlIO_debug("Cleanup layers for %p\n",aTHX);
 #else
     PerlIO_debug("Cleanup layers\n");
 #endif
     /* Raise STDIN..STDERR refcount so we don't close them */
-    for (i = 0; i < 3; i++)
+    for (i=0; i < 3; i++)
        PerlIOUnix_refcnt_inc(i);
-    PerlIO_cleantable(aTHX_ & PL_perlio);
+    PerlIO_cleantable(aTHX_ &PL_perlio);
     /* Restore STDIN..STDERR refcount */
-    for (i = 0; i < 3; i++)
+    for (i=0; i < 3; i++)
        PerlIOUnix_refcnt_dec(i);
 
     if (PL_known_layers) {
        PerlIO_list_free(aTHX_ PL_known_layers);
        PL_known_layers = NULL;
     }
-    if (PL_def_layerlist) {
+    if(PL_def_layerlist) {
        PerlIO_list_free(aTHX_ PL_def_layerlist);
        PL_def_layerlist = NULL;
     }
@@ -2362,16 +2272,16 @@ PerlIO_cleanup(pTHX)
  */
 
 typedef struct {
-    struct _PerlIO base;       /* The generic part */
-    int fd;                    /* UNIX like file descriptor */
-    int oflags;                        /* open/fcntl flags */
+    struct _PerlIO base;        /* The generic part */
+    int fd;                     /* UNIX like file descriptor */
+    int oflags;                 /* open/fcntl flags */
 } PerlIOUnix;
 
 int
 PerlIOUnix_oflags(const char *mode)
 {
     int oflags = -1;
-    if (*mode == 'I' || *mode == '#')
+    if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
        mode++;
     switch (*mode) {
     case 'r':
@@ -2433,58 +2343,25 @@ static void
 PerlIOUnix_setfd(pTHX_ PerlIO *f, int fd, int imode)
 {
     PerlIOUnix *s = PerlIOSelf(f, PerlIOUnix);
-
-#if 1 || defined(WIN32) || defined(HAS_SOCKET) && \
-    (defined(PERL_SOCK_SYSREAD_IS_RECV) || \
-     defined(PERL_SOCK_SYSWRITE_IS_SEND))
+#if defined(WIN32)
     Stat_t st;
     if (PerlLIO_fstat(fd, &st) == 0) {
-#if defined(WIN32)
-       /* WIN32 needs to know about non-regular files
-          as only regular files can be lseek()ed
-        */
        if (!S_ISREG(st.st_mode)) {
-           PerlIO_debug("%d is not regular file\n", fd);
-           PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
+           PerlIO_debug("%d is not regular file\n",fd);
+           PerlIOBase(f)->flags |= PERLIO_F_NOTREG;
        }
        else {
-           PerlIO_debug("%d _is_ a regular file\n", fd);
-       }
-#endif
-       /* If read/write are to be mapped to recv/send we need
-          to know this is a socket.
-          Lifted from code in doio.c that handles socket detection on dup
-        */
-#ifndef PERL_MICRO
-       if (S_ISSOCK(st.st_mode))
-           PerlIOBase(f)->flags |= PERLIO_F_SOCKET;
-       else if (
-#ifdef S_IFMT
-                   !(st.st_mode & S_IFMT)
-#else
-                   !st.st_mode
-#endif
-           ) {
-           char tmpbuf[256];
-           Sock_size_t buflen = sizeof tmpbuf;
-           if (PerlSock_getsockname
-               (fd, (struct sockaddr *) tmpbuf, &buflen) >= 0
-               || errno != ENOTSOCK)
-               PerlIOBase(f)->flags |= PERLIO_F_SOCKET;        /* some OS's return 0 on fstat()ed socket */
-           /* but some return 0 for streams too, sigh */
+           PerlIO_debug("%d _is_ a regular file\n",fd);
        }
-#endif                         /* !PERL_MICRO */
     }
-#endif                         /* HAS_SOCKET ... */
-
+#endif
     s->fd = fd;
     s->oflags = imode;
     PerlIOUnix_refcnt_inc(fd);
 }
 
 IV
-PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                 PerlIO_funcs *tab)
+PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
     if (*PerlIONext(f)) {
@@ -2495,14 +2372,36 @@ PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
         * handle rather than believing the "mode" we are passed in? XXX
         * Should the value on NULL mode be 0 or -1?
         */
-       PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
-                        mode ? PerlIOUnix_oflags(mode) : -1);
+        PerlIOUnix_setfd(aTHX_ f, PerlIO_fileno(PerlIONext(f)),
+                         mode ? PerlIOUnix_oflags(mode) : -1);
     }
     PerlIOBase(f)->flags |= PERLIO_F_OPEN;
 
     return code;
 }
 
+IV
+PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
+{
+    int fd = PerlIOSelf(f, PerlIOUnix)->fd;
+    Off_t new;
+    if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
+#ifdef  ESPIPE
+       SETERRNO(ESPIPE, LIB_INVARG);
+#else
+       SETERRNO(EINVAL, LIB_INVARG);
+#endif
+       return -1;
+    }
+    new  = PerlLIO_lseek(fd, offset, whence);
+    if (new == (Off_t) - 1)
+     {
+      return -1;
+     }
+    PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
+    return  0;
+}
+
 PerlIO *
 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
                IV n, const char *mode, int fd, int imode,
@@ -2510,11 +2409,11 @@ PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
 {
     if (PerlIOValid(f)) {
        if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
-           (*PerlIOBase(f)->tab->Close) (aTHX_ f);
+           (*PerlIOBase(f)->tab->Close)(aTHX_ f);
     }
     if (narg > 0) {
        char *path = SvPV_nolen(*args);
-       if (*mode == '#')
+       if (*mode == IoTYPE_NUMERIC)
            mode++;
        else {
            imode = PerlIOUnix_oflags(mode);
@@ -2525,7 +2424,7 @@ PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
        }
     }
     if (fd >= 0) {
-       if (*mode == 'I')
+       if (*mode == IoTYPE_IMPLICIT)
            mode++;
        if (!f) {
            f = PerlIO_allocate(aTHX);
@@ -2535,8 +2434,10 @@ PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
                return NULL;
            }
        }
-       PerlIOUnix_setfd(aTHX_ f, fd, imode);
+        PerlIOUnix_setfd(aTHX_ f, fd, imode);
        PerlIOBase(f)->flags |= PERLIO_F_OPEN;
+       if (*mode == IoTYPE_APPEND)
+           PerlIOUnix_seek(aTHX_ f, 0, SEEK_END);
        return f;
     }
     else {
@@ -2573,17 +2474,25 @@ SSize_t
 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
 {
     int fd = PerlIOSelf(f, PerlIOUnix)->fd;
-    if (PerlIOBase(f)->flags & (PERLIO_F_EOF | PERLIO_F_ERROR)) {
+    if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
+         PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
        return 0;
     }
-#ifdef PERL_SOCK_SYSREAD_IS_RECV
-    if (PerlIOBase(f)->flags & PERLIO_F_SOCKET) {
-       return PerlSock_recv(fd, vbuf, count, 0);
-    }
-    else
-#endif
-    {
-       return PerlLIO_read(fd, vbuf, count);
+    while (1) {
+       SSize_t len = PerlLIO_read(fd, vbuf, count);
+       if (len >= 0 || errno != EINTR) {
+           if (len < 0) {
+               if (errno != EAGAIN) {
+                   PerlIOBase(f)->flags |= PERLIO_F_ERROR;
+               }
+           }
+           else if (len == 0 && count != 0) {
+               PerlIOBase(f)->flags |= PERLIO_F_EOF;
+               SETERRNO(0,0);
+           }
+           return len;
+       }
+       PERL_ASYNC_CHECK();
     }
 }
 
@@ -2591,28 +2500,18 @@ SSize_t
 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
 {
     int fd = PerlIOSelf(f, PerlIOUnix)->fd;
-    return PerlLIO_write(fd, vbuf, count);
-}
-
-IV
-PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
-{
-    int fd = PerlIOSelf(f, PerlIOUnix)->fd;
-    Off_t new;
-    if (PerlIOBase(f)->flags & PERLIO_F_NOTREG) {
-#ifdef  ESPIPE
-       SETERRNO(ESPIPE, LIB_INVARG);
-#else
-       SETERRNO(EINVAL, LIB_INVARG);
-#endif
-       return -1;
-    }
-    new = PerlLIO_lseek(fd, offset, whence);
-    if (new == (Off_t) - 1) {
-       return -1;
+    while (1) {
+       SSize_t len = PerlLIO_write(fd, vbuf, count);
+       if (len >= 0 || errno != EINTR) {
+           if (len < 0) {
+               if (errno != EAGAIN) {
+                   PerlIOBase(f)->flags |= PERLIO_F_ERROR;
+               }
+           }
+           return len;
+       }
+       PERL_ASYNC_CHECK();
     }
-    PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
-    return 0;
 }
 
 Off_t
@@ -2634,7 +2533,7 @@ PerlIOUnix_close(pTHX_ PerlIO *f)
        }
     }
     else {
-       SETERRNO(EBADF, SS_IVCHAN);
+       SETERRNO(EBADF,SS_IVCHAN);
        return -1;
     }
     while (PerlLIO_close(fd) != 0) {
@@ -2658,7 +2557,7 @@ PerlIO_funcs PerlIO_unix = {
     PerlIOUnix_pushed,
     PerlIOBase_popped,
     PerlIOUnix_open,
-    PerlIOBase_binmode,                /* binmode */
+    PerlIOBase_binmode,         /* binmode */
     NULL,
     PerlIOUnix_fileno,
     PerlIOUnix_dup,
@@ -2668,17 +2567,17 @@ PerlIO_funcs PerlIO_unix = {
     PerlIOUnix_seek,
     PerlIOUnix_tell,
     PerlIOUnix_close,
-    PerlIOBase_noop_ok,                /* flush */
-    PerlIOBase_noop_fail,      /* fill */
+    PerlIOBase_noop_ok,         /* flush */
+    PerlIOBase_noop_fail,       /* fill */
     PerlIOBase_eof,
     PerlIOBase_error,
     PerlIOBase_clearerr,
     PerlIOBase_setlinebuf,
-    NULL,                      /* get_base */
-    NULL,                      /* get_bufsiz */
-    NULL,                      /* get_ptr */
-    NULL,                      /* get_cnt */
-    NULL,                      /* set_ptrcnt */
+    NULL,                       /* get_base */
+    NULL,                       /* get_bufsiz */
+    NULL,                       /* get_ptr */
+    NULL,                       /* get_cnt */
+    NULL,                       /* set_ptrcnt */
 };
 
 /*--------------------------------------------------------------------------------------*/
@@ -2696,7 +2595,7 @@ PerlIO_funcs PerlIO_unix = {
 
 typedef struct {
     struct _PerlIO base;
-    FILE *stdio;               /* The stream */
+    FILE *stdio;                /* The stream */
 } PerlIOStdio;
 
 IV
@@ -2714,10 +2613,12 @@ char *
 PerlIOStdio_mode(const char *mode, char *tmode)
 {
     char *ret = tmode;
-    while (*mode) {
-       *tmode++ = *mode++;
+    if (mode) {
+       while (*mode) {
+           *tmode++ = *mode++;
+       }
     }
-#ifdef PERLIO_USING_CRLF
+#if defined(PERLIO_USING_CRLF) || defined(__CYGWIN__)
     *tmode++ = 'b';
 #endif
     *tmode = '\0';
@@ -2725,34 +2626,29 @@ PerlIOStdio_mode(const char *mode, char *tmode)
 }
 
 IV
-PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                  PerlIO_funcs *tab)
+PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     PerlIO *n;
     if (PerlIOValid(f) && PerlIOValid(n = PerlIONext(f))) {
-       PerlIO_funcs *toptab = PerlIOBase(n)->tab;
-       if (toptab == tab) {
+        PerlIO_funcs *toptab = PerlIOBase(n)->tab;
+        if (toptab == tab) {
            /* Top is already stdio - pop self (duplicate) and use original */
            PerlIO_pop(aTHX_ f);
            return 0;
-       }
-       else {
+       } else {
            int fd = PerlIO_fileno(n);
            char tmode[8];
            FILE *stdio;
-           if (fd >= 0 && (stdio = PerlSIO_fdopen(fd,
-                                                  mode =
-                                                  PerlIOStdio_mode(mode,
-                                                                   tmode))))
-           {
+           if (fd >= 0 && (stdio  = PerlSIO_fdopen(fd,
+                           mode = PerlIOStdio_mode(mode, tmode)))) {
                PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
-               /* We never call down so do any pending stuff now */
-               PerlIO_flush(PerlIONext(f));
+               /* We never call down so do any pending stuff now */
+               PerlIO_flush(PerlIONext(f));
            }
            else {
                return -1;
            }
-       }
+        }
     }
     return PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
 }
@@ -2788,9 +2684,7 @@ PerlIO_importFILE(FILE *stdio, const char *mode)
            }
            fclose(f2);
        }
-       if ((f =
-            PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), &PerlIO_stdio,
-                        mode, Nullsv))) {
+       if ((f = PerlIO_push(aTHX_(f = PerlIO_allocate(aTHX)), &PerlIO_stdio, mode, Nullsv))) {
            s = PerlIOSelf(f, PerlIOStdio);
            s->stdio = stdio;
        }
@@ -2809,8 +2703,7 @@ PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
        PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
        FILE *stdio;
        PerlIOUnix_refcnt_dec(fileno(s->stdio));
-       stdio =
-           PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
+       stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
                            s->stdio);
        if (!s->stdio)
            return NULL;
@@ -2821,21 +2714,28 @@ PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
     else {
        if (narg > 0) {
            char *path = SvPV_nolen(*args);
-           if (*mode == '#') {
+           if (*mode == IoTYPE_NUMERIC) {
                mode++;
                fd = PerlLIO_open3(path, imode, perm);
            }
            else {
-               FILE *stdio = PerlSIO_fopen(path, mode);
+               FILE *stdio;
+               bool appended = FALSE;
+#ifdef __CYGWIN__
+               /* Cygwin wants its 'b' early. */
+               appended = TRUE;
+               mode = PerlIOStdio_mode(mode, tmode);
+#endif
+               stdio = PerlSIO_fopen(path, mode);
                if (stdio) {
                    PerlIOStdio *s;
                    if (!f) {
                        f = PerlIO_allocate(aTHX);
                    }
-                   if ((f = PerlIO_push(aTHX_ f, self,
-                                        (mode =
-                                         PerlIOStdio_mode(mode, tmode)),
-                                        PerlIOArg))) {
+                   if (!appended)
+                       mode = PerlIOStdio_mode(mode, tmode);
+                   f = PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
+                   if (f) {
                        s = PerlIOSelf(f, PerlIOStdio);
                        s->stdio = stdio;
                        PerlIOUnix_refcnt_inc(fileno(s->stdio));
@@ -2850,7 +2750,7 @@ PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
        if (fd >= 0) {
            FILE *stdio = NULL;
            int init = 0;
-           if (*mode == 'I') {
+           if (*mode == IoTYPE_IMPLICIT) {
                init = 1;
                mode++;
            }
@@ -2901,7 +2801,7 @@ PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
        if (flags & PERLIO_DUP_FD) {
            int dfd = PerlLIO_dup(fileno(stdio));
            if (dfd >= 0) {
-               stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o, mode));
+               stdio = PerlSIO_fdopen(dfd, PerlIO_modestr(o,mode));
                goto set_this;
            }
            else {
@@ -2910,8 +2810,8 @@ PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
                 */
            }
        }
-       stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o, mode));
-      set_this:
+       stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o,mode));
+    set_this:
        PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
        PerlIOUnix_refcnt_inc(fileno(stdio));
     }
@@ -2926,8 +2826,8 @@ PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
      */
 #  if defined(__GLIBC__)
     /* There may be a better way for GLIBC:
-       - libio.h defines a flag to not close() on cleanup
-     */
+       - libio.h defines a flag to not close() on cleanup
+     */        
     f->_fileno = -1;
     return 1;
 #  elif defined(__sun__)
@@ -2947,38 +2847,42 @@ PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
      */
     f->__pad[4] |= 0xffffffff00000000L;
     assert(fileno(f) == 0xffffffff);
-#    else                      /* !defined(_LP64) */
+#    else /* !defined(_LP64) */
     /* _file is just a unsigned char :-(
        Not clear why we dup() rather than using -1
        even if that would be treated as 0xFF - so will
        a dup fail ...
      */
     f->_file = PerlLIO_dup(fileno(f));
-#    endif                     /* defined(_LP64) */
+#    endif /* defined(_LP64) */
     return 1;
 #  elif defined(__hpux)
     f->__fileH = 0xff;
     f->__fileL = 0xff;
     return 1;
-    /* Next one ->_file seems to be a reasonable fallback, i.e. if
-       your platform does not have special entry try this one.
-       [For OSF only have confirmation for Tru64 (alpha)
-       but assume other OSFs will be similar.]
-     */
+   /* Next one ->_file seems to be a reasonable fallback, i.e. if
+      your platform does not have special entry try this one.
+      [For OSF only have confirmation for Tru64 (alpha)
+      but assume other OSFs will be similar.]
+    */
 #  elif defined(_AIX) || defined(__osf__) || defined(__irix__)
     f->_file = -1;
     return 1;
 #  elif defined(__FreeBSD__)
     /* There may be a better way on FreeBSD:
-       - we could insert a dummy func in the _close function entry
-       f->_close = (int (*)(void *)) dummy_close;
+        - we could insert a dummy func in the _close function entry
+       f->_close = (int (*)(void *)) dummy_close;
      */
     f->_file = -1;
     return 1;
+#  elif defined(__EMX__)
+    /* f->_flags &= ~_IOOPEN; */       /* Will leak stream->_buffer */
+    f->_handle = -1;
+    return 1;
 #  elif defined(__CYGWIN__)
     /* There may be a better way on CYGWIN:
-       - we could insert a dummy func in the _close function entry
-       f->_close = (int (*)(void *)) dummy_close;
+        - we could insert a dummy func in the _close function entry
+       f->_close = (int (*)(void *)) dummy_close;
      */
     f->_file = -1;
     return 1;
@@ -3013,52 +2917,51 @@ PerlIOStdio_close(pTHX_ PerlIO *f)
        return -1;
     }
     else {
-       int fd = fileno(stdio);
+        int fd = fileno(stdio);
        int socksfd = 0;
        int invalidate = 0;
        IV result = 0;
        int saveerr = 0;
        int dupfd = 0;
 #ifdef SOCKS5_VERSION_NAME
-       /* Socks lib overrides close() but stdio isn't linked to
+       /* Socks lib overrides close() but stdio isn't linked to
           that library (though we are) - so we must call close()
           on sockets on stdio's behalf.
         */
-       int optval;
-       Sock_size_t optlen = sizeof(int);
-       if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen)
-           == 0) {
-           socksfd = 1;
+       int optval;
+       Sock_size_t optlen = sizeof(int);
+       if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &optval, &optlen) == 0) {
+            socksfd = 1;
            invalidate = 1;
-       }
+       }
 #endif
-       if (PerlIOUnix_refcnt_dec(fd) > 0) {
+       if (PerlIOUnix_refcnt_dec(fd) > 0) {
            /* File descriptor still in use */
            invalidate = 1;
            socksfd = 0;
        }
        if (invalidate) {
-           /* For STD* handles don't close the stdio at all
+           /* For STD* handles don't close the stdio at all
               this is because we have shared the FILE * too
-            */
+            */
            if (stdio == stdin) {
-               /* Some stdios are buggy fflush-ing inputs */
-               return 0;
+               /* Some stdios are buggy fflush-ing inputs */
+               return 0;
            }
            else if (stdio == stdout || stdio == stderr) {
-               return PerlIO_flush(f);
+               return PerlIO_flush(f);
            }
-           /* Tricky - must fclose(stdio) to free memory but not close(fd)
+            /* Tricky - must fclose(stdio) to free memory but not close(fd)
               Use Sarathy's trick from maint-5.6 to invalidate the
               fileno slot of the FILE *
-            */
+           */
            result = PerlIO_flush(f);
            saveerr = errno;
-           if (!(invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio))) {
-               dupfd = PerlLIO_dup(fd);
+           if (!(invalidate = PerlIOStdio_invalidate_fileno(aTHX_ stdio))) {
+               dupfd = PerlLIO_dup(fd);
            }
        }
-       result = PerlSIO_fclose(stdio);
+        result = PerlSIO_fclose(stdio);
        /* We treat error from stdio as success if we invalidated
           errno may NOT be expected EBADF
         */
@@ -3071,7 +2974,7 @@ PerlIOStdio_close(pTHX_ PerlIO *f)
            result = close(fd);
        }
        if (dupfd) {
-           PerlLIO_dup2(dupfd, fd);
+           PerlLIO_dup2(dupfd,fd);
            PerlLIO_close(dupfd);
        }
        return result;
@@ -3083,22 +2986,28 @@ PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
 {
     FILE *s = PerlIOSelf(f, PerlIOStdio)->stdio;
     SSize_t got = 0;
-    if (count == 1) {
-       STDCHAR *buf = (STDCHAR *) vbuf;
-       /*
-        * Perl is expecting PerlIO_getc() to fill the buffer Linux's
-        * stdio does not do that for fread()
-        */
-       int ch = PerlSIO_fgetc(s);
-       if (ch != EOF) {
-           *buf = ch;
-           got = 1;
+    for (;;) {
+       if (count == 1) {
+           STDCHAR *buf = (STDCHAR *) vbuf;
+           /*
+            * Perl is expecting PerlIO_getc() to fill the buffer Linux's
+            * stdio does not do that for fread()
+            */
+           int ch = PerlSIO_fgetc(s);
+           if (ch != EOF) {
+               *buf = ch;
+               got = 1;
+           }
        }
+       else
+           got = PerlSIO_fread(vbuf, 1, count, s);
+       if (got == 0 && PerlSIO_ferror(s))
+           got = -1;
+       if (got >= 0 || errno != EINTR)
+           break;
+       PERL_ASYNC_CHECK();
+       SETERRNO(0,0);  /* just in case */
     }
-    else
-       got = PerlSIO_fread(vbuf, 1, count, s);
-    if (got == 0 && PerlSIO_ferror(s))
-       got = -1;
     return got;
 }
 
@@ -3112,18 +3021,18 @@ PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
     if (PerlIO_fast_gets(f) && PerlIO_has_base(f)) {
        STDCHAR *buf = ((STDCHAR *) vbuf) + count;
        STDCHAR *base = PerlIO_get_base(f);
-       SSize_t cnt = PerlIO_get_cnt(f);
-       STDCHAR *ptr = PerlIO_get_ptr(f);
+       SSize_t cnt   = PerlIO_get_cnt(f);
+       STDCHAR *ptr  = PerlIO_get_ptr(f);
        SSize_t avail = ptr - base;
        if (avail > 0) {
            if (avail > count) {
                avail = count;
            }
            ptr -= avail;
-           Move(buf - avail, ptr, avail, STDCHAR);
+           Move(buf-avail,ptr,avail,STDCHAR);
            count -= avail;
            unread += avail;
-           PerlIO_set_ptrcnt(f, ptr, cnt + avail);
+           PerlIO_set_ptrcnt(f,ptr,cnt+avail);
            if (PerlSIO_feof(s) && unread >= 0)
                PerlSIO_clearerr(s);
        }
@@ -3135,18 +3044,17 @@ PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
           Do ungetc() but check chars are ending up in the
           buffer
         */
-       STDCHAR *eptr = (STDCHAR *) PerlSIO_get_ptr(s);
+       STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
        STDCHAR *buf = ((STDCHAR *) vbuf) + count;
        while (count > 0) {
            int ch = *--buf & 0xFF;
-           if (ungetc(ch, s) != ch) {
+           if (ungetc(ch,s) != ch) {
                /* ungetc did not work */
                break;
            }
-           if ((STDCHAR *) PerlSIO_get_ptr(s) != --eptr
-               || ((*eptr & 0xFF) != ch)) {
+           if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
                /* Did not change pointer as expected */
-               fgetc(s);       /* get char back again */
+               fgetc(s);  /* get char back again */
                break;
            }
            /* It worked ! */
@@ -3164,10 +3072,15 @@ PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
 SSize_t
 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
 {
-    FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
-    SSize_t got = PerlSIO_fwrite(vbuf, 1, count, stdio);
-    if (got == 0 && PerlSIO_ferror(stdio))
-       got = -1;
+    SSize_t got;
+    for (;;) {
+       got = PerlSIO_fwrite(vbuf, 1, count,
+                             PerlIOSelf(f, PerlIOStdio)->stdio);
+       if (got >= 0 || errno != EINTR)
+           break;
+       PERL_ASYNC_CHECK();
+       SETERRNO(0,0);  /* just in case */
+    }
     return got;
 }
 
@@ -3244,7 +3157,7 @@ STDCHAR *
 PerlIOStdio_get_base(pTHX_ PerlIO *f)
 {
     FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
-    return (STDCHAR *) PerlSIO_get_base(stdio);
+    return (STDCHAR*)PerlSIO_get_base(stdio);
 }
 
 Size_t
@@ -3260,7 +3173,7 @@ STDCHAR *
 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
 {
     FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
-    return (STDCHAR *) PerlSIO_get_ptr(stdio);
+    return (STDCHAR*)PerlSIO_get_ptr(stdio);
 }
 
 SSize_t
@@ -3276,7 +3189,7 @@ PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
     FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
     if (ptr != NULL) {
 #ifdef STDIO_PTR_LVALUE
-       PerlSIO_set_ptr(stdio, (void *) ptr);   /* LHS STDCHAR* cast non-portable */
+       PerlSIO_set_ptr(stdio, (void*)ptr); /* LHS STDCHAR* cast non-portable */
 #ifdef STDIO_PTR_LVAL_SETS_CNT
        if (PerlSIO_get_cnt(stdio) != (cnt)) {
            assert(PerlSIO_get_cnt(stdio) == (cnt));
@@ -3288,24 +3201,24 @@ PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
         */
        return;
 #endif
-#else                          /* STDIO_PTR_LVALUE */
+#else                           /* STDIO_PTR_LVALUE */
        PerlProc_abort();
-#endif                         /* STDIO_PTR_LVALUE */
+#endif                          /* STDIO_PTR_LVALUE */
     }
     /*
      * Now (or only) set cnt
      */
 #ifdef STDIO_CNT_LVALUE
     PerlSIO_set_cnt(stdio, cnt);
-#else                          /* STDIO_CNT_LVALUE */
+#else                           /* STDIO_CNT_LVALUE */
 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
     PerlSIO_set_ptr(stdio,
                    PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
                                              cnt));
-#else                          /* STDIO_PTR_LVAL_SETS_CNT */
+#else                           /* STDIO_PTR_LVAL_SETS_CNT */
     PerlProc_abort();
-#endif                         /* STDIO_PTR_LVAL_SETS_CNT */
-#endif                         /* STDIO_CNT_LVALUE */
+#endif                          /* STDIO_PTR_LVAL_SETS_CNT */
+#endif                          /* STDIO_CNT_LVALUE */
 }
 
 
@@ -3334,12 +3247,12 @@ PerlIOStdio_fill(pTHX_ PerlIO *f)
        /* Fake ungetc() to the real buffer in case system's ungetc
           goes elsewhere
         */
-       STDCHAR *base = (STDCHAR *) PerlSIO_get_base(stdio);
-       SSize_t cnt = PerlSIO_get_cnt(stdio);
-       STDCHAR *ptr = (STDCHAR *) PerlSIO_get_ptr(stdio);
-       if (ptr == base + 1) {
+       STDCHAR *base = (STDCHAR*)PerlSIO_get_base(stdio);
+       SSize_t cnt   = PerlSIO_get_cnt(stdio);
+       STDCHAR *ptr  = (STDCHAR*)PerlSIO_get_ptr(stdio);
+       if (ptr == base+1) {
            *--ptr = (STDCHAR) c;
-           PerlIOStdio_set_ptrcnt(aTHX_ f, ptr, cnt + 1);
+           PerlIOStdio_set_ptrcnt(aTHX_ f,ptr,cnt+1);
            if (PerlSIO_feof(stdio))
                PerlSIO_clearerr(stdio);
            return 0;
@@ -3349,7 +3262,7 @@ PerlIOStdio_fill(pTHX_ PerlIO *f)
 #endif
     if (PerlIO_has_cntptr(f)) {
        STDCHAR ch = c;
-       if (PerlIOStdio_unread(aTHX_ f, &ch, 1) == 1) {
+       if (PerlIOStdio_unread(aTHX_ f,&ch,1) == 1) {
            return 0;
        }
     }
@@ -3378,11 +3291,11 @@ PerlIO_funcs PerlIO_stdio = {
     sizeof(PerlIO_funcs),
     "stdio",
     sizeof(PerlIOStdio),
-    PERLIO_K_BUFFERED | PERLIO_K_RAW,
+    PERLIO_K_BUFFERED|PERLIO_K_RAW,
     PerlIOStdio_pushed,
     PerlIOBase_popped,
     PerlIOStdio_open,
-    PerlIOBase_binmode,                /* binmode */
+    PerlIOBase_binmode,         /* binmode */
     NULL,
     PerlIOStdio_fileno,
     PerlIOStdio_dup,
@@ -3412,18 +3325,18 @@ PerlIO_funcs PerlIO_stdio = {
     PerlIOStdio_set_ptrcnt,
 #   else
     NULL,
-#   endif                      /* HAS_FAST_STDIO && USE_FAST_STDIO */
+#   endif /* HAS_FAST_STDIO && USE_FAST_STDIO */
 #else
     NULL,
     NULL,
     NULL,
-#endif                         /* USE_STDIO_PTR */
+#endif /* USE_STDIO_PTR */
 };
 
 /* Note that calls to PerlIO_exportFILE() are reversed using
  * PerlIO_releaseFILE(), not importFILE. */
 FILE *
-PerlIO_exportFILE(PerlIO *f, const char *mode)
+PerlIO_exportFILE(PerlIO * f, const char *mode)
 {
     dTHX;
     FILE *stdio = NULL;
@@ -3436,10 +3349,11 @@ PerlIO_exportFILE(PerlIO *f, const char *mode)
        stdio = PerlSIO_fdopen(PerlIO_fileno(f), mode);
        if (stdio) {
            PerlIOl *l = *f;
+           PerlIO *f2;
            /* De-link any lower layers so new :stdio sticks */
            *f = NULL;
-           if ((f = PerlIO_push(aTHX_ f, &PerlIO_stdio, buf, Nullsv))) {
-               PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
+           if ((f2 = PerlIO_push(aTHX_ f, &PerlIO_stdio, buf, Nullsv))) {
+               PerlIOStdio *s = PerlIOSelf((f = f2), PerlIOStdio);
                s->stdio = stdio;
                /* Link previous lower layers under new one */
                *PerlIONext(f) = l;
@@ -3494,8 +3408,7 @@ PerlIO_releaseFILE(PerlIO *p, FILE *f)
  */
 
 IV
-PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                PerlIO_funcs *tab)
+PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
     int fd = PerlIO_fileno(f);
@@ -3519,37 +3432,37 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
     if (PerlIOValid(f)) {
        PerlIO *next = PerlIONext(f);
        PerlIO_funcs *tab =
-           PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
-       next =
-           (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
-                         next, narg, args);
-       if (!next
-           || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg,
-                                             self) != 0) {
+            PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
+       if (tab && tab->Open)
+            next =
+                 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
+                              next, narg, args);
+       if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
            return NULL;
        }
     }
     else {
-       PerlIO_funcs *tab =
-           PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
+       PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
        int init = 0;
-       if (*mode == 'I') {
+       if (*mode == IoTYPE_IMPLICIT) {
            init = 1;
            /*
             * mode++;
             */
        }
-       f = (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
-                         f, narg, args);
+       if (tab && tab->Open)
+            f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
+                             f, narg, args);
+       else
+            SETERRNO(EINVAL, LIB_INVARG);
        if (f) {
            if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
                /*
                 * if push fails during open, open fails. close will pop us.
                 */
-               PerlIO_close(f);
+               PerlIO_close (f);
                return NULL;
-           }
-           else {
+           } else {
                fd = PerlIO_fileno(f);
                if (init && fd == 2) {
                    /*
@@ -3560,14 +3473,13 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
 #ifdef PERLIO_USING_CRLF
 #  ifdef PERLIO_IS_BINMODE_FD
                if (PERLIO_IS_BINMODE_FD(fd))
-                   PerlIO_binmode(aTHX_ f, '<' /*not used */ , O_BINARY,
-                                  Nullch);
+                   PerlIO_binmode(aTHX_ f,  '<'/*not used*/, O_BINARY, Nullch);
                else
 #  endif
-                   /*
-                    * do something about failing setmode()? --jhi
-                    */
-                   PerlLIO_setmode(fd, O_BINARY);
+               /*
+                * do something about failing setmode()? --jhi
+                */
+               PerlLIO_setmode(fd, O_BINARY);
 #endif
            }
        }
@@ -3652,7 +3564,7 @@ PerlIOBuf_fill(pTHX_ PerlIO *f)
        PerlIOBase_flush_linebuf(aTHX);
 
     if (!b->buf)
-       PerlIO_get_base(f);     /* allocate via vtable */
+       PerlIO_get_base(f);     /* allocate via vtable */
 
     b->ptr = b->end = b->buf;
 
@@ -3681,7 +3593,7 @@ PerlIOBuf_fill(pTHX_ PerlIO *f)
        if (avail > 0) {
            STDCHAR *ptr = PerlIO_get_ptr(n);
            SSize_t cnt = avail;
-           if (avail > (SSize_t) b->bufsiz)
+           if (avail > (SSize_t)b->bufsiz)
                avail = b->bufsiz;
            Copy(ptr, b->buf, avail, STDCHAR);
            PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
@@ -3785,10 +3697,10 @@ PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
     if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
        return 0;
     if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
-       if (PerlIO_flush(f) != 0) {
+       if (PerlIO_flush(f) != 0) {
            return 0;
        }
-    }
+    }  
     while (count > 0) {
        SSize_t avail = b->bufsiz - (b->ptr - b->buf);
        if ((SSize_t) count < avail)
@@ -3848,15 +3760,15 @@ PerlIOBuf_tell(pTHX_ PerlIO *f)
      */
     Off_t posn = b->posn;
     if ((PerlIOBase(f)->flags & PERLIO_F_APPEND) &&
-       (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
+        (PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
 #if 1
-       /* As O_APPEND files are normally shared in some sense it is better
+       /* As O_APPEND files are normally shared in some sense it is better
           to flush :
-        */
+        */     
        PerlIO_flush(f);
-#else
-       /* when file is NOT shared then this is sufficient */
-       PerlIO_seek(PerlIONext(f), 0, SEEK_END);
+#else  
+        /* when file is NOT shared then this is sufficient */
+       PerlIO_seek(PerlIONext(f),0, SEEK_END);
 #endif
        posn = b->posn = PerlIO_tell(PerlIONext(f));
     }
@@ -3924,7 +3836,8 @@ PerlIOBuf_get_base(pTHX_ PerlIO *f)
     if (!b->buf) {
        if (!b->bufsiz)
            b->bufsiz = 4096;
-       b->buf = Newz('B', b->buf, b->bufsiz, STDCHAR);
+       b->buf =
+       Newz('B',b->buf,b->bufsiz, STDCHAR);
        if (!b->buf) {
            b->buf = (STDCHAR *) & b->oneword;
            b->bufsiz = sizeof(b->oneword);
@@ -3961,7 +3874,7 @@ PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
 PerlIO *
 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
 {
   return PerlIOBase_dup(aTHX_ f, o, param, flags);
+ return PerlIOBase_dup(aTHX_ f, o, param, flags);
 }
 
 
@@ -3970,11 +3883,11 @@ PerlIO_funcs PerlIO_perlio = {
     sizeof(PerlIO_funcs),
     "perlio",
     sizeof(PerlIOBuf),
-    PERLIO_K_BUFFERED | PERLIO_K_RAW,
+    PERLIO_K_BUFFERED|PERLIO_K_RAW,
     PerlIOBuf_pushed,
     PerlIOBuf_popped,
     PerlIOBuf_open,
-    PerlIOBase_binmode,                /* binmode */
+    PerlIOBase_binmode,         /* binmode */
     NULL,
     PerlIOBase_fileno,
     PerlIOBuf_dup,
@@ -4057,8 +3970,7 @@ PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
 }
 
 IV
-PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                    PerlIO_funcs *tab)
+PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab);
     PerlIOl *l = PerlIOBase(f);
@@ -4077,11 +3989,11 @@ PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
 {
     SSize_t avail = PerlIO_get_cnt(f);
     SSize_t got = 0;
-    if ((SSize_t) count < avail)
+    if ((SSize_t)count < avail)
        avail = count;
     if (avail > 0)
        got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
-    if (got >= 0 && got < (SSize_t) count) {
+    if (got >= 0 && got < (SSize_t)count) {
        SSize_t more =
            PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
        if (more >= 0 || got == 0)
@@ -4094,11 +4006,11 @@ PerlIO_funcs PerlIO_pending = {
     sizeof(PerlIO_funcs),
     "pending",
     sizeof(PerlIOBuf),
-    PERLIO_K_BUFFERED | PERLIO_K_RAW,  /* not sure about RAW here */
+    PERLIO_K_BUFFERED|PERLIO_K_RAW,  /* not sure about RAW here */
     PerlIOPending_pushed,
     PerlIOBuf_popped,
     NULL,
-    PerlIOBase_binmode,                /* binmode */
+    PerlIOBase_binmode,         /* binmode */
     NULL,
     PerlIOBase_fileno,
     PerlIOBuf_dup,
@@ -4131,14 +4043,13 @@ PerlIO_funcs PerlIO_pending = {
  */
 
 typedef struct {
-    PerlIOBuf base;            /* PerlIOBuf stuff */
-    STDCHAR *nl;               /* Position of crlf we "lied" about in the
+    PerlIOBuf base;             /* PerlIOBuf stuff */
+    STDCHAR *nl;                /* Position of crlf we "lied" about in the
                                 * buffer */
 } PerlIOCrlf;
 
 IV
-PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
-                 PerlIO_funcs *tab)
+PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
 {
     IV code;
     PerlIOBase(f)->flags |= PERLIO_F_CRLF;
@@ -4148,6 +4059,23 @@ PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
                 f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
                 PerlIOBase(f)->flags);
 #endif
+    {
+      /* Enable the first CRLF capable layer you can find, but if none
+       * found, the one we just pushed is fine.  This results in at
+       * any given moment at most one CRLF-capable layer being enabled
+       * in the whole layer stack. */
+        PerlIO *g = PerlIONext(f);
+        while (g && *g) {
+             PerlIOl *b = PerlIOBase(g);
+             if (b && b->tab == &PerlIO_crlf) {
+                  if (!(b->flags & PERLIO_F_CRLF))
+                       b->flags |= PERLIO_F_CRLF;
+                  PerlIO_pop(aTHX_ f);
+                  return code;
+             }           
+             g = PerlIONext(g);
+        }
+    }
     return code;
 }
 
@@ -4209,8 +4137,7 @@ PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
        PerlIO_get_base(f);
     if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
        PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
-       if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)
-           && (!c->nl || *c->nl == 0xd)) {
+       if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == 0xd)) {
            STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
          scan:
            while (nl < b->end && *nl != 0xd)
@@ -4245,22 +4172,22 @@ PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
                    }
                    else {
                        int code;
-                       b->ptr++;       /* say we have read it as far as
+                       b->ptr++;       /* say we have read it as far as
                                         * flush() is concerned */
-                       b->buf++;       /* Leave space in front of buffer */
+                       b->buf++;       /* Leave space in front of buffer */
                        /* Note as we have moved buf up flush's
                           posn += ptr-buf
                           will naturally make posn point at CR
                         */
-                       b->bufsiz--;    /* Buffer is thus smaller */
-                       code = PerlIO_fill(f);  /* Fetch some more */
-                       b->bufsiz++;    /* Restore size for next time */
-                       b->buf--;       /* Point at space */
-                       b->ptr = nl = b->buf;   /* Which is what we hand
+                       b->bufsiz--;    /* Buffer is thus smaller */
+                       code = PerlIO_fill(f);  /* Fetch some more */
+                       b->bufsiz++;    /* Restore size for next time */
+                       b->buf--;       /* Point at space */
+                       b->ptr = nl = b->buf;   /* Which is what we hand
                                                 * off */
-                       *nl = 0xd;      /* Fill in the CR */
+                       *nl = 0xd;      /* Fill in the CR */
                        if (code == 0)
-                           goto test;  /* fill() call worked */
+                           goto test;  /* fill() call worked */
                        /*
                         * CR at EOF - just fall through
                         */
@@ -4300,14 +4227,14 @@ PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
         * Test code - delete when it works ...
         */
        IV flags = PerlIOBase(f)->flags;
-       STDCHAR *chk = (c->nl) ? (c->nl + 1) : b->end;
-       if (ptr + cnt == c->nl && c->nl + 1 == b->end && *c->nl == 0xd) {
-           /* Defered CR at end of buffer case - we lied about count */
-           chk--;
+       STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
+       if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == 0xd) {
+         /* Defered CR at end of buffer case - we lied about count */
+         chk--;
        }
        chk -= cnt;
 
-       if (ptr != chk) {
+       if (ptr != chk ) {
            Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
                       " nl=%p e=%p for %d", ptr, chk, flags, c->nl,
                       b->end, cnt);
@@ -4354,8 +4281,8 @@ PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
                        break;
                    }
                    else {
-                       *(b->ptr)++ = 0xd;      /* CR */
-                       *(b->ptr)++ = 0xa;      /* LF */
+                       *(b->ptr)++ = 0xd;      /* CR */
+                       *(b->ptr)++ = 0xa;      /* LF */
                        buf++;
                        if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
                            PerlIO_flush(f);
@@ -4399,7 +4326,7 @@ PerlIOCrlf_binmode(pTHX_ PerlIO *f)
 #ifndef PERLIO_USING_CRLF
        /* CRLF is unusual case - if this is just the :crlf layer pop it */
        if (PerlIOBase(f)->tab == &PerlIO_crlf) {
-           PerlIO_pop(aTHX_ f);
+               PerlIO_pop(aTHX_ f);
        }
 #endif
     }
@@ -4412,16 +4339,16 @@ PerlIO_funcs PerlIO_crlf = {
     sizeof(PerlIOCrlf),
     PERLIO_K_BUFFERED | PERLIO_K_CANCRLF | PERLIO_K_RAW,
     PerlIOCrlf_pushed,
-    PerlIOBuf_popped,          /* popped */
+    PerlIOBuf_popped,         /* popped */
     PerlIOBuf_open,
-    PerlIOCrlf_binmode,                /* binmode */
+    PerlIOCrlf_binmode,       /* binmode */
     NULL,
     PerlIOBase_fileno,
     PerlIOBuf_dup,
-    PerlIOBuf_read,            /* generic read works with ptr/cnt lies
+    PerlIOBuf_read,             /* generic read works with ptr/cnt lies
                                 * ... */
-    PerlIOCrlf_unread,         /* Put CR,LF in buffer for each '\n' */
-    PerlIOCrlf_write,          /* Put CR,LF in buffer for each '\n' */
+    PerlIOCrlf_unread,          /* Put CR,LF in buffer for each '\n' */
+    PerlIOCrlf_write,           /* Put CR,LF in buffer for each '\n' */
     PerlIOBuf_seek,
     PerlIOBuf_tell,
     PerlIOBuf_close,
@@ -4445,10 +4372,10 @@ PerlIO_funcs PerlIO_crlf = {
  */
 
 typedef struct {
-    PerlIOBuf base;            /* PerlIOBuf stuff */
-    Mmap_t mptr;               /* Mapped address */
-    Size_t len;                        /* mapped length */
-    STDCHAR *bbuf;             /* malloced buffer if map fails */
+    PerlIOBuf base;             /* PerlIOBuf stuff */
+    Mmap_t mptr;                /* Mapped address */
+    Size_t len;                 /* mapped length */
+    STDCHAR *bbuf;              /* malloced buffer if map fails */
 } PerlIOMmap;
 
 static size_t page_size = 0;
@@ -4499,7 +4426,7 @@ PerlIOMmap_map(pTHX_ PerlIO *f)
                    page_size = getpagesize();
 #   else
 #       if defined(I_SYS_PARAM) && defined(PAGESIZE)
-                   page_size = PAGESIZE;       /* compiletime, bad */
+                   page_size = PAGESIZE;       /* compiletime, bad */
 #       endif
 #   endif
 #endif
@@ -4583,11 +4510,11 @@ PerlIOMmap_get_base(pTHX_ PerlIO *f)
        /*
         * We have a write buffer or flushed PerlIOBuf read buffer
         */
-       m->bbuf = b->buf;       /* save it in case we need it again */
-       b->buf = NULL;          /* Clear to trigger below */
+       m->bbuf = b->buf;       /* save it in case we need it again */
+       b->buf = NULL;          /* Clear to trigger below */
     }
     if (!b->buf) {
-       PerlIOMmap_map(aTHX_ f);        /* Try and map it */
+       PerlIOMmap_map(aTHX_ f);        /* Try and map it */
        if (!b->buf) {
            /*
             * Map did not work - recover PerlIOBuf buffer if we have one
@@ -4719,7 +4646,7 @@ PerlIOMmap_close(pTHX_ PerlIO *f)
 PerlIO *
 PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
 {
   return PerlIOBase_dup(aTHX_ f, o, param, flags);
+ return PerlIOBase_dup(aTHX_ f, o, param, flags);
 }
 
 
@@ -4727,11 +4654,11 @@ PerlIO_funcs PerlIO_mmap = {
     sizeof(PerlIO_funcs),
     "mmap",
     sizeof(PerlIOMmap),
-    PERLIO_K_BUFFERED | PERLIO_K_RAW,
+    PERLIO_K_BUFFERED|PERLIO_K_RAW,
     PerlIOBuf_pushed,
     PerlIOBuf_popped,
     PerlIOBuf_open,
-    PerlIOBase_binmode,                /* binmode */
+    PerlIOBase_binmode,         /* binmode */
     NULL,
     PerlIOBase_fileno,
     PerlIOMmap_dup,
@@ -4754,7 +4681,7 @@ PerlIO_funcs PerlIO_mmap = {
     PerlIOBuf_set_ptrcnt,
 };
 
-#endif                         /* HAS_MMAP */
+#endif                          /* HAS_MMAP */
 
 PerlIO *
 Perl_PerlIO_stdin(pTHX)
@@ -4791,9 +4718,16 @@ PerlIO_getname(PerlIO *f, char *buf)
     dTHX;
     char *name = NULL;
 #ifdef VMS
+    bool exported = FALSE;
     FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
-    if (stdio)
+    if (!stdio) {
+       stdio = PerlIO_exportFILE(f,0);
+       exported = TRUE;
+    }
+    if (stdio) {
        name = fgetname(stdio, buf);
+       if (exported) PerlIO_releaseFILE(f,stdio);
+    }
 #else
     Perl_croak(aTHX_ "Don't know how to get file name");
 #endif
@@ -4937,57 +4871,50 @@ PerlIO_stdoutf(const char *fmt, ...)
 PerlIO *
 PerlIO_tmpfile(void)
 {
-    dTHX;
-    PerlIO *f = NULL;
-    int fd = -1;
-    SV *sv = Nullsv;
-    GV *gv = gv_fetchpv("File::Temp::tempfile", FALSE, SVt_PVCV);
-
-    if (!gv) {
-       ENTER;
-       Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
-                        newSVpvn("File::Temp", 10), Nullsv, Nullsv,
-                        Nullsv);
-       gv = gv_fetchpv("File::Temp::tempfile", FALSE, SVt_PVCV);
-       GvIMPORTED_CV_on(gv);
-       LEAVE;
-    }
-
-    if (gv && GvCV(gv)) {
-       dSP;
-       ENTER;
-       SAVETMPS;
-       PUSHMARK(SP);
-       PUTBACK;
-       if (call_sv((SV *) GvCV(gv), G_SCALAR)) {
-           GV *gv = (GV *) SvRV(newSVsv(*PL_stack_sp--));
-           IO *io = gv ? GvIO(gv) : 0;
-           fd = io ? PerlIO_fileno(IoIFP(io)) : -1;
-       }
-       SPAGAIN;
-       PUTBACK;
-       FREETMPS;
-       LEAVE;
-    }
-
-    if (fd >= 0) {
-       f = PerlIO_fdopen(fd, "w+");
-       if (sv) {
-           if (f)
-               PerlIOBase(f)->flags |= PERLIO_F_TEMP;
-           PerlLIO_unlink(SvPVX(sv));
-           SvREFCNT_dec(sv);
-       }
-    }
-
-    return f;
+     dTHX;
+     PerlIO *f = NULL;
+     int fd = -1;
+#ifdef WIN32
+     fd = win32_tmpfd();
+     if (fd >= 0)
+         f = PerlIO_fdopen(fd, "w+b");
+#else /* WIN32 */
+#    if defined(HAS_MKSTEMP) && ! defined(VMS) && ! defined(OS2)
+     SV *sv = newSVpv("/tmp/PerlIO_XXXXXX", 0);
+
+     /*
+      * I have no idea how portable mkstemp() is ... NI-S
+      */
+     fd = mkstemp(SvPVX(sv));
+     if (fd >= 0) {
+         f = PerlIO_fdopen(fd, "w+");
+         if (f)
+              PerlIOBase(f)->flags |= PERLIO_F_TEMP;
+         PerlLIO_unlink(SvPVX(sv));
+         SvREFCNT_dec(sv);
+     }
+#    else      /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
+     FILE *stdio = PerlSIO_tmpfile();
+
+     if (stdio) {
+         if ((f = PerlIO_push(aTHX_(PerlIO_allocate(aTHX)),
+                               &PerlIO_stdio, "w+", Nullsv))) {
+               PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
+
+               if (s)
+                    s->stdio = stdio;
+          }
+     }
+#    endif /* else HAS_MKSTEMP */
+#endif /* else WIN32 */
+     return f;
 }
 
 #undef HAS_FSETPOS
 #undef HAS_FGETPOS
 
-#endif                         /* USE_SFIO */
-#endif                         /* PERLIO_IS_STDIO */
+#endif                          /* USE_SFIO */
+#endif                          /* PERLIO_IS_STDIO */
 
 /*======================================================================================*/
 /*
@@ -5066,7 +4993,7 @@ int
 vprintf(char *pat, char *args)
 {
     _doprnt(pat, args, stdout);
-    return 0;                  /* wrong, but perl doesn't use the return
+    return 0;                   /* wrong, but perl doesn't use the return
                                 * value */
 }
 
@@ -5074,7 +5001,7 @@ int
 vfprintf(FILE *fd, char *pat, char *args)
 {
     _doprnt(pat, args, fd);
-    return 0;                  /* wrong, but perl doesn't use the return
+    return 0;                   /* wrong, but perl doesn't use the return
                                 * value */
 }
 
@@ -5109,3 +5036,11 @@ PerlIO_sprintf(char *s, int n, const char *fmt, ...)
     return result;
 }
 #endif
+
+
+
+
+
+
+
+