xref: /netbsd-src/sbin/savecore/zopen.c (revision 52678ac6a47ec385abffde8d30f60082301e611b)
1*52678ac6Skamil /*	$NetBSD: zopen.c,v 1.4 2017/01/10 04:42:20 kamil Exp $	*/
27e74657eSjoda 
37e74657eSjoda /*
47e74657eSjoda  * Public domain stdio wrapper for libz, written by Johan Danielsson.
57e74657eSjoda  */
67e74657eSjoda 
77e74657eSjoda #include <sys/cdefs.h>
87e74657eSjoda #ifndef lint
9*52678ac6Skamil __RCSID("$NetBSD: zopen.c,v 1.4 2017/01/10 04:42:20 kamil Exp $");
107e74657eSjoda #endif
117e74657eSjoda 
127e74657eSjoda #include <stdio.h>
137e74657eSjoda #include <zlib.h>
147e74657eSjoda 
157e74657eSjoda FILE *zopen(const char *fname, const char *mode);
167e74657eSjoda 
177e74657eSjoda /* convert arguments */
187e74657eSjoda static int
xgzread(void * cookie,char * data,int size)197e74657eSjoda xgzread(void *cookie, char *data, int size)
207e74657eSjoda {
217e74657eSjoda     return gzread(cookie, data, size);
227e74657eSjoda }
237e74657eSjoda 
247e74657eSjoda static int
xgzwrite(void * cookie,const char * data,int size)257e74657eSjoda xgzwrite(void *cookie, const char *data, int size)
267e74657eSjoda {
272c6eadc9Schristos     return gzwrite(cookie, __UNCONST(data), size);
287e74657eSjoda }
297e74657eSjoda 
307e74657eSjoda FILE *
zopen(const char * fname,const char * mode)317e74657eSjoda zopen(const char *fname, const char *mode)
327e74657eSjoda {
337e74657eSjoda     gzFile gz = gzopen(fname, mode);
347e74657eSjoda     if(gz == NULL)
357e74657eSjoda 	return NULL;
367e74657eSjoda 
377e74657eSjoda     if(*mode == 'r')
38*52678ac6Skamil 	return funopen(gz, xgzread, NULL, NULL, (int (*)(void *))gzclose);
397e74657eSjoda     else
40*52678ac6Skamil 	return funopen(gz, NULL, xgzwrite, NULL, (int (*)(void *))gzclose);
417e74657eSjoda }
42