summaryrefslogtreecommitdiff
path: root/lib/linebuffer.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2003-09-17 18:45:24 +0000
committerJim Meyering <jim@meyering.net>2003-09-17 18:45:24 +0000
commit21158aed3acf8f6e925c2e3902b0c494aa7bf63b (patch)
tree6dda21d7ce6a231f1edae516d63d863ac72c5a72 /lib/linebuffer.c
parent7620cc92c20ec5c372891eac4a4051b45c3447e0 (diff)
downloadcoreutils-21158aed3acf8f6e925c2e3902b0c494aa7bf63b.tar.xz
(readlinebuffer): Return NULL immediately upon
input error, instead of returning NULL the next time we are called (and therefore losing track of errno).
Diffstat (limited to 'lib/linebuffer.c')
-rw-r--r--lib/linebuffer.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/linebuffer.c b/lib/linebuffer.c
index e169a989d..434d6d858 100644
--- a/lib/linebuffer.c
+++ b/lib/linebuffer.c
@@ -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;