MCPcopy Create free account
hub / github.com/PurpleI2P/i2pd / GetInterfaceAddress

Function GetInterfaceAddress

libi2pd/util.cpp:593–644  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

591 }
592
593 const boost::asio::ip::address GetInterfaceAddress (const std::string & ifname, bool ipv6)
594 {
595#ifdef _WIN32
596 LogPrint(eLogError, "NetIface: Cannot get address by interface name, not implemented on WIN32");
597 if (ipv6)
598 return boost::asio::ip::make_address("::1");
599 else
600 return boost::asio::ip::make_address("127.0.0.1");
601#else
602 int af = (ipv6 ? AF_INET6 : AF_INET);
603 ifaddrs *addrs;
604 try
605 {
606 if (!getifaddrs(&addrs))
607 {
608 for (auto cur = addrs; cur; cur = cur->ifa_next)
609 {
610 std::string cur_ifname(cur->ifa_name);
611 if (cur_ifname == ifname && cur->ifa_addr && cur->ifa_addr->sa_family == af)
612 {
613 // match
614 char addr[INET6_ADDRSTRLEN];
615 memset (addr, 0, INET6_ADDRSTRLEN);
616 if (af == AF_INET)
617 inet_ntop(af, &((sockaddr_in *)cur->ifa_addr)->sin_addr, addr, INET6_ADDRSTRLEN);
618 else
619 inet_ntop(af, &((sockaddr_in6 *)cur->ifa_addr)->sin6_addr, addr, INET6_ADDRSTRLEN);
620 freeifaddrs(addrs);
621 std::string cur_ifaddr(addr);
622 return boost::asio::ip::make_address(cur_ifaddr);
623 }
624 }
625 }
626 }
627 catch (std::exception& ex)
628 {
629 LogPrint(eLogError, "NetIface: Exception while searching address using ifaddr: ", ex.what());
630 }
631
632 if (addrs) freeifaddrs(addrs);
633 std::string fallback;
634 if (ipv6)
635 {
636 fallback = "::1";
637 LogPrint(eLogWarning, "NetIface: Cannot find IPv6 address for interface ", ifname);
638 } else {
639 fallback = "127.0.0.1";
640 LogPrint(eLogWarning, "NetIface: Cannot find IPv4 address for interface ", ifname);
641 }
642 return boost::asio::ip::make_address(fallback);
643#endif
644 }
645
646 int GetMaxMTU (const boost::asio::ip::address_v6& localAddress)
647 {

Callers 1

InitAddressFromIfaceFunction · 0.85

Calls 1

LogPrintFunction · 0.85

Tested by

no test coverage detected