Blob Blame History Raw
diff -up evolution-data-server-3.12.11/camel/camel-network-service.c.smtp-timeout-change evolution-data-server-3.12.11/camel/camel-network-service.c
--- evolution-data-server-3.12.11/camel/camel-network-service.c.smtp-timeout-change	2015-01-12 14:23:00.000000000 +0100
+++ evolution-data-server-3.12.11/camel/camel-network-service.c	2015-05-28 11:29:50.007493148 +0200
@@ -659,8 +659,10 @@ network_service_connect_sync (CamelNetwo
 		GSocket *socket;
 
 		socket = g_socket_connection_get_socket (connection);
-		if (socket)
+		if (socket) {
 			g_socket_set_timeout (socket, 90);
+			g_socket_set_keepalive (socket, TRUE);
+		}
 	}
 
 	return (connection != NULL) ? G_IO_STREAM (connection) : NULL;
diff -up evolution-data-server-3.12.11/camel/camel-stream.c.smtp-timeout-change evolution-data-server-3.12.11/camel/camel-stream.c
--- evolution-data-server-3.12.11/camel/camel-stream.c.smtp-timeout-change	2015-05-28 11:30:32.653491341 +0200
+++ evolution-data-server-3.12.11/camel/camel-stream.c	2015-05-28 11:30:37.965491116 +0200
@@ -149,20 +149,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;
diff -up evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c.smtp-timeout-change evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c
--- evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c.smtp-timeout-change	2014-10-14 15:32:01.000000000 +0200
+++ evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c	2015-05-28 11:29:50.007493148 +0200
@@ -1444,6 +1444,36 @@ smtp_rcpt (CamelSmtpTransport *transport
 	return TRUE;
 }
 
+static void
+smtp_maybe_update_socket_timeout (CamelStream *strm,
+				  gint timeout_seconds)
+{
+	GIOStream *base_strm = camel_stream_ref_base_stream (strm);
+
+	if (G_IS_TLS_CONNECTION (base_strm)) {
+		GIOStream *base_io_stream = NULL;
+
+		g_object_get (G_OBJECT (base_strm), "base-io-stream", &base_io_stream, NULL);
+
+		g_object_unref (base_strm);
+		base_strm = base_io_stream;
+	} else if (base_strm) {
+		g_object_ref (base_strm);
+	}
+
+	if (G_IS_SOCKET_CONNECTION (base_strm)) {
+		GSocket *socket;
+
+		socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (base_strm));
+		if (socket) {
+			if (timeout_seconds > g_socket_get_timeout (socket))
+				g_socket_set_timeout (socket, timeout_seconds);
+		}
+	}
+
+	g_clear_object (&base_strm);
+}
+
 static gboolean
 smtp_data (CamelSmtpTransport *transport,
            CamelMimeMessage *message,
@@ -1532,6 +1562,9 @@ smtp_data (CamelSmtpTransport *transport
 		CAMEL_DATA_WRAPPER (message),
 		CAMEL_STREAM (null), NULL, NULL);
 
+	/* Set the upload timeout to an equal of 512 bytes per second */
+	smtp_maybe_update_socket_timeout (transport->ostream, null->written / 512);
+
 	filtered_stream = camel_stream_filter_new (transport->ostream);
 
 	/* setup progress reporting for message sending... */