[evolution-data-server] Make camel_stream_write() try to write all bytes at once
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Make camel_stream_write() try to write all bytes at once
- Date: Mon, 9 Feb 2015 12:02:32 +0000 (UTC)
commit bae0c643978a67f5368b6b0e5638b97687ee443a
Author: Milan Crha <mcrha redhat com>
Date: Mon Feb 9 12:58:09 2015 +0100
Make camel_stream_write() try to write all bytes at once
The default implementation of CamelStream::write() used
g_output_stream_write() method, which could write only a partial
content, returning how many bytes had been actually written. That's
fine, but not each caller counted with this, thus for example
a CamelStreamFilter::write() failed when only partial buffer had
been written, which could cause a silent failure on message send.
Easier than taking care of the not-whole-buffer-written state
at each place of the usage is to use g_output_stream_write_all()
function instead, which fails only on errors.
This had been reported downstream as:
https://bugzilla.redhat.com/show_bug.cgi?id=1186815
camel/camel-stream.c | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
---
diff --git a/camel/camel-stream.c b/camel/camel-stream.c
index a4270f5..980c70b 100644
--- a/camel/camel-stream.c
+++ b/camel/camel-stream.c
@@ -147,20 +147,25 @@ stream_write (CamelStream *stream,
GError **error)
{
GIOStream *base_stream;
- gssize n_bytes_written = (gssize) n;
+ gssize n_bytes_written = -1;
base_stream = camel_stream_ref_base_stream (stream);
if (base_stream != NULL) {
GOutputStream *output_stream;
+ gsize n_written = 0;
output_stream = g_io_stream_get_output_stream (base_stream);
stream->eos = FALSE;
- n_bytes_written = g_output_stream_write (
- output_stream, buffer, n, cancellable, error);
+ if (g_output_stream_write_all (output_stream, buffer, n, &n_written, cancellable, error))
+ n_bytes_written = (gssize) n_written;
+ else
+ n_bytes_written = -1;
g_object_unref (base_stream);
+ } else {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot write with no base
stream"));
}
return n_bytes_written;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]