Mercurial > irccd
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.