@@ -136,22 +136,17 @@ static int socket_can_bind_connect(const char *hostname, int family)
int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6)
{
- *has_ipv4 = *has_ipv6 = false;
+ int errv4, errv6;
- if (socket_can_bind_connect("127.0.0.1", PF_INET) < 0) {
- if (errno != EADDRNOTAVAIL) {
- return -1;
- }
- } else {
- *has_ipv4 = true;
- }
+ errv4 = socket_can_bind_connect("127.0.0.1", PF_INET);
+ *has_ipv4 = (errv4 == 0);
- if (socket_can_bind_connect("::1", PF_INET6) < 0) {
- if (errno != EADDRNOTAVAIL) {
- return -1;
- }
- } else {
- *has_ipv6 = true;
+ errv6 = socket_can_bind_connect("::1", PF_INET6);
+ *has_ipv6 = (errv6 == 0);
+
+ if (!*has_ipv4 && !*has_ipv6 &&
+ (errv4 != EADDRNOTAVAIL || errv6 != EADDRNOTAVAIL)) {
+ return -1;
}
return 0;
The tests/test-char test is currently always failing on my system since socket_can_bind_connect("::1", PF_INET6) fails with EINVAL and thus socket_check_protocol_support() is returning -1 for an error. But IPv4 is working fine. The logic in socket_check_protocol_support() seems to be wrong here, if either IPv6 or IPv4 is working, we should not return an error here. Thus rework the function to only return errors if both checks failed. Signed-off-by: Thomas Huth <thuth@redhat.com> --- tests/socket-helpers.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-)