From: Mark Adler Date: Sat, 3 Mar 2012 18:24:44 +0000 (-0800) Subject: Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen(). X-Git-Tag: v1.2.7~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=755c41dc4bcde575ae654065921206ab4efec962;p=thirdparty%2Fzlib-ng.git Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen(). --- diff --git a/gzlib.c b/gzlib.c index 7aedab8e2..fec7fbf7f 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 2cbd98182..ca6123c0e 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