struct istream **input, *cur_input;
uoff_t *input_size;
+ unsigned int input_count;
unsigned int cur_idx, unknown_size_idx;
size_t prev_stream_left, prev_stream_skip, prev_skip;
}
if (close_parent) {
- for (i = 0; cstream->input[i] != NULL; i++)
+ for (i = 0; i < cstream->input_count; i++)
i_stream_close(cstream->input[i]);
}
}
struct concat_istream *cstream = (struct concat_istream *)stream;
unsigned int i;
- for (i = 0; cstream->input[i] != NULL; i++)
+ for (i = 0; i < cstream->input_count; i++)
i_stream_unref(&cstream->input[i]);
i_free(cstream->input);
i_free(cstream->input_size);
unsigned int i;
cstream->istream.max_buffer_size = max_size;
- for (i = 0; cstream->input[i] != NULL; i++)
+ for (i = 0; i < cstream->input_count; i++)
i_stream_set_max_buffer_size(cstream->input[i], max_size);
}
}
/* we either read something or we're at EOF */
- last_stream = cstream->input[cstream->cur_idx+1] == NULL;
+ last_stream = cstream->cur_idx+1 >= cstream->input_count;
if (ret == -1 && !last_stream) {
if (stream->pos - stream->skip >= i_stream_get_max_buffer_size(&stream->istream))
return -2;
const struct stat *st;
unsigned int i;
- for (i = 0; cstream->input[i] != NULL; i++) {
+ for (i = 0; i < cstream->input_count; i++) {
if (*v_offset == 0) {
/* seek to beginning of this stream */
break;
stream->istream.stream_errno = EINVAL;
return;
}
- cstream->cur_input = cstream->input[cstream->cur_idx];
- if (cstream->cur_input == NULL) {
+ if (cstream->cur_idx < cstream->input_count)
+ cstream->cur_input = cstream->input[cstream->cur_idx];
+ else {
/* we allow seeking to EOF, but not past it. */
if (v_offset != 0) {
io_stream_set_error(&cstream->istream.iostream,
i_assert(count != 0);
cstream = i_new(struct concat_istream, 1);
- cstream->input = i_new(struct istream *, count + 1);
- cstream->input_size = i_new(uoff_t, count + 1);
+ cstream->input_count = count;
+ cstream->input = p_memdup(default_pool, input, sizeof(*input) * count);
+ cstream->input_size = i_new(uoff_t, count);
- memcpy(cstream->input, input, sizeof(*input) * count);
cstream->cur_input = cstream->input[0];
i_stream_seek(cstream->cur_input, 0);
return !test_has_failed();
}
+static void test_istream_concat_seek_end(void)
+{
+ test_begin("istream concat seek end");
+
+ struct istream *streams[] = {
+ test_istream_create("s1"),
+ test_istream_create("s2"),
+ NULL
+ };
+ struct istream *input = i_stream_create_concat(streams);
+ i_stream_seek(input, 4);
+ test_assert(i_stream_read(input) == -1);
+ i_stream_unref(&input);
+
+ test_end();
+}
+
static void test_istream_concat_early_end(void)
{
struct istream *input, *streams[2];
} T_END;
test_end();
+ test_istream_concat_seek_end();
test_istream_concat_early_end();
}