diff --git a/include/tools/networkTools.h b/include/tools/networkTools.h index 4281860f5..4762e2286 100644 --- a/include/tools/networkTools.h +++ b/include/tools/networkTools.h @@ -20,13 +20,10 @@ #ifndef KIWIX_NETWORKTOOLS_H #define KIWIX_NETWORKTOOLS_H -#include #include namespace kiwix { -std::map getNetworkInterfaces(); -std::string getBestPublicIp(); std::string download(const std::string& url); } diff --git a/src/tools/networkTools.cpp b/src/tools/networkTools.cpp index 3c69bad16..76d8f3dbf 100644 --- a/src/tools/networkTools.cpp +++ b/src/tools/networkTools.cpp @@ -19,167 +19,18 @@ #include -#ifdef _WIN32 -#include -#include -#else -#include -#include #include #include #include -#include -#include -#include #include -#endif #include #include #include +#include -std::map kiwix::getNetworkInterfaces() -{ - std::map interfaces; - -#ifdef _WIN32 - SOCKET sd = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, 0); - if (sd == (SOCKET)SOCKET_ERROR) { - std::cerr << "Failed to get a socket. Error " << WSAGetLastError() - << std::endl; - return interfaces; - } - - INTERFACE_INFO InterfaceList[20]; - unsigned long nBytesReturned; - if (WSAIoctl(sd, - SIO_GET_INTERFACE_LIST, - 0, - 0, - &InterfaceList, - sizeof(InterfaceList), - &nBytesReturned, - 0, - 0) - == SOCKET_ERROR) { - std::cerr << "Failed calling WSAIoctl: error " << WSAGetLastError() - << std::endl; - return interfaces; - } - - int nNumInterfaces = nBytesReturned / sizeof(INTERFACE_INFO); - for (int i = 0; i < nNumInterfaces; ++i) { - sockaddr_in* pAddress; - pAddress = (sockaddr_in*)&(InterfaceList[i].iiAddress); - - /* Add to the map */ - std::string interfaceName = std::string(inet_ntoa(pAddress->sin_addr)); - std::string interfaceIp = std::string(inet_ntoa(pAddress->sin_addr)); - interfaces.insert( - std::pair(interfaceName, interfaceIp)); - } -#else - /* Get Network interfaces information */ - char buf[16384]; - struct ifconf ifconf; - int fd = socket(PF_INET, SOCK_DGRAM, 0); /* Only IPV4 */ - ifconf.ifc_len = sizeof buf; - ifconf.ifc_buf = buf; - if (ioctl(fd, SIOCGIFCONF, &ifconf) != 0) { - perror("ioctl(SIOCGIFCONF)"); - exit(EXIT_FAILURE); - } - - /* Go through each interface */ - int i; - size_t len; - struct ifreq* ifreq; - ifreq = ifconf.ifc_req; - for (i = 0; i < ifconf.ifc_len;) { - if (ifreq->ifr_addr.sa_family == AF_INET) { - /* Get the network interface ip */ - char host[128] = {0}; - const int error = getnameinfo(&(ifreq->ifr_addr), - sizeof ifreq->ifr_addr, - host, - sizeof host, - 0, - 0, - NI_NUMERICHOST); - if (!error) { - std::string interfaceName = std::string(ifreq->ifr_name); - std::string interfaceIp = std::string(host); - /* Add to the map */ - interfaces.insert( - std::pair(interfaceName, interfaceIp)); - } else { - perror("getnameinfo()"); - } - } - -/* some systems have ifr_addr.sa_len and adjust the length that - * way, but not mine. weird */ -#ifndef __linux__ - len = IFNAMSIZ + ifreq->ifr_addr.sa_len; -#else - len = sizeof *ifreq; -#endif - ifreq = (struct ifreq*)((char*)ifreq + len); - i += len; - } -#endif - return interfaces; -} - -std::string kiwix::getBestPublicIp() -{ - std::map interfaces = kiwix::getNetworkInterfaces(); - -#ifndef _WIN32 - const char* const prioritizedNames[] - = {"eth0", "eth1", "wlan0", "wlan1", "en0", "en1"}; - const int count = (sizeof prioritizedNames) / (sizeof prioritizedNames[0]); - for (int i = 0; i < count; ++i) { - std::map::const_iterator it - = interfaces.find(prioritizedNames[i]); - if (it != interfaces.end()) { - return it->second; - } - } -#endif - - for (std::map::iterator iter = interfaces.begin(); - iter != interfaces.end(); - ++iter) { - std::string interfaceIp = iter->second; - if (interfaceIp.length() >= 7 && interfaceIp.substr(0, 7) == "192.168") { - return interfaceIp; - } - } - - for (std::map::iterator iter = interfaces.begin(); - iter != interfaces.end(); - ++iter) { - std::string interfaceIp = iter->second; - if (interfaceIp.length() >= 7 && interfaceIp.substr(0, 7) == "172.16.") { - return interfaceIp; - } - } - - for (std::map::iterator iter = interfaces.begin(); - iter != interfaces.end(); - ++iter) { - std::string interfaceIp = iter->second; - if (interfaceIp.length() >= 3 && interfaceIp.substr(0, 3) == "10.") { - return interfaceIp; - } - } - - return "127.0.0.1"; -} - size_t write_callback_to_iss(char* ptr, size_t size, size_t nmemb, void* userdata) { auto str = static_cast(userdata);