diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2008-03-23 14:29:19 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2008-03-23 14:29:19 +0000 | 
| commit | 8a2221a79b177a5c6d0b55dafebd39414d7fe10a (patch) | |
| tree | f6d61c6b93136e6bac705f8c9fc210836fbb19b6 /lib/ssl_openssl.c | |
| parent | 851a8c29c681cdc3c9838ed99486822cba927f60 (diff) | |
Fixed stalling issue with OpenSSL and Jabber (#368).
Diffstat (limited to 'lib/ssl_openssl.c')
| -rw-r--r-- | lib/ssl_openssl.c | 23 | 
1 files changed, 19 insertions, 4 deletions
| diff --git a/lib/ssl_openssl.c b/lib/ssl_openssl.c index b1ba1db9..fc6d433e 100644 --- a/lib/ssl_openssl.c +++ b/lib/ssl_openssl.c @@ -61,16 +61,16 @@ void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data  	struct scd *conn = g_new0( struct scd, 1 );  	conn->fd = proxy_connect( host, port, ssl_connected, conn ); -	conn->func = func; -	conn->data = data; -	conn->inpa = -1; -	  	if( conn->fd < 0 )  	{  		g_free( conn );  		return NULL;  	} +	conn->func = func; +	conn->data = data; +	conn->inpa = -1; +	  	return conn;  } @@ -230,6 +230,21 @@ int ssl_write( void *conn, const char *buf, int len )  	return st;  } +/* Only OpenSSL *really* needs this (and well, maybe NSS). See for more info: +   http://www.gnu.org/software/gnutls/manual/gnutls.html#index-gnutls_005frecord_005fcheck_005fpending-209 +   http://www.openssl.org/docs/ssl/SSL_pending.html +    +   Required because OpenSSL empties the TCP buffer completely but doesn't +   necessarily give us all the unencrypted data. +    +   Returns 0 if there's nothing left or if we don't have to care (GnuTLS), +   1 if there's more data. */ +int ssl_pending( void *conn ) +{ +	return ( ((struct scd*)conn) && ((struct scd*)conn)->established ) ? +	       SSL_pending( ((struct scd*)conn)->ssl ) > 0 : 0; +} +  void ssl_disconnect( void *conn_ )  {  	struct scd *conn = conn_; | 
