[libvirt] [PATCH 1/2] virsocket: Introduce virSocketAddrIsAny

Jiri Denemark jdenemar at redhat.com
Thu Jun 6 15:27:46 UTC 2013


On Thu, Jun 06, 2013 at 16:10:29 +0200, Michal Privoznik wrote:
> This internal API checks, if passed address is ANYCAST address.
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virsocketaddr.c | 22 ++++++++++++++++++++++
>  src/util/virsocketaddr.h |  1 +
>  tests/sockettest.c       | 38 ++++++++++++++++++++++++++++++++++++++
>  4 files changed, 62 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index b93629f..0b2ce42 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1780,6 +1780,7 @@ virSocketAddrFormatFull;
>  virSocketAddrGetIpPrefix;
>  virSocketAddrGetPort;
>  virSocketAddrGetRange;
> +virSocketAddrIsAny;
>  virSocketAddrIsNetmask;
>  virSocketAddrIsPrivate;
>  virSocketAddrMask;
> diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c
> index 1071b00..4bfc86d 100644
> --- a/src/util/virsocketaddr.c
> +++ b/src/util/virsocketaddr.c
> @@ -227,6 +227,28 @@ virSocketAddrIsPrivate(const virSocketAddrPtr addr)
>  }
>  
>  /*
> + * virSocketAddrIsAny:
> + * @addr: address to check
> + *
> + * Check if passed address is a variant of ANYCAST address.
> + */
> +bool
> +virSocketAddrIsAny(const virSocketAddrPtr addr)
> +{
> +    unsigned long tmp;
> +    switch (addr->data.stor.ss_family) {
> +    case AF_INET:
> +        tmp = INADDR_ANY;
> +        return memcmp(&addr->data.inet4.sin_addr.s_addr, &tmp,
> +                      sizeof(addr->data.inet4.sin_addr.s_addr)) == 0;
> +    case AF_INET6:
> +        return memcmp(addr->data.inet6.sin6_addr.s6_addr, &in6addr_any,
> +                      sizeof(addr->data.inet6.sin6_addr.s6_addr)) == 0;
> +    }
> +    return false;

Shouldn't we use in_addr_t (or uint32_t at least) for tmp rather than
unsigned long and

    IN6_IS_ADDR_UNSPECIFIED(&addr->data.inet6.sin6_addr.s6_addr)

instead of the second memcmp? However, I'm not sure how portable that
would be... in.h(0P) man page says both of them shall be defined in
netinet/in.h

> +}
> +
> +/*
>   * virSocketAddrFormat:
>   * @addr: an initialized virSocketAddrPtr
>   *
> diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h
> index 1c9e54a..d4d7ccf 100644
> --- a/src/util/virsocketaddr.h
> +++ b/src/util/virsocketaddr.h
> @@ -123,4 +123,5 @@ bool virSocketAddrEqual(const virSocketAddrPtr s1,
>                          const virSocketAddrPtr s2);
>  bool virSocketAddrIsPrivate(const virSocketAddrPtr addr);
>  
> +bool virSocketAddrIsAny(const virSocketAddrPtr addr);
>  #endif /* __VIR_SOCKETADDR_H__ */
> diff --git a/tests/sockettest.c b/tests/sockettest.c
> index 5b36a6c..e4a998b 100644
> --- a/tests/sockettest.c
> +++ b/tests/sockettest.c
> @@ -157,6 +157,28 @@ static int testNetmaskHelper(const void *opaque)
>      return testNetmask(data->addr1, data->addr2, data->netmask, data->pass);
>  }
>  
> +static int testAnycast(const char *addrstr,
> +                       bool pass)

I'd probably use a different name since "anycast" has different meaning
in IPv6 world but I don't mind that much as I can't think of a better
name :-)

Jirka




More information about the libvir-list mailing list