xref: /titanic_51/usr/src/boot/lib/libz/zopen.c (revision 4a5d661a82b942b6538acd26209d959ce98b593a)
1*4a5d661aSToomas Soome /*
2*4a5d661aSToomas Soome  * Public domain stdio wrapper for libz, written by Johan Danielsson.
3*4a5d661aSToomas Soome  */
4*4a5d661aSToomas Soome 
5*4a5d661aSToomas Soome #include <sys/cdefs.h>
6*4a5d661aSToomas Soome __FBSDID("$FreeBSD$");
7*4a5d661aSToomas Soome 
8*4a5d661aSToomas Soome #include <stdio.h>
9*4a5d661aSToomas Soome #include <zlib.h>
10*4a5d661aSToomas Soome 
11*4a5d661aSToomas Soome FILE *zopen(const char *fname, const char *mode);
12*4a5d661aSToomas Soome 
13*4a5d661aSToomas Soome /* convert arguments */
14*4a5d661aSToomas Soome static int
15*4a5d661aSToomas Soome xgzread(void *cookie, char *data, int size)
16*4a5d661aSToomas Soome {
17*4a5d661aSToomas Soome     return gzread(cookie, data, size);
18*4a5d661aSToomas Soome }
19*4a5d661aSToomas Soome 
20*4a5d661aSToomas Soome static int
21*4a5d661aSToomas Soome xgzwrite(void *cookie, const char *data, int size)
22*4a5d661aSToomas Soome {
23*4a5d661aSToomas Soome     return gzwrite(cookie, (void*)data, size);
24*4a5d661aSToomas Soome }
25*4a5d661aSToomas Soome 
26*4a5d661aSToomas Soome static int
27*4a5d661aSToomas Soome xgzclose(void *cookie)
28*4a5d661aSToomas Soome {
29*4a5d661aSToomas Soome     return gzclose(cookie);
30*4a5d661aSToomas Soome }
31*4a5d661aSToomas Soome 
32*4a5d661aSToomas Soome static fpos_t
33*4a5d661aSToomas Soome xgzseek(void *cookie,  fpos_t offset, int whence)
34*4a5d661aSToomas Soome {
35*4a5d661aSToomas Soome 	return gzseek(cookie, (z_off_t)offset, whence);
36*4a5d661aSToomas Soome }
37*4a5d661aSToomas Soome 
38*4a5d661aSToomas Soome FILE *
39*4a5d661aSToomas Soome zopen(const char *fname, const char *mode)
40*4a5d661aSToomas Soome {
41*4a5d661aSToomas Soome     gzFile gz = gzopen(fname, mode);
42*4a5d661aSToomas Soome     if(gz == NULL)
43*4a5d661aSToomas Soome 	return NULL;
44*4a5d661aSToomas Soome 
45*4a5d661aSToomas Soome     if(*mode == 'r')
46*4a5d661aSToomas Soome 	return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
47*4a5d661aSToomas Soome     else
48*4a5d661aSToomas Soome 	return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
49*4a5d661aSToomas Soome }
50