diff options
author | Thorsten Lockert <tholo@cvs.openbsd.org> | 1996-09-22 20:05:20 +0000 |
---|---|---|
committer | Thorsten Lockert <tholo@cvs.openbsd.org> | 1996-09-22 20:05:20 +0000 |
commit | b94f37f55f7022871e1921d7578e3a9b689a522a (patch) | |
tree | 309980d8a91bbb2e260c5bff79eaaee9e1a8f648 | |
parent | 99b0cb76e2303dd1d20a32461a8ab6aa1b70e0aa (diff) |
Add zdopen(); open a file descriptor
-rw-r--r-- | usr.bin/compress/zopen.3 | 15 | ||||
-rw-r--r-- | usr.bin/compress/zopen.c | 54 |
2 files changed, 65 insertions, 4 deletions
diff --git a/usr.bin/compress/zopen.3 b/usr.bin/compress/zopen.3 index 7feb5b367b3..a8f95941bf4 100644 --- a/usr.bin/compress/zopen.3 +++ b/usr.bin/compress/zopen.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: zopen.3,v 1.2 1996/06/26 05:32:21 deraadt Exp $ +.\" $OpenBSD: zopen.3,v 1.3 1996/09/22 20:05:18 tholo Exp $ .\" $NetBSD: zopen.3,v 1.3 1995/03/26 09:44:49 glass Exp $ .\" .\" Copyright (c) 1992, 1993 @@ -44,6 +44,8 @@ .Fd #include <stdio.h> .Ft FILE * .Fn zopen "const char *path" "const char *mode" "int bits" +.Ft FILE * +.Fn zdopen "int fd" "const char *mode" "int bits" .Sh DESCRIPTION The .Fn zopen @@ -52,6 +54,13 @@ opens the compressed file whose name is the string pointed to by .Fa path and associates a stream with it. .Pp +The +.Fn zdopen +function +opens the compressed file whose file descriptor is given in +.Fa fd +and associates a stream with it. +.Pp The argument .Fa mode points to one of the following one-character strings: @@ -137,6 +146,8 @@ first appeared in 4.4BSD. .Sh BUGS The .Fn zopen -function +and +.Fn zdopen +functions may not be portable to systems other than .Bx . diff --git a/usr.bin/compress/zopen.c b/usr.bin/compress/zopen.c index 14090d44ec4..dcf742c78d1 100644 --- a/usr.bin/compress/zopen.c +++ b/usr.bin/compress/zopen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: zopen.c,v 1.2 1996/06/26 05:32:22 deraadt Exp $ */ +/* $OpenBSD: zopen.c,v 1.3 1996/09/22 20:05:19 tholo Exp $ */ /* $NetBSD: zopen.c,v 1.5 1995/03/26 09:44:53 glass Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)zopen.c 8.1 (Berkeley) 6/27/93"; #else -static char rcsid[] = "$OpenBSD: zopen.c,v 1.2 1996/06/26 05:32:22 deraadt Exp $"; +static char rcsid[] = "$OpenBSD: zopen.c,v 1.3 1996/09/22 20:05:19 tholo Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -698,6 +698,56 @@ cl_hash(zs, cl_hsize) /* Reset code table. */ } FILE * +zdopen(fd, mode, bits) + int fd; + const char *mode; + int bits; +{ + struct s_zstate *zs; + + if (mode[0] != 'r' && mode[0] != 'w' || mode[1] != '\0' || + bits < 0 || bits > BITS) { + errno = EINVAL; + return (NULL); + } + + if ((zs = calloc(1, sizeof(struct s_zstate))) == NULL) + return (NULL); + + maxbits = bits ? bits : BITS; /* User settable max # bits/code. */ + maxmaxcode = 1 << maxbits; /* Should NEVER generate this code. */ + hsize = HSIZE; /* For dynamic table sizing. */ + free_ent = 0; /* First unused entry. */ + block_compress = BLOCK_MASK; + clear_flg = 0; + ratio = 0; + checkpoint = CHECK_GAP; + in_count = 1; /* Length of input. */ + out_count = 0; /* # of codes output (for debugging). */ + state = S_START; + roffset = 0; + size = 0; + + /* + * Layering compress on top of stdio in order to provide buffering, + * and ensure that reads and write work with the data specified. + */ + if ((fp = fdopen(fd, mode)) == NULL) { + free(zs); + return (NULL); + } + switch (*mode) { + case 'r': + zmode = 'r'; + return (funopen(zs, zread, NULL, NULL, zclose)); + case 'w': + zmode = 'w'; + return (funopen(zs, NULL, zwrite, NULL, zclose)); + } + /* NOTREACHED */ +} + +FILE * zopen(fname, mode, bits) const char *fname, *mode; int bits; |