]> git.wh0rd.org Git - dump.git/blob - common/transformation_lzo.c
Encryption (and compression as plugins) support.
[dump.git] / common / transformation_lzo.c
1 #include <stdlib.h>
2 #include <config.h>
3
4 #ifdef HAVE_LZO
5 #include <minilzo.h>
6 #endif /* HAVE_LZO */
7
8 #include "transformation.h"
9
10 /*
11  * Initialize
12  */
13 static int
14 lzo_initialize(Transformation *xform, int enc)
15 {
16 }
17
18 /*
19  * Shut down.
20  */
21 static int
22 lzo_shutdown(Transformation *xform)
23 {
24         return 0;
25 }
26
27 /*
28  * Handle forks.
29  */
30 static int
31 lzo_startNewTape(Transformation *xform, struct tapebuf *tpbin,
32         unsigned long *destlen)
33 {
34         return 0;
35 }
36
37 /*
38  * Start slave process.
39  */
40 static int
41 lzo_startDiskIOProcess(Transformation *xform)
42 {
43         return 0;
44 }
45
46 /*
47  * End slave process.
48  */
49 static int
50 lzo_endDiskIOProcess(Transformation *xform)
51 {
52         if (xform != NULL) {
53 #ifdef HAVE_LZO
54                 if (xform->state.lzo.LZO_WorkMem != NULL) {
55                         free(xform->state.lzo.LZO_WorkMem);
56                 }
57 #endif /* HAVE_LZO */
58                 free(xform);
59         }
60
61         return 0;
62 }
63
64 /*
65  * Compress a buffer.
66  */
67 static int
68 lzo_compress(Transformation *xform, struct tapebuf *tpbin,
69                 unsigned long *destlen, const char *src, int srclen, int compressed)
70 {
71 #ifdef HAVE_LZO
72         lzo_uint *worklen2 = (lzo_uint *) destlen;
73         int compresult;
74
75         compresult = lzo1x_1_compress(src, srclen, tpbin->buf, worklen2,
76                         xform->state.lzo.LZO_WorkMem);
77
78         return compresult == LZO_E_OK ? 1 : 0;
79 #else
80         return 1;
81 #endif /* HAVE_LZO */
82 }
83
84 /*
85  * Decompress a buffer.
86  */
87 static int
88 lzo_decompress(Transformation *xform, struct tapebuf *tpbin,
89                 unsigned long *destlen, const char *src, int srclen, char **reason)
90 {
91 #ifdef HAVE_LZO
92         int cresult = 0;
93         lzo_uint destlen2 = *destlen;
94         cresult = lzo1x_decompress(src, srclen, tpbin->buf, &destlen2, NULL);
95         *destlen = destlen2;
96         switch (cresult) {
97         case LZO_E_OK:
98                 *reason = "";
99                 break;
100         case LZO_E_ERROR:
101         case LZO_E_EOF_NOT_FOUND:
102                 *reason = "data error";
103                 break;
104         default:
105                 *reason = "unknown";
106         }
107
108         return (cresult == LZO_E_OK) ? 1 : 0;
109 #else
110         return 1;
111 #endif /* HAVE_LZO */
112 }
113
114 /*
115  * Factory
116  */
117 Transformation
118 *transformation_lzo_factory(int enc)
119 {
120         Transformation *t = (Transformation *) malloc(sizeof (Transformation));
121
122 #ifdef HAVE_LZO
123         t->state.lzo.LZO_WorkMem = malloc(LZO1X_1_MEM_COMPRESS);
124         if (!t->state.lzo.LZO_WorkMem)
125                 quit("couldn't allocate a compress buffer.\n");
126 #else /* HAVE_LZO */
127         t->state = NULL;
128 #endif /* HAVE_LZO */
129
130         t->name = "lzo";
131         t->mandatory = 0;
132         t->initialize = &lzo_initialize;
133         t->shutdown = &lzo_shutdown;
134         t->startNewTape = &lzo_startNewTape;
135         t->startDiskIOProcess = &lzo_startDiskIOProcess;
136         t->endDiskIOProcess = &lzo_endDiskIOProcess;
137         t->compress = &lzo_compress;
138         t->decompress = &lzo_decompress;
139
140         return t;
141 }