* @param sslContext The SSL context for the client.
*/
TlsStream::TlsStream(const Socket::Ptr& socket, ConnectionRole role, const boost::shared_ptr<SSL_CTX>& sslContext)
- : SocketEvents(socket, this), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_CloseOK(false), m_ErrorCode(0),
+ : SocketEvents(socket, this), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_ErrorCode(0),
m_ErrorOccurred(false), m_Socket(socket), m_Role(role), m_SendQ(new FIFO()), m_RecvQ(new FIFO()),
m_CurrentAction(TlsActionNone), m_Retry(false)
{
boost::mutex::scoped_lock lock(m_Mutex);
+ if (!m_SSL)
+ return;
+
char buffer[512];
if (m_CurrentAction == TlsActionNone) {
break;
case SSL_ERROR_ZERO_RETURN:
- Unregister();
+ SocketEvents::Unregister();
m_SSL.reset();
m_Socket->Close();
break;
default:
- Unregister();
+ SocketEvents::Unregister();
m_SSL.reset();
m_Socket->Close();
void TlsStream::Close(void)
{
boost::mutex::scoped_lock lock(m_Mutex);
+
+ if (!m_SSL)
+ return;
+
(void) SSL_shutdown(m_SSL.get());
+ m_SSL.reset();
+
m_Socket->Close();
- m_CloseOK = true;
- m_CV.notify_all();
+ m_Eof = true;
}
bool TlsStream::IsEof(void) const