From 8e56972dbc0f9ffde1b0da3265f89a126b2a5b94 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 29 Nov 2021 10:22:38 -0800 Subject: [PATCH] testsock check bind() order behavior for ipv4/6 --- src/evhelper.cpp | 26 ++++++++++++------ test/testsock.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/evhelper.cpp b/src/evhelper.cpp index 0088305..261c7a5 100644 --- a/src/evhelper.cpp +++ b/src/evhelper.cpp @@ -619,17 +619,25 @@ std::vector evsocket::broadcasts(const SockAddr* match) const bool evsocket::canIPv6() { - auto sock = socket(AF_INET6, SOCK_DGRAM, 0); - if(sock!=evutil_socket_t(-1)) { - evutil_closesocket(sock); + try { + evsocket sock(AF_INET6, SOCK_DGRAM, 0); + auto addr(SockAddr::loopback(AF_INET6)); + sock.bind(addr); return true; + + }catch(std::system_error& e){ + auto err = e.code().value(); // errno + switch(err) { + case EAFNOSUPPORT: // socket() fails. OS kernel not built with IPv6 support + case SOCK_EADDRNOTAVAIL:// bind() fails. Missing [::1]. Incomplete IPv6 config + break; + default: + log_warn_printf(logsock, "Unexpected errno %d while probing IPv6: %s\n", + err, evutil_socket_error_to_string(err)); + break; + } + return false; } - int err = evutil_socket_geterror(sock); - if(err!=EAFNOSUPPORT) { - log_warn_printf(logsock, "Unexpected errno %d while probing IPv6: %s\n", - err, evutil_socket_error_to_string(err)); - } - return false; } #if EPICS_VERSION_INT #include +#include #include #include @@ -33,6 +34,45 @@ bool is_wine() namespace { using namespace pvxs; +void test_bind46(const char* saddr1, const char* saddr2, int type, int expect) +{ + const std::string label = SB()<<__func__<<"("<