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