]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: add an ifaceGetIPAddress to the interface utilities
authorLaine Stump <laine@laine.org>
Thu, 7 Jul 2011 04:15:08 +0000 (00:15 -0400)
committerDaniel Veillard <veillard@redhat.com>
Mon, 25 Jul 2011 05:48:37 +0000 (13:48 +0800)
This function uses ioctl(SIOCGIFADDR), which limits it to returning
the first IPv4 address of an interface, but that's what we want right
now (the place we're going to use the address only accepts one).

src/libvirt_private.syms
src/util/interface.c
src/util/interface.h

index cac49957b689fe37dade7216b46c634a9de5904d..a3b78ad35310384b2b80e99a906a4c0f23ed8bc8 100644 (file)
@@ -529,6 +529,7 @@ ifaceCtrl;
 ifaceGetFlags;
 ifaceGetIndex;
 ifaceGetMacAddress;
+ifaceGetIPAddress;
 ifaceGetNthParent;
 ifaceGetVlanID;
 ifaceIsUp;
index 72c7f3d1346c7be2d05f29e8baa6d89bc8b21416..f5eecfb8b65cfcb504c05805ddf150de46359ac2 100644 (file)
@@ -29,6 +29,7 @@
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
+#include <netinet/in.h>
 
 #ifdef __linux__
 # include <linux/if.h>
@@ -511,6 +512,65 @@ ifaceSetMacAddress(const char *ifname ATTRIBUTE_UNUSED,
 #endif /* __linux__ */
 
 
+/**
+ * ifaceGetIPAddress:
+ * @ifname: name of the interface whose IP address we want
+ * @macaddr: MAC address (VIR_MAC_BUFLEN in size)
+ *
+ * This function gets the @macaddr for a given interface @ifname.
+ *
+ * Returns 0 on success, -errno on failure.
+ */
+#ifdef __linux__
+int
+ifaceGetIPAddress(const char *ifname,
+                  virSocketAddrPtr addr)
+{
+    struct ifreq ifr;
+    int fd;
+    int rc = 0;
+
+    if (!ifname || !addr)
+        return -EINVAL;
+
+    memset (addr, 0, sizeof(*addr));
+    addr->data.stor.ss_family = AF_UNSPEC;
+
+    fd = socket(AF_INET, SOCK_STREAM, 0);
+    if (fd < 0)
+        return -errno;
+
+    memset(&ifr, 0, sizeof(struct ifreq));
+    if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) {
+        rc = -EINVAL;
+        goto err_exit;
+    }
+
+    if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) != 0) {
+        rc = -errno;
+        goto err_exit;
+    }
+
+    addr->data.stor.ss_family = AF_INET;
+    addr->len = sizeof(addr->data.inet4);
+    memcpy(&addr->data.inet4, &ifr.ifr_addr, addr->len);
+
+err_exit:
+    VIR_FORCE_CLOSE(fd);
+    return rc;
+}
+
+#else
+
+int
+ifaceGetIPAddress(const char *ifname ATTRIBUTE_UNUSED,
+                  virSocketAddrPtr addr ATTRIBUTE_UNUSED)
+{
+    return -ENOSYS;
+}
+
+#endif /* __linux__ */
+
 /**
  * ifaceLinkAdd
  *
index 5cbf5c182b0d1339916c13563564ad788445d3c4..9647653947089a4109e4847138449cc27958234b 100644 (file)
@@ -24,6 +24,7 @@ struct nlattr;
 # endif
 
 # include "datatypes.h"
+# include "network.h"
 
 int ifaceGetFlags(const char *name, short *flags);
 int ifaceIsUp(const char *name, bool *up);
@@ -49,6 +50,8 @@ int ifaceSetMacAddress(const char *ifname, const unsigned char *macaddr);
 
 int ifaceGetMacAddress(const char *ifname, unsigned char *macaddr);
 
+int ifaceGetIPAddress(const char *ifname, virSocketAddrPtr addr);
+
 int ifaceMacvtapLinkAdd(const char *type,
                         const unsigned char *macaddress, int macaddrsize,
                         const char *ifname,