Changeset 643dfc4 for protocols/ssl_gnutls.c
- Timestamp:
- 2005-12-17T01:25:58Z (18 years ago)
- Branches:
- master
- Children:
- e3fb678
- Parents:
- 4146a07 (diff), 32c632f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/ssl_gnutls.c
r4146a07 r643dfc4 25 25 26 26 #include <gnutls/gnutls.h> 27 #include <fcntl.h> 28 #include <unistd.h> 27 29 #include "proxy.h" 28 30 #include "ssl_client.h" 29 31 #include "sock.h" 30 32 #include "stdlib.h" 33 34 int ssl_errno = 0; 31 35 32 36 static gboolean initialized = FALSE; … … 38 42 int fd; 39 43 gboolean established; 44 int inpa; 40 45 41 46 gnutls_session session; … … 44 49 45 50 static void ssl_connected( gpointer data, gint source, GaimInputCondition cond ); 46 47 51 48 52 … … 54 58 conn->func = func; 55 59 conn->data = data; 60 conn->inpa = -1; 56 61 57 62 if( conn->fd < 0 ) … … 76 81 } 77 82 83 static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond ); 84 78 85 static void ssl_connected( gpointer data, gint source, GaimInputCondition cond ) 79 86 { … … 81 88 82 89 if( source == -1 ) 83 goto ssl_connected_failure; 90 { 91 conn->func( conn->data, NULL, cond ); 92 93 gnutls_deinit( conn->session ); 94 gnutls_certificate_free_credentials( conn->xcred ); 95 96 g_free( conn ); 97 98 return; 99 } 84 100 101 sock_make_nonblocking( conn->fd ); 85 102 gnutls_transport_set_ptr( conn->session, (gnutls_transport_ptr) conn->fd ); 86 103 87 if( gnutls_handshake( conn->session ) < 0 ) 88 goto ssl_connected_failure; 104 ssl_handshake( data, source, cond ); 105 } 106 107 static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond ) 108 { 109 struct scd *conn = data; 110 int st; 89 111 90 conn->established = TRUE; 91 conn->func( conn->data, conn, cond ); 92 return; 112 if( conn->inpa != -1 ) 113 gaim_input_remove( conn->inpa ); 93 114 94 ssl_connected_failure: 95 conn->func( conn->data, NULL, cond ); 96 97 gnutls_deinit( conn->session ); 98 gnutls_certificate_free_credentials( conn->xcred ); 99 if( source >= 0 ) closesocket( source ); 100 g_free( conn ); 115 if( ( st = gnutls_handshake( conn->session ) ) < 0 ) 116 { 117 if( st == GNUTLS_E_AGAIN || st == GNUTLS_E_INTERRUPTED ) 118 { 119 conn->inpa = gaim_input_add( conn->fd, 120 gnutls_record_get_direction( conn->session ) ? 121 GAIM_INPUT_WRITE : GAIM_INPUT_READ, 122 ssl_handshake, data ); 123 } 124 else 125 { 126 conn->func( conn->data, NULL, cond ); 127 128 gnutls_deinit( conn->session ); 129 gnutls_certificate_free_credentials( conn->xcred ); 130 closesocket( conn->fd ); 131 132 g_free( conn ); 133 } 134 } 135 else 136 { 137 /* For now we can't handle non-blocking perfectly everywhere... */ 138 sock_make_blocking( conn->fd ); 139 140 conn->established = TRUE; 141 conn->func( conn->data, conn, cond ); 142 } 101 143 } 102 144 … … 104 146 { 105 147 if( !((struct scd*)conn)->established ) 106 return( 0 ); 148 { 149 ssl_errno = SSL_NOHANDSHAKE; 150 return( -1 ); 151 } 107 152 108 153 return( gnutls_record_recv( ((struct scd*)conn)->session, buf, len ) ); 154 109 155 } 110 156 … … 112 158 { 113 159 if( !((struct scd*)conn)->established ) 114 return( 0 ); 160 { 161 ssl_errno = SSL_NOHANDSHAKE; 162 return( -1 ); 163 } 115 164 116 165 return( gnutls_record_send( ((struct scd*)conn)->session, buf, len ) );
Note: See TracChangeset
for help on using the changeset viewer.