update from main archive 961127
[kopensolaris-gnu/glibc.git] / libio / fileops.c
index a3138af..1851d9a 100644 (file)
@@ -165,7 +165,7 @@ DEFUN(_IO_file_fopen, (fp, filename, mode),
     read_write = _IO_NO_READS|_IO_IS_APPENDING;
     break;
   default:
-    errno = EINVAL;
+    __set_errno (EINVAL);
     return NULL;
   }
   if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+')) {
@@ -308,7 +308,15 @@ DEFUN(_IO_file_overflow, (f, ch),
          _IO_doallocbuf(f);
          _IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base);
        }
-      /* Otherwise must be currently reading. */
+      /* Otherwise must be currently reading.
+        If _IO_read_ptr (and hence also _IO_read_end) is at the buffer end,
+        logically slide the buffer forwards one block (by setting the
+        read pointers to all point at the beginning of the block).  This
+        makes room for subsequent output.
+        Otherwise, set the read pointers to _IO_read_end (leaving that
+        alone, so it can continue to correspond to the external position). */
+      if (f->_IO_read_ptr == f->_IO_buf_end)
+       f->_IO_read_end = f->_IO_read_ptr = f->_IO_buf_base;
       f->_IO_write_ptr = f->_IO_read_ptr;
       f->_IO_write_base = f->_IO_write_ptr;
       f->_IO_write_end = f->_IO_buf_end;