io_stream_set_error(&zstream->istream.iostream,
"bzlib.read(%s): %s at %"PRIuUOFF_T,
i_stream_get_name(&zstream->istream.istream), error,
- zstream->istream.abs_start_offset +
- zstream->istream.istream.v_offset);
+ i_stream_get_absolute_offset(&zstream->istream.istream));
if (zstream->log_errors)
i_error("%s", zstream->istream.iostream.error);
}
io_stream_set_error(&zstream->istream.iostream,
"lz4.read(%s): %s at %"PRIuUOFF_T,
i_stream_get_name(&zstream->istream.istream), error,
- zstream->istream.abs_start_offset +
- zstream->istream.istream.v_offset);
+ i_stream_get_absolute_offset(&zstream->istream.istream));
if (zstream->log_errors)
i_error("%s", zstream->istream.iostream.error);
}
io_stream_set_error(&zstream->istream.iostream,
"lzma.read(%s): %s at %"PRIuUOFF_T,
i_stream_get_name(&zstream->istream.istream), error,
- zstream->istream.abs_start_offset +
- zstream->istream.istream.v_offset);
+ i_stream_get_absolute_offset(&zstream->istream.istream));
if (zstream->log_errors)
i_error("%s", zstream->istream.iostream.error);
}
io_stream_set_error(&zstream->istream.iostream,
"zlib.read(%s): %s at %"PRIuUOFF_T,
i_stream_get_name(&zstream->istream.istream), error,
- zstream->istream.abs_start_offset +
- zstream->istream.istream.v_offset);
+ i_stream_get_absolute_offset(&zstream->istream.istream));
if (zstream->log_errors)
i_error("%s", zstream->istream.iostream.error);
}
if (ret <= 0)
return ret;
/* this stream is kind of silently skipping over the metadata */
- stream->abs_start_offset += mstream->start_offset;
+ stream->start_offset += mstream->start_offset;
mstream->in_metadata = FALSE;
if (mstream->pending_seek != 0) {
i_stream_seek(&stream->istream, mstream->pending_seek);
for_path = t_strdup_printf(" for %s", tstream->name);
if (tstream->dupstream != NULL && !tstream->dupstream->closed) {
- abs_offset = tstream->dupstream->real_stream->abs_start_offset +
+ abs_offset = i_stream_get_absolute_offset(tstream->dupstream) -
+ tstream->dupstream->v_offset +
tstream->dupstream_start_offset;
size = tstream->dupstream_offset -
tstream->dupstream_start_offset;
mstream->istream.stat = i_stream_mmap_stat;
mstream->istream.istream.readable_fd = TRUE;
- mstream->istream.abs_start_offset = start_offset;
+ mstream->istream.start_offset = start_offset;
istream = i_stream_create(&mstream->istream, NULL, fd);
istream->mmaped = TRUE;
istream->blocking = TRUE;
struct istream istream;
int fd;
- uoff_t abs_start_offset;
+ uoff_t start_offset;
struct stat statbuf;
/* added by io_add_istream() -> i_stream_set_io() */
struct io *io;
uoff_t i_stream_get_absolute_offset(struct istream *stream)
{
- return stream->real_stream->abs_start_offset + stream->v_offset;
+ uoff_t abs_offset = stream->v_offset;
+ while (stream != NULL) {
+ abs_offset += stream->real_stream->start_offset;
+ stream = stream->real_stream->parent;
+ }
+ return abs_offset;
}
static char *i_stream_next_line_finish(struct istream_private *stream, size_t i)
_stream->parent = parent;
_stream->parent_start_offset = parent->v_offset;
_stream->parent_expected_offset = parent->v_offset;
- _stream->abs_start_offset = parent->v_offset +
- parent->real_stream->abs_start_offset;
+ _stream->start_offset = parent->v_offset;
/* if parent stream is an istream-error, copy the error */
_stream->istream.stream_errno = parent->stream_errno;
_stream->istream.eof = parent->eof;
bool *sendfile_not_supported_r)
{
struct file_ostream *foutstream = (struct file_ostream *)outstream;
- uoff_t in_size, offset, send_size, v_offset;
+ uoff_t in_size, offset, send_size, v_offset, abs_start_offset;
ssize_t ret;
*sendfile_not_supported_r = FALSE;
if (o_stream_lseek(foutstream) < 0)
return -1;
- v_offset = instream->v_offset;
+ v_offset = instream->v_offset;
+ abs_start_offset = i_stream_get_absolute_offset(instream) - v_offset;
while (v_offset < in_size) {
- offset = instream->real_stream->abs_start_offset + v_offset;
+ offset = abs_start_offset + v_offset;
send_size = in_size - v_offset;
ret = safe_sendfile(foutstream->fd, in_fd, &offset,
}
i_assert(instream->v_offset <= in_size);
- in_abs_offset = instream->real_stream->abs_start_offset +
- instream->v_offset;
+ in_abs_offset = i_stream_get_absolute_offset(instream);
ret = (off_t)outstream->ostream.offset - in_abs_offset;
if (ret == 0) {
/* copying data over itself. we don't really