}
static PRFileDesc *
-enable_ssl_or_close_fd (CamelTcpStreamSSL *ssl, PRFileDesc *fd)
+enable_ssl_or_close_fd (CamelTcpStreamSSL *ssl, PRFileDesc *fd, GError **error)
{
PRFileDesc *ssl_fd;
PR_Shutdown (fd, PR_SHUTDOWN_BOTH);
PR_Close (fd);
errno = errnosave;
+ _set_g_error_from_errno (error, FALSE);
return NULL;
}
}
static gboolean
-rehandshake_ssl (PRFileDesc *fd)
+rehandshake_ssl (PRFileDesc *fd, GError **error)
{
if (SSL_ResetHandshake (fd, FALSE) == SECFailure) {
_set_errno_from_pr_error (PR_GetError ());
+ _set_g_error_from_errno (error, FALSE);
return FALSE;
}
if (SSL_ForceHandshake (fd) == SECFailure) {
_set_errno_from_pr_error (PR_GetError ());
+ _set_g_error_from_errno (error, FALSE);
return FALSE;
}
}
static gint
-tcp_stream_ssl_connect (CamelTcpStream *stream, const char *host, const char *service, gint fallback_port, CamelException *ex)
+tcp_stream_ssl_connect (CamelTcpStream *stream, const char *host, const char *service, gint fallback_port, GError **error)
{
CamelTcpStreamSSL *ssl = CAMEL_TCP_STREAM_SSL (stream);
gint retval;
- retval = CAMEL_TCP_STREAM_CLASS (parent_class)->connect (stream, host, service, fallback_port, ex);
+ retval = CAMEL_TCP_STREAM_CLASS (camel_tcp_stream_ssl_parent_class)->connect (stream, host, service, fallback_port, error);
if (retval != 0)
return retval;
d (g_print (" enabling SSL\n"));
fd = camel_tcp_stream_get_file_desc (stream);
- ssl_fd = enable_ssl_or_close_fd (ssl, fd);
+ ssl_fd = enable_ssl_or_close_fd (ssl, fd, error);
_camel_tcp_stream_raw_replace_file_desc (CAMEL_TCP_STREAM_RAW (stream), ssl_fd);
if (!ssl_fd) {
d (g_print (" could not enable SSL\n"));
} else {
d (g_print (" re-handshaking SSL\n"));
-
- if (!rehandshake_ssl (ssl_fd)) {
+
+ if (!rehandshake_ssl (ssl_fd, error)) {
d (g_print (" failed\n"));
return -1;
}
_camel_tcp_stream_raw_replace_file_desc (CAMEL_TCP_STREAM_RAW (ssl), ssl_fd);
ssl->priv->ssl_mode = TRUE;
- if (!rehandshake_ssl (ssl_fd))
+ if (!rehandshake_ssl (ssl_fd, NULL)) /* NULL-GError */
return -1;
}