xref: /netbsd-src/sbin/savecore/zopen.c (revision 52678ac6a47ec385abffde8d30f60082301e611b)
1 /*	$NetBSD: zopen.c,v 1.4 2017/01/10 04:42:20 kamil Exp $	*/
2 
3 /*
4  * Public domain stdio wrapper for libz, written by Johan Danielsson.
5  */
6 
7 #include <sys/cdefs.h>
8 #ifndef lint
9 __RCSID("$NetBSD: zopen.c,v 1.4 2017/01/10 04:42:20 kamil Exp $");
10 #endif
11 
12 #include <stdio.h>
13 #include <zlib.h>
14 
15 FILE *zopen(const char *fname, const char *mode);
16 
17 /* convert arguments */
18 static int
xgzread(void * cookie,char * data,int size)19 xgzread(void *cookie, char *data, int size)
20 {
21     return gzread(cookie, data, size);
22 }
23 
24 static int
xgzwrite(void * cookie,const char * data,int size)25 xgzwrite(void *cookie, const char *data, int size)
26 {
27     return gzwrite(cookie, __UNCONST(data), size);
28 }
29 
30 FILE *
zopen(const char * fname,const char * mode)31 zopen(const char *fname, const char *mode)
32 {
33     gzFile gz = gzopen(fname, mode);
34     if(gz == NULL)
35 	return NULL;
36 
37     if(*mode == 'r')
38 	return funopen(gz, xgzread, NULL, NULL, (int (*)(void *))gzclose);
39     else
40 	return funopen(gz, NULL, xgzwrite, NULL, (int (*)(void *))gzclose);
41 }
42