Fix test failure when no IPv6 is avail

When the system doesn't have IPv6 available (e.g. not built into the
kernel or the module isn't loaded), you can not create an IPv6 socket.
The test determines earlier on that IPv6 isn't available then goes and
creates a socket. This makes socket creation conditional on IPv6
availability.
This commit is contained in:
Doug Goldstein 2012-07-22 12:04:16 -05:00 committed by Peter Krempa
parent f9ce7dad60
commit faffe26909

View File

@ -90,11 +90,13 @@ checkProtocols(bool *hasIPv4, bool *hasIPv6,
if ((s4 = socket(AF_INET, SOCK_STREAM, 0)) < 0)
goto cleanup;
if ((s6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
goto cleanup;
if (*hasIPv6) {
if ((s6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
goto cleanup;
if (setsockopt(s6, IPPROTO_IPV6, IPV6_V6ONLY, &only, sizeof(only)) < 0)
goto cleanup;
if (setsockopt(s6, IPPROTO_IPV6, IPV6_V6ONLY, &only, sizeof(only)) < 0)
goto cleanup;
}
memset(&in4, 0, sizeof(in4));
memset(&in6, 0, sizeof(in6));
@ -114,13 +116,16 @@ checkProtocols(bool *hasIPv4, bool *hasIPv6,
}
goto cleanup;
}
if (bind(s6, (struct sockaddr *)&in6, sizeof(in6)) < 0) {
if (errno == EADDRINUSE) {
VIR_FORCE_CLOSE(s4);
VIR_FORCE_CLOSE(s6);
continue;
if (*hasIPv6) {
if (bind(s6, (struct sockaddr *)&in6, sizeof(in6)) < 0) {
if (errno == EADDRINUSE) {
VIR_FORCE_CLOSE(s4);
VIR_FORCE_CLOSE(s6);
continue;
}
goto cleanup;
}
goto cleanup;
}
*freePort = BASE_PORT + i;