xref: /freebsd/lib/libz/zopen.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
1131ee164SKris Kennaway /*
2131ee164SKris Kennaway  * Public domain stdio wrapper for libz, written by Johan Danielsson.
3131ee164SKris Kennaway  */
4131ee164SKris Kennaway 
5fa81a976SMatthew Dillon #include <sys/cdefs.h>
6131ee164SKris Kennaway #include <stdio.h>
7131ee164SKris Kennaway #include <zlib.h>
8131ee164SKris Kennaway 
9131ee164SKris Kennaway FILE *zopen(const char *fname, const char *mode);
10*8e2a46c8SMark Johnston FILE *zdopen(int fd, const char *mode);
11131ee164SKris Kennaway 
12131ee164SKris Kennaway /* convert arguments */
13131ee164SKris Kennaway static int
xgzread(void * cookie,char * data,int size)14131ee164SKris Kennaway xgzread(void *cookie, char *data, int size)
15131ee164SKris Kennaway {
16131ee164SKris Kennaway     return gzread(cookie, data, size);
17131ee164SKris Kennaway }
18131ee164SKris Kennaway 
19131ee164SKris Kennaway static int
xgzwrite(void * cookie,const char * data,int size)20131ee164SKris Kennaway xgzwrite(void *cookie, const char *data, int size)
21131ee164SKris Kennaway {
22131ee164SKris Kennaway     return gzwrite(cookie, (void*)data, size);
23131ee164SKris Kennaway }
24131ee164SKris Kennaway 
25a2953f76SXin LI static int
xgzclose(void * cookie)26a2953f76SXin LI xgzclose(void *cookie)
27a2953f76SXin LI {
28a2953f76SXin LI     return gzclose(cookie);
29a2953f76SXin LI }
30a2953f76SXin LI 
3186ccd3e0SXin LI static fpos_t
xgzseek(void * cookie,fpos_t offset,int whence)3286ccd3e0SXin LI xgzseek(void *cookie,  fpos_t offset, int whence)
3386ccd3e0SXin LI {
3486ccd3e0SXin LI 	return gzseek(cookie, (z_off_t)offset, whence);
3586ccd3e0SXin LI }
3686ccd3e0SXin LI 
37131ee164SKris Kennaway FILE *
zopen(const char * fname,const char * mode)38131ee164SKris Kennaway zopen(const char *fname, const char *mode)
39131ee164SKris Kennaway {
40131ee164SKris Kennaway     gzFile gz = gzopen(fname, mode);
41131ee164SKris Kennaway     if(gz == NULL)
42131ee164SKris Kennaway 	return NULL;
43131ee164SKris Kennaway 
44131ee164SKris Kennaway     if(*mode == 'r')
4586ccd3e0SXin LI 	return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
46131ee164SKris Kennaway     else
4786ccd3e0SXin LI 	return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
48131ee164SKris Kennaway }
49*8e2a46c8SMark Johnston 
50*8e2a46c8SMark Johnston FILE *
zdopen(int fd,const char * mode)51*8e2a46c8SMark Johnston zdopen(int fd, const char *mode)
52*8e2a46c8SMark Johnston {
53*8e2a46c8SMark Johnston 	gzFile gz;
54*8e2a46c8SMark Johnston 
55*8e2a46c8SMark Johnston 	gz = gzdopen(fd, mode);
56*8e2a46c8SMark Johnston 	if (gz == NULL)
57*8e2a46c8SMark Johnston 		return (NULL);
58*8e2a46c8SMark Johnston 
59*8e2a46c8SMark Johnston 	if (*mode == 'r')
60*8e2a46c8SMark Johnston 		return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
61*8e2a46c8SMark Johnston 	else
62*8e2a46c8SMark Johnston 		return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
63*8e2a46c8SMark Johnston }
64