/* * This function uses SSLGetSessionState to determine connection status. * * Return codes: * 1 means the connection is still in place * 0 means the connection has been closed * -1 means the connection status is unknown */ int Curl_darwinssl_check_cxn(struct connectdata *conn) { struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET]; OSStatus err; SSLSessionState state; if(connssl->ssl_ctx) { err = SSLGetSessionState(connssl->ssl_ctx, &state); if(err == noErr) return state == kSSLConnected || state == kSSLHandshake; return -1; } return 0; }
static void ssl_cdsa_close(PurpleSslConnection *gsc) { PurpleSslCDSAData *cdsa_data = PURPLE_SSL_CDSA_DATA(gsc); #ifdef CDSA_DEBUG purple_debug_info("cdsa", "Closing PurpleSslConnection %p", cdsa_data); #endif if (cdsa_data == NULL) return; if (cdsa_data->handshake_handler) purple_input_remove(cdsa_data->handshake_handler); if (cdsa_data->ssl_ctx != NULL) { OSStatus err; SSLSessionState state; err = SSLGetSessionState(cdsa_data->ssl_ctx, &state); if(err != noErr) purple_debug_error("cdsa", "SSLGetSessionState failed\n"); else if(state == kSSLConnected) { err = SSLClose(cdsa_data->ssl_ctx); if(err != noErr) purple_debug_error("cdsa", "SSLClose failed\n"); } #ifdef CDSA_DEBUG purple_debug_info("cdsa", "SSLDisposeContext(%p)", cdsa_data->ssl_ctx); #endif err = SSLDisposeContext(cdsa_data->ssl_ctx); if(err != noErr) purple_debug_error("cdsa", "SSLDisposeContext failed\n"); cdsa_data->ssl_ctx = NULL; } connections = g_list_remove(connections, gsc); g_free(cdsa_data); gsc->private_data = NULL; }