On 16/10/18 16:36 +0100, Jonathan Wakely wrote:
On 16/10/18 16:24 +0100, Jonathan Wakely wrote:
On 12/10/18 11:50 +0100, Jonathan Wakely wrote:
This implementation is very incomplete (see the various TODO comments
in the code) but rather than keeping it out of tree any longer I'm
committing it to trunk. This will allow others to experiment with it
and (I hope) work on finishing it. Either way we'll ship somehing for
gcc 9. It works OK for some synchronous operations, but most of the
async ops are not done yet.
* include/Makefile.am: Add new headers.
* include/Makefile.in: Regenerate.
* include/experimental/bits/net.h: New header for common
implementation details of Networking TS.
* include/experimental/buffer: New header.
* include/experimental/executor: New header.
* include/experimental/internet: New header.
* include/experimental/io_context: New header.
* include/experimental/net: New header.
* include/experimental/netfwd: New header.
* include/experimental/socket: New header.
* include/experimental/timer: New header.
* testsuite/experimental/net/buffer/arithmetic.cc: New test.
* testsuite/experimental/net/buffer/const.cc: New test.
* testsuite/experimental/net/buffer/creation.cc: New test.
* testsuite/experimental/net/buffer/mutable.cc: New test.
* testsuite/experimental/net/buffer/size.cc: New test.
* testsuite/experimental/net/buffer/traits.cc: New test.
* testsuite/experimental/net/execution_context/use_service.cc: New
test.
* testsuite/experimental/net/headers.cc: New test.
* testsuite/experimental/net/internet/address/v4/comparisons.cc: New
test.
* testsuite/experimental/net/internet/address/v4/cons.cc: New test.
* testsuite/experimental/net/internet/address/v4/creation.cc: New
test.
* testsuite/experimental/net/internet/address/v4/members.cc: New
test.
* testsuite/experimental/net/internet/resolver/base.cc: New test.
* testsuite/experimental/net/internet/resolver/ops/lookup.cc: New
test.
* testsuite/experimental/net/internet/resolver/ops/reverse.cc: New
test.
* testsuite/experimental/net/timer/waitable/cons.cc: New test.
* testsuite/experimental/net/timer/waitable/dest.cc: New test.
* testsuite/experimental/net/timer/waitable/ops.cc: New test.
A minor correction. Committed to trunk.
The tests were written three years ago, before we used effective
targets to control the C++14 dialect used for tests. This fixes them
to use the modern style.
And this makes it a bit more portable (but still a long way from
compiling for mingw).
Tested x86_64-linux and powerpc-aix, committed to trunk.
commit f0ac14c2e9591577c56d53c57a16e89737f3765b
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Tue Oct 16 14:41:20 2018 +0100
Use autoconf to check for features needed by Networking TS
* config.h.in: Regenerate.
* configure: Regenerate.
* configure.ac: Check for headers used by Networking TS.
* include/experimental/executor: Include <condition_variable>
instead of <mutex>.
* include/experimental/internet: Use autoconf macros for available
headers. Include <sys/socket.h> for. Remove <cstring> and use
__builtin_memcpy and __builtin_strchr.
(resolver_errc) [!_GLIBCXX_HAVE_NETDB_H]: Do not define.
(address_v4::to_string, address_v6::to_string)
[!_GLIBCXX_HAVE_ARPA_INET_H]: Likewise.
(basic_resolver_results) [!_GLIBCXX_HAVE_NETDB_H]: Make private
constructors report errors.
[!_GLIBCXX_HAVE_NETINET_TCP_H] (tcp::no_delay): Do not define.
* include/experimental/io_context: Likewise.
* include/experimental/socket: Likewise.
[!_GLIBCXX_HAVE_SYS_SOCKET_H, !_GLIBCXX_HAVE_POLL_H] (socket_base): Do
not define nested types when relevant header not available.
(__socket_impl::native_non_blocking) [!_GLIBCXX_HAVE_FCNTL_H]: Report
an error.
(__basic_socket_impl::open, __basic_socket_impl::local_endpoint)
(__basic_socket_impl::bind) [!_GLIBCXX_HAVE_SYS_SOCKET_H]: Likewise.
(__basic_socket_impl::io_control) [!_GLIBCXX_HAVE_SYS_IOCTL_H]:
Likewise.
(basic_socket::at_mark, basic_socket::shutdown)
(basic_socket::remote_endpoint, basic_socket::connect)
(basic_socket::async_connect) [!_GLIBCXX_HAVE_SYS_SOCKET_H]: Likewise.
(basic_socket::available) [_GLIBCXX_HAVE_SYS_IOCTL_H]: Check macro
for <sys/ioctl.h> availability.
(basic_socket::wait) [!_GLIBCXX_HAVE_POLL_H]: Likewise.
(basic_datagram_socket::receive, basic_datagram_socket::async_receive)
(basic_datagram_socket::receive_from)
(basic_datagram_socket::async_receive_from)
(basic_datagram_socket::send, basic_datagram_socket::async_send)
(basic_datagram_socket::send_to, basic_datagram_socket::async_send_to)
[!_GLIBCXX_HAVE_SYS_SOCKET_H]: Likewise.
(basic_stream_socket::receive, basic_stream_socket::async_receive)
(basic_stream_socket::send, basic_stream_socket::async_send)
[!_GLIBCXX_HAVE_SYS_SOCKET_H]: Likewise.
(basic_socket_acceptor::listen, basic_socket_acceptor::accept)
(basic_socket_acceptor::async_accept) [!_GLIBCXX_HAVE_SYS_SOCKET_H]:
Likewise.
(basic_socket_acceptor::wait) [!_GLIBCXX_HAVE_POLL_H]: Likewise.
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index e3612b036df..dbb7dbc137c 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -423,6 +423,9 @@ AC_CHECK_HEADERS([fcntl.h dirent.h sys/statvfs.h utime.h])
GLIBCXX_ENABLE_FILESYSTEM_TS
GLIBCXX_CHECK_FILESYSTEM_DEPS
+# For Networking TS.
+AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/socket.h sys/uio.h poll.h netdb.h arpa/inet.h netinet/in.h netinet/tcp.h])
+
# For Transactional Memory TS
GLIBCXX_CHECK_SIZE_T_MANGLING
diff --git a/libstdc++-v3/include/experimental/executor b/libstdc++-v3/include/experimental/executor
index cd4adb58b0d..db8df4b871b 100644
--- a/libstdc++-v3/include/experimental/executor
+++ b/libstdc++-v3/include/experimental/executor
@@ -34,10 +34,10 @@
#if __cplusplus >= 201402L
#include <algorithm>
+#include <condition_variable>
#include <functional>
#include <future>
#include <list>
-#include <mutex>
#include <queue>
#include <thread>
#include <tuple>
diff --git a/libstdc++-v3/include/experimental/internet b/libstdc++-v3/include/experimental/internet
index 07fe6140f30..402a0474a95 100644
--- a/libstdc++-v3/include/experimental/internet
+++ b/libstdc++-v3/include/experimental/internet
@@ -34,19 +34,28 @@
#if __cplusplus >= 201402L
#include <experimental/netfwd>
+#include <experimental/io_context>
+#include <experimental/bits/net.h>
#include <array>
#include <forward_list>
#include <sstream>
-#include <typeinfo>
-#include <cstring>
#include <cstdint>
-#include <experimental/io_context>
-#include <experimental/bits/net.h>
#include <experimental/string_view>
-#include <unistd.h>
-#include <arpa/inet.h>
-#include <netinet/tcp.h>
-#include <netdb.h>
+#ifdef _GLIBCXX_HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
+# include <sys/socket.h> // AF_INET, AF_INET6, SOCK_DGRAM, SOCK_STREAM
+#endif
+#ifdef _GLIBCXX_HAVE_ARPA_INET_H
+# include <arpa/inet.h> // inet_ntop
+#endif
+#ifdef _GLIBCXX_HAVE_NETINET_TCP_H
+# include <netinet/tcp.h> // TCP_NODELAY
+#endif
+#ifdef _GLIBCXX_HAVE_NETDB_H
+# include <netdb.h> // getaddrinfo etc.
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -65,6 +74,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @{
*/
+#ifdef _GLIBCXX_HAVE_NETDB_H
/** Error codes for resolver errors.
* @{
*/
@@ -95,6 +105,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return error_condition(static_cast<int>(__e), resolver_category()); }
/// @}
+#endif
typedef uint_least16_t port_type; ///< Type used for port numbers.
typedef uint_least32_t scope_id_type; ///< Type used for IPv6 scope IDs.
@@ -182,6 +193,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr uint_type to_uint() const noexcept { return _S_ntoh(_M_addr); }
+#ifdef _GLIBCXX_HAVE_ARPA_INET_H
template<typename _Allocator = allocator<char>>
__string_with<_Allocator>
to_string(const _Allocator& __a = _Allocator()) const
@@ -194,6 +206,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__str.resize(0);
return __str;
}
+#endif
// static members:
static constexpr address_v4 any() noexcept { return address_v4{}; }
@@ -321,6 +334,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr bytes_type to_bytes() const noexcept { return _M_bytes; }
+#ifdef _GLIBCXX_HAVE_ARPA_INET_H
template<typename _Allocator = allocator<char>>
__string_with<_Allocator>
to_string(const _Allocator& __a = _Allocator()) const
@@ -333,13 +347,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__str.resize(0);
return __str;
}
+#endif
// static members:
static constexpr address_v6
any() noexcept
{
address_v6 __addr;
- std::memcpy(&__addr._M_bytes, in6addr_any.s6_addr, 16);
+ __builtin_memcpy(&__addr._M_bytes, in6addr_any.s6_addr, 16);
return __addr;
}
@@ -347,7 +362,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
loopback() noexcept
{
address_v6 __addr;
- std::memcpy(&__addr._M_bytes, in6addr_loopback.s6_addr, 16);
+ __builtin_memcpy(&__addr._M_bytes, in6addr_loopback.s6_addr, 16);
return __addr;
}
@@ -717,7 +732,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline address_v6
make_address_v6(const char* __str, error_code& __ec) noexcept
{
- auto __p = std::strchr(__str, '%');
+ auto __p = __builtin_strchr(__str, '%');
if (__p == nullptr)
return __make_address_v6(__str, nullptr, __ec);
char __buf[64];
@@ -1400,8 +1415,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_data._M_v6 = {};
_M_data._M_v6.sin6_family = protocol_type::v6().family();
_M_data._M_v6.sin6_port = address_v4::_S_hton(__port_num);
- std::memcpy(_M_data._M_v6.sin6_addr.s6_addr,
- __addr._M_v6._M_bytes.data(), 16);
+ __builtin_memcpy(_M_data._M_v6.sin6_addr.s6_addr,
+ __addr._M_v6._M_bytes.data(), 16);
_M_data._M_v6.sin6_scope_id = __addr._M_v6._M_scope_id;
}
}
@@ -1419,14 +1434,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
ip::address __addr;
if (protocol().family() == AF_INET6)
{
- std::memcpy(&__addr._M_v6._M_bytes,
- _M_data._M_v6.sin6_addr.s6_addr, 16);
+ __builtin_memcpy(&__addr._M_v6._M_bytes,
+ _M_data._M_v6.sin6_addr.s6_addr, 16);
__addr._M_is_v4 = false;
}
else
{
- std::memcpy(&__addr._M_v4._M_addr,
- &_M_data._M_v4.sin_addr.s_addr, 4);
+ __builtin_memcpy(&__addr._M_v4._M_addr,
+ &_M_data._M_v4.sin_addr.s_addr, 4);
}
return __addr;
}
@@ -1438,8 +1453,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
_M_data._M_v6 = {};
_M_data._M_v6.sin6_family = protocol_type::v6().family();
- std::memcpy(_M_data._M_v6.sin6_addr.s6_addr,
- __addr._M_v6._M_bytes.data(), 16);
+ __builtin_memcpy(_M_data._M_v6.sin6_addr.s6_addr,
+ __addr._M_v6._M_bytes.data(), 16);
_M_data._M_v6.sin6_scope_id = __addr._M_v6._M_scope_id;
}
else
@@ -1660,7 +1675,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
operator^=(resolver_base::flags& __f1, resolver_base::flags __f2)
{ return __f1 = (__f1 ^ __f2); }
- // TODO define resolver_base::flags static constants
+ // TODO define resolver_base::flags static constants for C++14 mode
// @}
@@ -1898,6 +1913,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
resolver_base::flags __f, error_code& __ec,
protocol_type* __protocol)
{
+#ifdef _GLIBCXX_HAVE_NETDB_H
string __host;
const char* __h = __host_name.data()
? (__host = __host_name.to_string()).c_str()
@@ -1943,12 +1959,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if (__ai->ai_family == AF_INET || __ai->ai_family == AF_INET6)
{
if (__ai->ai_addrlen <= __ep.capacity())
- std::memcpy(__ep.data(), __ai->ai_addr, __ai->ai_addrlen);
+ __builtin_memcpy(__ep.data(), __ai->ai_addr, __ai->ai_addrlen);
__ep.resize(__ai->ai_addrlen);
__tail = _M_results.emplace_after(__tail, __ep, __host, __svc);
_M_size++;
}
}
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
/// Private constructor to synchronously resolve an endpoint.
@@ -1956,6 +1975,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
basic_resolver_results<_InternetProtocol>::
basic_resolver_results(const endpoint_type& __ep, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_NETDB_H
char __host_name[256];
char __service_name[128];
int __flags = 0;
@@ -1982,6 +2002,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_results.emplace_front(__ep, __host_name, __service_name);
_M_size = 1;
}
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
/** The name of the local host.
@@ -2030,6 +2053,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef basic_socket_acceptor<tcp> acceptor; ///< A TCP acceptor.
typedef basic_socket_iostream<tcp> iostream; /// A TCP iostream.
+#ifdef _GLIBCXX_HAVE_NETINET_TCP_H
/// Disable coalescing of small segments (i.e. the Nagle algorithm).
struct no_delay : __sockopt_crtp<no_delay, bool>
{
@@ -2038,6 +2062,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static const int _S_level = IPPROTO_TCP;
static const int _S_name = TCP_NODELAY;
};
+#endif
// static members:
diff --git a/libstdc++-v3/include/experimental/io_context b/libstdc++-v3/include/experimental/io_context
index 7b42442a034..b8d231f7e68 100644
--- a/libstdc++-v3/include/experimental/io_context
+++ b/libstdc++-v3/include/experimental/io_context
@@ -41,9 +41,15 @@
#include <thread>
#include <experimental/netfwd>
#include <experimental/executor>
-#include <unistd.h>
-#include <poll.h>
-#include <fcntl.h>
+#if _GLIBCXX_HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef _GLIBCXX_HAVE_POLL_H
+# include <poll.h>
+#endif
+#ifdef _GLIBCXX_HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -775,6 +781,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_notify();
}
+# ifdef _GLIBCXX_HAVE_POLL_H
using __fdvec = vector<::pollfd>;
// Find first element p such that !(p.fd < __fd)
@@ -823,6 +830,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
__fdvec _M_fds; // _M_fds.back() is the read end of the self-pipe
+#endif
int _M_notify_wr; // write end of the self-pipe
};
diff --git a/libstdc++-v3/include/experimental/socket b/libstdc++-v3/include/experimental/socket
index e92a4374db9..e903eb824b2 100644
--- a/libstdc++-v3/include/experimental/socket
+++ b/libstdc++-v3/include/experimental/socket
@@ -42,11 +42,21 @@
#include <bits/unique_ptr.h>
#if _GLIBCXX_HAVE_UNISTD_H
# include <unistd.h>
-# include <sys/socket.h>
-# include <sys/ioctl.h>
-# include <sys/fcntl.h>
-# include <sys/uio.h>
-# include <poll.h>
+# ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
+# include <sys/socket.h> // socket etc
+# endif
+# ifdef _GLIBCXX_HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h> // ioctl
+# endif
+# ifdef _GLIBCXX_HAVE_SYS_UIO_H
+# include <sys/uio.h> // iovec
+# endif
+# ifdef _GLIBCXX_HAVE_POLL_H
+# include <poll.h> // poll, pollfd, POLLIN, POLLOUT, POLLERR
+# endif
+# ifdef _GLIBCXX_HAVE_FCNTL_H
+# include <fcntl.h> // fcntl, F_GETFL, F_SETFL
+# endif
#endif
namespace std _GLIBCXX_VISIBILITY(default)
@@ -139,6 +149,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
class socket_base
{
public:
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
struct broadcast : __sockopt_crtp<broadcast, bool>
{
using __sockopt_crtp::__sockopt_crtp;
@@ -261,6 +272,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static constexpr shutdown_type shutdown_send = __shutdown_send;
static constexpr shutdown_type shutdown_both = __shutdown_both;
+#ifdef _GLIBCXX_HAVE_POLL_H
enum wait_type : int
{
__wait_read = POLLIN,
@@ -270,6 +282,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static constexpr wait_type wait_read = __wait_read;
static constexpr wait_type wait_write = __wait_write;
static constexpr wait_type wait_error = __wait_error;
+#endif
enum message_flags : int
{
@@ -282,11 +295,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static constexpr message_flags message_do_not_route = __message_dontroute;
static const int max_listen_connections = SOMAXCONN;
+#endif
protected:
socket_base() = default;
~socket_base() = default;
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
struct __msg_hdr : ::msghdr
{
#ifdef IOV_MAX
@@ -342,6 +357,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
this->msg_namelen = __ep.size();
}
};
+#endif
};
constexpr socket_base::message_flags
@@ -440,6 +456,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
native_non_blocking(bool __mode, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_FCNTL_H
int __flags = ::fcntl(_M_sockfd, F_GETFL, 0);
if (__flags >= 0)
{
@@ -456,11 +473,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.clear();
_M_bits.native_non_blocking = __mode;
}
+#else
+ __ec = std::make_error_code(std::errc::not_supported);
+#endif
}
bool
native_non_blocking() const
{
+#ifdef _GLIBCXX_HAVE_FCNTL_H
if (_M_bits.native_non_blocking == -1)
{
const int __flags = ::fcntl(_M_sockfd, F_GETFL, 0);
@@ -469,6 +490,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_bits.native_non_blocking = __flags & O_NONBLOCK;
}
return _M_bits.native_non_blocking;
+#else
+ return false;
+#endif
}
io_context* _M_ctx;
@@ -517,6 +541,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
open(const protocol_type& __protocol, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
if (is_open())
__ec = socket_errc::already_open;
else
@@ -532,6 +557,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
__ec.assign(errno, std::generic_category());
}
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
void
@@ -588,18 +616,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
io_control(_IoControlCommand& __command, error_code& __ec)
{
- int __result = ::ioctl(_M_sockfd, __command.name(_M_protocol),
- __command.data(_M_protocol));
+#ifdef _GLIBCXX_HAVE_SYS_IOCTL_H
+ int __result = ::ioctl(_M_sockfd, __command.name(),
+ __command.data());
if (__result == -1)
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(std::errc::not_supported);
+#endif
}
endpoint_type
local_endpoint(error_code& __ec) const
{
endpoint_type __endpoint;
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socklen_t __endpoint_len = __endpoint.capacity();
if (::getsockname(_M_sockfd, (sockaddr*)__endpoint.data(),
&__endpoint_len) == -1)
@@ -609,17 +642,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
__ec.clear();
__endpoint.resize(__endpoint_len);
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
return __endpoint;
}
void
bind(const endpoint_type& __endpoint, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
if (::bind(_M_sockfd, (sockaddr*)__endpoint.data(), __endpoint.size())
== -1)
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
_Protocol _M_protocol{ endpoint_type{}.protocol() };
@@ -754,6 +794,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool
at_mark(error_code& __ec) const
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
const int __result = ::sockatmark(native_handle());
if (__result == -1)
{
@@ -762,6 +803,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
__ec.clear();
return (bool)__result;
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+ return false;
+#endif
}
size_t
@@ -776,7 +821,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec = std::make_error_code(errc::bad_file_descriptor);
return 0;
}
-#ifdef FIONREAD
+#if defined _GLIBCXX_HAVE_SYS_IOCTL_H && defined FIONREAD
int __avail = 0;
if (::ioctl(this->_M_sockfd, FIONREAD, &__avail) == -1)
{
@@ -804,10 +849,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
shutdown(shutdown_type __what, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
if (::shutdown(native_handle(), static_cast<int>(__what)) == -1)
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
endpoint_type
@@ -832,6 +881,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
remote_endpoint(error_code& __ec) const
{
endpoint_type __endpoint;
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socklen_t __endpoint_len = __endpoint.capacity();
if (::getpeername(this->_M_sockfd, (sockaddr*)__endpoint.data(),
&__endpoint_len)
@@ -842,6 +892,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
__ec.clear();
__endpoint.resize(__endpoint_len);
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
return __endpoint;
}
@@ -860,11 +913,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if (__ec)
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
if (::connect(native_handle(), (const sockaddr*)__endpoint.data(),
__endpoint.size()) == -1)
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
template<typename _CompletionToken>
@@ -898,9 +955,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ep = std::move(__endpoint),
__fd = native_handle()]
(error_code __ec) mutable {
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
if (!__ec && ::connect(__fd, (const sockaddr*)__ep.data(),
__ep.size()) == -1)
__ec.assign(errno, generic_category());
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
__h(__ec);
});
return __init.result.get();
@@ -913,6 +974,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
wait(wait_type __w, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_POLL_H
::pollfd __fd;
__fd.fd = native_handle();
__fd.events = static_cast<int>(__w);
@@ -921,6 +983,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
template<typename _CompletionToken>
@@ -1060,6 +1125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
receive(const _MutableBufferSequence& __buffers,
socket_base::message_flags __flags, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::recvmsg(this->native_handle(), &__msg,
static_cast<int>(__flags));
@@ -1070,6 +1136,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
__ec.clear();
return __result;
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+ return 0;
+#endif
}
template<typename _MutableBufferSequence, typename _CompletionToken>
@@ -1101,6 +1171,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec);
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::recvmsg(__fd, &__msg, __flags);
if (__result == -1)
@@ -1111,6 +1182,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
__ec.clear();
__h(__ec, __result);
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -1153,6 +1227,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
socket_base::message_flags __flags,
error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers, __sender);
ssize_t __result = ::recvmsg(this->native_handle(), &__msg,
static_cast<int>(__flags));
@@ -1164,6 +1239,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.clear();
__sender.resize(__msg.msg_namelen);
return __result;
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+ return 0;
+#endif
}
template<typename _MutableBufferSequence, typename _CompletionToken>
@@ -1199,6 +1278,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec);
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers, __sender);
ssize_t __result = ::recvmsg(__fd, &__msg, __flags);
if (__result == -1)
@@ -1212,6 +1292,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__sender.resize(__msg.msg_namelen);
}
__h(__ec, __result);
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -1243,6 +1326,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
send(const _ConstBufferSequence& __buffers,
socket_base::message_flags __flags, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::sendmsg(this->native_handle(), &__msg,
static_cast<int>(__flags));
@@ -1253,6 +1337,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
__ec.clear();
return __result;
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+ return 0;
+#endif
}
template<typename _ConstBufferSequence, typename _CompletionToken>
@@ -1284,6 +1372,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec);
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::sendmsg(__fd, &__msg, __flags);
if (__result == -1)
@@ -1294,6 +1383,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
__ec.clear();
__h(__ec, __result);
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -1333,6 +1425,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const endpoint_type& __recipient,
socket_base::message_flags __flags, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers, __recipient);
ssize_t __result = ::sendmsg(this->native_handle(), &__msg,
static_cast<int>(__flags));
@@ -1344,6 +1437,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.clear();
__recipient.resize(__msg.msg_namelen);
return __result;
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+ return 0;
+#endif
}
template<typename _ConstBufferSequence, typename _CompletionToken>
@@ -1379,6 +1476,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec);
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers, __recipient);
ssize_t __result = ::sendmsg(__fd, &__msg, __flags);
if (__result == -1)
@@ -1392,6 +1490,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__recipient.resize(__msg.msg_namelen);
}
__h(__ec, __result);
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -1482,7 +1583,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.clear();
return 0;
}
-
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::recvmsg(this->native_handle(), &__msg,
static_cast<int>(__flags));
@@ -1492,6 +1593,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return __result;
}
__ec.assign(errno, generic_category());
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
return 0;
}
@@ -1536,6 +1640,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec);
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::recvmsg(__fd, &__msg, __flags);
if (__result == -1)
@@ -1546,6 +1651,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
__ec.clear();
__h(__ec, __result);
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -1582,7 +1690,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.clear();
return 0;
}
-
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::sendmsg(this->native_handle(), &__msg,
static_cast<int>(__flags));
@@ -1592,6 +1700,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return __result;
}
__ec.assign(errno, generic_category());
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
return 0;
}
@@ -1636,6 +1747,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec);
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
socket_base::__msg_hdr __msg(__buffers);
ssize_t __result = ::sendmsg(__fd, &__msg, __flags);
if (__result == -1)
@@ -1646,6 +1758,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
__ec.clear();
__h(__ec, __result);
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -1889,12 +2004,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__throw_on_error{"basic_socket_acceptor::listen"});
}
- void listen(int __backlog, error_code& __ec)
+ void
+ listen(int __backlog, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
if (::listen(native_handle(), __backlog) == -1)
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
endpoint_type
@@ -1933,6 +2053,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
socket_type
accept(io_context& __ctx, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
do
{
int __h = ::accept(native_handle(), nullptr, 0);
@@ -1943,6 +2064,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
} while (errno == ECONNABORTED && enable_connection_aborted());
__ec.assign(errno, generic_category());
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
return socket_type{__ctx};
}
@@ -1975,6 +2099,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec, socket_type(__ctx));
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
do
{
int __newfd = ::accept(__fd, nullptr, 0);
@@ -1987,6 +2112,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
} while (errno == ECONNABORTED && __connabort);
__ec.assign(errno, generic_category());
__h(__ec, socket_type(__ctx));
+#else
+ __h(std::make_error_code(errc::operation_not_supported), 0);
+#endif
});
return __init.result.get();
}
@@ -2012,6 +2140,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
socket_type
accept(io_context& __ctx, endpoint_type& __endpoint, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
do
{
socklen_t __len = __endpoint.capacity();
@@ -2024,6 +2153,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
} while (errno == ECONNABORTED && enable_connection_aborted());
__ec.assign(errno, generic_category());
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
return socket_type{__ctx};
}
@@ -2058,6 +2190,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__h(__ec, socket_type(__ctx));
return;
}
+#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
do
{
socklen_t __len = __ep.capacity();
@@ -2072,6 +2205,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
} while (errno == ECONNABORTED && __connabort);
__ec.assign(errno, generic_category());
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
__h(__ec, socket_type(__ctx));
});
return __init.result.get();
@@ -2084,6 +2220,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
wait(wait_type __w, error_code& __ec)
{
+#ifdef _GLIBCXX_HAVE_POLL_H
::pollfd __fds;
__fds.fd = native_handle();
__fds.events = __w; // __w | POLLIN;
@@ -2091,6 +2228,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ec.assign(errno, generic_category());
else
__ec.clear();
+#else
+ __ec = std::make_error_code(errc::operation_not_supported);
+#endif
}
template<class _CompletionToken>