istream.c revision 37ab3cde96bfa4bc5304c0c348fc420aec79572d
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen _io_stream_ref(&stream->real_stream->iostream);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen _io_stream_unref(&stream->real_stream->iostream);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen struct _istream *_stream = stream->real_stream;
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen _io_stream_close(&stream->real_stream->iostream);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenvoid i_stream_set_max_buffer_size(struct istream *stream, size_t max_size)
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen _io_stream_set_max_buffer_size(&stream->real_stream->iostream,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid i_stream_set_blocking(struct istream *stream, int timeout_msecs,
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen _io_stream_set_blocking(&stream->real_stream->iostream, timeout_msecs,
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen struct _istream *_stream = stream->real_stream;
7569ab8537418b7fc369265f26595b0ef9e4cb35Timo Sirainenvoid i_stream_skip(struct istream *stream, uoff_t count)
7569ab8537418b7fc369265f26595b0ef9e4cb35Timo Sirainen struct _istream *_stream = stream->real_stream;
7569ab8537418b7fc369265f26595b0ef9e4cb35Timo Sirainen /* within buffer */
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen /* have to seek forward */
798cfe56c9871262770384da1239162b3800cce1Timo Sirainen _stream->seek(_stream, stream->v_offset + count);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenvoid i_stream_seek(struct istream *stream, uoff_t v_offset)
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen struct _istream *_stream = stream->real_stream;
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen i_stream_skip(stream, v_offset - stream->v_offset);
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenuoff_t i_stream_get_size(struct istream *stream)
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen struct _istream *_stream = stream->real_stream;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenchar *i_stream_next_line(struct istream *stream)
fc8d5f0ac909cca77840538e8beef98a8d40c21cTimo Sirainen struct _istream *_stream = stream->real_stream;
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen i_error("i_stream_next_line() called for unmodifyable stream");
82f53ea81671bcc7b9bf24a34b04a4ba2752efd3Timo Sirainen /* @UNSAFE */
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen for (i = _stream->skip; i < _stream->pos; i++) {
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen ret_buf = (char *) _stream->w_buffer + _stream->skip;
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenchar *i_stream_read_next_line(struct istream *stream)
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainenconst unsigned char *i_stream_get_data(struct istream *stream, size_t *size)
adc409a7ac9689d3baf811712ad5a5432cab2d87Timo Sirainen struct _istream *_stream = stream->real_stream;
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainenunsigned char *i_stream_get_modifyable_data(struct istream *stream,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen struct _istream *_stream = stream->real_stream;
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen if (_stream->skip >= _stream->pos || _stream->w_buffer == NULL) {
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenint i_stream_read_data(struct istream *stream, const unsigned char **data,
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen /* we need more data */
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen } while (ret >= 0);
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenstruct istream *_i_stream_create(struct _istream *_stream, pool_t pool, int fd,
938835576b218f6bb9498d829cef9514f8609c6fTimo Sirainen/* gcc istream.c -o teststream liblib.a -Wall -DHAVE_CONFIG_H -DSTREAM_TEST -g */
82f53ea81671bcc7b9bf24a34b04a4ba2752efd3Timo Sirainenstatic void check_buffer(const unsigned char *data, size_t size, size_t offset)
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen for (i = 0; i < size; i++)
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen const unsigned char *data;
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen fd1 = open("teststream.1", O_RDWR | O_CREAT | O_TRUNC, 0600);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen fd2 = open("teststream.2", O_RDWR | O_CREAT | O_TRUNC, 0600);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen /* write initial data */
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen for (i = 0; i < sizeof(buf); i++)
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen /* test reading */
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen input = i_stream_create_file(fd1, default_pool, 512, FALSE);
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen i_assert(i_stream_get_size(input) == sizeof(buf));
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen i_assert(i_stream_read_data(input, &data, &size, 0) > 0);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen i_assert(i_stream_read_data(input, &data, &size, 0) > 0);
43358fffb1d9f3091fd94895e0ac4643c50e2388Timo Sirainen i_assert(i_stream_read_data(input, &data, &size, 512) == -2);
43358fffb1d9f3091fd94895e0ac4643c50e2388Timo Sirainen i_assert(i_stream_read_data(input, &data, &size, 0) > 0);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen /* test moving data */
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen output1 = o_stream_create_file(fd1, default_pool, 512, FALSE);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen output2 = o_stream_create_file(fd2, default_pool, 512, FALSE);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_stream_seek(input, 1); size = sizeof(buf)-1;
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(o_stream_send_istream(output2, input) == size);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(read(fd2, buf, sizeof(buf)) == size);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(o_stream_send_istream(output1, input) == sizeof(buf));
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen /* test moving with limits */
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen l_input = i_stream_create_limit(default_pool, input,
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(o_stream_send_istream(output1, l_input) == 512);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_stream_set_max_buffer_size(input, sizeof(buf));
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(i_stream_read_data(input, &data, &size, sizeof(buf)-1) > 0);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen /* reading within limits */
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(i_stream_read_data(l_input, &data, &size, 511) > 0);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(i_stream_read_data(l_input, &data, &size, 512) == -2);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen i_assert(i_stream_read_data(l_input, &data, &size, 0) > 0);