---
src/util/network.c | 37 +++++++++++++++++++++++++++++++++++++
src/util/network.h | 2 ++
2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/src/util/network.c b/src/util/network.c
index 6e24792..2e0cf9c 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -54,6 +54,43 @@ static int getIPv6Addr(virSocketAddrPtr addr, virIPv6AddrPtr tab) {
}
/**
+ * virIsNumericIPAddr:
+ * @address: a text string containing a host name or IPv4/IPv6 address
+ *
+ * Given a text string, determines whether it contains a valid IPv4/IPv6
+ * address.
+ *
+ * Returns 0 if the given string is an IPv4 or IPv6 address, or non-zero
+ * for any other condition.
+ */
+int
+virIsNumericIPAddr(const char *address) {
+ int returnCode;
+ struct addrinfo hints;
+ struct addrinfo *res = NULL;
+
+ /* Sanity check we've been given a text string */
+ if (address == NULL)
+ return(-1);
+
+ /* Do a name lookup on the given string, and see what we're given back */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC; /* Doesn't matter whether IPv4 or IPv6 */
+ hints.ai_socktype = 0; /* Socket type doesn't matter */
+ hints.ai_flags = AI_NUMERICHOST; /* Force a numeric IP address check */
+ hints.ai_protocol = 0; /* Doesn't matter which protocol */
+ returnCode = getaddrinfo (address, NULL, &hints, &res);
+ if (0 == returnCode) {
+ /* A result was returned. This means the text string we were
+ * given is a valid IP address. We now free the result(s) we
+ * were given, and pass back the return code */
+ freeaddrinfo(res);
+ }
+
+ return returnCode;
+}
+
+/**
* virSocketParseAddr:
* @val: a numeric network address IPv4 or IPv6
* @addr: where to store the return value.
diff --git a/src/util/network.h b/src/util/network.h
index 5307c8c..c2e88d8 100644
--- a/src/util/network.h
+++ b/src/util/network.h
@@ -24,6 +24,8 @@ typedef union {
} virSocketAddr;
typedef virSocketAddr *virSocketAddrPtr;
+int virIsNumericIPAddr (const char *address);
+
int virSocketParseAddr (const char *val,
virSocketAddrPtr addr,
int hint);
--
1.7.2.1