From c890e1c87e0712287dd78e854ade7c30c6de6a35 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Sat, 10 Aug 2019 13:59:05 +0200 Subject: [PATCH] Add support of a binding to a specific ip address. --- include/server.h | 2 ++ src/server.cpp | 55 +++++++++++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/include/server.h b/include/server.h index 54b35b34e..09e73e74f 100644 --- a/include/server.h +++ b/include/server.h @@ -51,6 +51,7 @@ namespace kiwix void stop(); void set_root(const std::string& root) { m_root = root; } + void set_addr(const std::string& addr) { m_addr = addr; } void set_port(int port) { m_port = port; } void set_nbThreads(int threads) { m_nbThreads = threads; } void set_verbose(bool verbose) { m_verbose = verbose; } @@ -61,6 +62,7 @@ namespace kiwix Library& m_library; NameMapper* mp_nameMapper; std::string m_root = ""; + std::string m_addr = ""; int m_port = 80; int m_nbThreads = 1; bool m_verbose = false; diff --git a/src/server.cpp b/src/server.cpp index fd820ad57..2af22f0d3 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -20,23 +20,25 @@ #define KIWIX_MIN_CONTENT_SIZE_TO_DEFLATE 100 #ifdef _WIN32 - -#if !defined(__MINGW32__) && (_MSC_VER < 1600) -#include "stdint4win.h" +# if !defined(__MINGW32__) && (_MSC_VER < 1600) +# include "stdint4win.h" +# endif +# include +# include +# ifdef __GNUC__ + // inet_pton is not declared in mingw, even if the function exists. + extern "C" { + WINSOCK_API_LINKAGE INT WSAAPI inet_pton( INT Family, PCSTR pszAddrString, PVOID pAddrBuf); + } +# endif + typedef UINT64 uint64_t; + typedef UINT16 uint16_t; #endif -#include -#include // otherwise socklen_t is not a recognized type -//#include // otherwise int is not a recognized type -// typedef int off_t; -// typedef SSIZE_T ssize_t; -typedef UINT64 uint64_t; -typedef UINT16 uint16_t; + extern "C" { #include } -#endif - #include "tools/otherTools.h" #include "tools/pathTools.h" #include "tools/regexTools.h" @@ -62,12 +64,7 @@ extern "C" { #include "kiwixlib-resources.h" #ifndef _WIN32 -//#include -//#include -//#include -//#include -//#include -//#include +# include #endif #include "server.h" @@ -99,6 +96,7 @@ class InternalServer { public: InternalServer(Library& library, NameMapper* nameMapper, + std::string addr, int port, std::string root, int nbThreads, @@ -132,6 +130,7 @@ class InternalServer { kainjow::mustache::data get_default_data(); Response get_default_response(); + std::string m_addr; int m_port; std::string m_root; int m_nbThreads; @@ -158,6 +157,7 @@ bool Server::start() { mp_server.reset(new InternalServer( m_library, mp_nameMapper, + m_addr, m_port, m_root, m_nbThreads, @@ -175,12 +175,14 @@ void Server::stop() { InternalServer::InternalServer(Library& library, NameMapper* nameMapper, + std::string addr, int port, std::string root, int nbThreads, bool verbose, bool withTaskbar, bool withLibraryButton) : + m_addr(addr), m_port(port), m_root(root), m_nbThreads(nbThreads), @@ -193,7 +195,6 @@ InternalServer::InternalServer(Library& library, {} bool InternalServer::start() { - // TODO Readd selection of the interface #ifdef _WIN32 int flags = MHD_USE_SELECT_INTERNALLY; #else @@ -202,12 +203,28 @@ bool InternalServer::start() { if (m_verbose.load()) flags |= MHD_USE_DEBUG; + + struct sockaddr_in sockAddr; + memset(&sockAddr, 0, sizeof(sockAddr)); + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(m_port); + if (m_addr.empty()) { + if (0 != INADDR_ANY) + sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); + } else { + if (inet_pton(AF_INET, m_addr.c_str(), &(sockAddr.sin_addr.s_addr)) == 0) { + std::cerr << "Ip address " << m_addr << " is not a valid ip address" << std::endl; + return false; + } + } + mp_daemon = MHD_start_daemon(flags, m_port, NULL, NULL, &staticHandlerCallback, this, + MHD_OPTION_SOCK_ADDR, &sockAddr, MHD_OPTION_THREAD_POOL_SIZE, m_nbThreads, MHD_OPTION_END); if (mp_daemon == nullptr) {