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.cxx77
1 files changed, 8 insertions, 69 deletions
diff --git a/common/rdr/TLSOutStream.cxx b/common/rdr/TLSOutStream.cxx
index c3ae2d0a..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,103 +23,42 @@
#include <config.h>
#endif
-#include <core/Exception.h>
-#include <core/LogWriter.h>
-
-#include <rdr/TLSException.h>
#include <rdr/TLSOutStream.h>
-
-#include <errno.h>
+#include <rdr/TLSSocket.h>
#ifdef HAVE_GNUTLS
-using namespace rdr;
-static core::LogWriter vlog("TLSOutStream");
+using namespace rdr;
-ssize_t TLSOutStream::push(gnutls_transport_ptr_t str, const void* data,
- size_t size)
+TLSOutStream::TLSOutStream(TLSSocket* sock_)
+ : sock(sock_)
{
- TLSOutStream* self= (TLSOutStream*) str;
- OutStream *out = self->out;
-
- self->saved_exception = nullptr;
-
- try {
- out->writeBytes((const uint8_t*)data, size);
- out->flush();
- } catch (std::exception& e) {
- core::socket_error* se;
- vlog.error("Failure sending TLS data: %s", e.what());
- se = dynamic_cast<core::socket_error*>(&e);
- if (se)
- gnutls_transport_set_errno(self->session, se->err);
- else
- gnutls_transport_set_errno(self->session, EINVAL);
- self->saved_exception = std::current_exception();
- return -1;
- }
-
- return size;
-}
-
-TLSOutStream::TLSOutStream(OutStream* _out, gnutls_session_t _session)
- : session(_session), out(_out)
-{
- 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);
}
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)
- std::rethrow_exception(saved_exception);
-
- if (n < 0)
- throw tls_error("writeTLS", n);
-
- return n;
-}
-
#endif