dovecot-2.1: iostreams: Set errno to stream_errno when exiting f...

dovecot at dovecot.org dovecot at dovecot.org
Wed Feb 8 23:05:37 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/d4e7052af42a
changeset: 14076:d4e7052af42a
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Feb 08 23:05:26 2012 +0200
description:
iostreams: Set errno to stream_errno when exiting from failing functions.

diffstat:

 src/lib/istream.c |   5 ++++-
 src/lib/ostream.c |  29 +++++++++++++++++++++++------
 2 files changed, 27 insertions(+), 7 deletions(-)

diffs (122 lines):

diff -r 448c48968174 -r d4e7052af42a src/lib/istream.c
--- a/src/lib/istream.c	Wed Feb 08 22:50:20 2012 +0200
+++ b/src/lib/istream.c	Wed Feb 08 23:05:26 2012 +0200
@@ -115,8 +115,10 @@
 	size_t old_size;
 	ssize_t ret;
 
-	if (unlikely(stream->closed))
+	if (unlikely(stream->closed)) {
+		errno = stream->stream_errno;
 		return -1;
+	}
 
 	stream->eof = FALSE;
 	stream->stream_errno = 0;
@@ -135,6 +137,7 @@
 			/* error handling should be easier if we now just
 			   assume the stream is now at EOF */
 			stream->eof = TRUE;
+			errno = stream->stream_errno;
 		} else {
 			i_assert(stream->eof);
 		}
diff -r 448c48968174 -r d4e7052af42a src/lib/ostream.c
--- a/src/lib/ostream.c	Wed Feb 08 22:50:20 2012 +0200
+++ b/src/lib/ostream.c	Wed Feb 08 23:05:26 2012 +0200
@@ -88,13 +88,16 @@
 	struct ostream_private *_stream = stream->real_stream;
 	int ret = 1;
 
-	if (unlikely(stream->closed))
+	if (unlikely(stream->closed)) {
+		errno = stream->stream_errno;
 		return -1;
+	}
 
 	stream->stream_errno = 0;
 	if (unlikely((ret = _stream->flush(_stream)) < 0)) {
 		i_assert(stream->stream_errno != 0);
 		stream->last_failed_errno = stream->stream_errno;
+		errno = stream->stream_errno;
 	}
 	return ret;
 }
@@ -128,13 +131,16 @@
 {
 	struct ostream_private *_stream = stream->real_stream;
 
-	if (unlikely(stream->closed))
+	if (unlikely(stream->closed)) {
+		errno = stream->stream_errno;
 		return -1;
+	}
 
 	stream->stream_errno = 0;
 	if (unlikely(_stream->seek(_stream, offset) < 0)) {
 		i_assert(stream->stream_errno != 0);
 		stream->last_failed_errno = stream->stream_errno;
+		errno = stream->stream_errno;
 		return -1;
 	}
 	return 1;
@@ -158,8 +164,10 @@
 	size_t total_size;
 	ssize_t ret;
 
-	if (unlikely(stream->closed))
+	if (unlikely(stream->closed)) {
+		errno = stream->stream_errno;
 		return -1;
+	}
 
 	stream->stream_errno = 0;
 	for (i = 0, total_size = 0; i < iov_count; i++)
@@ -172,6 +180,7 @@
 		if (ret < 0) {
 			i_assert(stream->stream_errno != 0);
 			stream->last_failed_errno = stream->stream_errno;
+			errno = stream->stream_errno;
 		} else {
 			stream->overflow = TRUE;
 		}
@@ -190,13 +199,18 @@
 	struct ostream_private *_outstream = outstream->real_stream;
 	off_t ret;
 
-	if (unlikely(outstream->closed || instream->closed))
+	if (unlikely(outstream->closed || instream->closed)) {
+		errno = outstream->stream_errno;
 		return -1;
+	}
 
 	outstream->stream_errno = 0;
 	ret = _outstream->send_istream(_outstream, instream);
-	if (unlikely(ret < 0))
+	if (unlikely(ret < 0)) {
+		i_assert(outstream->stream_errno != 0);
+		outstream->last_failed_errno = outstream->stream_errno;
 		errno = outstream->stream_errno;
+	}
 	return ret;
 }
 
@@ -205,14 +219,17 @@
 {
 	int ret;
 
-	if (unlikely(stream->closed))
+	if (unlikely(stream->closed)) {
+		errno = stream->stream_errno;
 		return -1;
+	}
 
 	ret = stream->real_stream->write_at(stream->real_stream,
 					    data, size, offset);
 	if (unlikely(ret < 0)) {
 		i_assert(stream->stream_errno != 0);
 		stream->last_failed_errno = stream->stream_errno;
+		errno = stream->stream_errno;
 	}
 	return ret;
 }


More information about the dovecot-cvs mailing list