Lines Matching refs:zstream
30 struct lz4_istream *zstream = (struct lz4_istream *)stream;
32 buffer_free(&zstream->chunk_buf);
34 i_stream_close(zstream->istream.parent);
37 static void lz4_read_error(struct lz4_istream *zstream, const char *error)
39 io_stream_set_error(&zstream->istream.iostream,
41 i_stream_get_name(&zstream->istream.istream), error,
42 i_stream_get_absolute_offset(&zstream->istream.istream));
43 if (zstream->log_errors)
44 i_error("%s", zstream->istream.iostream.error);
47 static int i_stream_lz4_read_header(struct lz4_istream *zstream)
54 ret = i_stream_read_bytes(zstream->istream.parent, &data, &size,
57 zstream->istream.istream.stream_errno =
58 zstream->istream.parent->stream_errno;
61 if (ret == 0 && !zstream->istream.istream.eof)
66 lz4_read_error(zstream, "wrong magic in header (not lz4 file?)");
67 zstream->istream.istream.stream_errno = EINVAL;
70 zstream->max_uncompressed_chunk_size =
72 if (zstream->max_uncompressed_chunk_size > ISTREAM_LZ4_CHUNK_SIZE) {
73 lz4_read_error(zstream, t_strdup_printf(
75 zstream->max_uncompressed_chunk_size,
77 zstream->istream.istream.stream_errno = EINVAL;
80 i_stream_skip(zstream->istream.parent, sizeof(*hdr));
86 struct lz4_istream *zstream = (struct lz4_istream *)stream;
91 if (!zstream->header_read) {
92 if ((ret = i_stream_lz4_read_header(zstream)) <= 0)
94 zstream->header_read = TRUE;
97 if (zstream->chunk_left == 0) {
105 zstream->stream_size = stream->istream.v_offset +
112 zstream->chunk_size = zstream->chunk_left =
114 if (zstream->chunk_size == 0 ||
115 zstream->chunk_size > ISTREAM_LZ4_CHUNK_SIZE) {
116 lz4_read_error(zstream, t_strdup_printf(
117 "invalid lz4 chunk size: %u", zstream->chunk_size));
122 buffer_set_used_size(zstream->chunk_buf, 0);
126 while (zstream->chunk_left > 0 &&
127 (ret = i_stream_read_more(zstream->istream.parent, &data, &size)) > 0) {
128 if (size > zstream->chunk_left)
129 size = zstream->chunk_left;
130 buffer_append(zstream->chunk_buf, data, size);
131 i_stream_skip(zstream->istream.parent, size);
132 zstream->chunk_left -= size;
134 if (zstream->chunk_left > 0) {
135 if (ret == -1 && zstream->istream.parent->stream_errno == 0) {
136 lz4_read_error(zstream, "truncated lz4 chunk");
140 zstream->istream.istream.stream_errno =
141 zstream->istream.parent->stream_errno;
150 void *dest = i_stream_alloc(stream, zstream->max_uncompressed_chunk_size);
151 ret = LZ4_decompress_safe(zstream->chunk_buf->data, dest,
152 zstream->chunk_buf->used,
153 zstream->max_uncompressed_chunk_size);
154 i_assert(ret <= (int)zstream->max_uncompressed_chunk_size);
156 lz4_read_error(zstream, "corrupted lz4 chunk");
166 static void i_stream_lz4_reset(struct lz4_istream *zstream)
168 struct istream_private *stream = &zstream->istream;
171 zstream->header_read = FALSE;
172 zstream->chunk_size = zstream->chunk_left = 0;
182 struct lz4_istream *zstream = (struct lz4_istream *) stream;
187 i_stream_lz4_reset(zstream);
231 zstream->marked = TRUE;
237 struct lz4_istream *zstream = (struct lz4_istream *) stream;
254 if (zstream->stream_size == (uoff_t)-1) {
265 if (zstream->stream_size == (uoff_t)-1)
268 stream->statbuf.st_size = zstream->stream_size;
274 struct lz4_istream *zstream = (struct lz4_istream *) stream;
278 if (memcmp(&zstream->last_parent_statbuf,
284 zstream->last_parent_statbuf = *st;
286 i_stream_lz4_reset(zstream);
291 struct lz4_istream *zstream;
293 zstream = i_new(struct lz4_istream, 1);
294 zstream->stream_size = (uoff_t)-1;
295 zstream->log_errors = log_errors;
297 zstream->istream.iostream.close = i_stream_lz4_close;
298 zstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
299 zstream->istream.read = i_stream_lz4_read;
300 zstream->istream.seek = i_stream_lz4_seek;
301 zstream->istream.stat = i_stream_lz4_stat;
302 zstream->istream.sync = i_stream_lz4_sync;
304 zstream->istream.istream.readable_fd = FALSE;
305 zstream->istream.istream.blocking = input->blocking;
306 zstream->istream.istream.seekable = input->seekable;
307 zstream->chunk_buf = buffer_create_dynamic(default_pool, 1024);
309 return i_stream_create(&zstream->istream, input,