istream-concat.c revision 5a0ac2e5ef482016e00575a7dce83f52c1704732
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstatic void i_stream_concat_close(struct iostream_private *stream)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct concat_istream *cstream = (struct concat_istream *)stream;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int i;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstatic void i_stream_concat_destroy(struct iostream_private *stream)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct concat_istream *cstream = (struct concat_istream *)stream;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int i;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Siraineni_stream_concat_set_max_buffer_size(struct iostream_private *stream,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct concat_istream *cstream = (struct concat_istream *)stream;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int i;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen i_stream_set_max_buffer_size(cstream->input[i], max_size);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainenstatic void i_stream_concat_read_next(struct concat_istream *cstream)
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen const unsigned char *data;
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen data = i_stream_get_data(cstream->cur_input, &data_size);
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen cstream->cur_input = cstream->input[cstream->cur_idx];
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen if (cstream->prev_stream_left > 0 || cstream->istream.pos == 0) {
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen cstream->istream.pos - cstream->istream.skip);
73e19ec2d5069ea125dcd1ede5d8a70f701fd9a8Timo Sirainen /* we already verified that the data size is less than the
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen maximum buffer size */
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen if (!i_stream_get_buffer_space(&cstream->istream, data_size, &size))
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen memcpy(cstream->istream.w_buffer, data, data_size);
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainenstatic ssize_t i_stream_concat_read(struct istream_private *stream)
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen struct concat_istream *cstream = (struct concat_istream *)stream;
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen const unsigned char *data;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen bytes_skipped = stream->skip - cstream->prev_skip;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen /* no need to worry about buffers, skip everything */
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen } else if (bytes_skipped < cstream->prev_stream_left) {
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen /* we're still skipping inside buffer */
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen /* done with the buffer */
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen i_stream_skip(cstream->cur_input, bytes_skipped);
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen cur_pos = stream->pos - stream->skip - cstream->prev_stream_left;
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen data = i_stream_get_data(cstream->cur_input, &pos);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen /* need to read more */
dd93aba1901a457346990f49c54a738947dc7128Timo Sirainen if (ret == -1 && stream->istream.stream_errno != 0) {
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen /* we either read something or we're at EOF */
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen last_stream = cstream->input[cstream->cur_idx+1] == NULL;
08aea01ef9a9d20703e0fcf8618e6195c0037a44Timo Sirainen stream->istream.eof = cstream->cur_input->eof && last_stream;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen data = i_stream_get_data(cstream->cur_input, &pos);
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen if (!i_stream_get_buffer_space(stream, pos - cur_pos, &size))
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen pos += stream->skip + cstream->prev_stream_left;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstatic unsigned int
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenfind_v_offset(struct concat_istream *cstream, uoff_t *v_offset)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int i;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* seek to beginning of this stream */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* we'll need to figure out this stream's size */
static const struct stat *
unsigned int count;