dovecot-2.0: Simplified up istream-limit implementation.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Mar 8 15:41:05 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/d49913d2d75a
changeset: 10854:d49913d2d75a
user: Timo Sirainen <tss at iki.fi>
date: Mon Mar 08 15:29:41 2010 +0200
description:
Simplified up istream-limit implementation.
diffstat:
src/lib/istream-limit.c | 47 ++++++++++++++---------------------------------
1 files changed, 14 insertions(+), 33 deletions(-)
diffs (70 lines):
diff -r b1d5982ffd14 -r d49913d2d75a src/lib/istream-limit.c
--- a/src/lib/istream-limit.c Sat Mar 06 16:34:52 2010 +0200
+++ b/src/lib/istream-limit.c Mon Mar 08 15:29:41 2010 +0200
@@ -29,45 +29,25 @@
struct limit_istream *lstream = (struct limit_istream *) stream;
uoff_t left;
ssize_t ret;
- size_t pos;
- if (stream->istream.v_offset +
- (stream->pos - stream->skip) >= lstream->v_size) {
+ i_assert(stream->istream.v_offset +
+ (stream->pos - stream->skip) <= lstream->v_size);
+ left = lstream->v_size -
+ (stream->istream.v_offset + (stream->pos - stream->skip));
+ if (left == 0) {
stream->istream.eof = TRUE;
return -1;
}
- i_stream_seek(stream->parent, lstream->istream.parent_start_offset +
- stream->istream.v_offset);
-
- stream->pos -= stream->skip;
- stream->skip = 0;
-
- stream->buffer = i_stream_get_data(stream->parent, &pos);
- if (pos > stream->pos)
- ret = 0;
- else do {
- if ((ret = i_stream_read(stream->parent)) == -2)
- return -2;
-
- stream->istream.stream_errno = stream->parent->stream_errno;
- stream->istream.eof = stream->parent->eof;
- stream->buffer = i_stream_get_data(stream->parent, &pos);
- } while (pos <= stream->pos && ret > 0);
-
- if (lstream->v_size != (uoff_t)-1) {
- left = lstream->v_size - stream->istream.v_offset;
- if (pos >= left) {
- pos = left;
- stream->istream.eof = TRUE;
- }
+ i_stream_skip(stream->parent, stream->skip);
+ ret = i_stream_read_copy_from_parent(&stream->istream);
+ i_assert(stream->skip == 0);
+ if (ret >= (off_t)left) {
+ stream->pos -= ret - left;
+ ret = left;
+ stream->istream.eof = TRUE;
}
-
- ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
- (ret == 0 ? 0 : -1);
- stream->pos = pos;
- i_assert(ret != -1 || stream->istream.eof ||
- stream->istream.stream_errno != 0);
+ i_assert(stream->istream.v_offset + stream->pos <= lstream->v_size);
return ret;
}
@@ -78,6 +58,7 @@
i_assert(v_offset <= lstream->v_size);
+ i_stream_seek(stream->parent, stream->parent_start_offset + v_offset);
stream->istream.v_offset = v_offset;
stream->skip = stream->pos = 0;
}
More information about the dovecot-cvs
mailing list