istream.c revision 6449bd276af37b3e0b81a9c47ecd01f39a2cba53
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "istream-internal.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid i_stream_ref(struct istream *stream)
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _io_stream_ref(&stream->real_stream->iostream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainenvoid i_stream_unref(struct istream *stream)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _io_stream_unref(&stream->real_stream->iostream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenint i_stream_get_fd(struct istream *stream)
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen{
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen struct _istream *_stream = stream->real_stream;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return _stream->fd;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid i_stream_close(struct istream *stream)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _io_stream_close(&stream->real_stream->iostream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen stream->closed = TRUE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenvoid i_stream_set_max_buffer_size(struct istream *stream, size_t max_size)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen{
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen _io_stream_set_max_buffer_size(&stream->real_stream->iostream,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen max_size);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid i_stream_set_blocking(struct istream *stream, int timeout_msecs,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*timeout_cb)(void *), void *context)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _io_stream_set_blocking(&stream->real_stream->iostream, timeout_msecs,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen timeout_cb, context);
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen}
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainenvoid i_stream_set_start_offset(struct istream *stream, uoff_t offset)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct _istream *_stream = stream->real_stream;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen off_t diff;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_assert(stream->v_size == 0 ||
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen offset <= stream->start_offset + stream->v_size);
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen if (offset == stream->start_offset)
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen return;
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen diff = (off_t)stream->start_offset - (off_t)offset;
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen stream->start_offset = offset;
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen stream->v_offset += diff;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (stream->v_size != 0)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen stream->v_size += diff;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen if (stream->v_limit != 0)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen stream->v_limit += diff;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen /* reset buffer data */
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen _stream->skip = _stream->pos = _stream->high_pos = 0;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen}
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenvoid i_stream_set_read_limit(struct istream *stream, uoff_t v_offset)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen{
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen struct _istream *_stream = stream->real_stream;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen uoff_t max_pos;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen i_assert(stream->v_size == 0 || v_offset <= stream->v_size);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen stream->eof = FALSE;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen if (_stream->high_pos != 0) {
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen _stream->pos = _stream->high_pos;
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen _stream->high_pos = 0;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (v_offset == 0)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen stream->v_limit = stream->v_size;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen else {
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen i_assert(v_offset >= stream->v_offset);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen stream->v_limit = v_offset;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen max_pos = v_offset - stream->v_offset + _stream->skip;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (_stream->pos > max_pos) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen _stream->high_pos = _stream->pos;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen _stream->pos = max_pos;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen }
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen}
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenssize_t i_stream_read(struct istream *stream)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen{
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen struct _istream *_stream = stream->real_stream;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (stream->closed)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen return -1;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (_stream->pos < _stream->high_pos) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen /* virtual limit reached */
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen return -1;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen stream->eof = FALSE;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen return _stream->read(_stream);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen}
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenvoid i_stream_skip(struct istream *stream, uoff_t count)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen{
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen struct _istream *_stream = stream->real_stream;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen size_t data_size;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen i_assert(stream->v_size == 0 ||
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen stream->v_offset + count <= stream->v_size);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen data_size = _stream->pos - _stream->skip;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (count <= data_size) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen stream->v_offset += count;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen _stream->skip += count;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen }
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (stream->closed)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen count -= data_size;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen _stream->skip = _stream->pos;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen stream->v_offset += data_size;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (_stream->pos < _stream->high_pos) {
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen /* virtual limit reached */
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen } else {
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen _stream->skip_count(_stream, count);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen }
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen}
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenvoid i_stream_seek(struct istream *stream, uoff_t v_offset)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen{
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen struct _istream *_stream = stream->real_stream;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen i_assert(stream->v_size == 0 || v_offset <= stream->v_size);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (stream->closed)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen return;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen stream->eof = FALSE;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen _stream->high_pos = 0;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen _stream->seek(_stream, v_offset);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen}
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainenchar *i_stream_next_line(struct istream *stream)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen{
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen struct _istream *_stream = stream->real_stream;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen char *ret_buf;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen size_t i;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen i_assert(stream != NULL);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (_stream->skip >= _stream->pos) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen stream->stream_errno = 0;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen return NULL;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (_stream->w_buffer == NULL) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen i_error("i_stream_next_line() called for unmodifyable stream");
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return NULL;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen /* @UNSAFE */
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen ret_buf = NULL;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen for (i = _stream->skip; i < _stream->pos; i++) {
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (_stream->buffer[i] == 10) {
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen /* got it */
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (i > 0 && _stream->buffer[i-1] == '\r')
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen _stream->w_buffer[i-1] = '\0';
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen else
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen _stream->w_buffer[i] = '\0';
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen ret_buf = (char *) _stream->w_buffer + _stream->skip;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen i++;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen stream->v_offset += i - _stream->skip;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen _stream->skip = i;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen break;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return ret_buf;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen}
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainenchar *i_stream_read_next_line(struct istream *stream)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen{
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen char *line;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen line = i_stream_next_line(stream);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen if (line != NULL)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return line;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (i_stream_read(stream) > 0)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen line = i_stream_next_line(stream);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return line;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen}
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenconst unsigned char *i_stream_get_data(struct istream *stream, size_t *size)
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen{
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen struct _istream *_stream = stream->real_stream;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (_stream->skip >= _stream->pos) {
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen *size = 0;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return NULL;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen *size = _stream->pos - _stream->skip;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return _stream->buffer + _stream->skip;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenunsigned char *i_stream_get_modifyable_data(struct istream *stream,
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen size_t *size)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen struct _istream *_stream = stream->real_stream;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (_stream->skip >= _stream->pos || _stream->w_buffer == NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *size = 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return NULL;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *size = _stream->pos - _stream->skip;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return _stream->w_buffer + _stream->skip;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint i_stream_read_data(struct istream *stream, const unsigned char **data,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t *size, size_t threshold)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct _istream *_stream = stream->real_stream;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ssize_t ret = 0;
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen
8830fab191cab8440281eb641dfdd93974b2933bTimo Sirainen while (_stream->pos - _stream->skip <= threshold) {
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen /* we need more data */
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen ret = i_stream_read(stream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ret < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
92888ef30960c30ccc9e030fe7eab5d4d04a7d1cTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
92888ef30960c30ccc9e030fe7eab5d4d04a7d1cTimo Sirainen *data = i_stream_get_data(stream, size);
92888ef30960c30ccc9e030fe7eab5d4d04a7d1cTimo Sirainen return *size > threshold ? 1 :
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret == -2 ? -2 :
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *size > 0 ? 0 : -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainenstruct istream *_i_stream_create(struct _istream *_stream, pool_t pool, int fd,
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen uoff_t start_offset, uoff_t v_size)
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen{
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen _stream->fd = fd;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen _stream->istream.start_offset = start_offset;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen _stream->istream.v_size = v_size;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen _stream->istream.v_limit = v_size;
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen _stream->istream.real_stream = _stream;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen _io_stream_init(pool, &_stream->iostream);
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen return &_stream->istream;
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen}
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen