| 687 | |
| 688 | template<typename CheckAddress> |
| 689 | static boost::asio::ip::address_v6 GetLocalIPV6Address (CheckAddress checkAddress) |
| 690 | { |
| 691 | #if defined(_WIN32) |
| 692 | ULONG outBufLen = 0; |
| 693 | PIP_ADAPTER_ADDRESSES pAddresses = nullptr; |
| 694 | PIP_ADAPTER_ADDRESSES pCurrAddresses = nullptr; |
| 695 | PIP_ADAPTER_UNICAST_ADDRESS pUnicast = nullptr; |
| 696 | |
| 697 | if (GetAdaptersAddresses(AF_INET6, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen) |
| 698 | == ERROR_BUFFER_OVERFLOW) |
| 699 | { |
| 700 | FREE(pAddresses); |
| 701 | pAddresses = (IP_ADAPTER_ADDRESSES*) MALLOC(outBufLen); |
| 702 | } |
| 703 | |
| 704 | DWORD dwRetVal = GetAdaptersAddresses( |
| 705 | AF_INET6, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen |
| 706 | ); |
| 707 | |
| 708 | if (dwRetVal != NO_ERROR) |
| 709 | { |
| 710 | LogPrint(eLogError, "NetIface: GetYggdrasilAddress(): enclosed GetAdaptersAddresses() call has failed"); |
| 711 | FREE(pAddresses); |
| 712 | return boost::asio::ip::address_v6 (); |
| 713 | } |
| 714 | |
| 715 | pCurrAddresses = pAddresses; |
| 716 | while (pCurrAddresses) |
| 717 | { |
| 718 | pUnicast = pCurrAddresses->FirstUnicastAddress; |
| 719 | |
| 720 | while (pUnicast != nullptr) |
| 721 | { |
| 722 | LPSOCKADDR lpAddr = pUnicast->Address.lpSockaddr; |
| 723 | sockaddr_in6 *localInterfaceAddress = (sockaddr_in6*) lpAddr; |
| 724 | if (checkAddress(localInterfaceAddress->sin6_addr.u.Byte)) { |
| 725 | boost::asio::ip::address_v6::bytes_type bytes; |
| 726 | memcpy (bytes.data (), &localInterfaceAddress->sin6_addr.u.Byte, 16); |
| 727 | FREE(pAddresses); |
| 728 | return boost::asio::ip::address_v6 (bytes); |
| 729 | } |
| 730 | pUnicast = pUnicast->Next; |
| 731 | } |
| 732 | pCurrAddresses = pCurrAddresses->Next; |
| 733 | } |
| 734 | LogPrint(eLogWarning, "NetIface: Interface with ipv6 network address not found"); |
| 735 | FREE(pAddresses); |
| 736 | return boost::asio::ip::address_v6 (); |
| 737 | #else |
| 738 | ifaddrs *addrs; |
| 739 | try |
| 740 | { |
| 741 | if (!getifaddrs(&addrs)) |
| 742 | { |
| 743 | for (auto cur = addrs; cur; cur = cur->ifa_next) |
| 744 | { |
| 745 | if (cur->ifa_addr && cur->ifa_addr->sa_family == AF_INET6) |
| 746 | { |
no test coverage detected