update from main archive 961127
[kopensolaris-gnu/glibc.git] / libio / fileops.c
index 89381ec..1851d9a 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (C) 1993, 1995 Free Software Foundation
 
 This file is part of the GNU IO Library.  This library is free
@@ -24,7 +24,9 @@ the executable file might be covered by the GNU General Public License. */
 
 /*  written by Per Bothner (bothner@cygnus.com) */
 
-#define _POSIX_SOURCE
+#ifndef _POSIX_SOURCE
+# define _POSIX_SOURCE
+#endif
 #include "libioP.h"
 #include <fcntl.h>
 #include <sys/types.h>
@@ -68,14 +70,14 @@ extern int errno;
    (The pointers save_gptr() and save_egptr() are the values
    of gptr() and egptr() at the time putback mode was entered.)
    The OS position corresponds to that of save_egptr().
-   
+
    LINE BUFFERED OUTPUT:
    During line buffered output, pbase()==base() && epptr()==base().
    However, ptr() may be anywhere between base() and ebuf().
    This forces a call to filebuf::overflow(int C) on every put.
    If there is more space in the buffer, and C is not a '\n',
    then C is inserted, and pptr() incremented.
-   
+
    UNBUFFERED STREAMS:
    If a filebuf is unbuffered(), the _shortbuf[1] is used as the buffer.
 */
@@ -102,11 +104,11 @@ int
 DEFUN(_IO_file_close_it, (fp),
       register _IO_FILE* fp)
 {
-  int sync_status, close_status;
+  int write_status, close_status;
   if (!_IO_file_is_open(fp))
     return EOF;
 
-  sync_status = _IO_file_sync (fp);
+  write_status = _IO_do_flush (fp);
 
   _IO_unsave_markers(fp);
 
@@ -122,7 +124,7 @@ DEFUN(_IO_file_close_it, (fp),
   fp->_fileno = EOF;
   fp->_offset = _IO_pos_BAD;
 
-  return close_status ? close_status : sync_status;
+  return close_status ? close_status : write_status;
 }
 
 void
@@ -163,14 +165,14 @@ 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] == '+')) {
     omode = O_RDWR;
     read_write &= _IO_IS_APPENDING;
   }
-  fdesc = open(filename, omode|oflags, oprot);
+  fdesc = __open (filename, omode|oflags, oprot);
   if (fdesc < 0)
     return NULL;
   fp->_fileno = fdesc;
@@ -228,7 +230,7 @@ DEFUN(_IO_do_write, (fp, data, to_do),
        unpredictable. */
     fp->_offset = _IO_pos_BAD;
   else if (fp->_IO_read_end != fp->_IO_write_base)
-    { 
+    {
       _IO_pos_t new_pos
        = _IO_SYSSEEK(fp, fp->_IO_write_base - fp->_IO_read_end, 1);
       if (new_pos == _IO_pos_BAD)
@@ -306,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;
@@ -337,7 +347,7 @@ DEFUN(_IO_file_sync, (fp),
   /*    char* ptr = cur_ptr(); */
   if (fp->_IO_write_ptr > fp->_IO_write_base)
     if (_IO_do_flush(fp)) return EOF;
-  delta = fp->_IO_read_ptr - fp->_IO_read_end; 
+  delta = fp->_IO_read_ptr - fp->_IO_read_end;
   if (delta != 0)
     {
 #ifdef TODO
@@ -639,7 +649,7 @@ DEFUN(_IO_file_xsputn, (f, data, n),
       if (_IO_do_write(f, s, count) == EOF)
        return n - to_do;
       to_do = dont_write;
-      
+
       /* Now write out the remainder.  Normally, this will fit in the
         buffer, but it's somewhat messier for line-buffered files,
         so we let _IO_default_xsputn handle the general case. */
@@ -704,7 +714,7 @@ DEFUN(_IO_file_xsgetn, (fp, data, n),
               else
                 fp->_flags |= _IO_ERR_SEEN, count = 0;
             }
-         
+
          s += count;
          more -= count;
        }