Commit 244fffa6 authored by Joseph Noir's avatar Joseph Noir

Fix agnostic socket handling on windows

parent cf0e7e2c
...@@ -1317,7 +1317,7 @@ expected<void> set_inaddr_any(native_socket fd, sockaddr_in6& sa) { ...@@ -1317,7 +1317,7 @@ expected<void> set_inaddr_any(native_socket fd, sockaddr_in6& sa) {
template <int Family> template <int Family>
expected<native_socket> new_ip_acceptor_impl(uint16_t port, const char* addr, expected<native_socket> new_ip_acceptor_impl(uint16_t port, const char* addr,
bool reuse_addr) { bool reuse_addr, bool any) {
static_assert(Family == AF_INET || Family == AF_INET6, "invalid family"); static_assert(Family == AF_INET || Family == AF_INET6, "invalid family");
CAF_LOG_TRACE(CAF_ARG(port) << ", addr = " << (addr ? addr : "nullptr")); CAF_LOG_TRACE(CAF_ARG(port) << ", addr = " << (addr ? addr : "nullptr"));
CALL_CFUN(fd, cc_valid_socket, "socket", socket(Family, SOCK_STREAM, 0)); CALL_CFUN(fd, cc_valid_socket, "socket", socket(Family, SOCK_STREAM, 0));
...@@ -1339,12 +1339,10 @@ expected<native_socket> new_ip_acceptor_impl(uint16_t port, const char* addr, ...@@ -1339,12 +1339,10 @@ expected<native_socket> new_ip_acceptor_impl(uint16_t port, const char* addr,
sockaddr_type sa; sockaddr_type sa;
memset(&sa, 0, sizeof(sockaddr_type)); memset(&sa, 0, sizeof(sockaddr_type));
family_of(sa) = Family; family_of(sa) = Family;
if (!addr) { if (any)
set_inaddr_any(fd, sa); set_inaddr_any(fd, sa);
} else { CALL_CFUN(tmp, cc_one, "inet_pton",
CALL_CFUN(res, cc_one, "inet_pton",
inet_pton(Family, addr, &addr_of(sa))); inet_pton(Family, addr, &addr_of(sa)));
}
port_of(sa) = htons(port); port_of(sa) = htons(port);
CALL_CFUN(res, cc_zero, "bind", CALL_CFUN(res, cc_zero, "bind",
bind(fd, reinterpret_cast<sockaddr*>(&sa), bind(fd, reinterpret_cast<sockaddr*>(&sa),
...@@ -1359,12 +1357,14 @@ expected<native_socket> new_tcp_acceptor_impl(uint16_t port, const char* addr, ...@@ -1359,12 +1357,14 @@ expected<native_socket> new_tcp_acceptor_impl(uint16_t port, const char* addr,
if (addrs.empty()) if (addrs.empty())
return make_error(sec::cannot_open_port, "No local interface available", return make_error(sec::cannot_open_port, "No local interface available",
addr); addr);
int fd = invalid_native_socket; auto addr_str = std::string{addr == nullptr ? "" : addr};
bool any = addr_str.empty() || addr_str == "::" || addr_str == "0.0.0.0";
auto fd = invalid_native_socket;
for (auto& elem : addrs) { for (auto& elem : addrs) {
auto addr = elem.first.c_str(); auto hostname = elem.first.c_str();
auto p = elem.second == ipv4 auto p = elem.second == ipv4
? new_ip_acceptor_impl<AF_INET>(port, addr, reuse_addr) ? new_ip_acceptor_impl<AF_INET>(port, hostname, reuse_addr, any)
: new_ip_acceptor_impl<AF_INET6>(port, addr, reuse_addr); : new_ip_acceptor_impl<AF_INET6>(port, hostname, reuse_addr, any);
if (!p) { if (!p) {
CAF_LOG_DEBUG(p.error()); CAF_LOG_DEBUG(p.error());
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment