// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // 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 is present in all copies. The // full license for this software is available in the LICENSE file. #pragma once #define HAVE_IRCD_NET_ACCEPTOR_H // This file is not included with the IRCd standard include stack because // it requires symbols we can't forward declare without boost headers. It // is part of the stack which can be included in your // definition file if you need low level access to this acceptor API. struct ircd::net::listener::acceptor :std::enable_shared_from_this { using error_code = boost::system::error_code; static log::log log; static conf::item timeout; net::listener *listener; std::string name; std::string opts; size_t backlog; listener::callback cb; listener::proffer pcb; asio::ssl::context ssl; ip::tcp::endpoint ep; ip::tcp::acceptor a; size_t accepting {0}; size_t handshaking {0}; bool interrupting {false}; bool handle_set {false}; ctx::dock joining; void configure(const json::object &opts); // Handshake stack void check_handshake_error(const error_code &ec, socket &); void handshake(const error_code &ec, std::shared_ptr, std::weak_ptr) noexcept; // Acceptance stack bool check_accept_error(const error_code &ec, socket &); void accept(const error_code &ec, std::shared_ptr, std::weak_ptr) noexcept; // Accept next bool set_handle(); // Acceptor shutdown bool interrupt() noexcept; void join() noexcept; acceptor(net::listener &, const string_view &name, const json::object &opts, listener::callback, listener::proffer); ~acceptor() noexcept; friend std::ostream &operator<<(std::ostream &s, const acceptor &); }; struct ircd::net::listener_udp::acceptor { using error_code = boost::system::error_code; static constexpr log::log &log {listener::acceptor::log}; static ip::udp::socket::message_flags flags(const flag &); std::string name; std::string opts; ip::udp::endpoint ep; ip::udp::socket a; size_t waiting {0}; ctx::dock joining; // Yield context for datagram. datagram &operator()(datagram &); // Acceptor shutdown bool interrupt() noexcept; void join() noexcept; acceptor(const string_view &name, const json::object &opts); ~acceptor() noexcept; friend std::ostream &operator<<(std::ostream &s, const acceptor &); };