Re: Why *not* use UNIVERSAL qw( isa can ) ; ??
[p5sagit/p5-mst-13.2.git] / perlio.c
index f102600..8e8b859 100644 (file)
--- a/perlio.c
+++ b/perlio.c
 #define PERL_IN_PERLIO_C
 #include "perl.h"
 
+#ifdef PERL_IMPLICIT_CONTEXT
+#undef dSYS
+#define dSYS dTHX
+#endif
+
 #include "XSUB.h"
 
 int
@@ -779,8 +784,8 @@ PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
                     */
                    char q = ((*s == '\'') ? '"' : '\'');
                    Perl_warn(aTHX_
-                             "perlio: invalid separator character %c%c%c in layer specification list",
-                             q, *s, q);
+                             "perlio: invalid separator character %c%c%c in layer specification list %s",
+                             q, *s, q, s);
                    return -1;
                }
                do {
@@ -2872,19 +2877,26 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
        f = (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
                          NULL, narg, args);
        if (f) {
-           PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
-           fd = PerlIO_fileno(f);
+            if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
+               /*
+                * if push fails during open, open fails. close will pop us.
+                */
+               PerlIO_close (f);
+               return NULL;
+           } else {
+               fd = PerlIO_fileno(f);
 #if (O_BINARY != O_TEXT) && !defined(__BEOS__)
-           /*
-            * do something about failing setmode()? --jhi
-            */
-           PerlLIO_setmode(fd, O_BINARY);
-#endif
-           if (init && fd == 2) {
                /*
-                * Initial stderr is unbuffered
+                * do something about failing setmode()? --jhi
                 */
-               PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
+               PerlLIO_setmode(fd, O_BINARY);
+#endif
+               if (init && fd == 2) {
+                   /*
+                    * Initial stderr is unbuffered
+                    */
+                   PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
+               }
            }
        }
     }
@@ -3511,7 +3523,7 @@ PerlIOCrlf_get_cnt(PerlIO *f)
                        int code;
                        b->ptr++;       /* say we have read it as far as
                                         * flush() is concerned */
-                       b->buf++;       /* Leave space an front of buffer */
+                       b->buf++;       /* Leave space in front of buffer */
                        b->bufsiz--;    /* Buffer is thus smaller */
                        code = PerlIO_fill(f);  /* Fetch some more */
                        b->bufsiz++;    /* Restore size for next time */