From b7eadf95bf2e8b7e1c1abf272dd37dda58bdbe6a Mon Sep 17 00:00:00 2001 From: Aryan Arora Date: Wed, 24 Apr 2024 15:41:40 +0530 Subject: [PATCH] handle ip modes & add compilation flags for windows build --- include/common.h | 1 + include/server.h | 7 ++++--- include/tools.h | 18 +++--------------- meson.build | 11 ++++------- src/server.cpp | 6 +++--- src/server/internalServer.cpp | 33 +++++++++++++++++++-------------- src/server/internalServer.h | 6 +++--- src/tools/networkTools.cpp | 19 +++++++------------ 8 files changed, 44 insertions(+), 57 deletions(-) diff --git a/include/common.h b/include/common.h index 5df556e9d..995993bcb 100644 --- a/include/common.h +++ b/include/common.h @@ -16,6 +16,7 @@ namespace kiwix { +enum class IpMode { ipv4, ipv6, all }; typedef zim::size_type size_type; typedef zim::offset_type offset_type; diff --git a/include/server.h b/include/server.h index 1633aefe0..d44c5207a 100644 --- a/include/server.h +++ b/include/server.h @@ -22,6 +22,7 @@ #include #include +#include "common.h" namespace kiwix { @@ -62,10 +63,10 @@ namespace kiwix { m_withTaskbar = withTaskbar; m_withLibraryButton = withLibraryButton; } void setBlockExternalLinks(bool blockExternalLinks) { m_blockExternalLinks = blockExternalLinks; } - void setIPv6(bool ipv6) { m_ipv6 = ipv6; } + void setIpMode(IpMode mode) { m_ipMode = mode; } int getPort(); std::string getAddress(); - bool isAddressIPv6(); + IpMode getIpMode() const; protected: std::shared_ptr mp_library; @@ -80,7 +81,7 @@ namespace kiwix bool m_withTaskbar = true; bool m_withLibraryButton = true; bool m_blockExternalLinks = false; - bool m_ipv6 = false; + IpMode m_ipMode = IpMode::ipv4; int m_ipConnectionLimit = 0; std::unique_ptr mp_server; }; diff --git a/include/tools.h b/include/tools.h index ce42ae44e..8ac60312e 100644 --- a/include/tools.h +++ b/include/tools.h @@ -25,12 +25,12 @@ #include #include -struct ip_addr{ +namespace kiwix { +struct IpAddress{ std::string addr; std::string addr6; }; -namespace kiwix { typedef std::pair LangNameCodePair; typedef std::vector FeedLanguages; typedef std::vector FeedCategories; @@ -220,23 +220,11 @@ bool fileReadable(const std::string& path); */ std::string getMimeTypeForFile(const std::string& filename); -/** Provides all available network interfaces on Windows - * - * This function provides the available IPv4 and IPv6 network interfaces - */ -std::map getNetworkInterfacesWin(); - -/** Provides all available network interfaces on Posix - * - * This function provides the available IPv4 and IPv6 network interfaces - */ -std::map getNetworkInterfacesPosix(); - /** Provides all available network interfaces * * This function provides the available IPv4 and IPv6 network interfaces */ -std::map getNetworkInterfaces(); +std::map getNetworkInterfaces(); /** Provides the best IP address * This function provides the best IP address from the list given by getNetworkInterfaces diff --git a/meson.build b/meson.build index 50c8afe4e..582ef5eff 100644 --- a/meson.build +++ b/meson.build @@ -48,7 +48,10 @@ if host_machine.system() == 'windows' and static_deps endif if host_machine.system() == 'windows' - add_project_arguments('-DNOMINMAX', language: 'cpp') + add_project_arguments('-DNOMINMAX', language: 'cpp') + extra_libs += ['-liphlpapi'] +else + extra_link_args = [] endif all_deps = [thread_dep, libicu_dep, libzim_dep, pugixml_dep, libcurl_dep, microhttpd_dep, zlib_dep, xapian_dep] @@ -58,12 +61,6 @@ inc = include_directories('include', extra_include) conf = configuration_data() conf.set('LIBKIWIX_VERSION', '"@0@"'.format(meson.project_version())) -if build_machine.system() == 'windows' - extra_link_args = ['-lshlwapi', '-lwinmm'] -else - extra_link_args = [] -endif - subdir('include') subdir('scripts') subdir('static') diff --git a/src/server.cpp b/src/server.cpp index 53d938871..89491c371 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -51,7 +51,7 @@ bool Server::start() { m_withTaskbar, m_withLibraryButton, m_blockExternalLinks, - m_ipv6, + m_ipMode, m_indexTemplateString, m_ipConnectionLimit)); return mp_server->start(); @@ -85,9 +85,9 @@ std::string Server::getAddress() return mp_server->getAddress(); } -bool Server::isAddressIPv6() +IpMode Server::getIpMode() const { - return mp_server->isAddressIPv6(); + return mp_server->getIpMode(); } } diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 560059d47..ccc94a49b 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -416,7 +416,7 @@ InternalServer::InternalServer(LibraryPtr library, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, - bool ipv6, + IpMode ipMode, std::string indexTemplateString, int ipConnectionLimit) : m_addr(addr), @@ -429,7 +429,7 @@ InternalServer::InternalServer(LibraryPtr library, m_withTaskbar(withTaskbar), m_withLibraryButton(withLibraryButton), m_blockExternalLinks(blockExternalLinks), - m_ipv6(ipv6), + m_ipMode(ipMode), m_indexTemplateString(indexTemplateString.empty() ? RESOURCE::templates::index_html : indexTemplateString), m_ipConnectionLimit(ipConnectionLimit), mp_daemon(nullptr), @@ -466,22 +466,27 @@ bool InternalServer::start() { sockAddr6.sin6_addr = in6addr_any; sockAddr4.sin_addr.s_addr = htonl(INADDR_ANY); } - m_addr = kiwix::getBestPublicIp(m_ipv6); - std::cout< handle_request(const RequestContext& request); @@ -176,7 +176,7 @@ class InternalServer { bool m_withTaskbar; bool m_withLibraryButton; bool m_blockExternalLinks; - bool m_ipv6; + IpMode m_ipMode; std::string m_indexTemplateString; int m_ipConnectionLimit; struct MHD_Daemon* mp_daemon; diff --git a/src/tools/networkTools.cpp b/src/tools/networkTools.cpp index b113f810d..c1b61335f 100644 --- a/src/tools/networkTools.cpp +++ b/src/tools/networkTools.cpp @@ -79,8 +79,8 @@ std::string kiwix::download(const std::string& url) { #ifdef _WIN32 -std::map kiwix::getNetworkInterfacesWin() { - std::map interfaces; +std::map getNetworkInterfacesWin() { + std::map interfaces; const int working_buffer_size = 15000; const int max_tries = 3; @@ -98,7 +98,6 @@ std::map kiwix::getNetworkInterfacesWin() { // Successively allocate the required memory until GetAdaptersAddresses does not // results in ERROR_BUFFER_OVERFLOW for a maximum of max_tries do{ - interfacesHead = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen); if (interfacesHead == NULL) { std::cerr << "Memory allocation failed for IP_ADAPTER_ADDRESSES struct" << std::endl; @@ -106,7 +105,6 @@ std::map kiwix::getNetworkInterfacesWin() { } dwRetVal = GetAdaptersAddresses(family, flags, NULL, interfacesHead, &outBufLen); - } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < max_tries)); if (dwRetVal == NO_ERROR) { @@ -147,8 +145,8 @@ std::map kiwix::getNetworkInterfacesWin() { #else -std::map kiwix::getNetworkInterfacesPosix() { - std::map interfaces; +std::map getNetworkInterfacesPosix() { + std::map interfaces; struct ifaddrs *interfacesHead; if (getifaddrs(&interfacesHead) == -1) { @@ -179,20 +177,17 @@ std::map kiwix::getNetworkInterfacesPosix() { #endif -std::map kiwix::getNetworkInterfaces() { - std::map interfaces; - +std::map kiwix::getNetworkInterfaces() { #ifdef _WIN32 return getNetworkInterfacesWin(); #else return getNetworkInterfacesPosix(); #endif - } std::string kiwix::getBestPublicIp(bool ipv6) { - ip_addr bestPublicIp = ip_addr{"127.0.0.1","::1"}; - std::map interfaces = getNetworkInterfaces(); + kiwix::IpAddress bestPublicIp = kiwix::IpAddress{"127.0.0.1","::1"}; + std::map interfaces = getNetworkInterfaces(); #ifndef _WIN32 const char* const prioritizedNames[] =