From 7bf75b44fa73ecb208b46e12939883b9b0772312 Mon Sep 17 00:00:00 2001 From: XMRig Date: Fri, 27 Dec 2019 01:00:16 +0700 Subject: [PATCH] Sync changes. --- CMakeLists.txt | 1 + cmake/os.cmake | 45 ++++++++ src/base/api/Api.cpp | 18 +-- src/base/api/Api.h | 3 +- src/base/base.cmake | 2 + src/base/io/log/backends/ConsoleLog.cpp | 11 +- src/base/io/log/backends/ConsoleLog.h | 2 +- src/base/io/log/backends/FileLog.cpp | 3 +- src/base/kernel/Base.cpp | 2 +- src/base/kernel/Entry.cpp | 4 +- src/base/kernel/Env.cpp | 139 ++++++++++++++++++++++++ src/base/kernel/Env.h | 47 ++++++++ src/base/kernel/Process.cpp | 12 +- src/base/kernel/Process.h | 2 +- src/base/kernel/interfaces/IConfig.h | 1 + src/base/net/stratum/BaseClient.cpp | 18 ++- src/base/net/stratum/BaseClient.h | 6 +- src/base/net/stratum/Client.cpp | 8 +- src/base/net/stratum/DaemonClient.cpp | 4 +- src/crypto/common/Algorithm.cpp | 5 - src/crypto/common/Algorithm.h | 1 - src/version.h | 4 +- 22 files changed, 295 insertions(+), 43 deletions(-) create mode 100644 cmake/os.cmake create mode 100644 src/base/kernel/Env.cpp create mode 100644 src/base/kernel/Env.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 97e15e7..9eb0791 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ option(WITH_TLS "Enable OpenSSL support" ON) include (CheckIncludeFile) +include (cmake/os.cmake) include (src/base/base.cmake) diff --git a/cmake/os.cmake b/cmake/os.cmake new file mode 100644 index 0000000..0270cc9 --- /dev/null +++ b/cmake/os.cmake @@ -0,0 +1,45 @@ +if (WIN32) + set(XMRIG_OS_WIN ON) +elseif (APPLE) + set(XMRIG_OS_APPLE ON) + + if (IOS OR CMAKE_SYSTEM_NAME STREQUAL iOS) + set(XMRIG_OS_IOS ON) + else() + set(XMRIG_OS_MACOS ON) + endif() +else() + set(XMRIG_OS_UNIX ON) + + if (ANDROID OR CMAKE_SYSTEM_NAME MATCHES "Android") + set(XMRIG_OS_ANDROID ON) + elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(XMRIG_OS_LINUX ON) + elseif(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) + set(XMRIG_OS_FREEBSD ON) + endif() +endif() + + +if (XMRIG_OS_WIN) + add_definitions(/DWIN32) + add_definitions(/DXMRIG_OS_WIN) +elseif(XMRIG_OS_APPLE) + add_definitions(/DXMRIG_OS_APPLE) + + if (XMRIG_OS_IOS) + add_definitions(/DXMRIG_OS_IOS) + else() + add_definitions(/DXMRIG_OS_MACOS) + endif() +elseif(XMRIG_OS_UNIX) + add_definitions(/DXMRIG_OS_UNIX) + + if (XMRIG_OS_ANDROID) + add_definitions(/DXMRIG_OS_ANDROID) + elseif (XMRIG_OS_LINUX) + add_definitions(/DXMRIG_OS_LINUX) + elseif (XMRIG_OS_FREEBSD) + add_definitions(/DXMRIG_OS_FREEBSD) + endif() +endif() diff --git a/src/base/api/Api.cpp b/src/base/api/Api.cpp index c4b2c5a..dfd7856 100644 --- a/src/base/api/Api.cpp +++ b/src/base/api/Api.cpp @@ -26,17 +26,13 @@ #include -#ifndef _WIN32 -# include -#endif - - #include "base/api/Api.h" #include "3rdparty/http-parser/http_parser.h" #include "base/api/interfaces/IApiListener.h" #include "base/api/requests/HttpApiRequest.h" #include "base/io/json/Json.h" #include "base/kernel/Base.h" +#include "base/kernel/Env.h" #include "base/tools/Buffer.h" #include "base/tools/Chrono.h" #include "core/config/Config.h" @@ -158,7 +154,7 @@ void xmrig::Api::exec(IApiRequest &request) auto &reply = request.reply(); reply.AddMember("id", StringRef(m_id), allocator); - reply.AddMember("worker_id", StringRef(m_workerId), allocator); + reply.AddMember("worker_id", m_workerId.toJSON(), allocator); reply.AddMember("uptime", (Chrono::currentMSecsSinceEpoch() - m_timestamp) / 1000, allocator); reply.AddMember("restricted", request.isRestricted(), allocator); reply.AddMember("resources", getResources(request.doc()), allocator); @@ -245,12 +241,8 @@ void xmrig::Api::genId(const String &id) void xmrig::Api::genWorkerId(const String &id) { - memset(m_workerId, 0, sizeof(m_workerId)); - - if (id.size() > 0) { - strncpy(m_workerId, id.data(), sizeof(m_workerId) - 1); - } - else { - gethostname(m_workerId, sizeof(m_workerId) - 1); + m_workerId = Env::expand(id); + if (m_workerId.isEmpty()) { + m_workerId = Env::hostname(); } } diff --git a/src/base/api/Api.h b/src/base/api/Api.h index 130ce78..0ee9ca6 100644 --- a/src/base/api/Api.h +++ b/src/base/api/Api.h @@ -32,6 +32,7 @@ #include "base/kernel/interfaces/IBaseListener.h" #include "base/tools/Object.h" +#include "base/tools/String.h" namespace xmrig { @@ -71,7 +72,7 @@ private: Base *m_base; char m_id[32]{}; - char m_workerId[128]{}; + String m_workerId; const uint64_t m_timestamp; Httpd *m_httpd = nullptr; std::vector m_listeners; diff --git a/src/base/base.cmake b/src/base/base.cmake index 615d9ac..56aafde 100644 --- a/src/base/base.cmake +++ b/src/base/base.cmake @@ -12,6 +12,7 @@ set(HEADERS_BASE src/base/kernel/config/BaseConfig.h src/base/kernel/config/BaseTransform.h src/base/kernel/Entry.h + src/base/kernel/Env.h src/base/kernel/interfaces/IBaseListener.h src/base/kernel/interfaces/IClient.h src/base/kernel/interfaces/IClientListener.h @@ -66,6 +67,7 @@ set(SOURCES_BASE src/base/kernel/config/BaseConfig.cpp src/base/kernel/config/BaseTransform.cpp src/base/kernel/Entry.cpp + src/base/kernel/Env.cpp src/base/kernel/Platform.cpp src/base/kernel/Process.cpp src/base/kernel/Signals.cpp diff --git a/src/base/io/log/backends/ConsoleLog.cpp b/src/base/io/log/backends/ConsoleLog.cpp index 4d3c532..bf17deb 100644 --- a/src/base/io/log/backends/ConsoleLog.cpp +++ b/src/base/io/log/backends/ConsoleLog.cpp @@ -27,9 +27,10 @@ #include -#include "base/tools/Handle.h" #include "base/io/log/backends/ConsoleLog.h" +#include "base/tools/Handle.h" #include "base/io/log/Log.h" +#include "version.h" xmrig::ConsoleLog::ConsoleLog() @@ -48,7 +49,7 @@ xmrig::ConsoleLog::ConsoleLog() uv_tty_set_mode(m_tty, UV_TTY_MODE_NORMAL); -# ifdef WIN32 +# ifdef XMRIG_OS_WIN m_stream = reinterpret_cast(m_tty); HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); @@ -59,6 +60,8 @@ xmrig::ConsoleLog::ConsoleLog() SetConsoleMode(handle, mode | ENABLE_EXTENDED_FLAGS); } } + + SetConsoleTitleA(APP_NAME " " APP_VERSION); # endif } @@ -75,7 +78,7 @@ void xmrig::ConsoleLog::print(int, const char *line, size_t, size_t size, bool c return; } -# ifdef _WIN32 +# ifdef XMRIG_OS_WIN uv_buf_t buf = uv_buf_init(const_cast(line), static_cast(size)); if (!isWritable()) { @@ -99,7 +102,7 @@ bool xmrig::ConsoleLog::isSupported() const } -#ifdef WIN32 +#ifdef XMRIG_OS_WIN bool xmrig::ConsoleLog::isWritable() const { if (!m_stream || uv_is_writable(m_stream) != 1) { diff --git a/src/base/io/log/backends/ConsoleLog.h b/src/base/io/log/backends/ConsoleLog.h index 549243a..89ed360 100644 --- a/src/base/io/log/backends/ConsoleLog.h +++ b/src/base/io/log/backends/ConsoleLog.h @@ -54,7 +54,7 @@ private: uv_tty_t *m_tty = nullptr; -# ifdef _WIN32 +# ifdef XMRIG_OS_WIN bool isWritable() const; uv_stream_t *m_stream = nullptr; diff --git a/src/base/io/log/backends/FileLog.cpp b/src/base/io/log/backends/FileLog.cpp index c581b88..47fad1e 100644 --- a/src/base/io/log/backends/FileLog.cpp +++ b/src/base/io/log/backends/FileLog.cpp @@ -25,6 +25,7 @@ #include "base/io/log/backends/FileLog.h" +#include "base/kernel/Env.h" #include @@ -35,7 +36,7 @@ xmrig::FileLog::FileLog(const char *fileName) { uv_fs_t req; - m_file = uv_fs_open(uv_default_loop(), &req, fileName, O_CREAT | O_APPEND | O_WRONLY, 0644, nullptr); + m_file = uv_fs_open(uv_default_loop(), &req, Env::expand(fileName), O_CREAT | O_APPEND | O_WRONLY, 0644, nullptr); uv_fs_req_cleanup(&req); } diff --git a/src/base/kernel/Base.cpp b/src/base/kernel/Base.cpp index 03aaaca..42d2746 100644 --- a/src/base/kernel/Base.cpp +++ b/src/base/kernel/Base.cpp @@ -127,7 +127,7 @@ private: return config.release(); } - chain.addFile(process->location(Process::ExeLocation, "config.json")); + chain.addFile(Process::location(Process::ExeLocation, "config.json")); if (read(chain, config)) { return config.release(); diff --git a/src/base/kernel/Entry.cpp b/src/base/kernel/Entry.cpp index 1d1b7eb..58f9438 100644 --- a/src/base/kernel/Entry.cpp +++ b/src/base/kernel/Entry.cpp @@ -101,9 +101,9 @@ static int showVersion() #ifdef XMRIG_FEATURE_HWLOC -static int exportTopology(const Process &process) +static int exportTopology(const Process &) { - const String path = process.location(Process::ExeLocation, "topology.xml"); + const String path = Process::location(Process::ExeLocation, "topology.xml"); hwloc_topology_t topology; hwloc_topology_init(&topology); diff --git a/src/base/kernel/Env.cpp b/src/base/kernel/Env.cpp new file mode 100644 index 0000000..6f8627b --- /dev/null +++ b/src/base/kernel/Env.cpp @@ -0,0 +1,139 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "base/kernel/Env.h" +#include "base/kernel/Process.h" +#include "version.h" + + +#include +#include +#include + + +#ifndef _WIN32 +# include +#endif + + +#ifndef UV_MAXHOSTNAMESIZE +# ifdef MAXHOSTNAMELEN +# define UV_MAXHOSTNAMESIZE (MAXHOSTNAMELEN + 1) +# else +# define UV_MAXHOSTNAMESIZE 256 +# endif +#endif + + +namespace xmrig { + + +static std::map variables; + + +static void createVariables() +{ + variables.insert({ "XMRIG_VERSION", APP_VERSION }); + variables.insert({ "XMRIG_EXE_DIR", Process::location(Process::ExeLocation, "") }); + variables.insert({ "XMRIG_CWD", Process::location(Process::CwdLocation, "") }); +} + + +} // namespace xmrig + + +xmrig::String xmrig::Env::expand(const char *in) +{ + if (in == nullptr) { + return {}; + } + + std::string text(in); + if (text.size() < 4) { + return text.c_str(); + } + + static const std::regex env_re{R"--(\$\{([^}]+)\})--"}; + + std::map vars; + + for (std::sregex_iterator i = std::sregex_iterator(text.begin(), text.end(), env_re); i != std::sregex_iterator(); ++i) { + std::smatch m = *i; + const auto var = m.str(); + + if (vars.count(var)) { + continue; + } + + vars.insert({ var, get(m[1].str().c_str()) }); + } + + for (const auto &kv : vars) { + if (kv.second.isNull()) { + continue; + } + + size_t pos = 0; + while ((pos = text.find(kv.first, pos)) != std::string::npos) { + text.replace(pos, kv.first.size(), kv.second); + pos += kv.second.size(); + } + } + + return text.c_str(); +} + + +xmrig::String xmrig::Env::get(const String &name) +{ + if (variables.empty()) { + createVariables(); + } + + if (variables.count(name)) { + return variables.at(name); + } + + return static_cast(getenv(name)); +} + + +xmrig::String xmrig::Env::hostname() +{ + char buf[UV_MAXHOSTNAMESIZE]{}; + size_t size = sizeof(buf); + +# if UV_VERSION_HEX >= 0x010c00 + if (uv_os_gethostname(buf, &size) == 0) { + return static_cast(buf); + } +# else + if (gethostname(buf, size) == 0) { + return static_cast(buf); + } +# endif + + return {}; +} diff --git a/src/base/kernel/Env.h b/src/base/kernel/Env.h new file mode 100644 index 0000000..2f33abf --- /dev/null +++ b/src/base/kernel/Env.h @@ -0,0 +1,47 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef XMRIG_ENV_H +#define XMRIG_ENV_H + + +#include "base/tools/String.h" + + +namespace xmrig { + + +class Env +{ +public: + static String expand(const char *in); + static String get(const String &name); + static String hostname(); +}; + + +} /* namespace xmrig */ + + +#endif /* XMRIG_ENV_H */ diff --git a/src/base/kernel/Process.cpp b/src/base/kernel/Process.cpp index fae0d67..4fc3ea3 100644 --- a/src/base/kernel/Process.cpp +++ b/src/base/kernel/Process.cpp @@ -31,7 +31,10 @@ #include "base/tools/Chrono.h" -static size_t location(xmrig::Process::Location location, char *buf, size_t max) +namespace xmrig { + + +static size_t getLocation(Process::Location location, char *buf, size_t max) { using namespace xmrig; @@ -48,6 +51,9 @@ static size_t location(xmrig::Process::Location location, char *buf, size_t max) } +} // namespace xmrig + + xmrig::Process::Process(int argc, char **argv) : m_arguments(argc, argv) { @@ -55,12 +61,12 @@ xmrig::Process::Process(int argc, char **argv) : } -xmrig::String xmrig::Process::location(Location location, const char *fileName) const +xmrig::String xmrig::Process::location(Location location, const char *fileName) { constexpr const size_t max = 520; char *buf = new char[max](); - size_t size = ::location(location, buf, max); + size_t size = getLocation(location, buf, max); if (size == 0) { delete [] buf; diff --git a/src/base/kernel/Process.h b/src/base/kernel/Process.h index 2295904..12cfc90 100644 --- a/src/base/kernel/Process.h +++ b/src/base/kernel/Process.h @@ -48,7 +48,7 @@ public: Process(int argc, char **argv); - String location(Location location, const char *fileName = nullptr) const; + static String location(Location location, const char *fileName = nullptr); inline const Arguments &arguments() const { return m_arguments; } diff --git a/src/base/kernel/interfaces/IConfig.h b/src/base/kernel/interfaces/IConfig.h index fe1a24b..f483f04 100644 --- a/src/base/kernel/interfaces/IConfig.h +++ b/src/base/kernel/interfaces/IConfig.h @@ -92,6 +92,7 @@ public: RandomXModeKey = 1029, RandomX1GbPagesKey = 1031, RandomXWrmsrKey = 1032, + RandomXRdmsrKey = 1033, CPUMaxThreadsKey = 1026, MemoryPoolKey = 1027, YieldKey = 1030, diff --git a/src/base/net/stratum/BaseClient.cpp b/src/base/net/stratum/BaseClient.cpp index 56e5ad7..677b0e3 100644 --- a/src/base/net/stratum/BaseClient.cpp +++ b/src/base/net/stratum/BaseClient.cpp @@ -23,16 +23,19 @@ */ -#include "base/kernel/interfaces/IClientListener.h" #include "base/net/stratum/BaseClient.h" +#include "base/kernel/Env.h" +#include "base/kernel/interfaces/IClientListener.h" #include "base/net/stratum/SubmitResult.h" #include "rapidjson/document.h" namespace xmrig { + int64_t BaseClient::m_sequence = 1; + } /* namespace xmrig */ @@ -43,6 +46,19 @@ xmrig::BaseClient::BaseClient(int id, IClientListener *listener) : } +void xmrig::BaseClient::setPool(const Pool &pool) +{ + if (!pool.isValid()) { + return; + } + + m_pool = pool; + m_user = Env::expand(pool.user()); + m_password = Env::expand(pool.password()); + m_rigId = Env::expand(pool.rigId()); +} + + bool xmrig::BaseClient::handleResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error) { if (id == 1) { diff --git a/src/base/net/stratum/BaseClient.h b/src/base/net/stratum/BaseClient.h index 974e61a..5726b3e 100644 --- a/src/base/net/stratum/BaseClient.h +++ b/src/base/net/stratum/BaseClient.h @@ -56,11 +56,12 @@ protected: inline int64_t sequence() const override { return m_sequence; } inline void setAlgo(const Algorithm &algo) override { m_pool.setAlgo(algo); } inline void setEnabled(bool enabled) override { m_enabled = enabled; } - inline void setPool(const Pool &pool) override { if (pool.isValid()) { m_pool = pool; } } inline void setQuiet(bool quiet) override { m_quiet = quiet; } inline void setRetries(int retries) override { m_retries = retries; } inline void setRetryPause(uint64_t ms) override { m_retryPause = ms; } + void setPool(const Pool &pool) override; + protected: enum SocketState { UnconnectedState, @@ -95,6 +96,9 @@ protected: std::map m_callbacks; std::map m_results; String m_ip; + String m_password; + String m_rigId; + String m_user; uint64_t m_retryPause = 5000; static int64_t m_sequence; diff --git a/src/base/net/stratum/Client.cpp b/src/base/net/stratum/Client.cpp index 30ef20e..df90e40 100644 --- a/src/base/net/stratum/Client.cpp +++ b/src/base/net/stratum/Client.cpp @@ -624,12 +624,12 @@ void xmrig::Client::login() auto &allocator = doc.GetAllocator(); Value params(kObjectType); - params.AddMember("login", m_pool.user().toJSON(), allocator); - params.AddMember("pass", m_pool.password().toJSON(), allocator); + params.AddMember("login", m_user.toJSON(), allocator); + params.AddMember("pass", m_password.toJSON(), allocator); params.AddMember("agent", StringRef(m_agent), allocator); - if (!m_pool.rigId().isNull()) { - params.AddMember("rigid", m_pool.rigId().toJSON(), allocator); + if (!m_rigId.isNull()) { + params.AddMember("rigid", m_rigId.toJSON(), allocator); } m_listener->onLogin(this, doc, params); diff --git a/src/base/net/stratum/DaemonClient.cpp b/src/base/net/stratum/DaemonClient.cpp index 09f2a7f..11e8256 100644 --- a/src/base/net/stratum/DaemonClient.cpp +++ b/src/base/net/stratum/DaemonClient.cpp @@ -284,8 +284,8 @@ int64_t xmrig::DaemonClient::getBlockTemplate() auto &allocator = doc.GetAllocator(); Value params(kObjectType); - params.AddMember("wallet_address", m_pool.user().toJSON(), allocator); - params.AddMember("reserve_size", 8, allocator); + params.AddMember("wallet_address", m_user.toJSON(), allocator); + params.AddMember("reserve_size", 8, allocator); JsonRequest::create(doc, m_sequence, "getblocktemplate", params); diff --git a/src/crypto/common/Algorithm.cpp b/src/crypto/common/Algorithm.cpp index a725890..99883da 100644 --- a/src/crypto/common/Algorithm.cpp +++ b/src/crypto/common/Algorithm.cpp @@ -114,8 +114,6 @@ static AlgoName const algorithm_names[] = { { "RandomARQ", nullptr, Algorithm::RX_ARQ }, { "randomx/sfx", "rx/sfx", Algorithm::RX_SFX }, { "RandomSFX", nullptr, Algorithm::RX_SFX }, - { "randomx/v", "rx/v", Algorithm::RX_V }, - { "RandomV", nullptr, Algorithm::RX_V }, # endif # ifdef XMRIG_ALGO_ARGON2 { "argon2/chukwa", nullptr, Algorithm::AR2_CHUKWA }, @@ -143,7 +141,6 @@ size_t xmrig::Algorithm::l2() const case RX_0: case RX_LOKI: case RX_SFX: - case RX_V: return 0x40000; case RX_WOW: @@ -180,7 +177,6 @@ size_t xmrig::Algorithm::l3() const case RX_0: case RX_LOKI: case RX_SFX: - case RX_V: return oneMiB * 2; case RX_WOW: @@ -281,7 +277,6 @@ xmrig::Algorithm::Family xmrig::Algorithm::family(Id id) case RX_LOKI: case RX_ARQ: case RX_SFX: - case RX_V: return RANDOM_X; # endif diff --git a/src/crypto/common/Algorithm.h b/src/crypto/common/Algorithm.h index c72b4e6..bfdcea5 100644 --- a/src/crypto/common/Algorithm.h +++ b/src/crypto/common/Algorithm.h @@ -68,7 +68,6 @@ public: RX_LOKI, // "rx/loki" RandomXL (Loki). RX_ARQ, // "rx/arq" RandomARQ (Arqma). RX_SFX, // "rx/sfx" RandomSFX (Safex Cash). - RX_V, // "rx/v" RandomV (Monerov). AR2_CHUKWA, // "argon2/chukwa" Argon2id (Chukwa). AR2_WRKZ, // "argon2/wrkz" Argon2id (WRKZ) MAX diff --git a/src/version.h b/src/version.h index 021dcbd..530da14 100644 --- a/src/version.h +++ b/src/version.h @@ -28,14 +28,14 @@ #define APP_ID "xmrig-proxy" #define APP_NAME "xmrig-proxy" #define APP_DESC "XMRig Stratum proxy" -#define APP_VERSION "5.4.0" +#define APP_VERSION "5.5.0-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" #define APP_KIND "proxy" #define APP_VER_MAJOR 5 -#define APP_VER_MINOR 4 +#define APP_VER_MINOR 5 #define APP_VER_PATCH 0 #ifdef _MSC_VER