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 | 1 +
src/util/interface.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++
src/util/interface.h | 3 ++
3 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 4ef20bc..f89d92e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -506,6 +506,7 @@ ifaceCtrl;
ifaceGetFlags;
ifaceGetIndex;
ifaceGetMacAddress;
+ifaceGetIPAddress;
ifaceGetNthParent;
ifaceGetVlanID;
ifaceIsUp;
diff --git a/src/util/interface.c b/src/util/interface.c
index 837ecce..a714bad 100644
--- a/src/util/interface.c
+++ b/src/util/interface.c
@@ -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,
/**
+ * 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 in case of success or an errno code in case of 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
*
* @type: The type of device, i.e., "macvtap"
diff --git a/src/util/interface.h b/src/util/interface.h
index 5cbf5c1..9647653 100644
--- a/src/util/interface.h
+++ b/src/util/interface.h
@@ -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,
--
1.7.3.4