changeset 537:a4193cbce05d

Irccd: use unique_ptr for transport_server While here fix some issues: - server-list command was incorrect, - remove the local_transport_server file before binding.
author David Demelier <markand@malikania.fr>
date Sun, 19 Nov 2017 09:16:05 +0100
parents 623cb5d831d2
children 5c92ebd4423c
files irccd/main.cpp libirccd/irccd/command.cpp libirccd/irccd/config.cpp libirccd/irccd/config.hpp libirccd/irccd/transport_service.cpp libirccd/irccd/transport_service.hpp
diffstat 6 files changed, 34 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/main.cpp	Fri Nov 17 20:47:36 2017 +0100
+++ b/irccd/main.cpp	Sun Nov 19 09:16:05 2017 +0100
@@ -272,8 +272,7 @@
     load_foreground(config.is_foreground(), options);
 
     // [transport]
-    for (const auto& transport : config.load_transports(*instance))
-        instance->transports().add(transport);
+    config.load_transports(*instance);
 
     // [server] section.
     for (const auto& server : config.load_servers())
--- a/libirccd/irccd/command.cpp	Fri Nov 17 20:47:36 2017 +0100
+++ b/libirccd/irccd/command.cpp	Sun Nov 19 09:16:05 2017 +0100
@@ -373,7 +373,7 @@
 
     client.send({
         { "command",    "server-list"   },
-        { "list",       std::move(json) }
+        { "list",       std::move(list) }
     });
 }
 
--- a/libirccd/irccd/config.cpp	Fri Nov 17 20:47:36 2017 +0100
+++ b/libirccd/irccd/config.cpp	Sun Nov 19 09:16:05 2017 +0100
@@ -31,6 +31,7 @@
 #include "sysconfig.hpp"
 #include "system.hpp"
 #include "transport_server.hpp"
+#include "transport_service.hpp"
 
 namespace irccd {
 
@@ -119,11 +120,11 @@
 #endif // !HAVE_SYSLOG
 }
 
-std::shared_ptr<transport_server> load_transport_ip(boost::asio::io_service& service, const ini::section& sc)
+std::unique_ptr<transport_server> load_transport_ip(boost::asio::io_service& service, const ini::section& sc)
 {
     assert(sc.key() == "transport");
 
-    std::shared_ptr<transport_server> transport;
+    std::unique_ptr<transport_server> transport;
     ini::section::const_iterator it;
 
     // Port.
@@ -195,7 +196,7 @@
     boost::asio::ip::tcp::acceptor acceptor(service, endpoint, true);
 
     if (pkey.empty())
-        return std::make_shared<tcp_transport_server>(std::move(acceptor));
+        return std::make_unique<tcp_transport_server>(std::move(acceptor));
 
 #if defined(HAVE_SSL)
     boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);
@@ -203,13 +204,13 @@
     ctx.use_private_key_file(pkey, boost::asio::ssl::context::pem);
     ctx.use_certificate_file(cert, boost::asio::ssl::context::pem);
 
-    return std::make_shared<tls_transport_server>(std::move(acceptor), std::move(ctx));
+    return std::make_unique<tls_transport_server>(std::move(acceptor), std::move(ctx));
 #else
     throw std::invalid_argument("transport: SSL disabled");
 #endif
 }
 
-std::shared_ptr<transport_server> load_transport_unix(boost::asio::io_service& service, const ini::section& sc)
+std::unique_ptr<transport_server> load_transport_unix(boost::asio::io_service& service, const ini::section& sc)
 {
     using boost::asio::local::stream_protocol;
 
@@ -221,10 +222,13 @@
     if (it == sc.end())
         throw std::invalid_argument("transport: missing 'path' parameter");
 
+    // Remove the file first.
+    std::remove(it->value().c_str());
+
     stream_protocol::endpoint endpoint(it->value());
     stream_protocol::acceptor acceptor(service, std::move(endpoint));
 
-    return std::make_shared<local_transport_server>(std::move(acceptor));
+    return std::make_unique<local_transport_server>(std::move(acceptor));
 #else
     (void)sc;
 
@@ -232,11 +236,11 @@
 #endif
 }
 
