dovecot: Added last_failed_errno to ostream to make error handli...

dovecot at dovecot.org dovecot at dovecot.org
Sat Nov 24 06:51:31 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/c8f6eec5e996
changeset: 6850:c8f6eec5e996
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Nov 24 06:51:27 2007 +0200
description:
Added last_failed_errno to ostream to make error handling easier with files.

diffstat:

2 files changed, 24 insertions(+), 4 deletions(-)
src/lib/ostream.c |   23 +++++++++++++++++++----
src/lib/ostream.h |    5 +++++

diffs (68 lines):

diff -r e722bcdd426e -r c8f6eec5e996 src/lib/ostream.c
--- a/src/lib/ostream.c	Sat Nov 24 06:43:49 2007 +0200
+++ b/src/lib/ostream.c	Sat Nov 24 06:51:27 2007 +0200
@@ -74,12 +74,17 @@ int o_stream_flush(struct ostream *strea
 int o_stream_flush(struct ostream *stream)
 {
 	struct ostream_private *_stream = stream->real_stream;
+	int ret;
 
 	if (unlikely(stream->closed))
 		return -1;
 
 	stream->stream_errno = 0;
-	return _stream->flush(_stream);
+	if (unlikely((ret = _stream->flush(_stream)) < 0)) {
+		i_assert(stream->stream_errno != 0);
+		stream->last_failed_errno = stream->stream_errno;
+	}
+	return ret;
 }
 
 void o_stream_set_flush_pending(struct ostream *stream, bool set)
@@ -107,7 +112,11 @@ int o_stream_seek(struct ostream *stream
 		return -1;
 
 	stream->stream_errno = 0;
-	return _stream->seek(_stream, offset);
+	if (unlikely(_stream->seek(_stream, offset) < 0)) {
+		i_assert(stream->stream_errno != 0);
+		stream->last_failed_errno = stream->stream_errno;
+	}
+	return 1;
 }
 
 ssize_t o_stream_send(struct ostream *stream, const void *data, size_t size)
@@ -136,8 +145,14 @@ ssize_t o_stream_sendv(struct ostream *s
 		total_size += iov[i].iov_len;
 
 	ret = _stream->sendv(_stream, iov, iov_count);
-	if (unlikely(ret != (ssize_t)total_size))
-		stream->overflow = TRUE;
+	if (unlikely(ret != (ssize_t)total_size)) {
+		if (ret < 0) {
+			i_assert(stream->stream_errno != 0);
+			stream->last_failed_errno = stream->stream_errno;
+		} else {
+			stream->overflow = TRUE;
+		}
+	}
 	return ret;
 }
 
diff -r e722bcdd426e -r c8f6eec5e996 src/lib/ostream.h
--- a/src/lib/ostream.h	Sat Nov 24 06:43:49 2007 +0200
+++ b/src/lib/ostream.h	Sat Nov 24 06:51:27 2007 +0200
@@ -6,7 +6,12 @@ struct ostream {
 struct ostream {
 	uoff_t offset;
 
+	/* errno for the last operation send/seek operation. cleared before
+	   each call. */
 	int stream_errno;
+	/* errno of the last failed send/seek. never cleared. */
+	int last_failed_errno;
+
 	/* overflow is set when some of the data given to send()
 	   functions was neither sent nor buffered. It's never unset inside
 	   ostream code. */


More information about the dovecot-cvs mailing list