annotate src/lib-compression/istream-lzma.c @ 22616:629f44740f50

cassandra: Include "prepared" when logging about prepared statement queries Mainly useful for debugging/testing.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 16 Oct 2017 15:12:12 +0300
parents bf1220873408
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20829
diff changeset
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #ifdef HAVE_LZMA
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream-private.h"
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "istream-zlib.h"
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include <lzma.h>
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #define CHUNK_SIZE (1024*64)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #define LZMA_MEMORY_LIMIT (1024*1024*80)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct lzma_istream {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 struct istream_private istream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 lzma_stream strm;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 uoff_t eof_offset, stream_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 size_t high_pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct stat last_parent_statbuf;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 unsigned int log_errors:1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 unsigned int marked:1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 unsigned int strm_closed:1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 };
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 static void i_stream_lzma_close(struct iostream_private *stream,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 bool close_parent)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 struct lzma_istream *zstream = (struct lzma_istream *)stream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 if (!zstream->strm_closed) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 lzma_end(&zstream->strm);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 zstream->strm_closed = TRUE;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 if (close_parent)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 i_stream_close(zstream->istream.parent);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 static void lzma_read_error(struct lzma_istream *zstream, const char *error)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 io_stream_set_error(&zstream->istream.iostream,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 "lzma.read(%s): %s at %"PRIuUOFF_T,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 i_stream_get_name(&zstream->istream.istream), error,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 zstream->istream.abs_start_offset +
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 zstream->istream.istream.v_offset);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 if (zstream->log_errors)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 i_error("%s", zstream->istream.iostream.error);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
17059
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
52 static void lzma_stream_end(struct lzma_istream *zstream)
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
53 {
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
54 zstream->eof_offset = zstream->istream.istream.v_offset +
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
55 (zstream->istream.pos - zstream->istream.skip);
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
56 zstream->stream_size = zstream->eof_offset;
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
57 }
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
58
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 static ssize_t i_stream_lzma_read(struct istream_private *stream)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 struct lzma_istream *zstream = (struct lzma_istream *)stream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 const unsigned char *data;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 uoff_t high_offset;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 size_t size, out_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 lzma_ret ret;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 high_offset = stream->istream.v_offset + (stream->pos - stream->skip);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 if (zstream->eof_offset == high_offset) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 i_assert(zstream->high_pos == 0 ||
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 zstream->high_pos == stream->pos);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 stream->istream.eof = TRUE;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 if (stream->pos < zstream->high_pos) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 /* we're here because we seeked back within the read buffer. */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 ret = zstream->high_pos - stream->pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 stream->pos = zstream->high_pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 zstream->high_pos = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 if (zstream->eof_offset != (uoff_t)-1) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 high_offset = stream->istream.v_offset +
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 (stream->pos - stream->skip);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 i_assert(zstream->eof_offset == high_offset);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 stream->istream.eof = TRUE;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 return ret;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 zstream->high_pos = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 /* try to keep at least CHUNK_SIZE available */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 if (!zstream->marked && stream->skip > 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 /* don't try to keep anything cached if we don't
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 have a seek mark. */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 i_stream_compress(stream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 }
20245
57078d325d01 global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20242
diff changeset
98 if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 i_stream_grow_buffer(stream, CHUNK_SIZE);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 if (stream->pos == stream->buffer_size) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 if (stream->skip > 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 /* lose our buffer cache */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 i_stream_compress(stream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 if (stream->pos == stream->buffer_size)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 return -2; /* buffer full */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 if (i_stream_read_data(stream->parent, &data, &size, 0) < 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 if (stream->parent->stream_errno != 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 stream->istream.stream_errno =
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 stream->parent->stream_errno;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 } else {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 i_assert(stream->parent->eof);
17059
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
118 lzma_stream_end(zstream);
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
119 stream->istream.eof = TRUE;
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 if (size == 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 /* no more input */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 i_assert(!stream->istream.blocking);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 return 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 zstream->strm.next_in = data;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 zstream->strm.avail_in = size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 out_size = stream->buffer_size - stream->pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 zstream->strm.next_out = stream->w_buffer + stream->pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 zstream->strm.avail_out = out_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 ret = lzma_code(&zstream->strm, LZMA_RUN);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 out_size -= zstream->strm.avail_out;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 stream->pos += out_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 i_stream_skip(stream->parent, size - zstream->strm.avail_in);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 switch (ret) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 case LZMA_OK:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 break;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 case LZMA_DATA_ERROR:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 case LZMA_BUF_ERROR:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 lzma_read_error(zstream, "corrupted data");
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 stream->istream.stream_errno = EINVAL;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 case LZMA_FORMAT_ERROR:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 lzma_read_error(zstream, "wrong magic in header (not xz file?)");
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 stream->istream.stream_errno = EINVAL;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 case LZMA_OPTIONS_ERROR:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 lzma_read_error(zstream, "Unsupported xz options");
20501
6be0cfc31ba0 lib-compression: istream-zlib/lzma now differentiates between temporary errors and corruption.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20245
diff changeset
156 stream->istream.stream_errno = EIO;
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 case LZMA_MEM_ERROR:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 i_fatal_status(FATAL_OUTOFMEM, "lzma.read(%s): Out of memory",
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 i_stream_get_name(&stream->istream));
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 case LZMA_STREAM_END:
17059
fb157c79473e lzma: Reading until EOF without seeing LZMA_STREAM_END isn't an error.
Timo Sirainen <tss@iki.fi>
parents: 17028
diff changeset
162 lzma_stream_end(zstream);
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 if (out_size == 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 stream->istream.eof = TRUE;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 break;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 default:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 lzma_read_error(zstream, t_strdup_printf(
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 "lzma_code() failed with %d", ret));
20501
6be0cfc31ba0 lib-compression: istream-zlib/lzma now differentiates between temporary errors and corruption.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20245
diff changeset
171 stream->istream.stream_errno = EIO;
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 if (out_size == 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 /* read more input */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 return i_stream_lzma_read(stream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 return out_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 static void i_stream_lzma_init(struct lzma_istream *zstream)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 lzma_ret ret;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 ret = lzma_stream_decoder(&zstream->strm, LZMA_MEMORY_LIMIT,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 LZMA_CONCATENATED);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 switch (ret) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 case LZMA_OK:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 break;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 case LZMA_MEM_ERROR:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 i_fatal_status(FATAL_OUTOFMEM, "lzma: Out of memory");
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 default:
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 i_fatal("lzma_stream_decoder() failed with ret=%d", ret);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 static void i_stream_lzma_reset(struct lzma_istream *zstream)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 struct istream_private *stream = &zstream->istream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 i_stream_seek(stream->parent, stream->parent_start_offset);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 zstream->eof_offset = (uoff_t)-1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 zstream->strm.next_in = NULL;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 zstream->strm.avail_in = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 stream->parent_expected_offset = stream->parent_start_offset;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 stream->skip = stream->pos = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 stream->istream.v_offset = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 zstream->high_pos = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 lzma_end(&zstream->strm);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 i_stream_lzma_init(zstream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 static void
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 i_stream_lzma_seek(struct istream_private *stream, uoff_t v_offset, bool mark)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 struct lzma_istream *zstream = (struct lzma_istream *) stream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 uoff_t start_offset = stream->istream.v_offset - stream->skip;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 if (v_offset < start_offset) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 /* have to seek backwards */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 i_stream_lzma_reset(zstream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 start_offset = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 } else if (zstream->high_pos != 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 stream->pos = zstream->high_pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 zstream->high_pos = 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 if (v_offset <= start_offset + stream->pos) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 /* seeking backwards within what's already cached */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 stream->skip = v_offset - start_offset;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 stream->istream.v_offset = v_offset;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 zstream->high_pos = stream->pos;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 stream->pos = stream->skip;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 } else {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 /* read and cache forward */
22500
bf1220873408 lib-compression: Fix assert in i_stream_zlib_seek
Anton Yuzhaninov <citrin@citrin.ru>
parents: 21390
diff changeset
238 ssize_t ret;
20828
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20501
diff changeset
239
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 do {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 size_t avail = stream->pos - stream->skip;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 if (stream->istream.v_offset + avail >= v_offset) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 i_stream_skip(&stream->istream,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 v_offset -
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 stream->istream.v_offset);
22500
bf1220873408 lib-compression: Fix assert in i_stream_zlib_seek
Anton Yuzhaninov <citrin@citrin.ru>
parents: 21390
diff changeset
247 ret = -1;
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 break;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 i_stream_skip(&stream->istream, avail);
20828
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20501
diff changeset
252 } while ((ret = i_stream_read(&stream->istream)) > 0);
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20501
diff changeset
253 i_assert(ret == -1);
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 if (stream->istream.v_offset != v_offset) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 /* some failure, we've broken it */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (stream->istream.stream_errno != 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 i_error("lzma_istream.seek(%s) failed: %s",
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 i_stream_get_name(&stream->istream),
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 strerror(stream->istream.stream_errno));
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 i_stream_close(&stream->istream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 } else {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 /* unexpected EOF. allow it since we may just
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 want to check if there's anything.. */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 i_assert(stream->istream.eof);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 if (mark)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 zstream->marked = TRUE;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 static int
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 i_stream_lzma_stat(struct istream_private *stream, bool exact)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 struct lzma_istream *zstream = (struct lzma_istream *) stream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 const struct stat *st;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 size_t size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280
18896
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
281 if (i_stream_stat(stream->parent, exact, &st) < 0) {
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
282 stream->istream.stream_errno = stream->parent->stream_errno;
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 return -1;
18896
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
284 }
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 stream->statbuf = *st;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 /* when exact=FALSE always return the parent stat's size, even if we
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 know the exact value. this is necessary because otherwise e.g. mbox
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 code can see two different values and think that a compressed mbox
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 file keeps changing. */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 if (!exact)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 return 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 if (zstream->stream_size == (uoff_t)-1) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 uoff_t old_offset = stream->istream.v_offset;
20828
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20501
diff changeset
296 ssize_t ret;
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 do {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 size = i_stream_get_data_size(&stream->istream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 i_stream_skip(&stream->istream, size);
20828
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20501
diff changeset
301 } while ((ret = i_stream_read(&stream->istream)) > 0);
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20501
diff changeset
302 i_assert(ret == -1);
17028
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 i_stream_seek(&stream->istream, old_offset);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 if (zstream->stream_size == (uoff_t)-1)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 return -1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 stream->statbuf.st_size = zstream->stream_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 return 0;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 static void i_stream_lzma_sync(struct istream_private *stream)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 struct lzma_istream *zstream = (struct lzma_istream *) stream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 const struct stat *st;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 if (i_stream_stat(stream->parent, FALSE, &st) < 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 if (memcmp(&zstream->last_parent_statbuf,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 st, sizeof(*st)) == 0) {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 /* a compressed file doesn't change unexpectedly,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 don't clear our caches unnecessarily */
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 return;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 zstream->last_parent_statbuf = *st;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 i_stream_lzma_reset(zstream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 struct istream *i_stream_create_lzma(struct istream *input, bool log_errors)
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 {
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 struct lzma_istream *zstream;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 zstream = i_new(struct lzma_istream, 1);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 zstream->eof_offset = (uoff_t)-1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 zstream->stream_size = (uoff_t)-1;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 zstream->log_errors = log_errors;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 i_stream_lzma_init(zstream);
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 zstream->istream.iostream.close = i_stream_lzma_close;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 zstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 zstream->istream.read = i_stream_lzma_read;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 zstream->istream.seek = i_stream_lzma_seek;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 zstream->istream.stat = i_stream_lzma_stat;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 zstream->istream.sync = i_stream_lzma_sync;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 zstream->istream.istream.readable_fd = FALSE;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 zstream->istream.istream.blocking = input->blocking;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 zstream->istream.istream.seekable = input->seekable;
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 return i_stream_create(&zstream->istream, input,
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 i_stream_get_fd(input));
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 }
81e486aacbc7 lib-compression: Added support for liblzma (xz)
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 #endif