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