提交 c5d1592e 编写于 作者: L Laine Stump 提交者: Daniel Veillard

util: add an ifaceGetIPAddress to the interface utilities

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).
上级 5283ea9b
...@@ -529,6 +529,7 @@ ifaceCtrl; ...@@ -529,6 +529,7 @@ ifaceCtrl;
ifaceGetFlags; ifaceGetFlags;
ifaceGetIndex; ifaceGetIndex;
ifaceGetMacAddress; ifaceGetMacAddress;
ifaceGetIPAddress;
ifaceGetNthParent; ifaceGetNthParent;
ifaceGetVlanID; ifaceGetVlanID;
ifaceIsUp; ifaceIsUp;
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <fcntl.h> #include <fcntl.h>
#include <netinet/in.h>
#ifdef __linux__ #ifdef __linux__
# include <linux/if.h> # include <linux/if.h>
...@@ -511,6 +512,65 @@ ifaceSetMacAddress(const char *ifname ATTRIBUTE_UNUSED, ...@@ -511,6 +512,65 @@ ifaceSetMacAddress(const char *ifname ATTRIBUTE_UNUSED,
#endif /* __linux__ */ #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 * ifaceLinkAdd
* *
......
...@@ -24,6 +24,7 @@ struct nlattr; ...@@ -24,6 +24,7 @@ struct nlattr;
# endif # endif
# include "datatypes.h" # include "datatypes.h"
# include "network.h"
int ifaceGetFlags(const char *name, short *flags); int ifaceGetFlags(const char *name, short *flags);
int ifaceIsUp(const char *name, bool *up); int ifaceIsUp(const char *name, bool *up);
...@@ -49,6 +50,8 @@ int ifaceSetMacAddress(const char *ifname, const unsigned char *macaddr); ...@@ -49,6 +50,8 @@ int ifaceSetMacAddress(const char *ifname, const unsigned char *macaddr);
int ifaceGetMacAddress(const char *ifname, unsigned char *macaddr); int ifaceGetMacAddress(const char *ifname, unsigned char *macaddr);
int ifaceGetIPAddress(const char *ifname, virSocketAddrPtr addr);
int ifaceMacvtapLinkAdd(const char *type, int ifaceMacvtapLinkAdd(const char *type,
const unsigned char *macaddress, int macaddrsize, const unsigned char *macaddress, int macaddrsize,
const char *ifname, const char *ifname,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册