summaryrefslogtreecommitdiff
path: root/cpp/src/IceSSL/SslTransceiver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceSSL/SslTransceiver.cpp')
-rw-r--r--cpp/src/IceSSL/SslTransceiver.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/cpp/src/IceSSL/SslTransceiver.cpp b/cpp/src/IceSSL/SslTransceiver.cpp
new file mode 100644
index 00000000000..f49fc49e32f
--- /dev/null
+++ b/cpp/src/IceSSL/SslTransceiver.cpp
@@ -0,0 +1,106 @@
+// **********************************************************************
+//
+// Copyright (c) 2001
+// MutableRealms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#include <IceSSL/OpenSSL.h>
+#include <IceSSL/SslConnection.h>
+#include <IceSSL/SslTransceiver.h>
+#include <Ice/Instance.h>
+#include <Ice/TraceLevels.h>
+#include <Ice/Logger.h>
+#include <Ice/Buffer.h>
+#include <Ice/Network.h>
+#include <Ice/Exception.h>
+#include <sstream>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+using IceSSL::ConnectionPtr;
+
+SOCKET
+IceSSL::SslTransceiver::fd()
+{
+ return _fd;
+}
+
+void
+IceSSL::SslTransceiver::close()
+{
+ if (_traceLevels->network >= 1)
+ {
+ ostringstream s;
+ s << "closing ssl connection\n" << toString();
+ _logger->trace(_traceLevels->networkCat, s.str());
+ }
+
+ SOCKET fd = _fd;
+ _fd = INVALID_SOCKET;
+ _sslConnection->shutdown();
+ ::shutdown(fd, SHUT_RDWR); // helps to unblock threads in recv()
+ closeSocket(fd);
+}
+
+void
+IceSSL::SslTransceiver::shutdown()
+{
+ if (_traceLevels->network >= 2)
+ {
+ ostringstream s;
+ s << "shutting down ssl connection\n" << toString();
+ _logger->trace(_traceLevels->networkCat, s.str());
+ }
+
+ _sslConnection->shutdown();
+ ::shutdown(_fd, SHUT_WR); // Shutdown socket for writing
+}
+
+void
+IceSSL::SslTransceiver::write(Buffer& buf, int timeout)
+{
+ _sslConnection->write(buf, timeout);
+}
+
+void
+IceSSL::SslTransceiver::read(Buffer& buf, int timeout)
+{
+ if (!_sslConnection->read(buf, timeout))
+ {
+ if (_traceLevels->security >= IceSSL::SECURITY_WARNINGS)
+ {
+ _logger->trace(_traceLevels->securityCat, "WRN reading from ssl connection returns no bytes");
+ }
+ }
+}
+
+string
+IceSSL::SslTransceiver::toString() const
+{
+ return fdToString(_fd);
+}
+
+IceSSL::SslTransceiver::SslTransceiver(const InstancePtr& instance,
+ SOCKET fd,
+ const ConnectionPtr& sslConnection) :
+ _instance(instance),
+ _traceLevels(instance->traceLevels()),
+ _logger(instance->logger()),
+ _fd(fd),
+ _sslConnection(sslConnection)
+{
+ assert(sslConnection != 0);
+
+ FD_ZERO(&_rFdSet);
+ FD_ZERO(&_wFdSet);
+}
+
+IceSSL::SslTransceiver::~SslTransceiver()
+{
+ assert(_fd == INVALID_SOCKET);
+}