]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fix
authorTimo Sirainen <tss@iki.fi>
Wed, 29 Oct 2003 14:54:03 +0000 (16:54 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 29 Oct 2003 14:54:03 +0000 (16:54 +0200)
--HG--
branch : HEAD

src/lib-index/mbox/istream-mbox.c
src/lib/istream-file.c

index a99a03db9800809750a14a82c1c2d3f7bb364c76..2a7995fac43e22c86932366942fc828b3af38506 100644 (file)
@@ -48,6 +48,7 @@ static ssize_t _read(struct _istream *stream)
 {
        struct mbox_istream *mstream = (struct mbox_istream *) stream;
        ssize_t ret;
+       size_t pos;
        uoff_t limit, old_limit;
        off_t vsize_diff;
 
@@ -75,12 +76,18 @@ static ssize_t _read(struct _istream *stream)
        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)
index 4e0ce7d2c1f7ecfe5387ac0acbab66633bbd55b6..5c8e6da621684efec72c87fa61a0eab9335b160f 100644 (file)
@@ -161,7 +161,8 @@ static ssize_t _read(struct _istream *stream)
                        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);
@@ -209,8 +210,10 @@ static void _skip(struct _istream *stream, uoff_t count)
 {
        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;
 }