]> git.wh0rd.org Git - dump.git/blob - common/transformation_zlib.c
Regenerate configure.
[dump.git] / common / transformation_zlib.c
1 #include <stdio.h>
2 #include <config.h>
3
4 #ifdef HAVE_ZLIB
5 #include <zlib.h>
6 #endif /* HAVE_ZLIB */
7
8 #include "transformation.h"
9
10 /*
11  * Initialize
12  */
13 static int
14 zlib_initialize(Transformation *xform)
15 {
16         return 0;
17 }
18
19 /*
20  * Shut down.
21  */
22 static int
23 zlib_shutdown(Transformation *xform)
24 {
25         return 0;
26 }
27
28 /*
29  * Handle forks.
30  */
31 static int
32 zlib_startNewTape(Transformation *xform, struct tapebuf *bin,
33         unsigned long *destlen)
34 {
35         return 0;
36 }
37
38 /*
39  * Start slave process
40  */
41 static int
42 zlib_startDiskIOProcess(Transformation *xform)
43 {
44         return 0;
45 }
46
47 /*
48  * End slave process
49  */
50 static int
51 zlib_endDiskIOProcess(Transformation *xform)
52 {
53         if (xform != NULL) {
54                 free(xform);
55         }
56
57         return 0;
58 }
59
60 struct req {
61         ext2_loff_t dblk;
62         int count;
63 };
64
65 /*
66  * Compress a buffer.
67  */
68 static int
69 zlib_compress(Transformation *xform, struct tapebuf *tpbin,
70                 unsigned long *destlen, const char *src, int srclen)
71 {
72 #ifdef HAVE_ZLIB
73         int compresult;
74         compresult = compress2(tpbin->buf, destlen, src, srclen, xform->state.zlib.complvl);
75         return compresult == Z_OK ? 1 : 0;
76 #else
77         return 1;
78 #endif /* HAVE_ZLIB */
79 }
80
81 /*
82  * Decompress a buffer.
83  */
84 static int
85 zlib_decompress(Transformation *xform, struct tapebuf *tpbin,
86         unsigned long *destlen, const char *src, int srclen, char **reason)
87 {
88 #ifdef HAVE_ZLIB
89         int cresult;
90         cresult = uncompress(tpbin->buf, destlen, src, srclen);
91         switch (cresult) {
92                 case Z_OK:
93                         *reason = "";
94                         break;
95                 case Z_MEM_ERROR:
96                         *reason = "not enough memory";
97                         break;
98                 case Z_BUF_ERROR:
99                         *reason = "buffer too small";
100                         break;
101                 case Z_DATA_ERROR:
102                         *reason = "data error";
103                         break;
104                 default:
105                         *reason = "unknown";
106         }
107         return (cresult == Z_OK) ? 1 : 0;
108 #else
109         return 1;
110 #endif /* HAVE_ZLIB */
111 }
112
113
114 /*
115  * Factory
116  */
117 Transformation
118 *transformation_zlib_factory(int enc, int complvl)
119 {
120         Transformation *t = (Transformation *) malloc(sizeof (Transformation));
121
122         t->enc = enc;
123         t->state.zlib.complvl = complvl;
124
125         t->name = "zlib";
126         t->mandatory = 0;
127         t->initialize = &zlib_initialize;
128         t->shutdown = &zlib_shutdown;
129         t->startNewTape = &zlib_startNewTape;
130         t->startDiskIOProcess = &zlib_startDiskIOProcess;
131         t->endDiskIOProcess = &zlib_endDiskIOProcess;
132         t->compress = &zlib_compress;
133         t->decompress = &zlib_decompress;
134
135         return t;
136 }