aboutsummaryrefslogtreecommitdiffstats
path: root/common/rdr/TLSOutStream.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'common/rdr/TLSOutStream.cxx')
-rw-r--r--common/rdr/TLSOutStream.cxx82
1 files changed, 8 insertions, 74 deletions
diff --git a/common/rdr/TLSOutStream.cxx b/common/rdr/TLSOutStream.cxx
index 365ffd60..ba9d182f 100644
--- a/common/rdr/TLSOutStream.cxx
+++ b/common/rdr/TLSOutStream.cxx
@@ -1,7 +1,7 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyright (C) 2005 Martin Koegler
* Copyright (C) 2010 TigerVNC Team
- * Copyright (C) 2012-2021 Pierre Ossman for Cendio AB
+ * Copyright 2012-2025 Pierre Ossman for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,108 +23,42 @@
#include <config.h>
#endif
-#include <rdr/Exception.h>
-#include <rdr/TLSException.h>
#include <rdr/TLSOutStream.h>
-#include <rfb/LogWriter.h>
-#include <errno.h>
+#include <rdr/TLSSocket.h>
#ifdef HAVE_GNUTLS
-using namespace rdr;
-
-static rfb::LogWriter vlog("TLSOutStream");
-
-ssize_t TLSOutStream::push(gnutls_transport_ptr_t str, const void* data,
- size_t size)
-{
- TLSOutStream* self= (TLSOutStream*) str;
- OutStream *out = self->out;
-
- delete self->saved_exception;
- self->saved_exception = nullptr;
- try {
- out->writeBytes((const uint8_t*)data, size);
- out->flush();
- } catch (socket_error& e) {
- vlog.error("Failure sending TLS data: %s", e.what());
- gnutls_transport_set_errno(self->session, e.err);
- self->saved_exception = new socket_error(e);
- return -1;
- } catch (std::exception& e) {
- vlog.error("Failure sending TLS data: %s", e.what());
- gnutls_transport_set_errno(self->session, EINVAL);
- self->saved_exception = new std::runtime_error(e.what());
- return -1;
- }
-
- return size;
-}
+using namespace rdr;
-TLSOutStream::TLSOutStream(OutStream* _out, gnutls_session_t _session)
- : session(_session), out(_out), saved_exception(nullptr)
+TLSOutStream::TLSOutStream(TLSSocket* sock_)
+ : sock(sock_)
{
- gnutls_transport_ptr_t recv, send;
-
- gnutls_transport_set_push_function(session, push);
- gnutls_transport_get_ptr2(session, &recv, &send);
- gnutls_transport_set_ptr2(session, recv, this);
}
TLSOutStream::~TLSOutStream()
{
-#if 0
- try {
-// flush();
- } catch (Exception&) {
- }
-#endif
- gnutls_transport_set_push_function(session, nullptr);
-
- delete saved_exception;
}
void TLSOutStream::flush()
{
BufferedOutStream::flush();
- out->flush();
+ sock->out->flush();
}
void TLSOutStream::cork(bool enable)
{
BufferedOutStream::cork(enable);
- out->cork(enable);
+ sock->out->cork(enable);
}
bool TLSOutStream::flushBuffer()
{
while (sentUpTo < ptr) {
- size_t n = writeTLS(sentUpTo, ptr - sentUpTo);
+ size_t n = sock->writeTLS(sentUpTo, ptr - sentUpTo);
sentUpTo += n;
}
return true;
}
-size_t TLSOutStream::writeTLS(const uint8_t* data, size_t length)
-{
- int n;
-
- n = gnutls_record_send(session, data, length);
- if (n == GNUTLS_E_INTERRUPTED || n == GNUTLS_E_AGAIN)
- return 0;
-
- if (n == GNUTLS_E_PUSH_ERROR) {
- if (dynamic_cast<socket_error*>(saved_exception))
- throw *dynamic_cast<socket_error*>(saved_exception);
- else
- throw std::runtime_error(saved_exception->what());
- }
-
- if (n < 0)
- throw tls_error("writeTLS", n);
-
- return n;
-}
-
#endif