/src/haproxy/include/import/slz.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 2013-2015 Willy Tarreau <w@1wt.eu> |
3 | | * |
4 | | * Permission is hereby granted, free of charge, to any person obtaining |
5 | | * a copy of this software and associated documentation files (the |
6 | | * "Software"), to deal in the Software without restriction, including |
7 | | * without limitation the rights to use, copy, modify, merge, publish, |
8 | | * distribute, sublicense, and/or sell copies of the Software, and to |
9 | | * permit persons to whom the Software is furnished to do so, subject to |
10 | | * the following conditions: |
11 | | * |
12 | | * The above copyright notice and this permission notice shall be |
13 | | * included in all copies or substantial portions of the Software. |
14 | | * |
15 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
16 | | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
17 | | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
18 | | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
19 | | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
20 | | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
21 | | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
22 | | * OTHER DEALINGS IN THE SOFTWARE. |
23 | | */ |
24 | | |
25 | | #ifndef _SLZ_H |
26 | | #define _SLZ_H |
27 | | |
28 | | #include <inttypes.h> |
29 | | #include <stddef.h> |
30 | | |
31 | | /* |
32 | | * ============================================================================= |
33 | | * Common API |
34 | | * shared by slz and uslz APIs |
35 | | * ============================================================================= |
36 | | */ |
37 | | void slz_make_crc_table(void); /* obsolete, not needed anymore */ |
38 | | uint32_t slz_crc32_by1(uint32_t crc, const unsigned char *buf, int len); |
39 | | uint32_t slz_crc32_by4(uint32_t crc, const unsigned char *buf, int len); |
40 | | uint32_t slz_adler32_by1(uint32_t crc, const unsigned char *buf, int len); |
41 | | uint32_t slz_adler32_block(uint32_t crc, const unsigned char *buf, long len); |
42 | | |
43 | | /* |
44 | | * ============================================================================= |
45 | | * slz API (compression) |
46 | | * ============================================================================= |
47 | | */ |
48 | | |
49 | | enum slz_state { |
50 | | SLZ_ST_INIT, /* stream initialized */ |
51 | | SLZ_ST_EOB, /* header or end of block already sent */ |
52 | | SLZ_ST_FIXED, /* inside a fixed huffman sequence */ |
53 | | SLZ_ST_LAST, /* last block, BFINAL sent */ |
54 | | SLZ_ST_DONE, /* BFINAL+EOB sent BFINAL */ |
55 | | SLZ_ST_END /* end sent (BFINAL, EOB, CRC + len) */ |
56 | | }; |
57 | | |
58 | | enum { |
59 | | SLZ_FMT_NONE = 0,/* default value, this way this ensure library users storing the |
60 | | * the fmt value in a structure that is zero-initialized have no |
61 | | * FMT by default, plus they have a way to know if a fmt was |
62 | | * selected or not by comparing it with this value |
63 | | */ |
64 | | SLZ_FMT_GZIP, /* RFC1952: gzip envelope and crc32 for CRC */ |
65 | | SLZ_FMT_ZLIB, /* RFC1950: zlib envelope and adler-32 for CRC */ |
66 | | SLZ_FMT_DEFLATE, /* RFC1951: raw deflate, and no crc */ |
67 | | }; |
68 | | |
69 | | struct slz_stream { |
70 | | #if defined(__SIZEOF_LONG__) && (__SIZEOF_LONG__ - 0 > 4) |
71 | | /* Note below: the queue never contains more than 32 bits for the |
72 | | * 64-bit one, or 8 bits for the 32-bit one since contents are dumped |
73 | | * as soon as they're large enough (32b for the 64-bit one, 8b-24b for |
74 | | * the 32-bit one). |
75 | | */ |
76 | | uint64_t queue; /* last pending bits, LSB first, faster on 64-bit archs */ |
77 | | #else |
78 | | uint32_t queue; /* last pending bits, LSB first, faster on 32-bit archs */ |
79 | | #endif |
80 | | uint32_t qbits; /* number of bits in queue, < 8 on 32-bit, < 32 on 64-bit */ |
81 | | unsigned char *outbuf; /* set by encode() */ |
82 | | uint16_t state; /* one of slz_state */ |
83 | | uint8_t level:1; /* 0 = no compression, 1 = compression */ |
84 | | uint8_t format:2; /* SLZ_FMT_* */ |
85 | | uint8_t debt; /* number of bits by which the fixed huffman encoding is |
86 | | * currently behind the equivalent stored blocks, see |
87 | | * SLZ_MAX_DEBT in slz.c |
88 | | */ |
89 | | uint32_t crc32; |
90 | | uint32_t ilen; |
91 | | }; |
92 | | |
93 | | /* Functions specific to rfc1951 (deflate) */ |
94 | | void slz_prepare_dist_table(); /* obsolete, not needed anymore */ |
95 | | long slz_rfc1951_encode(struct slz_stream *strm, unsigned char *out, const unsigned char *in, long ilen, int more); |
96 | | int slz_rfc1951_init(struct slz_stream *strm, int level); |
97 | | int slz_rfc1951_flush(struct slz_stream *strm, unsigned char *buf); |
98 | | int slz_rfc1951_finish(struct slz_stream *strm, unsigned char *buf); |
99 | | |
100 | | /* Functions specific to rfc1952 (gzip) */ |
101 | | long slz_rfc1952_encode(struct slz_stream *strm, unsigned char *out, const unsigned char *in, long ilen, int more); |
102 | | int slz_rfc1952_send_header(struct slz_stream *strm, unsigned char *buf); |
103 | | int slz_rfc1952_init(struct slz_stream *strm, int level); |
104 | | int slz_rfc1952_flush(struct slz_stream *strm, unsigned char *buf); |
105 | | int slz_rfc1952_finish(struct slz_stream *strm, unsigned char *buf); |
106 | | |
107 | | /* Functions specific to rfc1950 (zlib) */ |
108 | | long slz_rfc1950_encode(struct slz_stream *strm, unsigned char *out, const unsigned char *in, long ilen, int more); |
109 | | int slz_rfc1950_send_header(struct slz_stream *strm, unsigned char *buf); |
110 | | int slz_rfc1950_init(struct slz_stream *strm, int level); |
111 | | int slz_rfc1950_flush(struct slz_stream *strm, unsigned char *buf); |
112 | | int slz_rfc1950_finish(struct slz_stream *strm, unsigned char *buf); |
113 | | |
114 | | /* generic functions */ |
115 | | |
116 | | /* Initializes stream <strm>. It will configure the stream to use format |
117 | | * <format> for the data, which must be one of SLZ_FMT_*. The compression level |
118 | | * passed in <level> is set. This value can only be 0 (no compression) or 1 |
119 | | * (compression) and other values will lead to unpredictable behaviour. The |
120 | | * function should always return 0. |
121 | | */ |
122 | | static inline int slz_init(struct slz_stream *strm, int level, int format) |
123 | 0 | { |
124 | 0 | int ret; |
125 | 0 |
|
126 | 0 | if (format == SLZ_FMT_GZIP) |
127 | 0 | ret = slz_rfc1952_init(strm, level); |
128 | 0 | else if (format == SLZ_FMT_ZLIB) |
129 | 0 | ret = slz_rfc1950_init(strm, level); |
130 | 0 | else { /* deflate for anything else */ |
131 | 0 | ret = slz_rfc1951_init(strm, level); |
132 | 0 | strm->format = format; |
133 | 0 | } |
134 | 0 | return ret; |
135 | 0 | } Unexecuted instantiation: chunk.c:slz_init Unexecuted instantiation: debug.c:slz_init Unexecuted instantiation: fd.c:slz_init Unexecuted instantiation: h1_htx.c:slz_init Unexecuted instantiation: http.c:slz_init Unexecuted instantiation: http_htx.c:slz_init Unexecuted instantiation: htx.c:slz_init Unexecuted instantiation: limits.c:slz_init Unexecuted instantiation: listener.c:slz_init Unexecuted instantiation: log.c:slz_init Unexecuted instantiation: mworker.c:slz_init Unexecuted instantiation: peers.c:slz_init Unexecuted instantiation: pool.c:slz_init Unexecuted instantiation: proto_sockpair.c:slz_init Unexecuted instantiation: protocol.c:slz_init Unexecuted instantiation: proxy.c:slz_init Unexecuted instantiation: resolvers.c:slz_init Unexecuted instantiation: ring.c:slz_init Unexecuted instantiation: sample.c:slz_init Unexecuted instantiation: server.c:slz_init Unexecuted instantiation: session.c:slz_init Unexecuted instantiation: signal.c:slz_init Unexecuted instantiation: sink.c:slz_init Unexecuted instantiation: sock.c:slz_init Unexecuted instantiation: sock_inet.c:slz_init Unexecuted instantiation: stats-proxy.c:slz_init Unexecuted instantiation: stats.c:slz_init Unexecuted instantiation: stconn.c:slz_init Unexecuted instantiation: stick_table.c:slz_init Unexecuted instantiation: stream.c:slz_init Unexecuted instantiation: sym.c:slz_init Unexecuted instantiation: systemd.c:slz_init Unexecuted instantiation: task.c:slz_init Unexecuted instantiation: tcp_rules.c:slz_init Unexecuted instantiation: tcpcheck.c:slz_init Unexecuted instantiation: thread.c:slz_init Unexecuted instantiation: tools.c:slz_init Unexecuted instantiation: trace.c:slz_init Unexecuted instantiation: twork.c:slz_init Unexecuted instantiation: uri_auth.c:slz_init Unexecuted instantiation: vars.c:slz_init Unexecuted instantiation: version.c:slz_init Unexecuted instantiation: acl.c:slz_init Unexecuted instantiation: action.c:slz_init Unexecuted instantiation: activity.c:slz_init Unexecuted instantiation: applet.c:slz_init Unexecuted instantiation: arg.c:slz_init Unexecuted instantiation: auth.c:slz_init Unexecuted instantiation: backend.c:slz_init Unexecuted instantiation: cfgparse-listen.c:slz_init Unexecuted instantiation: cfgparse.c:slz_init Unexecuted instantiation: channel.c:slz_init Unexecuted instantiation: check.c:slz_init Unexecuted instantiation: cli.c:slz_init Unexecuted instantiation: clock.c:slz_init Unexecuted instantiation: connection.c:slz_init Unexecuted instantiation: counters.c:slz_init Unexecuted instantiation: dgram.c:slz_init Unexecuted instantiation: dns.c:slz_init Unexecuted instantiation: dns_ring.c:slz_init Unexecuted instantiation: dynbuf.c:slz_init Unexecuted instantiation: errors.c:slz_init Unexecuted instantiation: event_hdl.c:slz_init Unexecuted instantiation: extcheck.c:slz_init Unexecuted instantiation: filters.c:slz_init Unexecuted instantiation: fix.c:slz_init Unexecuted instantiation: flt_bwlim.c:slz_init Unexecuted instantiation: flt_decomp.c:slz_init Unexecuted instantiation: flt_http_comp.c:slz_init Unexecuted instantiation: flt_spoe.c:slz_init Unexecuted instantiation: flt_trace.c:slz_init Unexecuted instantiation: freq_ctr.c:slz_init Unexecuted instantiation: frontend.c:slz_init Unexecuted instantiation: guid.c:slz_init Unexecuted instantiation: h1.c:slz_init Unexecuted instantiation: haterm.c:slz_init Unexecuted instantiation: http_ana.c:slz_init Unexecuted instantiation: http_ext.c:slz_init Unexecuted instantiation: http_fetch.c:slz_init Unexecuted instantiation: http_rules.c:slz_init Unexecuted instantiation: lb_chash.c:slz_init Unexecuted instantiation: lb_fas.c:slz_init Unexecuted instantiation: lb_fwlc.c:slz_init Unexecuted instantiation: lb_fwrr.c:slz_init Unexecuted instantiation: lb_map.c:slz_init Unexecuted instantiation: lb_ss.c:slz_init Unexecuted instantiation: mailers.c:slz_init Unexecuted instantiation: mqtt.c:slz_init Unexecuted instantiation: mux_spop.c:slz_init Unexecuted instantiation: pattern.c:slz_init Unexecuted instantiation: payload.c:slz_init Unexecuted instantiation: pipe.c:slz_init Unexecuted instantiation: proto_rhttp.c:slz_init Unexecuted instantiation: queue.c:slz_init Unexecuted instantiation: regex.c:slz_init Unexecuted instantiation: stats-file.c:slz_init Unexecuted instantiation: stats-html.c:slz_init Unexecuted instantiation: stats-json.c:slz_init Unexecuted instantiation: cache.c:slz_init Unexecuted instantiation: cfgcond.c:slz_init Unexecuted instantiation: cfgparse-global.c:slz_init Unexecuted instantiation: compression.c:slz_init Unexecuted instantiation: fcgi-app.c:slz_init Unexecuted instantiation: proto_tcp.c:slz_init Unexecuted instantiation: shctx.c:slz_init Unexecuted instantiation: slz.c:slz_init Unexecuted instantiation: slz_common.c:slz_init Unexecuted instantiation: uslz.c:slz_init |
136 | | |
137 | | /* Encodes the block according to the format used by the stream. This means |
138 | | * that the CRC of the input block may be computed according to the CRC32 or |
139 | | * adler-32 algorithms. The number of output bytes is returned. |
140 | | */ |
141 | | static inline long slz_encode(struct slz_stream *strm, void *out, |
142 | | const void *in, long ilen, int more) |
143 | 0 | { |
144 | 0 | long ret; |
145 | |
|
146 | 0 | if (strm->format == SLZ_FMT_GZIP) |
147 | 0 | ret = slz_rfc1952_encode(strm, (unsigned char *) out, (const unsigned char *) in, ilen, more); |
148 | 0 | else if (strm->format == SLZ_FMT_ZLIB) |
149 | 0 | ret = slz_rfc1950_encode(strm, (unsigned char *) out, (const unsigned char *) in, ilen, more); |
150 | 0 | else /* deflate for other ones */ |
151 | 0 | ret = slz_rfc1951_encode(strm, (unsigned char *) out, (const unsigned char *) in, ilen, more); |
152 | |
|
153 | 0 | return ret; |
154 | 0 | } Unexecuted instantiation: chunk.c:slz_encode Unexecuted instantiation: debug.c:slz_encode Unexecuted instantiation: fd.c:slz_encode Unexecuted instantiation: h1_htx.c:slz_encode Unexecuted instantiation: http.c:slz_encode Unexecuted instantiation: http_htx.c:slz_encode Unexecuted instantiation: htx.c:slz_encode Unexecuted instantiation: limits.c:slz_encode Unexecuted instantiation: listener.c:slz_encode Unexecuted instantiation: log.c:slz_encode Unexecuted instantiation: mworker.c:slz_encode Unexecuted instantiation: peers.c:slz_encode Unexecuted instantiation: pool.c:slz_encode Unexecuted instantiation: proto_sockpair.c:slz_encode Unexecuted instantiation: protocol.c:slz_encode Unexecuted instantiation: proxy.c:slz_encode Unexecuted instantiation: resolvers.c:slz_encode Unexecuted instantiation: ring.c:slz_encode Unexecuted instantiation: sample.c:slz_encode Unexecuted instantiation: server.c:slz_encode Unexecuted instantiation: session.c:slz_encode Unexecuted instantiation: signal.c:slz_encode Unexecuted instantiation: sink.c:slz_encode Unexecuted instantiation: sock.c:slz_encode Unexecuted instantiation: sock_inet.c:slz_encode Unexecuted instantiation: stats-proxy.c:slz_encode Unexecuted instantiation: stats.c:slz_encode Unexecuted instantiation: stconn.c:slz_encode Unexecuted instantiation: stick_table.c:slz_encode Unexecuted instantiation: stream.c:slz_encode Unexecuted instantiation: sym.c:slz_encode Unexecuted instantiation: systemd.c:slz_encode Unexecuted instantiation: task.c:slz_encode Unexecuted instantiation: tcp_rules.c:slz_encode Unexecuted instantiation: tcpcheck.c:slz_encode Unexecuted instantiation: thread.c:slz_encode Unexecuted instantiation: tools.c:slz_encode Unexecuted instantiation: trace.c:slz_encode Unexecuted instantiation: twork.c:slz_encode Unexecuted instantiation: uri_auth.c:slz_encode Unexecuted instantiation: vars.c:slz_encode Unexecuted instantiation: version.c:slz_encode Unexecuted instantiation: acl.c:slz_encode Unexecuted instantiation: action.c:slz_encode Unexecuted instantiation: activity.c:slz_encode Unexecuted instantiation: applet.c:slz_encode Unexecuted instantiation: arg.c:slz_encode Unexecuted instantiation: auth.c:slz_encode Unexecuted instantiation: backend.c:slz_encode Unexecuted instantiation: cfgparse-listen.c:slz_encode Unexecuted instantiation: cfgparse.c:slz_encode Unexecuted instantiation: channel.c:slz_encode Unexecuted instantiation: check.c:slz_encode Unexecuted instantiation: cli.c:slz_encode Unexecuted instantiation: clock.c:slz_encode Unexecuted instantiation: connection.c:slz_encode Unexecuted instantiation: counters.c:slz_encode Unexecuted instantiation: dgram.c:slz_encode Unexecuted instantiation: dns.c:slz_encode Unexecuted instantiation: dns_ring.c:slz_encode Unexecuted instantiation: dynbuf.c:slz_encode Unexecuted instantiation: errors.c:slz_encode Unexecuted instantiation: event_hdl.c:slz_encode Unexecuted instantiation: extcheck.c:slz_encode Unexecuted instantiation: filters.c:slz_encode Unexecuted instantiation: fix.c:slz_encode Unexecuted instantiation: flt_bwlim.c:slz_encode Unexecuted instantiation: flt_decomp.c:slz_encode Unexecuted instantiation: flt_http_comp.c:slz_encode Unexecuted instantiation: flt_spoe.c:slz_encode Unexecuted instantiation: flt_trace.c:slz_encode Unexecuted instantiation: freq_ctr.c:slz_encode Unexecuted instantiation: frontend.c:slz_encode Unexecuted instantiation: guid.c:slz_encode Unexecuted instantiation: h1.c:slz_encode Unexecuted instantiation: haterm.c:slz_encode Unexecuted instantiation: http_ana.c:slz_encode Unexecuted instantiation: http_ext.c:slz_encode Unexecuted instantiation: http_fetch.c:slz_encode Unexecuted instantiation: http_rules.c:slz_encode Unexecuted instantiation: lb_chash.c:slz_encode Unexecuted instantiation: lb_fas.c:slz_encode Unexecuted instantiation: lb_fwlc.c:slz_encode Unexecuted instantiation: lb_fwrr.c:slz_encode Unexecuted instantiation: lb_map.c:slz_encode Unexecuted instantiation: lb_ss.c:slz_encode Unexecuted instantiation: mailers.c:slz_encode Unexecuted instantiation: mqtt.c:slz_encode Unexecuted instantiation: mux_spop.c:slz_encode Unexecuted instantiation: pattern.c:slz_encode Unexecuted instantiation: payload.c:slz_encode Unexecuted instantiation: pipe.c:slz_encode Unexecuted instantiation: proto_rhttp.c:slz_encode Unexecuted instantiation: queue.c:slz_encode Unexecuted instantiation: regex.c:slz_encode Unexecuted instantiation: stats-file.c:slz_encode Unexecuted instantiation: stats-html.c:slz_encode Unexecuted instantiation: stats-json.c:slz_encode Unexecuted instantiation: cache.c:slz_encode Unexecuted instantiation: cfgcond.c:slz_encode Unexecuted instantiation: cfgparse-global.c:slz_encode Unexecuted instantiation: compression.c:slz_encode Unexecuted instantiation: fcgi-app.c:slz_encode Unexecuted instantiation: proto_tcp.c:slz_encode Unexecuted instantiation: shctx.c:slz_encode Unexecuted instantiation: slz.c:slz_encode Unexecuted instantiation: slz_common.c:slz_encode Unexecuted instantiation: uslz.c:slz_encode |
155 | | |
156 | | /* Flushes pending bits and sends the trailer for stream <strm> into buffer |
157 | | * <buf> if needed. When it's done, the stream state is updated to SLZ_ST_END. |
158 | | * It returns the number of bytes emitted. The trailer consists in flushing the |
159 | | * possibly pending bits from the queue, the possible EOB and the final empty |
160 | | * block, rounding to the next byte, then 4 bytes for the CRC when doing |
161 | | * zlib/gzip, then another 4 bytes for the input length for gzip. That may |
162 | | * amount to 6+4+4 = 14 bytes, that the caller must ensure are available before |
163 | | * calling the function. Note that if the initial header was never sent, it |
164 | | * will be sent first as well (up to 10 extra bytes). |
165 | | */ |
166 | | static inline int slz_finish(struct slz_stream *strm, void *buf) |
167 | 0 | { |
168 | 0 | int ret; |
169 | |
|
170 | 0 | if (strm->format == SLZ_FMT_GZIP) |
171 | 0 | ret = slz_rfc1952_finish(strm, (unsigned char *) buf); |
172 | 0 | else if (strm->format == SLZ_FMT_ZLIB) |
173 | 0 | ret = slz_rfc1950_finish(strm, (unsigned char *) buf); |
174 | 0 | else /* deflate for other ones */ |
175 | 0 | ret = slz_rfc1951_finish(strm, (unsigned char *) buf); |
176 | |
|
177 | 0 | return ret; |
178 | 0 | } Unexecuted instantiation: chunk.c:slz_finish Unexecuted instantiation: debug.c:slz_finish Unexecuted instantiation: fd.c:slz_finish Unexecuted instantiation: h1_htx.c:slz_finish Unexecuted instantiation: http.c:slz_finish Unexecuted instantiation: http_htx.c:slz_finish Unexecuted instantiation: htx.c:slz_finish Unexecuted instantiation: limits.c:slz_finish Unexecuted instantiation: listener.c:slz_finish Unexecuted instantiation: log.c:slz_finish Unexecuted instantiation: mworker.c:slz_finish Unexecuted instantiation: peers.c:slz_finish Unexecuted instantiation: pool.c:slz_finish Unexecuted instantiation: proto_sockpair.c:slz_finish Unexecuted instantiation: protocol.c:slz_finish Unexecuted instantiation: proxy.c:slz_finish Unexecuted instantiation: resolvers.c:slz_finish Unexecuted instantiation: ring.c:slz_finish Unexecuted instantiation: sample.c:slz_finish Unexecuted instantiation: server.c:slz_finish Unexecuted instantiation: session.c:slz_finish Unexecuted instantiation: signal.c:slz_finish Unexecuted instantiation: sink.c:slz_finish Unexecuted instantiation: sock.c:slz_finish Unexecuted instantiation: sock_inet.c:slz_finish Unexecuted instantiation: stats-proxy.c:slz_finish Unexecuted instantiation: stats.c:slz_finish Unexecuted instantiation: stconn.c:slz_finish Unexecuted instantiation: stick_table.c:slz_finish Unexecuted instantiation: stream.c:slz_finish Unexecuted instantiation: sym.c:slz_finish Unexecuted instantiation: systemd.c:slz_finish Unexecuted instantiation: task.c:slz_finish Unexecuted instantiation: tcp_rules.c:slz_finish Unexecuted instantiation: tcpcheck.c:slz_finish Unexecuted instantiation: thread.c:slz_finish Unexecuted instantiation: tools.c:slz_finish Unexecuted instantiation: trace.c:slz_finish Unexecuted instantiation: twork.c:slz_finish Unexecuted instantiation: uri_auth.c:slz_finish Unexecuted instantiation: vars.c:slz_finish Unexecuted instantiation: version.c:slz_finish Unexecuted instantiation: acl.c:slz_finish Unexecuted instantiation: action.c:slz_finish Unexecuted instantiation: activity.c:slz_finish Unexecuted instantiation: applet.c:slz_finish Unexecuted instantiation: arg.c:slz_finish Unexecuted instantiation: auth.c:slz_finish Unexecuted instantiation: backend.c:slz_finish Unexecuted instantiation: cfgparse-listen.c:slz_finish Unexecuted instantiation: cfgparse.c:slz_finish Unexecuted instantiation: channel.c:slz_finish Unexecuted instantiation: check.c:slz_finish Unexecuted instantiation: cli.c:slz_finish Unexecuted instantiation: clock.c:slz_finish Unexecuted instantiation: connection.c:slz_finish Unexecuted instantiation: counters.c:slz_finish Unexecuted instantiation: dgram.c:slz_finish Unexecuted instantiation: dns.c:slz_finish Unexecuted instantiation: dns_ring.c:slz_finish Unexecuted instantiation: dynbuf.c:slz_finish Unexecuted instantiation: errors.c:slz_finish Unexecuted instantiation: event_hdl.c:slz_finish Unexecuted instantiation: extcheck.c:slz_finish Unexecuted instantiation: filters.c:slz_finish Unexecuted instantiation: fix.c:slz_finish Unexecuted instantiation: flt_bwlim.c:slz_finish Unexecuted instantiation: flt_decomp.c:slz_finish Unexecuted instantiation: flt_http_comp.c:slz_finish Unexecuted instantiation: flt_spoe.c:slz_finish Unexecuted instantiation: flt_trace.c:slz_finish Unexecuted instantiation: freq_ctr.c:slz_finish Unexecuted instantiation: frontend.c:slz_finish Unexecuted instantiation: guid.c:slz_finish Unexecuted instantiation: h1.c:slz_finish Unexecuted instantiation: haterm.c:slz_finish Unexecuted instantiation: http_ana.c:slz_finish Unexecuted instantiation: http_ext.c:slz_finish Unexecuted instantiation: http_fetch.c:slz_finish Unexecuted instantiation: http_rules.c:slz_finish Unexecuted instantiation: lb_chash.c:slz_finish Unexecuted instantiation: lb_fas.c:slz_finish Unexecuted instantiation: lb_fwlc.c:slz_finish Unexecuted instantiation: lb_fwrr.c:slz_finish Unexecuted instantiation: lb_map.c:slz_finish Unexecuted instantiation: lb_ss.c:slz_finish Unexecuted instantiation: mailers.c:slz_finish Unexecuted instantiation: mqtt.c:slz_finish Unexecuted instantiation: mux_spop.c:slz_finish Unexecuted instantiation: pattern.c:slz_finish Unexecuted instantiation: payload.c:slz_finish Unexecuted instantiation: pipe.c:slz_finish Unexecuted instantiation: proto_rhttp.c:slz_finish Unexecuted instantiation: queue.c:slz_finish Unexecuted instantiation: regex.c:slz_finish Unexecuted instantiation: stats-file.c:slz_finish Unexecuted instantiation: stats-html.c:slz_finish Unexecuted instantiation: stats-json.c:slz_finish Unexecuted instantiation: cache.c:slz_finish Unexecuted instantiation: cfgcond.c:slz_finish Unexecuted instantiation: cfgparse-global.c:slz_finish Unexecuted instantiation: compression.c:slz_finish Unexecuted instantiation: fcgi-app.c:slz_finish Unexecuted instantiation: proto_tcp.c:slz_finish Unexecuted instantiation: shctx.c:slz_finish Unexecuted instantiation: slz.c:slz_finish Unexecuted instantiation: slz_common.c:slz_finish Unexecuted instantiation: uslz.c:slz_finish |
179 | | |
180 | | /* Flushes any pending data for stream <strm> into buffer <buf>, then emits an |
181 | | * empty literal block to byte-align the output, allowing to completely flush |
182 | | * the queue. Note that if the initial header was never sent, it will be sent |
183 | | * first as well (0, 2 or 10 extra bytes). This requires that the output buffer |
184 | | * still has this plus the 6 bytes needed to flush the queue, the possible EOB |
185 | | * and the (BFINAL,BTYPE) bits, plus 4 bytes for LEN+NLEN, or a total of 20 |
186 | | * bytes in the worst case. The number of bytes emitted is returned. It is |
187 | | * guaranteed that the queue is empty on return. This may cause some overhead |
188 | | * by adding needless 5-byte blocks if called to often. |
189 | | */ |
190 | | static inline int slz_flush(struct slz_stream *strm, void *buf) |
191 | 0 | { |
192 | 0 | int ret; |
193 | |
|
194 | 0 | if (strm->format == SLZ_FMT_GZIP) |
195 | 0 | ret = slz_rfc1952_flush(strm, (unsigned char *) buf); |
196 | 0 | else if (strm->format == SLZ_FMT_ZLIB) |
197 | 0 | ret = slz_rfc1950_flush(strm, (unsigned char *) buf); |
198 | 0 | else /* deflate for other ones */ |
199 | 0 | ret = slz_rfc1951_flush(strm, (unsigned char *) buf); |
200 | |
|
201 | 0 | return ret; |
202 | 0 | } Unexecuted instantiation: chunk.c:slz_flush Unexecuted instantiation: debug.c:slz_flush Unexecuted instantiation: fd.c:slz_flush Unexecuted instantiation: h1_htx.c:slz_flush Unexecuted instantiation: http.c:slz_flush Unexecuted instantiation: http_htx.c:slz_flush Unexecuted instantiation: htx.c:slz_flush Unexecuted instantiation: limits.c:slz_flush Unexecuted instantiation: listener.c:slz_flush Unexecuted instantiation: log.c:slz_flush Unexecuted instantiation: mworker.c:slz_flush Unexecuted instantiation: peers.c:slz_flush Unexecuted instantiation: pool.c:slz_flush Unexecuted instantiation: proto_sockpair.c:slz_flush Unexecuted instantiation: protocol.c:slz_flush Unexecuted instantiation: proxy.c:slz_flush Unexecuted instantiation: resolvers.c:slz_flush Unexecuted instantiation: ring.c:slz_flush Unexecuted instantiation: sample.c:slz_flush Unexecuted instantiation: server.c:slz_flush Unexecuted instantiation: session.c:slz_flush Unexecuted instantiation: signal.c:slz_flush Unexecuted instantiation: sink.c:slz_flush Unexecuted instantiation: sock.c:slz_flush Unexecuted instantiation: sock_inet.c:slz_flush Unexecuted instantiation: stats-proxy.c:slz_flush Unexecuted instantiation: stats.c:slz_flush Unexecuted instantiation: stconn.c:slz_flush Unexecuted instantiation: stick_table.c:slz_flush Unexecuted instantiation: stream.c:slz_flush Unexecuted instantiation: sym.c:slz_flush Unexecuted instantiation: systemd.c:slz_flush Unexecuted instantiation: task.c:slz_flush Unexecuted instantiation: tcp_rules.c:slz_flush Unexecuted instantiation: tcpcheck.c:slz_flush Unexecuted instantiation: thread.c:slz_flush Unexecuted instantiation: tools.c:slz_flush Unexecuted instantiation: trace.c:slz_flush Unexecuted instantiation: twork.c:slz_flush Unexecuted instantiation: uri_auth.c:slz_flush Unexecuted instantiation: vars.c:slz_flush Unexecuted instantiation: version.c:slz_flush Unexecuted instantiation: acl.c:slz_flush Unexecuted instantiation: action.c:slz_flush Unexecuted instantiation: activity.c:slz_flush Unexecuted instantiation: applet.c:slz_flush Unexecuted instantiation: arg.c:slz_flush Unexecuted instantiation: auth.c:slz_flush Unexecuted instantiation: backend.c:slz_flush Unexecuted instantiation: cfgparse-listen.c:slz_flush Unexecuted instantiation: cfgparse.c:slz_flush Unexecuted instantiation: channel.c:slz_flush Unexecuted instantiation: check.c:slz_flush Unexecuted instantiation: cli.c:slz_flush Unexecuted instantiation: clock.c:slz_flush Unexecuted instantiation: connection.c:slz_flush Unexecuted instantiation: counters.c:slz_flush Unexecuted instantiation: dgram.c:slz_flush Unexecuted instantiation: dns.c:slz_flush Unexecuted instantiation: dns_ring.c:slz_flush Unexecuted instantiation: dynbuf.c:slz_flush Unexecuted instantiation: errors.c:slz_flush Unexecuted instantiation: event_hdl.c:slz_flush Unexecuted instantiation: extcheck.c:slz_flush Unexecuted instantiation: filters.c:slz_flush Unexecuted instantiation: fix.c:slz_flush Unexecuted instantiation: flt_bwlim.c:slz_flush Unexecuted instantiation: flt_decomp.c:slz_flush Unexecuted instantiation: flt_http_comp.c:slz_flush Unexecuted instantiation: flt_spoe.c:slz_flush Unexecuted instantiation: flt_trace.c:slz_flush Unexecuted instantiation: freq_ctr.c:slz_flush Unexecuted instantiation: frontend.c:slz_flush Unexecuted instantiation: guid.c:slz_flush Unexecuted instantiation: h1.c:slz_flush Unexecuted instantiation: haterm.c:slz_flush Unexecuted instantiation: http_ana.c:slz_flush Unexecuted instantiation: http_ext.c:slz_flush Unexecuted instantiation: http_fetch.c:slz_flush Unexecuted instantiation: http_rules.c:slz_flush Unexecuted instantiation: lb_chash.c:slz_flush Unexecuted instantiation: lb_fas.c:slz_flush Unexecuted instantiation: lb_fwlc.c:slz_flush Unexecuted instantiation: lb_fwrr.c:slz_flush Unexecuted instantiation: lb_map.c:slz_flush Unexecuted instantiation: lb_ss.c:slz_flush Unexecuted instantiation: mailers.c:slz_flush Unexecuted instantiation: mqtt.c:slz_flush Unexecuted instantiation: mux_spop.c:slz_flush Unexecuted instantiation: pattern.c:slz_flush Unexecuted instantiation: payload.c:slz_flush Unexecuted instantiation: pipe.c:slz_flush Unexecuted instantiation: proto_rhttp.c:slz_flush Unexecuted instantiation: queue.c:slz_flush Unexecuted instantiation: regex.c:slz_flush Unexecuted instantiation: stats-file.c:slz_flush Unexecuted instantiation: stats-html.c:slz_flush Unexecuted instantiation: stats-json.c:slz_flush Unexecuted instantiation: cache.c:slz_flush Unexecuted instantiation: cfgcond.c:slz_flush Unexecuted instantiation: cfgparse-global.c:slz_flush Unexecuted instantiation: compression.c:slz_flush Unexecuted instantiation: fcgi-app.c:slz_flush Unexecuted instantiation: proto_tcp.c:slz_flush Unexecuted instantiation: shctx.c:slz_flush Unexecuted instantiation: slz.c:slz_flush Unexecuted instantiation: slz_common.c:slz_flush Unexecuted instantiation: uslz.c:slz_flush |
203 | | |
204 | | /* |
205 | | * ============================================================================= |
206 | | * uslz API |
207 | | * (u stands for uncompress) |
208 | | * ============================================================================= |
209 | | */ |
210 | | |
211 | | #define USLZ_FL_NONE 0x0000 |
212 | 0 | #define USLZ_FL_GZIP 0x0001 |
213 | 0 | #define USLZ_FL_ZLIB 0x0002 |
214 | 0 | #define USLZ_FL_FINAL 0x0004 /* current block is the last one. */ |
215 | 0 | #define USLZ_FL_COMPLETE 0x0008 /* last block is completely treated, marks end of the decompressed stream */ |
216 | 0 | #define USLZ_FL_EXP_GZIP 0x0010 /* caller explicitly imposed the gzip envelope */ |
217 | 0 | #define USLZ_FL_EXP_ZLIB 0x0020 /* caller explicitly imposed the zlib envelope */ |
218 | | |
219 | | |
220 | | enum uslz_stream_state { |
221 | | USLZ_ST_INITIAL = 0, /* Initial state of a new state block (must be zero). */ |
222 | | USLZ_ST_PARTIAL_HEADER, /* Waiting for a second data byte. */ |
223 | | USLZ_ST_HEADER, |
224 | | USLZ_ST_UNCOMPRESSED_LEN, |
225 | | USLZ_ST_UNCOMPRESSED_ILEN, |
226 | | USLZ_ST_UNCOMPRESSED_DATA, |
227 | | USLZ_ST_LITERAL_COUNT, |
228 | | USLZ_ST_DISTANCE_COUNT, |
229 | | USLZ_ST_CODELEN_COUNT, |
230 | | USLZ_ST_READ_CODE_LENGTHS, |
231 | | USLZ_ST_READ_LENGTHS, |
232 | | USLZ_ST_READ_LENGTHS_16, |
233 | | USLZ_ST_READ_LENGTHS_17, |
234 | | USLZ_ST_READ_LENGTHS_18, |
235 | | USLZ_ST_READ_SYMBOL, |
236 | | USLZ_ST_READ_LENGTH, |
237 | | USLZ_ST_READ_DISTANCE, |
238 | | USLZ_ST_READ_DISTANCE_RET, |
239 | | USLZ_ST_READ_DISTANCE_EXTRA, |
240 | | USLZ_ST_CHECK_CKSUM, |
241 | | }; |
242 | | |
243 | | /* decompression state */ |
244 | | struct uslz_stream { |
245 | | enum uslz_stream_state state; /* parsing state, USLZ_ST_* */ |
246 | | |
247 | | uint32_t crc; /* current crc value for the stream */ |
248 | | uint16_t flags; /* USLZ_FL_* flags */ |
249 | | unsigned int counter; /* generic counter */ |
250 | | const unsigned char *in_ptr; /* pointer to the next byte to read from |
251 | | * input buffer |
252 | | */ |
253 | | const unsigned char *in_top; /* pointer to one byte past the last byte |
254 | | * of the input buffer |
255 | | */ |
256 | | unsigned int distance; |
257 | | unsigned char *out_base; /* pointer to the beginning of the output |
258 | | * buffer |
259 | | */ |
260 | | unsigned long out_max; /* max number of bytes in ouput buffer */ |
261 | | unsigned long dec_total; /* total number of decoded bytes from stream */ |
262 | | unsigned long dec_bofs; /* offset used to read the current decoded block */ |
263 | | unsigned long dec_bsize; /* size of the current decoded block */ |
264 | | |
265 | | uint64_t bit_accum; /* bit accumulator (used by GETBITS() macro) */ |
266 | | unsigned char num_bits; /* number of bits in the accumulator */ |
267 | | |
268 | | unsigned char block_type; /* compressed block type */ |
269 | | unsigned int huff_index; /* current index for pending huffman decoding |
270 | | * attempt |
271 | | */ |
272 | | unsigned int symbol; /* symbol code currently being processed */ |
273 | | unsigned int last_value; /* last value read for length / distance table |
274 | | * construction |
275 | | */ |
276 | | unsigned int repeat_length; /* repeated string length */ |
277 | | |
278 | | unsigned int len; /* uncompressed block length */ |
279 | | unsigned int ilen; /* uncompressed block inverted length */ |
280 | | unsigned int nread; /* number of bytes copied from uncompressed block */ |
281 | | |
282 | | /* literal_table: Code-to-symbol conversion table for the alphabet used |
283 | | * for literals and length values. Elements 0 and 1 correspond to a |
284 | | * one-bit code of 0 or 1, respectively; other elements are linked |
285 | | * (directly or indirectly) from these to represent the Huffman tree. |
286 | | * The value of each element is: |
287 | | * - for terminal codes, the symbol corresponding to the code (a |
288 | | * nonnegative value); |
289 | | * - for nonterminal codes, the one's complement of the array index |
290 | | * corresponding to the code with a zero appended (the following |
291 | | * array element corresponds to the code with a one appended). |
292 | | * For an alphabet of N symbols, a Huffman tree will have N-1 non-leaf |
293 | | * nodes (including the root node, which is not represented in the |
294 | | * array). In the case of the literal/length alphabet, there are |
295 | | * normally 286 symbols; however, the default (static) Huffman table |
296 | | * uses a 288-symbol alphabet with two unused symbols, so we reserve |
297 | | * enough space for that alphabet. |
298 | | */ |
299 | | short literal_table[288*2-2]; |
300 | | union { |
301 | | /* Code-to-symbol conversion table for the alphabet used for |
302 | | * distances. This alphabet consists of 32 symbols, 2 of |
303 | | * which are unused. |
304 | | */ |
305 | | short distance_table[32*2-2]; |
306 | | /* we may need to hold up to 10 bytes to detect the format |
307 | | * (zlib/gzip/raw) before starting to decode the stream, thus |
308 | | * we use the distance table memory which is only used when we |
309 | | * start decoding. |
310 | | */ |
311 | | struct { |
312 | | unsigned char buf[10]; |
313 | | int buf_len; |
314 | | char gzip_flags; |
315 | | } hdr_detect; |
316 | | }; |
317 | | short codelen_table[19*2-2]; /* Code-to-symbol conversion table for the alphabet |
318 | | * used for code lengths. |
319 | | */ |
320 | | unsigned int literal_count; /* number of literal codes in the Huffman table |
321 | | * (HLIT in RFC 1951) |
322 | | */ |
323 | | unsigned int distance_count; /* number of distance codes in the Huffman table |
324 | | * (HDIST in RFC 1951) |
325 | | */ |
326 | | unsigned int codelen_count; /* number of codelen codes in the Huffman table |
327 | | * used for decompressing the main Huffman tables |
328 | | * (HCLEN in RFC 1951) |
329 | | */ |
330 | | unsigned char literal_len[288]; /* code length for the symbol in literal_table */ |
331 | | unsigned char distance_len[32]; /* code length for the symbol in distance table */ |
332 | | unsigned char codelen_len[19]; /* code length for the symbol in codelen table */ |
333 | | }; |
334 | | |
335 | | /* list of possible return values for uslz_decode() */ |
336 | | enum uslz_decode_ret { |
337 | | USLZ_DECODE_SUCCESS, |
338 | | USLZ_DECODE_OUT_OF_SPACE, |
339 | | USLZ_DECODE_OUT_OF_DATA, |
340 | | USLZ_DECODE_E_INVALID_ARGUMENT, |
341 | | USLZ_DECODE_E_BAD_COMP_METHOD, |
342 | | USLZ_DECODE_E_BAD_CRC, |
343 | | USLZ_DECODE_E_DICT, |
344 | | USLZ_DECODE_E_OUT_BUFFER, |
345 | | USLZ_DECODE_E_GEN_HUFF, |
346 | | USLZ_DECODE_E_DISTANCE, |
347 | | USLZ_DECODE_E_INVALID_SYMBOL, |
348 | | USLZ_DECODE_E_INVALID_STATE, |
349 | | USLZ_DECODE_E_INVALID_BLOCK_CODE, |
350 | | USLZ_DECODE_E_INVALID_DATA, |
351 | | USLZ_DECODE_E_CORRUPT, |
352 | | USLZ_DECODE_E_UNEXPECTED, |
353 | | }; |
354 | | |
355 | | int uslz_init(struct uslz_stream *strm, unsigned char *output_buffer, long output_size); |
356 | | int uslz_init_fmt(struct uslz_stream *strm, unsigned char *output_buffer, long output_size, |
357 | | int format); |
358 | | enum uslz_decode_ret uslz_decode(struct uslz_stream *state, |
359 | | const unsigned char *compressed_data, long compressed_size, |
360 | | unsigned char **decoded_data, long *decoded_size, |
361 | | long *consumed_bytes, uint32_t *crc_ret); |
362 | | |
363 | | #endif |