-std::shared_ptr<transport_server> load_transport(boost::asio::io_service& service, const ini::section& sc)
+std::unique_ptr<transport_server> load_transport(boost::asio::io_service& service, const ini::section& sc)
 {
     assert(sc.key() == "transport");
 
-    std::shared_ptr<transport_server> transport;
+    std::unique_ptr<transport_server> transport;
     ini::section::const_iterator it = sc.find("type");
 
     if (it == sc.end())
@@ -493,15 +497,11 @@
     log::set_filter(std::move(filter));
 }
 
-std::vector<std::shared_ptr<transport_server>> config::load_transports(irccd& irccd) const
+void config::load_transports(irccd& irccd) const
 {
-    std::vector<std::shared_ptr<transport_server>> transports;
-
     for (const auto& section : document_)
         if (section.key() == "transport")
-            transports.push_back(load_transport(irccd.service(), section));
-
-    return transports;
+            irccd.transports().add(load_transport(irccd.service(), section));
 }
 
 std::vector<rule> config::load_rules() const
--- a/libirccd/irccd/config.hpp	Fri Nov 17 20:47:36 2017 +0100
+++ b/libirccd/irccd/config.hpp	Sun Nov 19 09:16:05 2017 +0100
@@ -147,9 +147,8 @@
      * Load transports.
      *
      * \param irccd the irccd instance
-     * \return the set of transports
      */
-    std::vector<std::shared_ptr<transport_server>> load_transports(irccd& irccd) const;
+    void load_transports(irccd& irccd) const;
 
     /**
      * Load rules.
--- a/libirccd/irccd/transport_service.cpp	Fri Nov 17 20:47:36 2017 +0100
+++ b/libirccd/irccd/transport_service.cpp	Sun Nov 19 09:16:05 2017 +0100
@@ -34,11 +34,8 @@
 
     irccd_.post([=] (irccd&) {
         auto name = object.find("command");
-        if (name == object.end() || !name->is_string()) {
-            // TODO: send error.
-            log::warning("invalid command object");
+        if (name == object.end() || !name->is_string())
             return;
-        }
 
         auto cmd = irccd_.commands().find(*name);
 
@@ -54,12 +51,12 @@
     });
 }
 
-void transport_service::do_accept(std::shared_ptr<transport_server> ts)
+void transport_service::do_accept(transport_server& ts)
 {
-    ts->accept([this, ts] (auto client, auto code) {
-        if (code) {
+    ts.accept([this, &ts] (auto client, auto code) {
+        if (code)
             log::warning() << "transport: " << code.message() << std::endl;
-        } else {
+        else {
             client->recv([this, client] (auto json, auto code) {
                 if (code)
                     log::warning() << "transport: " << code.message() << std::endl;
@@ -77,11 +74,13 @@
 {
 }
 
-void transport_service::add(std::shared_ptr<transport_server> ts)
+transport_service::~transport_service() noexcept = default;
+
+void transport_service::add(std::unique_ptr<transport_server> ts)
 {
     assert(ts);
 
-    do_accept(ts);
+    do_accept(*ts);
     servers_.push_back(std::move(ts));
 }
 
--- a/libirccd/irccd/transport_service.hpp	Fri Nov 17 20:47:36 2017 +0100
+++ b/libirccd/irccd/transport_service.hpp	Sun Nov 19 09:16:05 2017 +0100
@@ -35,14 +35,14 @@
  */
 class transport_service {
 public:
-    using servers_t = std::vector<std::shared_ptr<transport_server>>;
+    using servers_t = std::vector<std::unique_ptr<transport_server>>;
 
 private:
     irccd& irccd_;
     servers_t servers_;
 
     void handle_command(std::shared_ptr<transport_client>, const nlohmann::json&);
-    void do_accept(std::shared_ptr<transport_server>);
+    void do_accept(transport_server&);
 
 public:
     /**
@@ -53,11 +53,16 @@
     transport_service(irccd& irccd) noexcept;
 
     /**
+     * Default destructor.
+     */
+    ~transport_service() noexcept;
+
+    /**
      * Add a transport server.
      *
      * \param ts the transport server
      */
-    void add(std::shared_ptr<transport_server> ts);
+    void add(std::unique_ptr<transport_server> ts);
 
     /**
      * Send data to all clients.