dovecot-2.2: o_stream_send_istream(): Get input stream size with...

dovecot at dovecot.org dovecot at dovecot.org
Tue Aug 28 22:41:19 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/3cba27563159
changeset: 14963:3cba27563159
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Aug 28 22:20:17 2012 +0300
description:
o_stream_send_istream(): Get input stream size with i_stream_get_size() instead of _stat().

diffstat:

 src/lib/ostream-file.c |  24 +++++++++++-------------
 1 files changed, 11 insertions(+), 13 deletions(-)

diffs (65 lines):

diff -r bb0533bca649 -r 3cba27563159 src/lib/ostream-file.c
--- a/src/lib/ostream-file.c	Tue Aug 28 22:15:57 2012 +0300
+++ b/src/lib/ostream-file.c	Tue Aug 28 22:20:17 2012 +0300
@@ -677,17 +677,15 @@
 				struct istream *instream, int in_fd)
 {
 	struct file_ostream *foutstream = (struct file_ostream *)outstream;
-	const struct stat *st;
 	uoff_t start_offset;
 	uoff_t in_size, offset, send_size, v_offset;
 	ssize_t ret;
 
-	st = i_stream_stat(instream, TRUE);
-	if (st == NULL) {
-		outstream->ostream.stream_errno = instream->stream_errno;
+	if ((ret = i_stream_get_size(instream, TRUE, &in_size)) <= 0) {
+		outstream->ostream.stream_errno = ret == 0 ? ESPIPE :
+			instream->stream_errno;
 		return -1;
 	}
-	in_size = st->st_size;
 
 	o_stream_socket_cork(foutstream);
 
@@ -815,18 +813,18 @@
 				   struct istream *instream, bool same_stream)
 {
 	struct file_ostream *foutstream = (struct file_ostream *)outstream;
-	const struct stat *st;
+	uoff_t in_size;
 	off_t in_abs_offset, ret;
 
 	if (same_stream) {
 		/* copying data within same fd. we'll have to be careful with
 		   seeks and overlapping writes. */
-		st = i_stream_stat(instream, TRUE);
-		if (st == NULL) {
-			outstream->ostream.stream_errno = instream->stream_errno;
+		if ((ret = i_stream_get_size(instream, TRUE, &in_size)) <= 0) {
+			outstream->ostream.stream_errno = ret == 0 ? ESPIPE :
+				instream->stream_errno;
 			return -1;
 		}
-		i_assert(instream->v_offset <= (uoff_t)st->st_size);
+		i_assert(instream->v_offset <= in_size);
 
 		in_abs_offset = instream->real_stream->abs_start_offset +
 			instream->v_offset;
@@ -834,13 +832,13 @@
 		if (ret == 0) {
 			/* copying data over itself. we don't really
 			   need to do that, just fake it. */
-			return st->st_size - instream->v_offset;
+			return in_size - instream->v_offset;
 		}
-		if (ret > 0 && st->st_size > ret) {
+		if (ret > 0 && in_size > (uoff_t)ret) {
 			/* overlapping */
 			i_assert(instream->seekable);
 			return io_stream_copy_backwards(outstream, instream,
-							st->st_size);
+							in_size);
 		}
 	}
 


More information about the dovecot-cvs mailing list