dovecot: i_stream_create() now takes parent stream as parameter ...

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 22 05:59:02 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/85cf52f0bc64
changeset: 7032:85cf52f0bc64
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 22 05:15:51 2007 +0200
description:
i_stream_create() now takes parent stream as parameter and internally sets
abs_start_offset correctly. Added parent_start_offset which is used by
filters instead of their own internal start_offset.

diffstat:

13 files changed, 44 insertions(+), 41 deletions(-)
src/lib-mail/istream-header-filter.c          |   18 ++++++++----------
src/lib-storage/index/mbox/istream-raw-mbox.c |    8 ++++----
src/lib/istream-concat.c                      |    4 ++--
src/lib/istream-crlf.c                        |    4 ++--
src/lib/istream-data.c                        |    2 +-
src/lib/istream-file.c                        |    2 +-
src/lib/istream-internal.h                    |    5 +++--
src/lib/istream-limit.c                       |   15 +++++++--------
src/lib/istream-mmap.c                        |    3 ++-
src/lib/istream-seekable.c                    |    4 ++--
src/lib/istream-tee.c                         |    6 +++---
src/lib/istream.c                             |   10 +++++++---
src/plugins/zlib/istream-zlib.c               |    4 ++--

diffs (294 lines):

diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib-mail/istream-header-filter.c
--- a/src/lib-mail/istream-header-filter.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib-mail/istream-header-filter.c	Sat Dec 22 05:15:51 2007 +0200
@@ -13,7 +13,6 @@ struct header_filter_istream {
 	pool_t pool;
 
 	struct message_header_parser_ctx *hdr_ctx;
-	uoff_t start_offset;
 
 	const char **headers;
 	unsigned int headers_count;
@@ -288,7 +287,7 @@ static ssize_t i_stream_header_filter_re
 		return -1;
 	}
 
