1 /*
2 * Copyright 2018 Jonathan Dieter <jdieter@gmail.com>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #include <stdlib.h>
28 #include <stdint.h>
29 #include <stdbool.h>
30 #include <string.h>
31 #include <zck.h>
32
33 #include "zck_private.h"
34
init(zckCtx * zck,zckComp * comp)35 static bool init(zckCtx *zck, zckComp *comp) {
36 VALIDATE_BOOL(zck);
37 ALLOCD_BOOL(zck, comp);
38
39 return true;
40 }
41
compress(zckCtx * zck,zckComp * comp,const char * src,const size_t src_size,char ** dst,size_t * dst_size,bool use_dict)42 static ssize_t compress(zckCtx *zck, zckComp *comp, const char *src,
43 const size_t src_size, char **dst, size_t *dst_size,
44 bool use_dict) {
45 VALIDATE_INT(zck);
46 ALLOCD_INT(zck, dst);
47 ALLOCD_INT(zck, src);
48 ALLOCD_INT(zck, dst_size);
49 ALLOCD_INT(zck, comp);
50
51 *dst = zmalloc(src_size);
52
53 memcpy(*dst, src, src_size);
54 *dst_size = src_size;
55
56 return *dst_size;
57 }
58
end_cchunk(zckCtx * zck,zckComp * comp,char ** dst,size_t * dst_size,bool use_dict)59 static bool end_cchunk(zckCtx *zck, zckComp *comp, char **dst, size_t *dst_size,
60 bool use_dict) {
61 VALIDATE_BOOL(zck);
62 ALLOCD_BOOL(zck, dst);
63 ALLOCD_BOOL(zck, dst_size);
64 ALLOCD_BOOL(zck, comp);
65
66 *dst = NULL;
67 *dst_size = 0;
68
69 return true;
70 }
71
decompress(zckCtx * zck,zckComp * comp,const bool use_dict)72 static bool decompress(zckCtx *zck, zckComp *comp, const bool use_dict) {
73 VALIDATE_BOOL(zck);
74 ALLOCD_BOOL(zck, comp);
75
76 char *src = comp->data;
77 size_t src_size = comp->data_size;
78 comp->data = NULL;
79 comp->data_size = 0;
80 if(!comp_add_to_dc(zck, comp, src, src_size)) {
81 free(src);
82 return false;
83 }
84 free(src);
85 return true;
86 }
87
end_dchunk(zckCtx * zck,zckComp * comp,const bool use_dict,const size_t fd_size)88 static bool end_dchunk(zckCtx *zck, zckComp *comp, const bool use_dict,
89 const size_t fd_size) {
90 VALIDATE_BOOL(zck);
91 ALLOCD_BOOL(zck, comp);
92
93 return true;
94 }
95
close(zckCtx * zck,zckComp * comp)96 static bool close(zckCtx *zck, zckComp *comp) {
97 ALLOCD_BOOL(zck, zck);
98 ALLOCD_BOOL(zck, comp);
99
100 return true;
101 }
102
103 /* Nocomp doesn't support any parameters, so return error if setting a parameter
104 * was attempted */
set_parameter(zckCtx * zck,zckComp * comp,int option,const void * value)105 static bool set_parameter(zckCtx *zck, zckComp *comp, int option,
106 const void *value) {
107 VALIDATE_BOOL(zck);
108 ALLOCD_BOOL(zck, comp);
109
110 set_error(zck, "Invalid compression parameter for ZCK_COMP_NONE");
111 return false;
112 }
113
114 /* No default parameters to set when there's no compression */
set_default_parameters(zckCtx * zck,zckComp * comp)115 static bool set_default_parameters(zckCtx *zck, zckComp *comp) {
116 VALIDATE_BOOL(zck);
117 ALLOCD_BOOL(zck, comp);
118
119 return true;
120 }
121
nocomp_setup(zckCtx * zck,zckComp * comp)122 bool nocomp_setup(zckCtx *zck, zckComp *comp) {
123 comp->init = init;
124 comp->set_parameter = set_parameter;
125 comp->compress = compress;
126 comp->end_cchunk = end_cchunk;
127 comp->decompress = decompress;
128 comp->end_dchunk = end_dchunk;
129 comp->close = close;
130 comp->type = ZCK_COMP_NONE;
131 return set_default_parameters(zck, comp);
132 }
133