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(a)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