{
struct mbox_istream *mstream = (struct mbox_istream *) stream;
ssize_t ret;
+ size_t pos;
uoff_t limit, old_limit;
off_t vsize_diff;
ret = i_stream_read(mstream->input);
mstream->istream.skip = 0;
- mstream->istream.buffer =
- i_stream_get_data(mstream->input, &mstream->istream.pos);
+ mstream->istream.buffer = i_stream_get_data(mstream->input, &pos);
+
+ if (pos == mstream->istream.pos)
+ ret = -1;
+ else {
+ ret = mstream->istream.pos - pos;
+ mstream->istream.pos = pos;
+ }
if (limit != old_limit)
i_stream_set_read_limit(mstream->input, old_limit);
- return mstream->istream.pos == 0 ? -1 : (ssize_t)mstream->istream.pos;
+ return ret;
}
static void _seek(struct _istream *stream, uoff_t v_offset)
ret = pread(stream->fd,
stream->w_buffer + stream->pos, size,
stream->istream.start_offset +
- stream->istream.v_offset);
+ stream->istream.v_offset +
+ (stream->pos - stream->skip));
} else {
ret = read(stream->fd,
stream->w_buffer + stream->pos, size);
{
struct file_istream *fstream = (struct file_istream *) stream;
+ i_assert(stream->skip == stream->pos);
+
if (!fstream->file)
- fstream->skip_left += count - (stream->pos - stream->skip);
+ fstream->skip_left += count;
stream->istream.v_offset += count;
stream->skip = stream->pos = 0;
}