changeset 594:0a5cb2b65621

Irccd: split transport_server into different files
author David Demelier <markand@malikania.fr>
date Tue, 05 Dec 2017 16:31:35 +0100
parents b3b046c638cb
children 029667d16d12
files libirccd-test/irccd/command_test.hpp libirccd/CMakeLists.txt libirccd/irccd/basic_transport_server.hpp libirccd/irccd/ip_transport_server.hpp libirccd/irccd/local_transport_server.hpp libirccd/irccd/tls_transport_server.cpp libirccd/irccd/tls_transport_server.hpp libirccd/irccd/transport_server.cpp libirccd/irccd/transport_server.hpp libirccd/irccd/transport_service.cpp
diffstat 10 files changed, 324 insertions(+), 150 deletions(-) [+]
line wrap: on
line diff
--- a/libirccd-test/irccd/command_test.hpp	Tue Dec 05 15:43:23 2017 +0100
+++ b/libirccd-test/irccd/command_test.hpp	Tue Dec 05 16:31:35 2017 +0100
@@ -23,8 +23,9 @@
 
 #include <irccd/logger.hpp>
 
+#include <irccd/command_service.hpp>
+#include <irccd/ip_transport_server.hpp>
 #include <irccd/irccd.hpp>
-#include <irccd/command_service.hpp>
 #include <irccd/transport_service.hpp>
 
 #include <irccd/ctl/ip_connection.hpp>