-	i_stream_seek(stream->parent, mstream->start_offset +
+	i_stream_seek(stream->parent, mstream->istream.parent_start_offset +
 		      stream->istream.v_offset -
 		      mstream->header_size.virtual_size +
 		      mstream->header_size.physical_size);
@@ -346,7 +345,7 @@ static void i_stream_header_filter_seek(
 	if (v_offset < mstream->header_size.virtual_size) {
 		/* seek into headers. we'll have to re-parse them, use
 		   skip_count to set the wanted position */
-		i_stream_seek(stream->parent, mstream->start_offset);
+		i_stream_seek(stream->parent, stream->parent_start_offset);
 		mstream->skip_count = v_offset;
 		mstream->cur_line = 0;
 		mstream->header_read = FALSE;
@@ -354,7 +353,8 @@ static void i_stream_header_filter_seek(
 		/* body */
 		v_offset += mstream->header_size.physical_size -
 			mstream->header_size.virtual_size;
-		i_stream_seek(stream->parent, mstream->start_offset + v_offset);
+		i_stream_seek(stream->parent,
+			      stream->parent_start_offset + v_offset);
 	}
 }
 
@@ -401,9 +401,6 @@ i_stream_create_header_filter(struct ist
 	mstream->pool = pool_alloconly_create("header filter stream", 4096);
 	mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
-	mstream->istream.parent = input;
-	i_stream_ref(mstream->istream.parent);
-
 	mstream->headers = headers_count == 0 ? NULL :
 		p_new(mstream->pool, const char *, headers_count);
 	for (i = 0; i < headers_count; i++) 
@@ -416,7 +413,6 @@ i_stream_create_header_filter(struct ist
 	mstream->exclude = (flags & HEADER_FILTER_EXCLUDE) != 0;
 	mstream->crlf = (flags & HEADER_FILTER_NO_CR) == 0;
 	mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0;
-	mstream->start_offset = input->v_offset;
 
 	mstream->istream.iostream.destroy = i_stream_header_filter_destroy;
 	mstream->istream.iostream.set_max_buffer_size =
@@ -429,5 +425,7 @@ i_stream_create_header_filter(struct ist
 
 	mstream->istream.istream.blocking = input->blocking;
 	mstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&mstream->istream, -1, 0);
-}
+
+	i_stream_ref(input);
+	return i_stream_create(&mstream->istream, input, -1);
+}
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib-storage/index/mbox/istream-raw-mbox.c
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Dec 22 05:15:51 2007 +0200
@@ -345,7 +345,7 @@ struct istream *i_stream_create_raw_mbox
 {
 	struct raw_mbox_istream *rstream;
 
-	i_stream_ref(input);
+	i_assert(input->v_offset == 0);
 
 	rstream = i_new(struct raw_mbox_istream, 1);
 
@@ -358,7 +358,6 @@ struct istream *i_stream_create_raw_mbox
 	rstream->istream.iostream.set_max_buffer_size =
 		i_stream_raw_mbox_set_max_buffer_size;
 
-	rstream->istream.parent = input;
 	rstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 	rstream->istream.read = i_stream_raw_mbox_read;
 	rstream->istream.seek = i_stream_raw_mbox_seek;
@@ -367,8 +366,9 @@ struct istream *i_stream_create_raw_mbox
 
 	rstream->istream.istream.blocking = input->blocking;
 	rstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&rstream->istream, -1,
-			       input->real_stream->abs_start_offset);
+
+	i_stream_ref(input);
+	return i_stream_create(&rstream->istream, input, -1);
 }
 
 static int istream_raw_mbox_is_valid_from(struct raw_mbox_istream *rstream)
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-concat.c
--- a/src/lib/istream-concat.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-concat.c	Sat Dec 22 05:15:51 2007 +0200
@@ -271,5 +271,5 @@ struct istream *i_stream_create_concat(s
 
 	cstream->istream.istream.blocking = blocking;
 	cstream->istream.istream.seekable = seekable;
-	return i_stream_create(&cstream->istream, -1, 0);
-}
+	return i_stream_create(&cstream->istream, NULL, -1);
+}
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-crlf.c
--- a/src/lib/istream-crlf.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-crlf.c	Sat Dec 22 05:15:51 2007 +0200
@@ -178,7 +178,6 @@ i_stream_create_crlf_full(struct istream
 	cstream->istream.iostream.set_max_buffer_size =
 		i_stream_crlf_set_max_buffer_size;
 
-	cstream->istream.parent = input;
 	cstream->istream.read = crlf ? i_stream_crlf_read_crlf :
 		i_stream_crlf_read_lf;
 	cstream->istream.seek = i_stream_crlf_seek;
@@ -186,7 +185,8 @@ i_stream_create_crlf_full(struct istream
 
 	cstream->istream.istream.blocking = input->blocking;
 	cstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&cstream->istream, i_stream_get_fd(input), 0);
+	return i_stream_create(&cstream->istream, input,
+			       i_stream_get_fd(input));
 }
 
 struct istream *i_stream_create_crlf(struct istream *input)
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-data.c
--- a/src/lib/istream-data.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-data.c	Sat Dec 22 05:15:51 2007 +0200
@@ -29,7 +29,7 @@ struct istream *i_stream_create_from_dat
 
 	stream->istream.blocking = TRUE;
 	stream->istream.seekable = TRUE;
-	(void)i_stream_create(stream, -1, 0);
+	(void)i_stream_create(stream, NULL, -1);
 	stream->statbuf.st_size = size;
 	return &stream->istream;
 }
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-file.c
--- a/src/lib/istream-file.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-file.c	Sat Dec 22 05:15:51 2007 +0200
@@ -166,5 +166,5 @@ struct istream *i_stream_create_fd(int f
 		fstream->istream.istream.seekable = TRUE;
 	}
 
-	return i_stream_create(&fstream->istream, fd, 0);
+	return i_stream_create(&fstream->istream, NULL, fd);
 }
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-internal.h
--- a/src/lib/istream-internal.h	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-internal.h	Sat Dec 22 05:15:51 2007 +0200
@@ -31,12 +31,13 @@ struct istream_private {
 	size_t skip, pos;
 
 	struct istream *parent; /* for filter streams */
+	uoff_t parent_start_offset;
+
 	string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */
 };
 
 struct istream *
-i_stream_create(struct istream_private *stream,
-		int fd, uoff_t abs_start_offset);
+i_stream_create(struct istream_private *stream, struct istream *parent, int fd);
 
 void i_stream_compress(struct istream_private *stream);
 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-limit.c
--- a/src/lib/istream-limit.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-limit.c	Sat Dec 22 05:15:51 2007 +0200
@@ -6,7 +6,7 @@ struct limit_istream {
 struct limit_istream {
 	struct istream_private istream;
 
-	uoff_t v_start_offset, v_size;
+	uoff_t v_size;
 };
 
 static void i_stream_limit_destroy(struct iostream_private *stream)
@@ -14,7 +14,8 @@ static void i_stream_limit_destroy(struc
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 
 	/* get to same position in parent stream */
-	i_stream_seek(lstream->istream.parent, lstream->v_start_offset +
+	i_stream_seek(lstream->istream.parent,
+		      lstream->istream.parent_start_offset +
 		      lstream->istream.istream.v_offset);
 	i_stream_unref(&lstream->istream.parent);
 }
@@ -43,9 +44,9 @@ static ssize_t i_stream_limit_read(struc
 	}
 
 	if (stream->parent->v_offset !=
-	    lstream->v_start_offset + stream->istream.v_offset) {
+	    lstream->istream.parent_start_offset + stream->istream.v_offset) {
 		i_stream_seek(stream->parent,
-			      lstream->v_start_offset +
+			      lstream->istream.parent_start_offset +
 			      stream->istream.v_offset);
 	}
 
@@ -113,7 +114,6 @@ struct istream *i_stream_create_limit(st
 	i_stream_ref(input);
 
 	lstream = i_new(struct limit_istream, 1);
-	lstream->v_start_offset = input->v_offset;
 	lstream->v_size = v_size;
 	lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
@@ -128,7 +128,6 @@ struct istream *i_stream_create_limit(st
 
 	lstream->istream.istream.blocking = input->blocking;
 	lstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&lstream->istream, i_stream_get_fd(input),
-			       input->real_stream->abs_start_offset +
-			       input->v_offset);
+	return i_stream_create(&lstream->istream, input,
+			       i_stream_get_fd(input));
 }
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-mmap.c
--- a/src/lib/istream-mmap.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-mmap.c	Sat Dec 22 05:15:51 2007 +0200
@@ -220,7 +220,8 @@ struct istream *i_stream_create_mmap(int
 	mstream->istream.sync = i_stream_mmap_sync;
 	mstream->istream.stat = i_stream_mmap_stat;
 
-	istream = i_stream_create(&mstream->istream, fd, start_offset);
+	mstream->istream.abs_start_offset = start_offset;
+	istream = i_stream_create(&mstream->istream, NULL, fd);
 	istream->mmaped = TRUE;
 	istream->blocking = TRUE;
 	istream->seekable = TRUE;
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-seekable.c
--- a/src/lib/istream-seekable.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-seekable.c	Sat Dec 22 05:15:51 2007 +0200
@@ -347,5 +347,5 @@ i_stream_create_seekable(struct istream 
 
 	sstream->istream.istream.blocking = blocking;
 	sstream->istream.istream.seekable = TRUE;
-	return i_stream_create(&sstream->istream, -1, 0);
-}
+	return i_stream_create(&sstream->istream, NULL, -1);
+}
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream-tee.c
--- a/src/lib/istream-tee.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-tee.c	Sat Dec 22 05:15:51 2007 +0200
@@ -206,6 +206,6 @@ struct istream *tee_i_stream_create_chil
 	tstream->next = tee->children;
 	tee->children = tstream;
 
-	return i_stream_create(&tstream->istream,
-			       i_stream_get_fd(tee->input), 0);
-}
+	return i_stream_create(&tstream->istream, NULL,
+			       i_stream_get_fd(tee->input));
+}
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/lib/istream.c
--- a/src/lib/istream.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream.c	Sat Dec 22 05:15:51 2007 +0200
@@ -341,11 +341,15 @@ i_stream_default_stat(struct istream_pri
 }
 
 struct istream *
-i_stream_create(struct istream_private *_stream,
-		int fd, uoff_t abs_start_offset)
+i_stream_create(struct istream_private *_stream, struct istream *parent, int fd)
 {
 	_stream->fd = fd;
-	_stream->abs_start_offset = abs_start_offset;
+	if (parent != NULL) {
+		_stream->parent = parent;
+		_stream->parent_start_offset = parent->v_offset;
+		_stream->abs_start_offset = parent->v_offset +
+			parent->real_stream->abs_start_offset;
+	}
 	_stream->istream.real_stream = _stream;
 
 	if (_stream->stat == NULL)
diff -r 4b51ee73ed51 -r 85cf52f0bc64 src/plugins/zlib/istream-zlib.c
--- a/src/plugins/zlib/istream-zlib.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/plugins/zlib/istream-zlib.c	Sat Dec 22 05:15:51 2007 +0200
@@ -220,5 +220,5 @@ struct istream *i_stream_create_zlib(int
 		zstream->istream.istream.seekable = TRUE;
 	}
 
-	return i_stream_create(&zstream->istream, fd, 0);
-}
+	return i_stream_create(&zstream->istream, NULL, fd);
+}


More information about the dovecot-cvs mailing list