diff --git a/gzlib.c b/gzlib.c index 7aedab8..fec7fbf 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; @@ -183,10 +190,13 @@ local gzFile gz_open(path, fd, mode) #endif #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 2cbd981..ca6123c 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