diff --git a/src/backend/cuda/wrappers/CudaLib.cpp b/src/backend/cuda/wrappers/CudaLib.cpp index 189c6b2a..c148d9f8 100644 --- a/src/backend/cuda/wrappers/CudaLib.cpp +++ b/src/backend/cuda/wrappers/CudaLib.cpp @@ -28,6 +28,7 @@ #include "backend/cuda/wrappers/CudaLib.h" +#include "base/kernel/Env.h" #include "crypto/rx/RxAlgo.h" @@ -117,7 +118,7 @@ String CudaLib::m_loader; bool xmrig::CudaLib::init(const char *fileName) { if (!m_initialized) { - m_loader = fileName == nullptr ? defaultLoader() : fileName; + m_loader = fileName == nullptr ? defaultLoader() : Env::expand(fileName); m_ready = uv_dlopen(m_loader, &cudaLib) == 0 && load(); m_initialized = true; } @@ -319,7 +320,7 @@ bool xmrig::CudaLib::load() } -const char *xmrig::CudaLib::defaultLoader() +xmrig::String xmrig::CudaLib::defaultLoader() { # if defined(__APPLE__) return "/System/Library/Frameworks/OpenCL.framework/OpenCL"; // FIXME diff --git a/src/backend/cuda/wrappers/CudaLib.h b/src/backend/cuda/wrappers/CudaLib.h index 4874112f..6202e049 100644 --- a/src/backend/cuda/wrappers/CudaLib.h +++ b/src/backend/cuda/wrappers/CudaLib.h @@ -95,7 +95,7 @@ public: private: static bool load(); - static const char *defaultLoader(); + static String defaultLoader(); static bool m_initialized; static bool m_ready; diff --git a/src/backend/opencl/wrappers/OclLib.cpp b/src/backend/opencl/wrappers/OclLib.cpp index f156ed3d..d3329e73 100644 --- a/src/backend/opencl/wrappers/OclLib.cpp +++ b/src/backend/opencl/wrappers/OclLib.cpp @@ -28,10 +28,12 @@ #include +#include "backend/opencl/wrappers/OclLib.h" #include "backend/common/Tags.h" #include "backend/opencl/wrappers/OclError.h" -#include "backend/opencl/wrappers/OclLib.h" #include "base/io/log/Log.h" +#include "base/kernel/Env.h" + #if defined(OCL_DEBUG_REFERENCE_COUNT) # define LOG_REFS(x, ...) xmrig::Log::print(xmrig::Log::WARNING, x, ##__VA_ARGS__) @@ -188,7 +190,7 @@ static String getOclString(FUNC fn, OBJ obj, PARAM param) bool xmrig::OclLib::init(const char *fileName) { if (!m_initialized) { - m_loader = fileName == nullptr ? defaultLoader() : fileName; + m_loader = fileName == nullptr ? defaultLoader() : Env::expand(fileName); m_ready = uv_dlopen(m_loader, &oclLib) == 0 && load(); m_initialized = true; } @@ -257,7 +259,7 @@ bool xmrig::OclLib::load() } -const char *xmrig::OclLib::defaultLoader() +xmrig::String xmrig::OclLib::defaultLoader() { # if defined(__APPLE__) return "/System/Library/Frameworks/OpenCL.framework/OpenCL"; diff --git a/src/backend/opencl/wrappers/OclLib.h b/src/backend/opencl/wrappers/OclLib.h index 0c0eb0d4..9b9e19a8 100644 --- a/src/backend/opencl/wrappers/OclLib.h +++ b/src/backend/opencl/wrappers/OclLib.h @@ -102,7 +102,7 @@ public: private: static bool load(); - static const char *defaultLoader(); + static String defaultLoader(); static bool m_initialized; static bool m_ready; diff --git a/src/base/api/Api.cpp b/src/base/api/Api.cpp index c4b2c5a7..dfd78565 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 130ce78e..0ee9ca6a 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 615d9ac5..56aafdea 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/FileLog.cpp b/src/base/io/log/backends/FileLog.cpp index c581b880..47fad1ed 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/Env.cpp b/src/base/kernel/Env.cpp new file mode 100644 index 00000000..0be0480e --- /dev/null +++ b/src/base/kernel/Env.cpp @@ -0,0 +1,138 @@ +/* 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 + + +#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 00000000..2f33abf9 --- /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/net/stratum/BaseClient.cpp b/src/base/net/stratum/BaseClient.cpp index 56e5ad7c..677b0e37 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 974e61a5..5726b3e5 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 30ef20ea..df90e40f 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 09f2a7f9..11e8256a 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);