[Qemu-devel] [PATCH v2 3/5] tests: specify the address family when checking bind

Marc-André Lureau posted 5 patches 6 years, 7 months ago
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, Fam Zheng <fam@euphon.net>, "Philippe Mathieu-Daudé" <philmd@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>
There is a newer version of this series
[Qemu-devel] [PATCH v2 3/5] tests: specify the address family when checking bind
Posted by Marc-André Lureau 6 years, 7 months ago
getaddrinfo() may succeed with PF_UNSPEC, but fail when more specific.

(this allows to skip some tests that would fail under podman)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tests/socket-helpers.c | 17 +++++++++++++----
 tests/socket-helpers.h | 11 -----------
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/tests/socket-helpers.c b/tests/socket-helpers.c
index 8112763f5b..19a51e887e 100644
--- a/tests/socket-helpers.c
+++ b/tests/socket-helpers.c
@@ -30,7 +30,16 @@
 # define EAI_ADDRFAMILY 0
 #endif
 
-int socket_can_bind_connect(const char *hostname)
+/*
+ * @hostname: a DNS name or numeric IP address
+ *
+ * Check whether it is possible to bind & connect to ports
+ * on the DNS name or IP address @hostname. If an IP address
+ * is used, it must not be a wildcard address.
+ *
+ * Returns 0 on success, -1 on error with errno set
+ */
+static int socket_can_bind_connect(const char *hostname, int family)
 {
     int lfd = -1, cfd = -1, afd = -1;
     struct addrinfo ai, *res = NULL;
@@ -44,7 +53,7 @@ int socket_can_bind_connect(const char *hostname)
 
     memset(&ai, 0, sizeof(ai));
     ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
-    ai.ai_family = AF_UNSPEC;
+    ai.ai_family = family;
     ai.ai_socktype = SOCK_STREAM;
 
     /* lookup */
@@ -129,7 +138,7 @@ int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6)
 {
     *has_ipv4 = *has_ipv6 = false;
 
-    if (socket_can_bind_connect("127.0.0.1") < 0) {
+    if (socket_can_bind_connect("127.0.0.1", PF_INET) < 0) {
         if (errno != EADDRNOTAVAIL) {
             return -1;
         }
@@ -137,7 +146,7 @@ int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6)
         *has_ipv4 = true;
     }
 
-    if (socket_can_bind_connect("::1") < 0) {
+    if (socket_can_bind_connect("::1", PF_INET6) < 0) {
         if (errno != EADDRNOTAVAIL) {
             return -1;
         }
diff --git a/tests/socket-helpers.h b/tests/socket-helpers.h
index 9de0e6b151..512a004811 100644
--- a/tests/socket-helpers.h
+++ b/tests/socket-helpers.h
@@ -20,17 +20,6 @@
 #ifndef TESTS_SOCKET_HELPERS_H
 #define TESTS_SOCKET_HELPERS_H
 
-/*
- * @hostname: a DNS name or numeric IP address
- *
- * Check whether it is possible to bind & connect to ports
- * on the DNS name or IP address @hostname. If an IP address
- * is used, it must not be a wildcard address.
- *
- * Returns 0 on success, -1 on error with errno set
- */
-int socket_can_bind_connect(const char *hostname);
-
 /*
  * @has_ipv4: set to true on return if IPv4 is available
  * @has_ipv6: set to true on return if IPv6 is available
-- 
2.22.0.214.g8dca754b1e


Re: [Qemu-devel] [PATCH v2 3/5] tests: specify the address family when checking bind
Posted by Philippe Mathieu-Daudé 6 years, 7 months ago
On 7/9/19 9:43 PM, Marc-André Lureau wrote:
> getaddrinfo() may succeed with PF_UNSPEC, but fail when more specific.
> 
> (this allows to skip some tests that would fail under podman)
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  tests/socket-helpers.c | 17 +++++++++++++----
>  tests/socket-helpers.h | 11 -----------
>  2 files changed, 13 insertions(+), 15 deletions(-)
> 
> diff --git a/tests/socket-helpers.c b/tests/socket-helpers.c
> index 8112763f5b..19a51e887e 100644
> --- a/tests/socket-helpers.c
> +++ b/tests/socket-helpers.c
> @@ -30,7 +30,16 @@
>  # define EAI_ADDRFAMILY 0
>  #endif
>  
> -int socket_can_bind_connect(const char *hostname)
> +/*
> + * @hostname: a DNS name or numeric IP address
> + *
> + * Check whether it is possible to bind & connect to ports
> + * on the DNS name or IP address @hostname. If an IP address
> + * is used, it must not be a wildcard address.
> + *
> + * Returns 0 on success, -1 on error with errno set
> + */
> +static int socket_can_bind_connect(const char *hostname, int family)
>  {
>      int lfd = -1, cfd = -1, afd = -1;
>      struct addrinfo ai, *res = NULL;
> @@ -44,7 +53,7 @@ int socket_can_bind_connect(const char *hostname)
>  
>      memset(&ai, 0, sizeof(ai));
>      ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
> -    ai.ai_family = AF_UNSPEC;
> +    ai.ai_family = family;
>      ai.ai_socktype = SOCK_STREAM;
>  
>      /* lookup */
> @@ -129,7 +138,7 @@ int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6)
>  {
>      *has_ipv4 = *has_ipv6 = false;
>  
> -    if (socket_can_bind_connect("127.0.0.1") < 0) {
> +    if (socket_can_bind_connect("127.0.0.1", PF_INET) < 0) {
>          if (errno != EADDRNOTAVAIL) {
>              return -1;
>          }
> @@ -137,7 +146,7 @@ int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6)
>          *has_ipv4 = true;
>      }
>  
> -    if (socket_can_bind_connect("::1") < 0) {
> +    if (socket_can_bind_connect("::1", PF_INET6) < 0) {
>          if (errno != EADDRNOTAVAIL) {
>              return -1;
>          }
> diff --git a/tests/socket-helpers.h b/tests/socket-helpers.h
> index 9de0e6b151..512a004811 100644
> --- a/tests/socket-helpers.h
> +++ b/tests/socket-helpers.h
> @@ -20,17 +20,6 @@
>  #ifndef TESTS_SOCKET_HELPERS_H
>  #define TESTS_SOCKET_HELPERS_H
>  
> -/*
> - * @hostname: a DNS name or numeric IP address
> - *
> - * Check whether it is possible to bind & connect to ports
> - * on the DNS name or IP address @hostname. If an IP address
> - * is used, it must not be a wildcard address.
> - *
> - * Returns 0 on success, -1 on error with errno set
> - */
> -int socket_can_bind_connect(const char *hostname);
> -
>  /*
>   * @has_ipv4: set to true on return if IPv4 is available
>   * @has_ipv6: set to true on return if IPv6 is available
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>