[libvirt] [PATCH 1/7] virutil: Introduce virIsValidHostname

Peter Krempa pkrempa at redhat.com
Mon Apr 20 13:40:32 UTC 2015


On Sun, Apr 19, 2015 at 20:49:06 -0400, John Ferlan wrote:
> Similar to virGetHostname, but this time taking a parameter which is a
> hostname or ipaddress from a <source ... <host name ='%s'.../>... />
> XML property and validating that the name can be resolved.
> 
> Return true or false depending on whether we can ascertain the hostname
> address from calls to 'getnameinfo' and 'getaddrinfo'. Subsequent patches
> will be validating a proposed pool hostname definition against existing
> pool hostnames to ensure they are not the same hostname (and thus having
> two pools looking at the same data)
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virutil.c       | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
>  src/util/virutil.h       |  1 +
>  3 files changed, 51 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 8c37303..5ba9635 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2324,6 +2324,7 @@ virIsCapableFCHost;
>  virIsCapableVport;
>  virIsDevMapperDevice;
>  virIsSUID;
> +virIsValidHostname;
>  virManageVport;
>  virMemoryLimitIsSet;
>  virMemoryLimitTruncate;
> diff --git a/src/util/virutil.c b/src/util/virutil.c
> index 79cdb7a..f6cc9af 100644
> --- a/src/util/virutil.c
> +++ b/src/util/virutil.c
> @@ -690,6 +690,55 @@ char *virGetHostname(void)
>  }
>  
>  
> +/*
> + * virIsValidHostname:
> + *
> + * Unlike virGetHostname, this variant of the code receives a hostname
> + * retrieves the getaddrinfo. If the passed hostname can be successfully
> + * and if successfully resolved via getaddrinfo, then success is declared.
> + *
> + * On error in lookup, if an IP Address is not found, or error formatting
> + * the name, an error is generated and a NULL is returned.
> + *
> + * On success, a pointer to a character representation of the numeric IP
> + * Address is returned.
> + *
> + * It is the caller's responsibility to check for a non NULL return and
> + * VIR_FREE the resultant string.

This comment does not describe how this function works.

> + */
> +bool
> +virIsValidHostname(const char *hostname)
> +{
> +    int r;
> +    struct addrinfo hints, *info;
> +
> +    if (STRPREFIX(hostname, "localhost") ||

This certainly is not a good idea:

 $ host localhost.pipo.sk
 localhost.pipo.sk has address 46.255.230.242


> +        STREQ(hostname, "127.0.0.1") || STREQ(hostname, "::1"))
> +        return true;
> +
> +    memset(&hints, 0, sizeof(hints));
> +    hints.ai_family = AF_UNSPEC;
> +    hints.ai_protocol = IPPROTO_TCP;
> +
> +    if ((r = getaddrinfo(hostname, NULL, &hints, &info)) != 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("IP address lookup for host '%s' failed: %s"),
> +                       hostname, gai_strerror(r));
> +        return false;
> +    }
> +
> +    if (!info) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("No IP address for host '%s' found"),
> +                       hostname);
> +        return false;
> +    }
> +    freeaddrinfo(info);
> +
> +    return true;
> +}
> +
> +

Ghm, this seems a bit too excesive IMO, let see how it's used.

Peter

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150420/7f9c4232/attachment-0001.sig>


More information about the libvir-list mailing list