]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Changed istream.abs_start_offset to be relative start_offset
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 18 May 2016 19:36:57 +0000 (22:36 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 18 May 2016 22:25:40 +0000 (01:25 +0300)
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).

src/lib-compression/istream-bzlib.c
src/lib-compression/istream-lz4.c
src/lib-compression/istream-lzma.c
src/lib-compression/istream-zlib.c
src/lib-fs/istream-metawrap.c
src/lib/iostream-temp.c
src/lib/istream-mmap.c
src/lib/istream-private.h
src/lib/istream.c
src/lib/ostream-file.c

index 5d1aabfb040f2fcda6e2e33999c943d0965ada77..20b2ca7a7f8ac02082d58c8930d6418e95bd021f 100644 (file)
@@ -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);
 }
index b5ce92dcb9725fb7a99b4b0990f901e78578528f..b7e072b9801be0d02b48011a835636b11933e736 100644 (file)
@@ -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);
 }
index bf6d5b344ed8a31707fb12ecbf5523de311a79c6..ed17d6db942b7c51c4470713c58b808b00a83769 100644 (file)
@@ -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);
 }
index cb2c76ecaf410b294caf6d0d8afc741f9af2dfb7..c92fe1d36b7ef9661cb1c8a9bf76be484c2f691d 100644 (file)
@@ -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);
 }
index d757f51a43b9967b0abfd4a1e9c8114e43141179..fc9624542592c6c1c3d7bc5e098e0a0ef9ebe14e 100644 (file)
@@ -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);
index 779c4481c491ea850f7ba068ac53d89529ce88e9..2b2462ffee8f374d646c2ffaa553519667cd1176 100644 (file)
@@ -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;
index de4ddeb2ad09d67f9a905878de22da90657dc93c..7e1e1ab1308a7631a16b88a1da3fc713f89cdbab 100644 (file)
@@ -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;
index c6b69d5754134683f5848d986af47cd9f955f6e3..0fceda027356e42d8ffd0ff4ecd2fc7068ce0773 100644 (file)
@@ -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;
index bcbb027386408f8396638b8a4445de5b5beba724..9b66f79af82fe37edd15919a72073a3838754500 100644 (file)
@@ -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)
@@ -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;
index c77742ac5ff1f81dce0e71fd25db77d736f38fc1..51658c97dc83e6a628b77a15eea560739aa03543 100644 (file)
@@ -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;
@@ -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,
@@ -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