Skip to content

Commit

Permalink
lib: Changed istream.abs_start_offset to be relative start_offset
Browse files Browse the repository at this point in the history
i_stream_get_absolute_offset() walks through the stream's parents to get the
absolute offset. This allows streams to change their start_offset after
they have already created (e.g. istream-metawrap).
  • Loading branch information
sirainen authored and GitLab committed May 18, 2016
1 parent 79fff61 commit d28179f
Show file tree
Hide file tree
Showing 10 changed files with 21 additions and 20 deletions.
3 changes: 1 addition & 2 deletions src/lib-compression/istream-bzlib.c
Expand Up @@ -41,8 +41,7 @@ static void bzlib_read_error(struct bzlib_istream *zstream, const char *error)
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);
}
Expand Down
3 changes: 1 addition & 2 deletions src/lib-compression/istream-lz4.c
Expand Up @@ -40,8 +40,7 @@ static void lz4_read_error(struct lz4_istream *zstream, const char *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);
}
Expand Down
3 changes: 1 addition & 2 deletions src/lib-compression/istream-lzma.c
Expand Up @@ -43,8 +43,7 @@ static void lzma_read_error(struct lzma_istream *zstream, const char *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);
}
Expand Down
3 changes: 1 addition & 2 deletions src/lib-compression/istream-zlib.c
Expand Up @@ -58,8 +58,7 @@ static void zlib_read_error(struct zlib_istream *zstream, const char *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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/lib-fs/istream-metawrap.c
Expand Up @@ -64,7 +64,7 @@ static ssize_t i_stream_metawrap_read(struct istream_private *stream)
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);
Expand Down
3 changes: 2 additions & 1 deletion src/lib/iostream-temp.c
Expand Up @@ -296,7 +296,8 @@ struct istream *iostream_temp_finish(struct ostream **output,
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;
Expand Down
2 changes: 1 addition & 1 deletion src/lib/istream-mmap.c
Expand Up @@ -230,7 +230,7 @@ struct istream *i_stream_create_mmap(int fd, size_t block_size,
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;
Expand Down
2 changes: 1 addition & 1 deletion src/lib/istream-private.h
Expand Up @@ -25,7 +25,7 @@ struct istream_private {
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;
Expand Down
10 changes: 7 additions & 3 deletions src/lib/istream.c
Expand Up @@ -367,7 +367,12 @@ bool i_stream_is_eof(struct istream *stream)

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)
Expand Down Expand Up @@ -827,8 +832,7 @@ void i_stream_init_parent(struct istream_private *_stream,
_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;
Expand Down
10 changes: 5 additions & 5 deletions src/lib/ostream-file.c
Expand Up @@ -692,7 +692,7 @@ static int io_stream_sendfile(struct ostream_private *outstream,
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;
Expand All @@ -713,9 +713,10 @@ static int io_stream_sendfile(struct ostream_private *outstream,
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,
Expand Down Expand Up @@ -862,8 +863,7 @@ static int io_stream_copy_same_stream(struct ostream_private *outstream,
}
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
Expand Down

0 comments on commit d28179f

Please sign in to comment.