--- a/libirccd/CMakeLists.txt	Tue Dec 05 15:43:23 2017 +0100
+++ b/libirccd/CMakeLists.txt	Tue Dec 05 16:31:35 2017 +0100
@@ -23,12 +23,15 @@
 set(
     HEADERS
     ${libirccd_SOURCE_DIR}/irccd/basic_transport_client.hpp
+    ${libirccd_SOURCE_DIR}/irccd/basic_transport_server.hpp
     ${libirccd_SOURCE_DIR}/irccd/command.hpp
     ${libirccd_SOURCE_DIR}/irccd/command_service.hpp
     ${libirccd_SOURCE_DIR}/irccd/config.hpp
     ${libirccd_SOURCE_DIR}/irccd/dynlib_plugin.hpp
+    ${libirccd_SOURCE_DIR}/irccd/ip_transport_server.hpp
+    ${libirccd_SOURCE_DIR}/irccd/irccd.hpp
     ${libirccd_SOURCE_DIR}/irccd/irc.hpp
-    ${libirccd_SOURCE_DIR}/irccd/irccd.hpp
+    ${libirccd_SOURCE_DIR}/irccd/local_transport_server.hpp
     ${libirccd_SOURCE_DIR}/irccd/plugin.hpp
     ${libirccd_SOURCE_DIR}/irccd/plugin_service.hpp
     ${libirccd_SOURCE_DIR}/irccd/rule.hpp
@@ -38,6 +41,7 @@
     ${libirccd_SOURCE_DIR}/irccd/transport_client.hpp
     ${libirccd_SOURCE_DIR}/irccd/transport_server.hpp
     ${libirccd_SOURCE_DIR}/irccd/transport_service.hpp
+    $<$<BOOL:${HAVE_SSL}>:${libirccd_SOURCE_DIR}/irccd/tls_transport_server.hpp>
 )
 
 set(
@@ -46,8 +50,8 @@
     ${libirccd_SOURCE_DIR}/irccd/command_service.cpp
     ${libirccd_SOURCE_DIR}/irccd/config.cpp
     ${libirccd_SOURCE_DIR}/irccd/dynlib_plugin.cpp
+    ${libirccd_SOURCE_DIR}/irccd/irccd.cpp
     ${libirccd_SOURCE_DIR}/irccd/irc.cpp
-    ${libirccd_SOURCE_DIR}/irccd/irccd.cpp
     ${libirccd_SOURCE_DIR}/irccd/plugin.cpp
     ${libirccd_SOURCE_DIR}/irccd/plugin_service.cpp
     ${libirccd_SOURCE_DIR}/irccd/rule.cpp
@@ -57,6 +61,7 @@
     ${libirccd_SOURCE_DIR}/irccd/transport_client.cpp
     ${libirccd_SOURCE_DIR}/irccd/transport_server.cpp
     ${libirccd_SOURCE_DIR}/irccd/transport_service.cpp
+    $<$<BOOL:${HAVE_SSL}>:${libirccd_SOURCE_DIR}/irccd/tls_transport_server.cpp>
 )
 
 irccd_define_library(
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/basic_transport_server.hpp	Tue Dec 05 16:31:35 2017 +0100
@@ -0,0 +1,97 @@
+/*
+ * basic_transport_server.hpp -- simple socket transport servers
+ *
+ * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef IRCCD_BASIC_TRANSPORT_SERVER_HPP
+#define IRCCD_BASIC_TRANSPORT_SERVER_HPP
+
+/**
+ * \file basic_transport_server.hpp
+ * \brief Simple socket transport servers.
+ */
+
+#include "basic_transport_client.hpp"
+#include "transport_server.hpp"
+
+namespace irccd {
+
+/**
+ * \brief Basic implementation for IP/TCP and local sockets
+ *
+ * This class implements an accept function for:
+ *
+ *   - boost::asio::ip::tcp
+ *   - boost::asio::local::stream_protocol
+ */
+template <typename Protocol>
+class basic_transport_server : public transport_server {
+public:
+    /**
+     * Type for underlying socket.
+     */
+    using socket_t = typename Protocol::socket;
+
+    /**
+     * Type for underlying acceptor.
+     */
+    using acceptor_t = typename Protocol::acceptor;
+
+protected:
+    /**
+     * The acceptor object.
+     */
+    acceptor_t acceptor_;
+
+protected:
+    /**
+     * \copydoc transport_server::accept
+     */
+    void do_accept(accept_t handler) override;
+
+public:
+    /**
+     * Constructor with an acceptor in parameter.
+     *
+     * \pre acceptor.is_open()
+     * \param acceptor the already bound acceptor
+     */
+    basic_transport_server(acceptor_t acceptor);
+};
+
+template <typename Protocol>
+basic_transport_server<Protocol>::basic_transport_server(acceptor_t acceptor)
+    : acceptor_(std::move(acceptor))
+{
+    assert(acceptor_.is_open());
+}
+
+template <typename Protocol>
+void basic_transport_server<Protocol>::do_accept(accept_t handler)
+{
+    auto client = std::make_shared<basic_transport_client<socket_t>>(*this, acceptor_.get_io_service());
+
+    acceptor_.async_accept(client->stream().socket(), [this, client, handler] (auto code) {
+        if (code)
+            handler(std::move(code), nullptr);
+        else
+            handler(std::move(code), std::move(client));
+    });
+}
+
+} // !irccd
+
+#endif // !IRCCD_BASIC_TRANSPORT_SERVER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/ip_transport_server.hpp	Tue Dec 05 16:31:35 2017 +0100
@@ -0,0 +1,38 @@
+/*
+ * ip_transport_server.hpp -- server side transports (TCP/IP support)
+ *
+ * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef IRCCD_IP_TRANSPORT_SERVER_HPP
+#define IRCCD_IP_TRANSPORT_SERVER_HPP
+
+/**
+ * \file ip_transport_server.hpp
+ * \brief Server side transports (TCP/IP support).
+ */
+
+#include "basic_transport_server.hpp"
+
+namespace irccd {
+
+/**
+ * Convenient type for IP/TCP
+ */
+using ip_transport_server = basic_transport_server<boost::asio::ip::tcp>;
+
+} // !irccd
+
+#endif // !IRCCD_IP_TRANSPORT_SERVER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/local_transport_server.hpp	Tue Dec 05 16:31:35 2017 +0100
@@ -0,0 +1,44 @@
+/*
+ * local_transport_server.hpp -- server side transports (Unix support)
+ *
+ * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef IRCCD_LOCAL_TRANSPORT_SERVER_HPP
+#define IRCCD_LOCAL_TRANSPORT_SERVER_HPP
+
+/**
+ * \file local_transport_server.hpp
+ * \brief Server side transports (Unix support).
+ */
+
+#include <irccd/sysconfig.hpp>
+
+#if !defined(IRCCD_SYSTEM_WINDOWS)
+
+#include "basic_transport_server.hpp"
+
+namespace irccd {
+
+/**
+ * Convenient type for UNIX local sockets.
+ */
+using local_transport_server = basic_transport_server<boost::asio::local::stream_protocol>;
+
+#endif // !_WIN32
+
+} // !irccd
+
+#endif // !IRCCD_LOCAL_TRANSPORT_SERVER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/tls_transport_server.cpp	Tue Dec 05 16:31:35 2017 +0100
@@ -0,0 +1,52 @@
+/*
+ * tls_transport_server.cpp -- server side transports (SSL support)
+ *
+ * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "tls_transport_server.hpp"
+
+#if defined(HAVE_SSL)
+
+namespace irccd {
+
+void tls_transport_server::do_handshake(std::shared_ptr<client_t> client, accept_t handler)
+{
+    client->stream().socket().async_handshake(boost::asio::ssl::stream_base::server, [client, handler] (auto code) {
+        handler(std::move(code), std::move(client));
+    });
+}
+
+tls_transport_server::tls_transport_server(acceptor_t acceptor, context_t context)
+    : ip_transport_server(std::move(acceptor))
+    , context_(std::move(context))
+{
+}
+
+void tls_transport_server::do_accept(accept_t handler)
+{
+    auto client = std::make_shared<client_t>(*this, acceptor_.get_io_service(), context_);
+
+    acceptor_.async_accept(client->stream().socket().lowest_layer(), [this, client, handler] (auto code) {
+        if (code)
+            handler(std::move(code), nullptr);
+        else
+            do_handshake(std::move(client), std::move(handler));
+    });
+}
+
+} // !irccd
+
+#endif // !HAVE_SSL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd/irccd/tls_transport_server.hpp	Tue Dec 05 16:31:35 2017 +0100
@@ -0,0 +1,72 @@
+/*
+ * tls_transport_server.hpp -- server side transports (SSL support)
+ *
+ * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef IRCCD_TLS_TRANSPORT_SERVER_HPP
+#define IRCCD_TLS_TRANSPORT_SERVER_HPP
+
+/**
+ * \file tls_transport_server.hpp
+ * \brief Server side transports (SSL support).
+ */
+
+#include <irccd/sysconfig.hpp>
+
+#if defined(HAVE_SSL)
+
+#include <boost/asio/ssl.hpp>
+
+#include "ip_transport_server.hpp"
+
+namespace irccd {
+
+/**
+ * \brief Secure layer implementation.
+ */
+class tls_transport_server : public ip_transport_server {
+private:
+    using context_t = boost::asio::ssl::context;
+    using client_t = basic_transport_client<boost::asio::ssl::stream<socket_t>>;
+
+    context_t context_;
+
+    void do_handshake(std::shared_ptr<client_t>, accept_t);
+
+protected:
+    /**
+     * \copydoc tcp_transport_server::do_accept
+     *
+     * This function does the same as tcp_transport_server::do_accept but it
+     * also perform a SSL handshake after a successful accept operation.
+     */
+    void do_accept(accept_t handler) override;
+
+public:
+    /**
+     * Construct a secure layer transport server.
+     *
+     * \param acceptor the acceptor
+     * \param context the SSL context
+     */
+    tls_transport_server(acceptor_t acceptor, context_t context);
+};
+
+} // !irccd
+
+#endif // !HAVE_SSL
+
+#endif // !IRCCD_TLS_TRANSPORT_SERVER_HPP
--- a/libirccd/irccd/transport_server.cpp	Tue Dec 05 15:43:23 2017 +0100
+++ b/libirccd/irccd/transport_server.cpp	Tue Dec 05 16:31:35 2017 +0100
@@ -100,33 +100,4 @@
     });
 }
 
