include/boost/corosio/native/detail/native_socket_base.hpp

100.0% Lines (36/36) 93.1% List of functions (54/58) 48.7% Branches (76/156)
native_socket_base.hpp
f(x) Functions (58)
Function Calls Lines Branches Blocks
boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::native_socket_base() :64 124x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::native_socket_base() :64 157x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::native_socket_base() :64 14356x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::native_socket_base() :64 160x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::native_socket_base() :64 120x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::native_socket_base() :64 153x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::native_socket_base() :64 5330x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::native_socket_base() :64 155x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::~native_socket_base() :72 124x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::~native_socket_base() :72 157x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::~native_socket_base() :72 14356x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::~native_socket_base() :72 160x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::~native_socket_base() :72 120x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::~native_socket_base() :72 153x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::~native_socket_base() :72 5330x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::~native_socket_base() :72 155x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::native_handle() const :75 494x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::native_handle() const :75 455x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::native_handle() const :75 46913x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::native_handle() const :75 802x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::native_handle() const :75 475x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::native_handle() const :75 445x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::native_handle() const :75 16254x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::native_handle() const :75 782x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::local_endpoint() const :81 1x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::local_endpoint() const :81 2x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::local_endpoint() const :81 29x 0.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::local_endpoint() const :81 62x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::local_endpoint() const :81 1x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::local_endpoint() const :81 2x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::local_endpoint() const :81 29x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::local_endpoint() const :81 60x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::set_option(int, int, void const*, unsigned long) :93 11x 100.0% 33.3% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::set_option(int, int, void const*, unsigned long) :93 0 100.0% 0.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::set_option(int, int, void const*, unsigned long) :93 0 0.0% 0.0% 0.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::set_option(int, int, void const*, unsigned long) :93 44x 100.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::set_option(int, int, void const*, unsigned long) :93 11x 100.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::set_option(int, int, void const*, unsigned long) :93 0 0.0% 0.0% 0.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::set_option(int, int, void const*, unsigned long) :93 0 0.0% 0.0% 0.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::set_option(int, int, void const*, unsigned long) :93 41x 100.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::get_option(int, int, void*, unsigned long*) const :107 3x 100.0% 50.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::get_option(int, int, void*, unsigned long*) const :107 3x 100.0% 57.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::get_option(int, int, void*, unsigned long*) const :107 44x 85.7% 33.3% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::get_option(int, int, void*, unsigned long*) const :107 24x 100.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::get_option(int, int, void*, unsigned long*) const :107 3x 100.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::get_option(int, int, void*, unsigned long*) const :107 3x 85.7% 16.7% 57.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::get_option(int, int, void*, unsigned long*) const :107 44x 100.0% 66.7% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::get_option(int, int, void*, unsigned long*) const :107 23x 100.0% 85.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::set_socket(int) :118 12x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::set_socket(int) :118 4621x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::local_endpoint>::set_socket(int) :118 12x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::set_socket(int) :118 1727x 100.0% 100.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::do_bind(boost::corosio::local_endpoint const&) :137 30x 100.0% 60.0% 90.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::do_bind(boost::corosio::endpoint const&) :137 8x 100.0% 90.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::do_bind(boost::corosio::endpoint const&) :137 91x 100.0% 90.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::local_endpoint>::do_bind(boost::corosio::local_endpoint const&) :137 28x 100.0% 90.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::endpoint>::do_bind(boost::corosio::endpoint const&) :137 8x 100.0% 90.0% boost::corosio::detail::native_socket_base<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::endpoint>::do_bind(boost::corosio::endpoint const&) :137 86x 100.0% 90.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Michael Vandeberg
3 //
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)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #ifndef BOOST_COROSIO_NATIVE_DETAIL_NATIVE_SOCKET_BASE_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_NATIVE_SOCKET_BASE_HPP
12
13 #include <boost/corosio/detail/native_handle.hpp>
14 #include <boost/corosio/endpoint.hpp>
15 #include <boost/corosio/native/detail/endpoint_convert.hpp>
16 #include <boost/corosio/native/detail/make_err.hpp>
17
18 #include <memory>
19 #include <system_error>
20
21 #include <errno.h>
22 #include <sys/socket.h>
23
24 /*
25 Readiness/completion-agnostic socket base for the POSIX-fd backends.
26
27 Holds the part of a socket impl that does not care whether the backend
28 is readiness-based (epoll/kqueue/select, which park ops on a
29 descriptor_state) or completion-based (io_uring, which submits SQEs):
30 the file descriptor, the cached local endpoint, the impl lifecycle
31 bases (enable_shared_from_this + the service's intrusive tracking node),
32 and the synchronous accessors (native_handle / options / bind).
33
34 reactor_basic_socket derives from this and adds the readiness machinery
35 (descriptor_state, register_op, the cancel/close that deregister from
36 the reactor). io_uring's socket impls derive from it and add their op
37 slots + SQE submission. This is the socket-layer analogue of io_uring
38 deriving from reactor_scheduler: io_uring sockets share the reactor's
39 readiness-agnostic socket surface, while the on-EAGAIN action (park vs
40 submit-SQE) and the op model stay backend-specific.
41
42 @tparam Derived The concrete socket type (CRTP, for shared_from_this
43 and the intrusive node).
44 @tparam ImplBase The public vtable base (tcp_socket::implementation,
45 udp_socket::implementation, ...).
46 @tparam Endpoint The endpoint type (endpoint or local_endpoint).
47 */
48
49 namespace boost::corosio::detail {
50
51 template<class Derived, class ImplBase, class Endpoint = endpoint>
52 class native_socket_base
53 : public ImplBase
54 , public std::enable_shared_from_this<Derived>
55 {
56 protected:
57 // CRTP base: not publicly constructible. The check's preferred fix
58 // (private ctor + `friend Derived`) is infeasible here — the reactor
59 // sockets reach this base through intermediate templates
60 // (reactor_stream_socket -> reactor_basic_socket) that are not `Derived`,
61 // so a private ctor would stop those intermediates from constructing it.
62 // Protected is the correct access; suppress the private-only suggestion.
63 // NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility)
64 41110x native_socket_base() = default;
65
66 20555x int fd_ = -1;
67 // mutable so a derived const local_endpoint() override can lazily fill
68 // it via getsockname() on first read (io_uring's lazy_pending state).
69 mutable Endpoint local_endpoint_;
70
71 public:
72 20555x ~native_socket_base() override = default;
73
74 /// Return the underlying file descriptor.
75 66620x native_handle_type native_handle() const noexcept override
76 {
77 66620x return fd_;
78 }
79
80 /// Return the cached local endpoint.
81 186x Endpoint local_endpoint() const noexcept override
82 {
83 186x return local_endpoint_;
84 }
85
86 /// Return true if the socket has an open file descriptor.
87 bool is_open() const noexcept
88 {
89 return fd_ >= 0;
90 }
91
92 /// Set a socket option.
93 107x std::error_code set_option(
94 int level,
95 int optname,
96 void const* data,
97 std::size_t size) noexcept override
98 {
99
12/32
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 41 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 32 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 11 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 10 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 44 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 9 times.
✓ Branch 23 taken 35 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 11 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 time.
✓ Branch 31 taken 10 times.
107x if (::setsockopt(
100 107x fd_, level, optname, data, static_cast<socklen_t>(size)) != 0)
101
4/16
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 15 not taken.
20x return make_err(errno);
102 87x return {};
103 107x }
104
105 /// Get a socket option.
106 std::error_code
107 147x get_option(int level, int optname, void* data, std::size_t* size)
108 const noexcept override
109 {
110 147x socklen_t len = static_cast<socklen_t>(*size);
111
18/32
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 46 times.
✓ Branch 4 taken 67 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 65 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 20 taken 24 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 time.
✓ Branch 23 taken 23 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 time.
✓ Branch 31 taken 2 times.
147x if (::getsockopt(fd_, level, optname, data, &len) != 0)
112
6/16
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 15 not taken.
8x return make_err(errno);
113 139x *size = static_cast<std::size_t>(len);
114 139x return {};
115 147x }
116
117 /// Assign the file descriptor.
118 6372x void set_socket(int fd) noexcept
119 {
120 6372x fd_ = fd;
121 6372x }
122
123 /// Cache the local endpoint.
124 void set_local_endpoint(Endpoint ep) noexcept
125 {
126 local_endpoint_ = ep;
127 }
128
129 /** Bind the socket to a local endpoint.
130
131 Calls ::bind() and caches the resulting local endpoint via
132 getsockname(). Readiness-agnostic; usable by any fd backend.
133
134 @param ep The endpoint to bind to.
135 @return Error code on failure, empty on success.
136 */
137 251x std::error_code do_bind(Endpoint const& ep) noexcept
138 {
139 251x sockaddr_storage storage{};
140 251x socklen_t addrlen = to_sockaddr(ep, socket_family(fd_), storage);
141
18/24
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 86 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 84 times.
✓ Branch 8 taken 28 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 26 times.
✓ Branch 12 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✓ Branch 15 taken 5 times.
✓ Branch 16 taken 91 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 89 times.
✓ Branch 20 taken 30 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 28 times.
251x if (::bind(fd_, reinterpret_cast<sockaddr*>(&storage), addrlen) != 0)
142
6/12
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
14x return make_err(errno);
143
144 237x sockaddr_storage local_storage{};
145 237x socklen_t local_len = sizeof(local_storage);
146
12/24
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 84 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 84 times.
✓ Branch 8 taken 26 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 26 times.
✓ Branch 12 taken 5 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 5 times.
✓ Branch 16 taken 89 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 89 times.
✓ Branch 20 taken 28 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 28 times.
237x if (::getsockname(
147 237x fd_, reinterpret_cast<sockaddr*>(&local_storage), &local_len) ==
148 0)
149 237x local_endpoint_ =
150 237x from_sockaddr_as(local_storage, local_len, Endpoint{});
151
152 237x return {};
153 251x }
154 };
155
156 } // namespace boost::corosio::detail
157
158 #endif // BOOST_COROSIO_NATIVE_DETAIL_NATIVE_SOCKET_BASE_HPP
159