Update Changes.
[p5sagit/p5-mst-13.2.git] / perlio.c
index c55b681..925e3fb 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -193,8 +193,10 @@ PerlIO_cleantable(PerlIO **tablep)
    for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
     {
      PerlIO *f = table+i;
-     if (*f)
-      PerlIO_close(f);
+     if (*f) 
+      {
+       PerlIO_close(f);
+      }
     }
    Safefree(table);
    *tablep = NULL;
@@ -943,6 +945,11 @@ PerlIOUnix_oflags(const char *mode)
      oflags |= O_WRONLY;
     break;
   }
+ if (*mode == 'b')
+  {
+   oflags |= O_BINARY;
+   mode++; 
+  }   
  if (*mode || oflags == -1)
   {
    errno = EINVAL;
@@ -1271,7 +1278,8 @@ PerlIOStdio_tell(PerlIO *f)
 IV
 PerlIOStdio_close(PerlIO *f)
 {
- return fclose(PerlIOSelf(f,PerlIOStdio)->stdio);
+ FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
+ return fclose(stdio);
 }
 
 IV
@@ -1304,8 +1312,12 @@ PerlIOStdio_fill(PerlIO *f)
 {
  FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
  int c;
- if (fflush(stdio) != 0)
-  return EOF;
+ /* fflush()ing read-only streams can cause trouble on some stdio-s */
+ if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
+  {
+   if (fflush(stdio) != 0)
+    return EOF;
+  }
  c = fgetc(stdio);
  if (c == EOF || ungetc(c,stdio) != c)
   return EOF;
@@ -1542,14 +1554,15 @@ PerlIOBuf_flush(PerlIO *f)
    /* write() the buffer */
    STDCHAR *p = b->buf;
    int count;
+   PerlIO *n = PerlIONext(f);
    while (p < b->ptr)
     {
-     count = PerlIO_write(PerlIONext(f),p,b->ptr - p);
+     count = PerlIO_write(n,p,b->ptr - p);
      if (count > 0)
       {
        p += count;
       }
-     else if (count < 0)
+     else if (count < 0 || PerlIO_error(n))
       {
        PerlIOBase(f)->flags |= PERLIO_F_ERROR;
        code = -1;
@@ -2366,7 +2379,13 @@ PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
  SV *sv = newSVpvn("",0);
  char *s;
  STRLEN len;
+#ifdef NEED_VA_COPY
+ va_list apc;
+ Perl_va_copy(ap, apc);
+ sv_vcatpvf(sv, fmt, &apc);
+#else
  sv_vcatpvf(sv, fmt, &ap);
+#endif
  s = SvPV(sv,len);
  return PerlIO_write(f,s,len);
 }
@@ -2399,8 +2418,18 @@ PerlIO_stdoutf(const char *fmt,...)
 PerlIO *
 PerlIO_tmpfile(void)
 {
- dTHX;
  /* I have no idea how portable mkstemp() is ... */
+#if defined(WIN32) || !defined(HAVE_MKSTEMP)
+ PerlIO *f = NULL;
+ FILE *stdio = tmpfile();
+ if (stdio)
+  {
+   PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"w+"),PerlIOStdio);
+   s->stdio  = stdio;
+  }
+ return f;
+#else
+ dTHX;
  SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
  int fd = mkstemp(SvPVX(sv));
  PerlIO *f = NULL;
@@ -2415,6 +2444,7 @@ PerlIO_tmpfile(void)
    SvREFCNT_dec(sv);
   }
  return f;
+#endif
 }
 
 #undef HAS_FSETPOS