git: 61a2e7a442f7 - stable/12 - Add zdopen(3) to complement zopen(3).

From: Xin LI <delphij_at_FreeBSD.org>
Date: Sun, 03 Apr 2022 22:33:19 UTC
The branch stable/12 has been updated by delphij:

URL: https://cgit.FreeBSD.org/src/commit/?id=61a2e7a442f795dab5de1789c040fe7d97b74a5b

commit 61a2e7a442f795dab5de1789c040fe7d97b74a5b
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2018-12-06 20:03:06 +0000
Commit:     Xin LI <delphij@FreeBSD.org>
CommitDate: 2022-04-03 22:32:44 +0000

    Add zdopen(3) to complement zopen(3).
    
    zdopen() can be used in capability mode.  Update zopen.3 accordingly
    and fix some grammar nits while I'm here.
    
    Reviewed by:    delphij
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D18456
    
    (cherry picked from commit 8e2a46c8bd361395add649440758880c1e3da3ee)
---
 lib/libz/Makefile     |  1 +
 lib/libz/Symbol.map   |  4 ++++
 lib/libz/Versions.def |  3 +++
 lib/libz/zopen.3      | 57 +++++++++++++++++++++++++++++++--------------------
 lib/libz/zopen.c      | 16 +++++++++++++++
 5 files changed, 59 insertions(+), 22 deletions(-)

diff --git a/lib/libz/Makefile b/lib/libz/Makefile
index 81526179e2d0..ef3ec038f6f5 100644
--- a/lib/libz/Makefile
+++ b/lib/libz/Makefile
@@ -7,6 +7,7 @@ LIB=		z
 SHLIBDIR?=	/lib
 SHLIB_MAJOR=	6
 MAN=		zlib.3 zopen.3
+MLINKS+=	zopen.3 zdopen.3
 
 ZLIBSRC=	${SRCTOP}/sys/contrib/zlib
 
diff --git a/lib/libz/Symbol.map b/lib/libz/Symbol.map
index 92b02b56d0eb..0a91537272c1 100644
--- a/lib/libz/Symbol.map
+++ b/lib/libz/Symbol.map
@@ -103,6 +103,10 @@ FBSD_1.2 {
 	zopen;
 };
 
+FBSD_1.6 {
+	zdopen;
+};
+
 ZLIBprivate_1.0 {
 	_tr_align;
 	_tr_flush_block;
diff --git a/lib/libz/Versions.def b/lib/libz/Versions.def
index d5f1816b2be8..9a67602185b8 100644
--- a/lib/libz/Versions.def
+++ b/lib/libz/Versions.def
@@ -15,6 +15,9 @@ ZLIB_1.2.9 {
 FBSD_1.2 {
 } ZLIB_1.2.4.0;
 
+FBSD_1.6 {
+} FBSD_1.2;
+
 ZLIBprivate_1.0 {
 } ZLIB_1.2.4.0;
 
diff --git a/lib/libz/zopen.3 b/lib/libz/zopen.3
index b56fb447a345..7677f300a8ae 100644
--- a/lib/libz/zopen.3
+++ b/lib/libz/zopen.3
@@ -23,7 +23,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 5, 2014
+.Dd December 6, 2018
 .Dt ZOPEN 3
 .Os
 .Sh NAME
@@ -34,33 +34,44 @@
 .Sh SYNOPSIS
 .Ft FILE *
 .Fn zopen "const char *path" "const char *mode"
+.Ft FILE *
+.Fn zdopen "int fd" "const char *mode"
 .Sh DESCRIPTION
 The
 .Fn zopen
-opens a gzip file whose name is the string pointed to by
+function opens a gzip file whose name is the string pointed to by
 .Fa path
-and associates a stream with it.
-It is a wrapper around
+and returns a stream which can be used to access the uncompressed contents
+of the file.
+The
+.Fn zdopen
+variant takes a gzip file referenced by the file descriptor
+.Fa fd ,
+analogous to
+.Xr fdopen 3 .
+They are wrappers around
 .Xr zlib 3
-and standard stream I/O APIs.
+and the standard stream I/O APIs.
 .Pp
 The argument
 .Fa mode
-have the same meaning as it does in
+has the same meaning as it does in
 .Xr fopen 3 .
 .Pp
 The
-.Nm
-function will associate read, write, seek and close
+.Fn zopen
+and
+.Fn zdopen
+functions will associate the read, write, seek and close
 functions of
 .Xr zlib 3
-after successfully opened a file with
-.Xr funopen 3
-so that they will be used to read or write the new stream.
+with the returned stream.
 .Sh RETURN VALUES
 Upon successful completion
-.Nm
-returns a
+.Fn zopen
+and
+.Fn zdopen
+return a
 .Tn FILE
 pointer.
 Otherwise,
@@ -70,26 +81,28 @@ is returned and the global variable
 is set to indicate the error.
 .Sh ERRORS
 In addition to the errors documented for
-.Xr fopen 3 ,
-the
-.Nm
-function may also fail for: 
+.Xr fopen 3
+and
+.Xr fdopen 3 ,
+the functions may also fail for:
 .Bl -tag -width Er
 .It Bq Er ENOMEM
 Insufficient memory is available.
 .El
 .Sh COMPATIBILITY
-This implementation of
-.Nm
+The implementation of
+.Fn zopen
 function first appeared in
 .Nx 1.6
 and
 .Fx 4.5 .
-The
-.Nm
-function may not be portable to systems other than
+.Fn zdopen
+first appeared in
+.Fx 13.0 .
+These functions may not be portable to systems other than
 .Fx .
 .Sh SEE ALSO
+.Xr fdopen 3 ,
 .Xr fopen 3 ,
 .Xr funopen 3 ,
 .Xr zlib 3
diff --git a/lib/libz/zopen.c b/lib/libz/zopen.c
index cde022dcf0e6..a6ac99166128 100644
--- a/lib/libz/zopen.c
+++ b/lib/libz/zopen.c
@@ -9,6 +9,7 @@ __FBSDID("$FreeBSD$");
 #include <zlib.h>
 
 FILE *zopen(const char *fname, const char *mode);
+FILE *zdopen(int fd, const char *mode);
 
 /* convert arguments */
 static int
@@ -47,3 +48,18 @@ zopen(const char *fname, const char *mode)
     else
 	return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
 }
+
+FILE *
+zdopen(int fd, const char *mode)
+{
+	gzFile gz;
+
+	gz = gzdopen(fd, mode);
+	if (gz == NULL)
+		return (NULL);
+
+	if (*mode == 'r')
+		return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
+	else
+		return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
+}