2006-04-18 Mikael Hallendal <micke@imendio.com>
authorhallski <hallski>
Tue, 18 Apr 2006 13:47:21 +0000
changeset 139 2d0dcbb757b3
parent 138 210cf8993393
child 140 103227122f45
2006-04-18 Mikael Hallendal <micke@imendio.com> * loudmouth/lm-ssl-openssl.c: (_lm_ssl_begin): - Fixed an issue reported by Martyn when using non-blocking sockets.
ChangeLog
loudmouth/lm-ssl-openssl.c
--- a/ChangeLog	Wed Apr 12 14:37:15 2006 +0000
+++ b/ChangeLog	Tue Apr 18 13:47:21 2006 +0000
@@ -1,3 +1,8 @@
+2006-04-18  Mikael Hallendal  <micke@imendio.com>
+
+	* loudmouth/lm-ssl-openssl.c: (_lm_ssl_begin):
+	- Fixed an issue reported by Martyn when using non-blocking sockets.
+
 2006-04-12  Mikael Hallendal  <micke@imendio.com>
 
 	* autogen.sh:
--- a/loudmouth/lm-ssl-openssl.c	Wed Apr 12 14:37:15 2006 +0000
+++ b/loudmouth/lm-ssl-openssl.c	Tue Apr 18 13:47:21 2006 +0000
@@ -122,19 +122,36 @@
 gboolean
 _lm_ssl_begin (LmSSL *ssl, gint fd, const gchar *server, GError **error)
 {
-	BIO      *sbio;
+	BIO       *sbio;
+	GIOStatus  status;
 
 	ssl->session = SSL_new (ssl->ctx);
 	sbio = BIO_new_socket (fd, BIO_NOCLOSE);
 	SSL_set_bio (ssl->session, sbio, sbio);
 
-	if (SSL_connect (ssl->session) <= 0) {
-		g_set_error (error, 
-			     LM_ERROR, LM_ERROR_CONNECTION_OPEN,
-			     "*** OpenSSL handshake failed");
+	while (TRUE) {
+		gint ret;
+
+		ret = SSL_connect (ssl->session);
 
-		return FALSE;	/* Error */
-	} 
+		if (ret > 0) {
+			/* Successful */
+			break;
+		}
+		else {
+			status = ssl_io_status_from_return (ssl, ret);
+			if (status == G_IO_STATUS_AGAIN) {
+				/* Try again */
+				continue;
+			} else {
+				g_set_error (error, 
+					     LM_ERROR, LM_ERROR_CONNECTION_OPEN,
+					     "*** OpenSSL handshake failed");
+				return FALSE;
+			}
+
+		}
+	}
 
 	if (!ssl_verify_certificate (ssl, server)) {
 		g_set_error (error,