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