linebuffer.c (readlinebuffer): Return NULL immediately upon input error.
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 16 Sep 2003 20:00:38 +0000 (20:00 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 16 Sep 2003 20:00:38 +0000 (20:00 +0000)
lib/ChangeLog
lib/linebuffer.c

index 9b8480dd7c337841e5793720404dbb2a85d7f2f3..19b303996d1eda7056b519b17f521f070e70c85e 100644 (file)
@@ -1,6 +1,12 @@
+2003-09-16  Paul Eggert  <eggert@twinsun.com>
+
+       * linebuffer.c (readlinebuffer): Return NULL immediately upon
+       input error, instead of returning NULL the next time we are called
+       (and therefore losing track of errno).
+
 2003-09-15  Paul Eggert  <eggert@twinsun.com>
 
-       * lib/getndelim2.c (getndelim2): Don't trash errno when a read
+       * getndelim2.c (getndelim2): Don't trash errno when a read
        fails, so that the caller gets the proper errno.
 
        * readutmp.c (read_utmp): Likewise.
index e169a989d569a01344f749d94f8e7da7e159b5d6..434d6d8588638a921e4f5acf8fea1272065b388b 100644 (file)
@@ -45,7 +45,9 @@ initbuffer (struct linebuffer *linebuffer)
    that ends in a non-newline character.  Do not null terminate.
    Therefore the stream can contain NUL bytes, and the length
    (including the newline) is returned in linebuffer->length.
-   Return NULL upon error, or when STREAM is empty.
+   Return NULL when stream is empty.  Return NULL and set errno upon
+   error; callers can distinguish this case from the empty case by
+   invoking ferror (stream).
    Otherwise, return LINEBUFFER.  */
 struct linebuffer *
 readlinebuffer (struct linebuffer *linebuffer, FILE *stream)
@@ -55,7 +57,7 @@ readlinebuffer (struct linebuffer *linebuffer, FILE *stream)
   char *p = linebuffer->buffer;
   char *end = buffer + linebuffer->size; /* Sentinel. */
 
-  if (feof (stream) || ferror (stream))
+  if (feof (stream))
     return NULL;
 
   do
@@ -63,7 +65,7 @@ readlinebuffer (struct linebuffer *linebuffer, FILE *stream)
       c = getc (stream);
       if (c == EOF)
        {
-         if (p == buffer)
+         if (p == buffer || ferror (stream))
            return NULL;
          if (p[-1] == '\n')
            break;