use getifaddrs on linux to enumerate interfaces
This commit is contained in:
parent
7d300c807a
commit
b6b0970e16
|
@ -83,12 +83,12 @@ int main()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%-35s%-18s%-40s%-8sflags\n", "address", "netmask", "name", "mtu");
|
printf("%-30s%-45s%-20s%-8sflags\n", "address", "netmask", "name", "mtu");
|
||||||
|
|
||||||
for (std::vector<ip_interface>::const_iterator i = net.begin()
|
for (std::vector<ip_interface>::const_iterator i = net.begin()
|
||||||
, end(net.end()); i != end; ++i)
|
, end(net.end()); i != end; ++i)
|
||||||
{
|
{
|
||||||
printf("%-35s%-18s%-40s%-8d%s%s%s\n"
|
printf("%-30s%-45s%-20s%-8d%s%s%s\n"
|
||||||
, i->interface_address.to_string(ec).c_str()
|
, i->interface_address.to_string(ec).c_str()
|
||||||
, i->netmask.to_string(ec).c_str()
|
, i->netmask.to_string(ec).c_str()
|
||||||
, i->name
|
, i->name
|
||||||
|
|
|
@ -80,6 +80,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace libtorrent { namespace
|
namespace libtorrent { namespace
|
||||||
|
@ -279,6 +281,34 @@ namespace libtorrent { namespace
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined TORRENT_LINUX
|
||||||
|
bool iface_from_ifaddrs(ifaddrs *ifa, ip_interface &rv, error_code& ec)
|
||||||
|
{
|
||||||
|
int family = ifa->ifa_addr->sa_family;
|
||||||
|
|
||||||
|
if (family != AF_INET
|
||||||
|
#if TORRENT_USE_IPV6
|
||||||
|
&& family != AF_INET6
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(rv.name, ifa->ifa_name, sizeof(rv.name));
|
||||||
|
rv.name[sizeof(rv.name)-1] = 0;
|
||||||
|
|
||||||
|
// determine address
|
||||||
|
rv.interface_address = sockaddr_to_address(ifa->ifa_addr);
|
||||||
|
// determine netmask
|
||||||
|
if (ifa->ifa_netmask != NULL)
|
||||||
|
{
|
||||||
|
rv.netmask = sockaddr_to_address(ifa->ifa_netmask);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}} // <anonymous>
|
}} // <anonymous>
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
|
@ -302,7 +332,7 @@ namespace libtorrent
|
||||||
m = mask.to_v6().to_bytes();
|
m = mask.to_v6().to_bytes();
|
||||||
for (int i = 0; i < b1.size(); ++i)
|
for (int i = 0; i < b1.size(); ++i)
|
||||||
b1[i] &= m[i];
|
b1[i] &= m[i];
|
||||||
return memcmp(&b1[0], &b2[0], b1.size());
|
return memcmp(&b1[0], &b2[0], b1.size()) == 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return (a1.to_v4().to_ulong() & mask.to_v4().to_ulong())
|
return (a1.to_v4().to_ulong() & mask.to_v4().to_ulong())
|
||||||
|
@ -370,8 +400,53 @@ namespace libtorrent
|
||||||
std::vector<ip_interface> enum_net_interfaces(io_service& ios, error_code& ec)
|
std::vector<ip_interface> enum_net_interfaces(io_service& ios, error_code& ec)
|
||||||
{
|
{
|
||||||
std::vector<ip_interface> ret;
|
std::vector<ip_interface> ret;
|
||||||
// covers linux, MacOS X and BSD distributions
|
#if defined TORRENT_LINUX
|
||||||
#if defined TORRENT_LINUX || defined TORRENT_BSD || defined TORRENT_SOLARIS
|
int s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if (s < 0)
|
||||||
|
{
|
||||||
|
ec = error_code(errno, asio::error::system_category);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ifaddrs *ifaddr;
|
||||||
|
if (getifaddrs(&ifaddr) == -1)
|
||||||
|
{
|
||||||
|
ec = error_code(errno, asio::error::system_category);
|
||||||
|
close(s);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next)
|
||||||
|
{
|
||||||
|
if (ifa->ifa_addr == 0) continue;
|
||||||
|
if ((ifa->ifa_flags & IFF_UP) == 0) continue;
|
||||||
|
|
||||||
|
int family = ifa->ifa_addr->sa_family;
|
||||||
|
if (family == AF_INET
|
||||||
|
#if TORRENT_USE_IPV6
|
||||||
|
|| family == AF_INET6
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ip_interface iface;
|
||||||
|
if (iface_from_ifaddrs(ifa, iface, ec))
|
||||||
|
{
|
||||||
|
ifreq req;
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
strncpy(req.ifr_name, iface.name, IF_NAMESIZE);
|
||||||
|
if (ioctl(s, SIOCGIFMTU, &req) < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
iface.mtu = req.ifr_mtu;
|
||||||
|
ret.push_back(iface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(s);
|
||||||
|
freeifaddrs(ifaddr);
|
||||||
|
// MacOS X, BSD and solaris
|
||||||
|
#elif defined TORRENT_BSD || defined TORRENT_SOLARIS
|
||||||
int s = socket(AF_INET, SOCK_DGRAM, 0);
|
int s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (s < 0)
|
if (s < 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue