dovecot-2.0: Added struct istream.readable_fd, which is used to ...

dovecot at dovecot.org dovecot at dovecot.org
Sun Jun 28 04:08:50 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/622509c562e8
changeset: 9540:622509c562e8
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Jun 27 21:08:45 2009 -0400
description:
Added struct istream.readable_fd, which is used to determine if sendfile() can be used.

diffstat:

13 files changed, 17 insertions(+), 4 deletions(-)
src/lib-mail/istream-dot.c                    |    1 +
src/lib-mail/istream-header-filter.c          |    1 +
src/lib-storage/index/mbox/istream-raw-mbox.c |    1 +
src/lib/istream-concat.c                      |    1 +
src/lib/istream-crlf.c                        |    1 +
src/lib/istream-data.c                        |    1 +
src/lib/istream-file.c                        |    1 +
src/lib/istream-limit.c                       |    1 +
src/lib/istream-mmap.c                        |    1 +
src/lib/istream-seekable.c                    |    1 +
src/lib/istream.h                             |    2 ++
src/lib/ostream-file.c                        |    2 +-
src/plugins/zlib/istream-zlib.c               |    7 ++++---

diffs (148 lines):

diff -r 7e4fe0c07661 -r 622509c562e8 src/lib-mail/istream-dot.c
--- a/src/lib-mail/istream-dot.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib-mail/istream-dot.c	Sat Jun 27 21:08:45 2009 -0400
@@ -232,6 +232,7 @@ struct istream *i_stream_create_dot(stru
 	dstream->istream.read = i_stream_dot_read;
 	dstream->istream.stat = i_stream_dot_stat;
 
+	dstream->istream.istream.readable_fd = FALSE;
 	dstream->istream.istream.blocking = input->blocking;
 	dstream->istream.istream.seekable = FALSE;
 	dstream->send_last_lf = send_last_lf;
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib-mail/istream-header-filter.c
--- a/src/lib-mail/istream-header-filter.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib-mail/istream-header-filter.c	Sat Jun 27 21:08:45 2009 -0400
@@ -415,6 +415,7 @@ i_stream_create_header_filter(struct ist
 	mstream->istream.sync = i_stream_header_filter_sync;
 	mstream->istream.stat = i_stream_header_filter_stat;
 
+	mstream->istream.istream.readable_fd = FALSE;
 	mstream->istream.istream.blocking = input->blocking;
 	mstream->istream.istream.seekable = input->seekable;
 
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib-storage/index/mbox/istream-raw-mbox.c
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Jun 27 21:08:45 2009 -0400
@@ -438,6 +438,7 @@ i_stream_create_raw_mbox(struct istream 
 	rstream->istream.sync = i_stream_raw_mbox_sync;
 	rstream->istream.stat = i_stream_raw_mbox_stat;
 
+	rstream->istream.istream.readable_fd = input->readable_fd;
 	rstream->istream.istream.blocking = input->blocking;
 	rstream->istream.istream.seekable = input->seekable;
 
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-concat.c
--- a/src/lib/istream-concat.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-concat.c	Sat Jun 27 21:08:45 2009 -0400
@@ -269,6 +269,7 @@ struct istream *i_stream_create_concat(s
 	cstream->istream.seek = i_stream_concat_seek;
 	cstream->istream.stat = i_stream_concat_stat;
 
+	cstream->istream.istream.readable_fd = FALSE;
 	cstream->istream.istream.blocking = blocking;
 	cstream->istream.istream.seekable = seekable;
 	return i_stream_create(&cstream->istream, NULL, -1);
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-crlf.c
--- a/src/lib/istream-crlf.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-crlf.c	Sat Jun 27 21:08:45 2009 -0400
@@ -151,6 +151,7 @@ i_stream_create_crlf_full(struct istream
 		i_stream_crlf_read_lf;
 	cstream->istream.stat = i_stream_crlf_stat;
 
+	cstream->istream.istream.readable_fd = FALSE;
 	cstream->istream.istream.blocking = input->blocking;
 	cstream->istream.istream.seekable = FALSE;
 	return i_stream_create(&cstream->istream, input,
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-data.c
--- a/src/lib/istream-data.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-data.c	Sat Jun 27 21:08:45 2009 -0400
@@ -27,6 +27,7 @@ struct istream *i_stream_create_from_dat
 	stream->read = i_stream_data_read;
 	stream->seek = i_stream_data_seek;
 
+	stream->istream.readable_fd = FALSE;
 	stream->istream.blocking = TRUE;
 	stream->istream.seekable = TRUE;
 	(void)i_stream_create(stream, NULL, -1);
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-file.c
--- a/src/lib/istream-file.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-file.c	Sat Jun 27 21:08:45 2009 -0400
@@ -162,6 +162,7 @@ struct istream *i_stream_create_fd(int f
 		fstream->istream.istream.blocking = TRUE;
 		fstream->istream.istream.seekable = TRUE;
 	}
+	fstream->istream.istream.readable_fd = TRUE;
 
 	return i_stream_create(&fstream->istream, NULL, fd);
 }
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-limit.c
--- a/src/lib/istream-limit.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-limit.c	Sat Jun 27 21:08:45 2009 -0400
@@ -138,6 +138,7 @@ struct istream *i_stream_create_limit(st
 	lstream->istream.stat = i_stream_limit_stat;
 	lstream->istream.get_size = i_stream_limit_get_size;
 
+	lstream->istream.istream.readable_fd = input->readable_fd;
 	lstream->istream.istream.blocking = input->blocking;
 	lstream->istream.istream.seekable = input->seekable;
 	return i_stream_create(&lstream->istream, input,
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-mmap.c
--- a/src/lib/istream-mmap.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-mmap.c	Sat Jun 27 21:08:45 2009 -0400
@@ -219,6 +219,7 @@ struct istream *i_stream_create_mmap(int
 	mstream->istream.sync = i_stream_mmap_sync;
 	mstream->istream.stat = i_stream_mmap_stat;
 
+	mstream->istream.istream.readable_fd = TRUE;
 	mstream->istream.abs_start_offset = start_offset;
 	istream = i_stream_create(&mstream->istream, NULL, fd);
 	istream->mmaped = TRUE;
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream-seekable.c
--- a/src/lib/istream-seekable.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream-seekable.c	Sat Jun 27 21:08:45 2009 -0400
@@ -319,6 +319,7 @@ i_stream_create_seekable(struct istream 
 	sstream->istream.seek = i_stream_seekable_seek;
 	sstream->istream.stat = i_stream_seekable_stat;
 
+	sstream->istream.istream.readable_fd = FALSE;
 	sstream->istream.istream.blocking = blocking;
 	sstream->istream.istream.seekable = TRUE;
 	return i_stream_create(&sstream->istream, NULL, -1);
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/istream.h
--- a/src/lib/istream.h	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/istream.h	Sat Jun 27 21:08:45 2009 -0400
@@ -11,6 +11,8 @@ struct istream {
 	unsigned int mmaped:1; /* be careful when copying data */
 	unsigned int blocking:1; /* read() shouldn't return 0 */
 	unsigned int closed:1;
+	unsigned int readable_fd:1; /* fd can be read directly if necessary
+	                               (for sendfile()) */
 	unsigned int seekable:1; /* we can seek() backwards */
 	unsigned int eof:1; /* read() has reached to end of file
 	                       (but may still be data available in buffer) */
diff -r 7e4fe0c07661 -r 622509c562e8 src/lib/ostream-file.c
--- a/src/lib/ostream-file.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/lib/ostream-file.c	Sat Jun 27 21:08:45 2009 -0400
@@ -856,7 +856,7 @@ static off_t o_stream_file_send_istream(
 	off_t in_abs_offset, ret;
 	int in_fd;
 
-	in_fd = i_stream_get_fd(instream);
+	in_fd = !instream->readable_fd ? -1 : i_stream_get_fd(instream);
 
 	if (in_fd == foutstream->fd) {
 		/* copying data within same fd. we'll have to be careful with
diff -r 7e4fe0c07661 -r 622509c562e8 src/plugins/zlib/istream-zlib.c
--- a/src/plugins/zlib/istream-zlib.c	Sat Jun 27 21:06:57 2009 -0400
+++ b/src/plugins/zlib/istream-zlib.c	Sat Jun 27 21:08:45 2009 -0400
@@ -237,6 +237,7 @@ struct istream *i_stream_create_zlib(int
 		zstream->istream.istream.seekable = TRUE;
 	}
 
-	return i_stream_create(&zstream->istream, NULL, -1);
-}
-#endif
+	zstream->istream.istream.readable_fd = FALSE;
+	return i_stream_create(&zstream->istream, NULL, fd);
+}
+#endif


More information about the dovecot-cvs mailing list