-#if defined(HAVE_SSL)
-
-void tls_transport_server::do_handshake(std::shared_ptr<client_t> client, accept_t handler)
-{
-    client->stream().socket().async_handshake(boost::asio::ssl::stream_base::server, [client, handler] (auto code) {
-        handler(std::move(code), std::move(client));
-    });
-}
-
-tls_transport_server::tls_transport_server(acceptor_t acceptor, context_t context)
-    : ip_transport_server(std::move(acceptor))
-    , context_(std::move(context))
-{
-}
-
-void tls_transport_server::do_accept(accept_t handler)
-{
-    auto client = std::make_shared<client_t>(*this, acceptor_.get_io_service(), context_);
-
-    acceptor_.async_accept(client->stream().socket().lowest_layer(), [this, client, handler] (auto code) {
-        if (code)
-            handler(std::move(code), nullptr);
-        else
-            do_handshake(std::move(client), std::move(handler));
-    });
-}
-
-#endif // !HAVE_SSL
-
 } // !irccd
--- a/libirccd/irccd/transport_server.hpp	Tue Dec 05 15:43:23 2017 +0100
+++ b/libirccd/irccd/transport_server.hpp	Tue Dec 05 16:31:35 2017 +0100
@@ -29,11 +29,7 @@
 
 #include <boost/asio.hpp>
 
