# HG changeset patch # User David Demelier # Date 1471007799 -7200 # Node ID 5fa15cd7ffe05ab19b204f0d17d3d48307ea9f04 # Parent 5566cf7720730ec881f2b14c207c9c406968ff98 Irccd: transport code looks like connection diff -r 5566cf772073 -r 5fa15cd7ffe0 lib/irccd/transport-client.cpp --- a/lib/irccd/transport-client.cpp Fri Aug 12 15:01:16 2016 +0200 +++ b/lib/irccd/transport-client.cpp Fri Aug 12 15:16:39 2016 +0200 @@ -30,13 +30,23 @@ onCommand(document); } +unsigned TransportClient::recv(char *buffer, unsigned length) +{ + return m_socket.recv(buffer, length); +} + +unsigned TransportClient::send(const char *buffer, unsigned length) +{ + return m_socket.send(buffer, length); +} + void TransportClient::syncInput() { try { std::string buffer; buffer.resize(512); - buffer.resize(m_socket.recv(&buffer[0], buffer.size())); + buffer.resize(recv(&buffer[0], buffer.size())); if (buffer.empty()) onDie(); @@ -50,7 +60,7 @@ void TransportClient::syncOutput() { try { - auto ns = m_socket.send(&m_output[0], m_output.size()); + auto ns = send(&m_output[0], m_output.size()); if (ns == 0) onDie(); @@ -133,35 +143,34 @@ handshake(); } -void TransportClientTls::syncInput() +unsigned TransportClientTls::recv(char *buffer, unsigned length) { - try { - std::string buffer; - - buffer.resize(512); - buffer.resize(m_ssl.recv(&buffer[0], buffer.size())); + unsigned nread = 0; - if (buffer.empty()) - onDie(); + try { + nread = m_ssl.recv(buffer, length); + } catch (const net::WantReadError &) { + m_handshake = HandshakeRead; + } catch (const net::WantWriteError &) { + m_handshake = HandshakeWrite; + } - m_input += std::move(buffer); - } catch (const std::exception &) { - onDie(); - } + return nread; } -void TransportClientTls::syncOutput() +unsigned TransportClientTls::send(const char *buffer, unsigned length) { - try { - auto ns = m_ssl.send(&m_output[0], m_output.size()); + unsigned nsent = 0; - if (ns == 0) - onDie(); + try { + nsent = m_ssl.send(buffer, length); + } catch (const net::WantReadError &) { + m_handshake = HandshakeRead; + } catch (const net::WantWriteError &) { + m_handshake = HandshakeWrite; + } - m_output.erase(0, ns); - } catch (const std::exception &ex) { - onDie(); - } + return nsent; } void TransportClientTls::prepare(fd_set &in, fd_set &out, net::Handle &max) diff -r 5566cf772073 -r 5fa15cd7ffe0 lib/irccd/transport-client.hpp --- a/lib/irccd/transport-client.hpp Fri Aug 12 15:01:16 2016 +0200 +++ b/lib/irccd/transport-client.hpp Fri Aug 12 15:16:39 2016 +0200 @@ -76,8 +76,23 @@ void parse(const std::string &buffer); protected: - virtual void syncInput(); - virtual void syncOutput(); + /** + * Try to receive some data into the given buffer. + * + * \param buffer the destination buffer + * \param length the buffer length + * \return the number of bytes received + */ + virtual unsigned recv(char *buffer, unsigned length); + + /** + * Try to send some data into the given buffer. + * + * \param buffer the source buffer + * \param length the buffer length + * \return the number of bytes sent + */ + virtual unsigned send(const char *buffer, unsigned length); public: inline TransportClient(net::TcpSocket socket) @@ -87,6 +102,20 @@ } /** + * Convenient wrapper around recv(). + * + * Must be used in sync() function. + */ + void syncInput(); + + /** + * Convenient wrapper around send(). + * + * Must be used in sync() function. + */ + void syncOutput(); + + /** * Virtual destructor defaulted. */ virtual ~TransportClient() = default; @@ -111,8 +140,15 @@ void handshake(); protected: - void syncInput() override; - void syncOutput() override; + /** + * \copydoc TransportClient::recv + */ + unsigned recv(char *buffer, unsigned length) override; + + /** + * \copydoc TransportClient::send + */ + unsigned send(const char *buffer, unsigned length) override; public: IRCCD_EXPORT TransportClientTls(const std::string &pkey, diff -r 5566cf772073 -r 5fa15cd7ffe0 lib/irccd/transport-server.hpp --- a/lib/irccd/transport-server.hpp Fri Aug 12 15:01:16 2016 +0200 +++ b/lib/irccd/transport-server.hpp Fri Aug 12 15:16:39 2016 +0200 @@ -133,6 +133,8 @@ /** * Constructor. * \pre mode > 0 + * \param pkey the private key file + * \param cert the certificate file * \param address the address (* for any) * \param port the port number * \param mode the domains to use (can be OR'ed)