summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gzlib.c12
-rw-r--r--zlib.h5
2 files changed, 15 insertions, 2 deletions
diff --git a/gzlib.c b/gzlib.c
index 7aedab8e2d..fec7fbf7f2 100644
--- a/gzlib.c
+++ b/gzlib.c
@@ -94,6 +94,7 @@ local gzFile gz_open(path, fd, mode)
const char *mode;
{
gz_statep state;
+ int cloexec = 0, exclusive = 0;
/* check input */
if (path == NULL)
@@ -133,6 +134,12 @@ local gzFile gz_open(path, fd, mode)
return NULL;
case 'b': /* ignore -- will request binary anyway */
break;
+ case 'e':
+ cloexec = 1;
+ break;
+ case 'x':
+ exclusive = 1;
+ break;
case 'f':
state->strategy = Z_FILTERED;
break;
@@ -184,9 +191,12 @@ local gzFile gz_open(path, fd, mode)
#ifdef O_BINARY
O_BINARY |
#endif
+#ifdef O_CLOEXEC
+ (cloexec ? O_CLOEXEC : 0) |
+#endif
(state->mode == GZ_READ ?
O_RDONLY :
- (O_WRONLY | O_CREAT | (
+ (O_WRONLY | O_CREAT | (exclusive ? O_EXCL : 0) | (
state->mode == GZ_WRITE ?
O_TRUNC :
O_APPEND))),
diff --git a/zlib.h b/zlib.h
index 2cbd981824..ca6123c0ef 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1217,7 +1217,10 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
"a" can be used instead of "w" to request that the gzip stream that will
be written be appended to the file. "+" will result in an error, since
- reading and writing to the same gzip file is not supported.
+ reading and writing to the same gzip file is not supported. The addition of
+ "x" when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of "e" when
+ reading or writing will set the flag to close the file on an execve() call.
These functions, as well as gzip, will read and decode a sequence of gzip
streams in a file. The append function of gzopen() can be used to create