-#if defined(HAVE_SSL)
-#   include <boost/asio/ssl.hpp>
-#endif
-
-#include "basic_transport_client.hpp"
+#include "transport_client.hpp"
 
 namespace irccd {
 
@@ -133,118 +129,6 @@
     }
 };
 
-/**
- * \brief Basic implementation for IP/TCP and local sockets
- *
- * This class implements an accept function for:
- *
- *   - boost::asio::ip::tcp
- *   - boost::asio::local::stream_protocol
- */
-template <typename Protocol>
-class basic_transport_server : public transport_server {
-public:
-    /**
-     * Type for underlying socket.
-     */
-    using socket_t = typename Protocol::socket;
-
-    /**
-     * Type for underlying acceptor.
-     */
-    using acceptor_t = typename Protocol::acceptor;
-
-protected:
-    /**
-     * The acceptor object.
-     */
-    acceptor_t acceptor_;
-
-protected:
-    /**
-     * \copydoc transport_server::accept
-     */
-    void do_accept(accept_t handler) override;
-
-public:
-    /**
-     * Constructor with an acceptor in parameter.
-     *
-     * \pre acceptor.is_open()
-     * \param acceptor the already bound acceptor
-     */
-    basic_transport_server(acceptor_t acceptor);
-};
-
-template <typename Protocol>
-basic_transport_server<Protocol>::basic_transport_server(acceptor_t acceptor)
-    : acceptor_(std::move(acceptor))
-{
-    assert(acceptor_.is_open());
-}
-
-template <typename Protocol>
-void basic_transport_server<Protocol>::do_accept(accept_t handler)
-{
-    auto client = std::make_shared<basic_transport_client<socket_t>>(*this, acceptor_.get_io_service());
-
-    acceptor_.async_accept(client->stream().socket(), [this, client, handler] (auto code) {
-        if (code)
-            handler(std::move(code), nullptr);
-        else
-            handler(std::move(code), std::move(client));
-    });
-}
-
-/**
- * Convenient type for IP/TCP
- */
-using ip_transport_server = basic_transport_server<boost::asio::ip::tcp>;
-
-#if !defined(_WIN32)
-
-/**
- * Convenient type for UNIX local sockets.
- */
-using local_transport_server = basic_transport_server<boost::asio::local::stream_protocol>;
-
-#endif // !_WIN32
-
-#if defined(HAVE_SSL)
-
-/**
- * \brief Secure layer implementation.
- */
-class tls_transport_server : public ip_transport_server {
-private:
-    using context_t = boost::asio::ssl::context;
-    using client_t = basic_transport_client<boost::asio::ssl::stream<socket_t>>;
-
-    context_t context_;
-
-    void do_handshake(std::shared_ptr<client_t>, accept_t);
-
-protected:
-    /**
-     * \copydoc tcp_transport_server::do_accept
-     *
-     * This function does the same as tcp_transport_server::do_accept but it
-     * also perform a SSL handshake after a successful accept operation.
-     */
-    void do_accept(accept_t handler) override;
-
-public:
-    /**
-     * Construct a secure layer transport server.
-     *
-     * \param acceptor the acceptor
-     * \param context the SSL context
-     */
-    tls_transport_server(acceptor_t acceptor, context_t context);
-};
-
-#endif // !HAVE_SSL
-
 } // !irccd
 
 #endif // !IRCCD_TRANSPORT_SERVER_HPP
--- a/libirccd/irccd/transport_service.cpp	Tue Dec 05 15:43:23 2017 +0100
+++ b/libirccd/irccd/transport_service.cpp	Tue Dec 05 16:31:35 2017 +0100
@@ -16,17 +16,27 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <irccd/sysconfig.hpp>
+
 #include <cassert>
 
 #include <irccd/string_util.hpp>
 
 #include "command_service.hpp"
 #include "irccd.hpp"
+#include "ip_transport_server.hpp"
 #include "logger.hpp"
 #include "transport_client.hpp"
-#include "transport_server.hpp"
 #include "transport_service.hpp"
 
+#if !defined(IRCCD_SYSTEM_WINDOWS)
+#   include "local_transport_server.hpp"
+#endif
+
+#if defined(HAVE_SSL)
+#   include "tls_transport_server.hpp"
+#endif
+
 namespace irccd {
 
 namespace {