Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen().

This commit is contained in:
Mark Adler 2012-03-03 10:24:44 -08:00
parent 53bfe01cea
commit 755c41dc4b
2 changed files with 15 additions and 2 deletions

12
gzlib.c
View File

@ -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))),

5
zlib.h
View File

@ -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