100.00% Lines (2/2) 100.00% Functions (2/2)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2026 Steve Gerbino 2   // Copyright (c) 2026 Steve Gerbino
3   // 3   //
4   // Distributed under the Boost Software License, Version 1.0. (See accompanying 4   // Distributed under the Boost Software License, Version 1.0. (See accompanying
5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6   // 6   //
7   // Official repository: https://github.com/cppalliance/corosio 7   // Official repository: https://github.com/cppalliance/corosio
8   // 8   //
9   9  
10   #ifndef BOOST_COROSIO_DETAIL_TCP_ACCEPTOR_SERVICE_HPP 10   #ifndef BOOST_COROSIO_DETAIL_TCP_ACCEPTOR_SERVICE_HPP
11   #define BOOST_COROSIO_DETAIL_TCP_ACCEPTOR_SERVICE_HPP 11   #define BOOST_COROSIO_DETAIL_TCP_ACCEPTOR_SERVICE_HPP
12   12  
13   #include <boost/corosio/detail/config.hpp> 13   #include <boost/corosio/detail/config.hpp>
14   #include <boost/corosio/tcp_acceptor.hpp> 14   #include <boost/corosio/tcp_acceptor.hpp>
15   #include <boost/corosio/endpoint.hpp> 15   #include <boost/corosio/endpoint.hpp>
16   #include <boost/capy/ex/execution_context.hpp> 16   #include <boost/capy/ex/execution_context.hpp>
17   #include <system_error> 17   #include <system_error>
18   18  
19   namespace boost::corosio::detail { 19   namespace boost::corosio::detail {
20   20  
21   /** Abstract acceptor service base class. 21   /** Abstract acceptor service base class.
22   22  
23   Concrete implementations ( epoll_acceptors, select_acceptors, etc. ) 23   Concrete implementations ( epoll_acceptors, select_acceptors, etc. )
24   inherit from this class and provide platform-specific acceptor 24   inherit from this class and provide platform-specific acceptor
25   operations. The context constructor installs whichever backend 25   operations. The context constructor installs whichever backend
26   via `make_service`, and `tcp_acceptor.cpp` retrieves it via 26   via `make_service`, and `tcp_acceptor.cpp` retrieves it via
27   `use_service<tcp_acceptor_service>()`. 27   `use_service<tcp_acceptor_service>()`.
28   */ 28   */
29   class BOOST_COROSIO_DECL tcp_acceptor_service 29   class BOOST_COROSIO_DECL tcp_acceptor_service
30   : public capy::execution_context::service 30   : public capy::execution_context::service
31   , public io_object::io_service 31   , public io_object::io_service
32   { 32   {
33   public: 33   public:
34   /// Identifies this service for `execution_context` lookup. 34   /// Identifies this service for `execution_context` lookup.
35   using key_type = tcp_acceptor_service; 35   using key_type = tcp_acceptor_service;
36   36  
37   /** Create the acceptor socket without binding or listening. 37   /** Create the acceptor socket without binding or listening.
38   38  
39   Creates a socket with dual-stack enabled for IPv6 but does 39   Creates a socket with dual-stack enabled for IPv6 but does
40   not bind or listen. Does not set SO_REUSEADDR. 40   not bind or listen. Does not set SO_REUSEADDR.
41   41  
42   @param impl The acceptor implementation to open. 42   @param impl The acceptor implementation to open.
43   @param family Address family (e.g. `AF_INET`, `AF_INET6`). 43   @param family Address family (e.g. `AF_INET`, `AF_INET6`).
44   @param type Socket type (e.g. `SOCK_STREAM`). 44   @param type Socket type (e.g. `SOCK_STREAM`).
45   @param protocol Protocol number (e.g. `IPPROTO_TCP`). 45   @param protocol Protocol number (e.g. `IPPROTO_TCP`).
46   @return Error code on failure, empty on success. 46   @return Error code on failure, empty on success.
47   */ 47   */
48   virtual std::error_code open_acceptor_socket( 48   virtual std::error_code open_acceptor_socket(
49   tcp_acceptor::implementation& impl, 49   tcp_acceptor::implementation& impl,
50   int family, 50   int family,
51   int type, 51   int type,
52   int protocol) = 0; 52   int protocol) = 0;
53   53  
  54 + /** Adopt an existing listening socket.
  55 +
  56 + Validates @p fd, closes any socket the implementation already
  57 + holds, and registers the adopted descriptor with the backend.
  58 + Listen state is not verified.
  59 +
  60 + @param impl The acceptor implementation to assign to.
  61 + @param fd The native socket to adopt. Ownership transfers only
  62 + on success.
  63 + @return Error code on failure, empty on success.
  64 + */
  65 + virtual std::error_code assign_socket(
  66 + tcp_acceptor::implementation& impl,
  67 + native_handle_type fd) = 0;
  68 +
54   /** Bind an open acceptor to a local endpoint. 69   /** Bind an open acceptor to a local endpoint.
55   70  
56   @param impl The acceptor implementation to bind. 71   @param impl The acceptor implementation to bind.
57   @param ep The local endpoint to bind to. 72   @param ep The local endpoint to bind to.
58   @return Error code on failure, empty on success. 73   @return Error code on failure, empty on success.
59   */ 74   */
60   virtual std::error_code 75   virtual std::error_code
61   bind_acceptor(tcp_acceptor::implementation& impl, endpoint ep) = 0; 76   bind_acceptor(tcp_acceptor::implementation& impl, endpoint ep) = 0;
62   77  
63   /** Start listening for incoming connections. 78   /** Start listening for incoming connections.
64   79  
65   Registers the acceptor with the platform reactor after 80   Registers the acceptor with the platform reactor after
66   calling `::listen()`. 81   calling `::listen()`.
67   82  
68   @param impl The acceptor implementation to listen on. 83   @param impl The acceptor implementation to listen on.
69   @param backlog The maximum length of the pending connection queue. 84   @param backlog The maximum length of the pending connection queue.
70   @return Error code on failure, empty on success. 85   @return Error code on failure, empty on success.
71   */ 86   */
72   virtual std::error_code 87   virtual std::error_code
73   listen_acceptor(tcp_acceptor::implementation& impl, int backlog) = 0; 88   listen_acceptor(tcp_acceptor::implementation& impl, int backlog) = 0;
74   89  
75   protected: 90   protected:
76   /// Construct the acceptor service. 91   /// Construct the acceptor service.
HITCBC 77   1450 tcp_acceptor_service() = default; 92   1533 tcp_acceptor_service() = default;
78   93  
79   /// Destroy the acceptor service. 94   /// Destroy the acceptor service.
HITCBC 80   1450 ~tcp_acceptor_service() override = default; 95   1533 ~tcp_acceptor_service() override = default;
81   }; 96   };
82   97  
83   } // namespace boost::corosio::detail 98   } // namespace boost::corosio::detail
84   99  
85   #endif // BOOST_COROSIO_DETAIL_TCP_ACCEPTOR_SERVICE_HPP 100   #endif // BOOST_COROSIO_DETAIL_TCP_ACCEPTOR_SERVICE_HPP