]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libz/zopen.c
zonectl(8): Fix a few issues reported by mandoc
[FreeBSD/FreeBSD.git] / lib / libz / zopen.c
1 /*
2  * Public domain stdio wrapper for libz, written by Johan Danielsson.
3  */
4
5 #include <sys/cdefs.h>
6 __FBSDID("$FreeBSD$");
7
8 #include <stdio.h>
9 #include <zlib.h>
10
11 FILE *zopen(const char *fname, const char *mode);
12 FILE *zdopen(int fd, const char *mode);
13
14 /* convert arguments */
15 static int
16 xgzread(void *cookie, char *data, int size)
17 {
18     return gzread(cookie, data, size);
19 }
20
21 static int
22 xgzwrite(void *cookie, const char *data, int size)
23 {
24     return gzwrite(cookie, (void*)data, size);
25 }
26
27 static int
28 xgzclose(void *cookie)
29 {
30     return gzclose(cookie);
31 }
32
33 static fpos_t
34 xgzseek(void *cookie,  fpos_t offset, int whence)
35 {
36         return gzseek(cookie, (z_off_t)offset, whence);
37 }
38
39 FILE *
40 zopen(const char *fname, const char *mode)
41 {
42     gzFile gz = gzopen(fname, mode);
43     if(gz == NULL)
44         return NULL;
45
46     if(*mode == 'r')
47         return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
48     else
49         return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
50 }
51
52 FILE *
53 zdopen(int fd, const char *mode)
54 {
55         gzFile gz;
56
57         gz = gzdopen(fd, mode);
58         if (gz == NULL)
59                 return (NULL);
60
61         if (*mode == 'r')
62                 return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
63         else
64                 return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
65 }