[libvirt] [PATCH 1/2] util: add wrapper function to check if address string is an ip

Justin Clift jclift at redhat.com
Tue Aug 10 09:42:49 UTC 2010


---
 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




More information about the libvir-list mailing list