summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-12-14 04:21:00 -0800
committerMark Adler <madler@alumni.caltech.edu>2011-12-14 04:21:00 -0800
commit2556706d67b471b45e0882ea4f32aa8b2efc14ec (patch)
treeed16d084027fa6726873eddfaa5187a64e05857e
parent850a198ff1879e506c961c91da30009539ed14b3 (diff)
downloadzlib-2556706d67b471b45e0882ea4f32aa8b2efc14ec.tar.gz
Document gzread() capability to read concurrently written files.
Also since gzread() will no longer return an error for an incomplete gzip file, have gzclose() return an error if the last gzread() ended in the middle of a gzip stream.
-rw-r--r--gzread.c5
-rw-r--r--zlib.h15
2 files changed, 17 insertions, 3 deletions
diff --git a/gzread.c b/gzread.c
index 4bbbf52..09e5863 100644
--- a/gzread.c
+++ b/gzread.c
@@ -553,7 +553,7 @@ int ZEXPORT gzdirect(file)
int ZEXPORT gzclose_r(file)
gzFile file;
{
- int ret;
+ int ret, err;
gz_statep state;
/* get internal structure */
@@ -571,9 +571,10 @@ int ZEXPORT gzclose_r(file)
free(state->out);
free(state->in);
}
+ err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
gz_error(state, Z_OK, NULL);
free(state->path);
ret = close(state->fd);
free(state);
- return ret ? Z_ERRNO : Z_OK;
+ return ret ? Z_ERRNO : err;
}
diff --git a/zlib.h b/zlib.h
index 1ee04e9..7068d50 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1297,6 +1297,18 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
If something other than a gzip stream is encountered after a gzip stream,
that remaining trailing garbage is ignored (and no error is returned).
+ gzread can be used to read a gzip file that is being concurrently written.
+ Upon reaching the end of the input, gzread will return with the available
+ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+ gzclearerr can be used to clear the end of file indicator in order to permit
+ gzread to be tried again. Z_OK indicates that a gzip stream was completed
+ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the
+ middle of a gzip stream. Note that gzread does not return -1 in the event
+ of an incomplete gzip stream. This error is deferred until gzclose(), which
+ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+ stream. Alternatively, gzerror can be used before gzclose to detect this
+ case.
+
gzread returns the number of uncompressed bytes actually read, less than
len for end of file, or -1 for error.
*/
@@ -1480,7 +1492,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file));
must not be called more than once on the same allocation.
gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
- file operation error, Z_MEM_ERROR if out of memory, or Z_OK on success.
+ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+ last read ended in the middle of a gzip stream, or Z_OK on success.
*/
ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));