diff options
Diffstat (limited to 'ace/SSL/SSL_SOCK_Connector.cpp')
-rw-r--r-- | ace/SSL/SSL_SOCK_Connector.cpp | 407 |
1 files changed, 0 insertions, 407 deletions
diff --git a/ace/SSL/SSL_SOCK_Connector.cpp b/ace/SSL/SSL_SOCK_Connector.cpp deleted file mode 100644 index 0664ea387f9..00000000000 --- a/ace/SSL/SSL_SOCK_Connector.cpp +++ /dev/null @@ -1,407 +0,0 @@ -// -*- C++ -*- -// -// $Id$ - -#include "SSL_SOCK_Connector.h" - -#include "ace/Handle_Set.h" -#include "ace/INET_Addr.h" -#include "ace/Synch_T.h" -#include "ace/Log_Msg.h" - -#include <openssl/err.h> - -#if defined (ACE_LACKS_INLINE_FUNCTIONS) -#include "SSL_SOCK_Connector.i" -#endif /* ACE_LACKS_INLINE_FUNCTIONS */ - -ACE_RCSID (ACE_SSL, - SSL_SOCK_Connector, - "$Id$") - -ACE_ALLOC_HOOK_DEFINE(ACE_SSL_SOCK_Connector) - - -ACE_SSL_SOCK_Connector::~ACE_SSL_SOCK_Connector (void) -{ - ACE_TRACE ("ACE_SSL_SOCK_Connector::~ACE_SSL_SOCK_Connector"); -} - -int -ACE_SSL_SOCK_Connector::ssl_connect (ACE_SSL_SOCK_Stream &new_stream, - const ACE_Time_Value *timeout) -{ - SSL *ssl = new_stream.ssl (); - - if (SSL_is_init_finished (ssl)) - return 0; - - // Check if a connection is already pending for the given SSL - // structure. - if (!SSL_in_connect_init (ssl)) - ::SSL_set_connect_state (ssl); - - ACE_HANDLE handle = new_stream.get_handle (); - - // We're going to call SSL_connect, optionally doing ACE::select and - // retrying the SSL_connect, until the SSL handshake is done or - // it fails. - // To get the timeout affect, set the socket to nonblocking mode - // before beginning if there is a timeout specified. If the timeout - // is 0 (wait as long as it takes) then don't worry about the blocking - // status; we'll block in SSL_connect if the socket is blocking, and - // block in ACE::select if not. - int reset_blocking_mode = 0; - if (timeout != 0) - { - reset_blocking_mode = ACE_BIT_DISABLED (ACE::get_flags (handle), - ACE_NONBLOCK); - // Set the handle into non-blocking mode if it's not already - // in it. - if (reset_blocking_mode - && ACE::set_flags (handle, - ACE_NONBLOCK) == -1) - return -1; - } - - ACE_Time_Value t; - if (timeout != 0) - t = *timeout; // Need a non-const copy. - - // Take into account the time between each select() call below. - ACE_Countdown_Time countdown ((timeout == 0 ? 0 : &t)); - - int status; - do - { - // These handle sets are used to set up for whatever SSL_connect - // says it wants next. They're reset on each pass around the loop. - ACE_Handle_Set rd_handle; - ACE_Handle_Set wr_handle; - - status = ::SSL_connect (ssl); - switch (::SSL_get_error (ssl, status)) - { - case SSL_ERROR_NONE: - // Start out with non-blocking disabled on the SSL stream. - new_stream.disable (ACE_NONBLOCK); - status = 0; // To tell caller about success - break; // Done - - case SSL_ERROR_WANT_WRITE: - wr_handle.set_bit (handle); - status = 1; // Wait for more activity - break; - - case SSL_ERROR_WANT_READ: - rd_handle.set_bit (handle); - status = 1; // Wait for more activity - break; - - case SSL_ERROR_ZERO_RETURN: - // The peer has notified us that it is shutting down via - // the SSL "close_notify" message so we need to - // shutdown, too. - status = -1; - break; - - case SSL_ERROR_SYSCALL: - // On some platforms (e.g. MS Windows) OpenSSL does not - // store the last error in errno so explicitly do so. - // - // Explicitly check for EWOULDBLOCK since it doesn't get - // converted to an SSL_ERROR_WANT_{READ,WRITE} on some - // platforms. If SSL_connect failed outright, though, don't - // bother checking more. This can happen if the socket gets - // closed during the handshake. - if (ACE_OS::set_errno_to_last_error () == EWOULDBLOCK && - status == -1) - { - // Although the SSL_ERROR_WANT_READ/WRITE isn't getting - // set correctly, the read/write state should be valid. - // Use that to decide what to do. - status = 1; // Wait for more activity - if (SSL_want_write (ssl)) - wr_handle.set_bit (handle); - else if (SSL_want_read (ssl)) - rd_handle.set_bit (handle); - else - status = -1; // Doesn't want anything - bail out - } - else - status = -1; - break; - - default: - ACE_SSL_Context::report_error (); - status = -1; - break; - } - - if (status == 1) - { - // Must have at least one handle to wait for at this point. - ACE_ASSERT (rd_handle.num_set () == 1 || wr_handle.num_set () == 1); - - // Block indefinitely if timeout pointer is zero. - status = ACE::select (int (handle) + 1, - &rd_handle, - &wr_handle, - 0, - (timeout == 0 ? 0 : &t)); - - (void) countdown.update (); - - // 0 is timeout, so we're done. - // -1 is error, so we're done. - // Could be both handles set (same handle in both masks) so set to 1. - if (status >= 1) - status = 1; - else // Timeout or socket failure - status = -1; - } - - } while (status == 1 && !SSL_is_init_finished (ssl)); - - if (reset_blocking_mode) - { - ACE_Errno_Guard eguard (errno); - ACE::clr_flags (handle, ACE_NONBLOCK); - } - - return (status == -1 ? -1 : 0); - -} - -int -ACE_SSL_SOCK_Connector::connect (ACE_SSL_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - const ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int flags, - int perms) -{ - ACE_TRACE ("ACE_SSL_SOCK_Connector::connect"); - - // Take into account the time to complete the basic TCP handshake - // and the SSL handshake. - ACE_Time_Value time_copy; - ACE_Countdown_Time countdown (&time_copy); - if (timeout != 0) - { - time_copy += *timeout; - countdown.start (); - } - - int result = - this->connector_.connect (new_stream.peer (), - remote_sap, - timeout, - local_sap, - reuse_addr, - flags, - perms); - - int error = 0; - if (result == -1) - error = errno; // Save us some TSS accesses. - - // Obtain the handle from the underlying SOCK_Stream and set it in - // the SSL_SOCK_Stream. Note that the case where a connection is in - // progress is also handled. In that case, the handle must also be - // set in the SSL_SOCK_Stream so that the correct handle is returned - // when performing non-blocking connect()s. - if (new_stream.get_handle () == ACE_INVALID_HANDLE - && (result == 0 - || (result == -1 && (error == EWOULDBLOCK - || error == EINPROGRESS)))) - new_stream.set_handle (new_stream.peer ().get_handle ()); - - if (result == -1) - return result; - - // If using a timeout, update the countdown timer to reflect the time - // spent on the connect itself, then pass the remaining time to - // ssl_connect to bound the time on the handshake. - if (timeout != 0) - { - countdown.update (); - timeout = &time_copy; - } - - result = this->ssl_connect (new_stream, timeout); - - if (result == -1) - new_stream.close (); - - return result; -} - -int -ACE_SSL_SOCK_Connector::connect (ACE_SSL_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_QoS_Params qos_params, - const ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - ACE_Protocol_Info *protocolinfo, - ACE_SOCK_GROUP g, - u_long flags, - int reuse_addr, - int perms) -{ - ACE_TRACE ("ACE_SSL_SOCK_Connector::connect"); - - // Take into account the time to complete the basic TCP handshake - // and the SSL handshake. - ACE_Time_Value time_copy; - ACE_Countdown_Time countdown (&time_copy); - if (timeout != 0) - { - time_copy += *timeout; - countdown.start (); - } - - int result = this->connector_.connect (new_stream.peer (), - remote_sap, - qos_params, - timeout, - local_sap, - protocolinfo, - g, - flags, - reuse_addr, - perms); - - int error = 0; - if (result == -1) - error = errno; // Save us some TSS accesses. - - // Obtain the handle from the underlying SOCK_Stream and set it in - // the SSL_SOCK_Stream. Note that the case where a connection is in - // progress is also handled. In that case, the handle must also be - // set in the SSL_SOCK_Stream so that the correct handle is returned - // when performing non-blocking connect()s. - if (new_stream.get_handle () == ACE_INVALID_HANDLE - && (result == 0 - || (result == -1 && (error == EWOULDBLOCK - || error == EINPROGRESS)))) - new_stream.set_handle (new_stream.peer ().get_handle ()); - - if (result == -1) - return result; - - // If using a timeout, update the countdown timer to reflect the time - // spent on the connect itself, then pass the remaining time to - // ssl_connect to bound the time on the handshake. - if (timeout != 0) - { - countdown.update (); - timeout = &time_copy; - } - - result = this->ssl_connect (new_stream, timeout); - - if (result == -1) - new_stream.close (); - - return result; -} - -// Try to complete a non-blocking connection. - -int -ACE_SSL_SOCK_Connector::complete (ACE_SSL_SOCK_Stream &new_stream, - ACE_Addr *remote_sap, - const ACE_Time_Value *tv) -{ - ACE_TRACE ("ACE_SSL_SOCK_Connector::complete"); - - // Take into account the time to complete the basic TCP handshake - // and the SSL handshake. - ACE_Time_Value time_copy; - ACE_Countdown_Time countdown (&time_copy); - if (tv != 0) - { - time_copy += *tv; - countdown.start (); - } - - // Only attempt to complete the TCP connection if it that hasn't - // already been done. - ACE_INET_Addr raddr; - if (new_stream.peer ().get_remote_addr (raddr) != 0 - && this->connector_.complete (new_stream.peer (), - remote_sap, - tv) == -1) - return -1; - - // The handle in the SSL_SOCK_Stream should have already been set in - // the connect() method. - - // If using a timeout, update the countdown timer to reflect the time - // spent on the connect itself, then pass the remaining time to - // ssl_connect to bound the time on the handshake. - if (tv != 0) - { - countdown.update (); - tv = &time_copy; - } - - if (this->ssl_connect (new_stream, tv) == -1) - { - new_stream.close (); - return -1; - } - - return 0; - -} - - -ACE_SSL_SOCK_Connector::ACE_SSL_SOCK_Connector ( - ACE_SSL_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - const ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int flags, - int perms) - : connector_ () -{ - ACE_TRACE ("ACE_SSL_SOCK_Connector::ACE_SSL_SOCK_Connector"); - this->connect (new_stream, - remote_sap, - timeout, - local_sap, - reuse_addr, - flags, - perms); -} - -ACE_SSL_SOCK_Connector::ACE_SSL_SOCK_Connector ( - ACE_SSL_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_QoS_Params qos_params, - const ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - ACE_Protocol_Info *protocolinfo, - ACE_SOCK_GROUP g, - u_long flags, - int reuse_addr, - int perms) - : connector_ () -{ - ACE_TRACE ("ACE_SSL_SOCK_Connector::ACE_SSL_SOCK_Connector"); - - this->connect (new_stream, - remote_sap, - qos_params, - timeout, - local_sap, - protocolinfo, - g, - flags, - reuse_addr, - perms); -} |