XMRigCC 2.1.0 (#270)
* New XMRigCCServer without dependencies and now with full TLS support on Windows * Dashboard * Added all columns to the dashboard * Dynamic table view (column visibility) * Grouping by Algo * GZIP compression for the whole traffic * Full Rebase on XMRig 3.2.0 * Final randomX/0 (XMR) * Coin config * Bugfixes
This commit is contained in:
parent
b395fe94f6
commit
f7c3dd88ee
90 changed files with 9477 additions and 7371 deletions
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -1,3 +1,14 @@
|
||||||
|
# 2.1.0
|
||||||
|
* New XMRigCCServer without dependencies and now with full TLS support on Windows
|
||||||
|
* Dashboard
|
||||||
|
* Added all columns to the dashboard
|
||||||
|
* Dynamic table view (column visibility)
|
||||||
|
* Grouping by Algo
|
||||||
|
* GZIP compression for the whole traffic
|
||||||
|
* Full Rebase on XMRig 3.2.0
|
||||||
|
* Final randomX/0 (XMR)
|
||||||
|
* Coin config
|
||||||
|
* Bugfixes
|
||||||
# 2.0.0
|
# 2.0.0
|
||||||
**Thx to @xmrig and @SChernykh awesome work!**
|
**Thx to @xmrig and @SChernykh awesome work!**
|
||||||
* Full Rebase on XMRig 3.1.1
|
* Full Rebase on XMRig 3.1.1
|
||||||
|
|
|
@ -21,10 +21,11 @@ option(WITH_HTTP "Enable HTTP protocol support (client/server)" ON)
|
||||||
option(WITH_CN_EXTREMELITE "CryptoNight-Extremelite support" ON)
|
option(WITH_CN_EXTREMELITE "CryptoNight-Extremelite support" ON)
|
||||||
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
|
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
|
||||||
option(WITH_TLS "Enable OpenSSL support" ON)
|
option(WITH_TLS "Enable OpenSSL support" ON)
|
||||||
|
option(WITH_ZLIB "Enabled gzip compression on CC (client/server)")
|
||||||
option(WITH_ASM "Enable ASM PoW implementations" ON)
|
option(WITH_ASM "Enable ASM PoW implementations" ON)
|
||||||
option(WITH_EMBEDDED_CONFIG "Enable internal embedded JSON config" OFF)
|
option(WITH_EMBEDDED_CONFIG "Enable internal embedded JSON config" OFF)
|
||||||
option(WITH_CC_CLIENT "CC Client" ON)
|
option(WITH_CC_CLIENT "CC Client" ON)
|
||||||
option(WITH_CC_SERVER "CC Server" OFF)
|
option(WITH_CC_SERVER "CC Server" ON)
|
||||||
|
|
||||||
option(BUILD_STATIC "Build static binary" OFF)
|
option(BUILD_STATIC "Build static binary" OFF)
|
||||||
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
|
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
|
||||||
|
@ -86,6 +87,7 @@ set(HEADERS_CRYPTO
|
||||||
src/crypto/cn/skein_port.h
|
src/crypto/cn/skein_port.h
|
||||||
src/crypto/cn/soft_aes.h
|
src/crypto/cn/soft_aes.h
|
||||||
src/crypto/common/Algorithm.h
|
src/crypto/common/Algorithm.h
|
||||||
|
src/crypto/common/Coin.h
|
||||||
src/crypto/common/keccak.h
|
src/crypto/common/keccak.h
|
||||||
src/crypto/common/Nonce.h
|
src/crypto/common/Nonce.h
|
||||||
src/crypto/common/portable/mm_malloc.h
|
src/crypto/common/portable/mm_malloc.h
|
||||||
|
@ -123,6 +125,7 @@ set(SOURCES_CRYPTO
|
||||||
src/crypto/cn/CnCtx.cpp
|
src/crypto/cn/CnCtx.cpp
|
||||||
src/crypto/cn/CnHash.cpp
|
src/crypto/cn/CnHash.cpp
|
||||||
src/crypto/common/Algorithm.cpp
|
src/crypto/common/Algorithm.cpp
|
||||||
|
src/crypto/common/Coin.cpp
|
||||||
src/crypto/common/keccak.cpp
|
src/crypto/common/keccak.cpp
|
||||||
src/crypto/common/Nonce.cpp
|
src/crypto/common/Nonce.cpp
|
||||||
src/crypto/common/VirtualMemory.cpp
|
src/crypto/common/VirtualMemory.cpp
|
||||||
|
@ -203,32 +206,53 @@ if (WITH_EMBEDDED_CONFIG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_CC_SERVER)
|
if (WITH_CC_SERVER)
|
||||||
if (MHD_FOUND)
|
|
||||||
include_directories(${MHD_INCLUDE_DIRS})
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "microhttpd NOT found: use `-DWITH_CC_SERVER=OFF` to build without CC Server support")
|
|
||||||
endif(MHD_FOUND)
|
|
||||||
|
|
||||||
set(SOURCES_CC_SERVER
|
set(SOURCES_CC_SERVER
|
||||||
|
src/base/io/log/backends/ConsoleLog.cpp
|
||||||
|
src/base/io/log/backends/FileLog.cpp
|
||||||
|
src/base/io/log/Log.cpp
|
||||||
|
src/base/io/json/Json.cpp
|
||||||
|
src/base/io/json/JsonChain.cpp
|
||||||
|
src/base/io/Console.cpp
|
||||||
|
src/base/kernel/Signals.cpp
|
||||||
|
src/base/tools/String.cpp
|
||||||
|
src/cc/CCCServerConfig.cpp
|
||||||
src/cc/CCServer.cpp
|
src/cc/CCServer.cpp
|
||||||
src/cc/Service.cpp
|
|
||||||
src/cc/Summary.cpp
|
src/cc/Summary.cpp
|
||||||
|
src/cc/Service.cpp
|
||||||
src/cc/Httpd.cpp
|
src/cc/Httpd.cpp
|
||||||
src/cc/XMRigCC.cpp
|
src/cc/XMRigCC.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
set(SOURCES_CC_SERVER
|
||||||
|
"${SOURCES_CC_SERVER}"
|
||||||
|
src/base/io/json/Json_win.cpp
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set(SOURCES_CC_SERVER
|
||||||
|
"${SOURCES_CC_SERVER}"
|
||||||
|
src/base/io/json/Json_unix.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_definitions("/DXMRIG_FEATURE_CC_SERVER")
|
add_definitions("/DXMRIG_FEATURE_CC_SERVER")
|
||||||
|
add_definitions("/DCXXOPTS_NO_RTTI")
|
||||||
|
|
||||||
|
if (WITH_TLS)
|
||||||
|
add_definitions(/DCPPHTTPLIB_OPENSSL_SUPPORT)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_CC_CLIENT)
|
if (WITH_CC_CLIENT)
|
||||||
set(SOURCES_CC_CLIENT
|
set(SOURCES_CC_CLIENT
|
||||||
src/cc/CCClientConfig.cpp
|
src/cc/CCClientConfig.cpp
|
||||||
src/cc/CCClient.cpp)
|
src/cc/CCClient.cpp
|
||||||
|
src/base/io/log/backends/RemoteLog.cpp)
|
||||||
add_definitions("/DXMRIG_FEATURE_CC_CLIENT")
|
add_definitions("/DXMRIG_FEATURE_CC_CLIENT")
|
||||||
|
|
||||||
if (WITH_TLS)
|
if (WITH_TLS)
|
||||||
add_definitions(/DCPPHTTPLIB_OPENSSL_SUPPORT)
|
add_definitions(/DCPPHTTPLIB_OPENSSL_SUPPORT)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_CC_SERVER OR WITH_CC_CLIENT)
|
if (WITH_CC_SERVER OR WITH_CC_CLIENT)
|
||||||
|
@ -236,6 +260,11 @@ if (WITH_CC_SERVER OR WITH_CC_CLIENT)
|
||||||
src/cc/ControlCommand.cpp
|
src/cc/ControlCommand.cpp
|
||||||
src/cc/ClientStatus.cpp
|
src/cc/ClientStatus.cpp
|
||||||
src/cc/GPUInfo.cpp)
|
src/cc/GPUInfo.cpp)
|
||||||
|
|
||||||
|
if (WITH_ZLIB)
|
||||||
|
find_package(ZLIB)
|
||||||
|
add_definitions(/DCPPHTTPLIB_ZLIB_SUPPORT)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(src)
|
include_directories(src)
|
||||||
|
@ -250,10 +279,14 @@ if (WITH_DEBUG_LOG)
|
||||||
add_definitions(/DAPP_DEBUG)
|
add_definitions(/DAPP_DEBUG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES} ${SOURCES_CC_CLIENT} ${SOURCES_CC_COMMON})
|
add_executable(xmrigMiner ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES} ${SOURCES_CC_CLIENT} ${SOURCES_CC_COMMON})
|
||||||
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY})
|
target_link_libraries(xmrigMiner ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY})
|
||||||
|
set_target_properties(xmrigMiner PROPERTIES OUTPUT_NAME ${MINER_EXECUTABLE_NAME})
|
||||||
|
|
||||||
add_executable(xmrigDaemon src/cc/XMRigd.cpp res/app.rc)
|
add_executable(xmrigDaemon src/cc/XMRigd.cpp res/app.rc)
|
||||||
|
|
||||||
set_target_properties(xmrigDaemon PROPERTIES OUTPUT_NAME ${DAEMON_EXECUTABLE_NAME})
|
set_target_properties(xmrigDaemon PROPERTIES OUTPUT_NAME ${DAEMON_EXECUTABLE_NAME})
|
||||||
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES OUTPUT_NAME ${MINER_EXECUTABLE_NAME})
|
|
||||||
|
if (WITH_CC_SERVER)
|
||||||
|
add_executable(xmrigServer ${SOURCES_CC_SERVER} ${SOURCES_CC_COMMON} ${SOURCES_SYSLOG} res/app.rc)
|
||||||
|
target_link_libraries(xmrigServer ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY} ${ZLIB_LIBRARIES})
|
||||||
|
endif()
|
|
@ -1,5 +1,6 @@
|
||||||
# XMRigCC
|
# XMRigCC
|
||||||
|
|
||||||
|
**:warning: [Monero will change PoW algorithm to RandomX on November 30.](https://github.com/xmrig/xmrig/issues/1204)**
|
||||||
XMRig is a high performance RandomX, CryptoNight and Argon2 CPU miner, with official support for Windows.
|
XMRig is a high performance RandomX, CryptoNight and Argon2 CPU miner, with official support for Windows.
|
||||||
|
|
||||||
:bulb: **This is the CPU variant of XMRigCC, if you're looking for the AMD GPU (OpenCL) variant [click here](https://github.com/Bendr0id/xmrigCC-amd/).**
|
:bulb: **This is the CPU variant of XMRigCC, if you're looking for the AMD GPU (OpenCL) variant [click here](https://github.com/Bendr0id/xmrigCC-amd/).**
|
||||||
|
|
|
@ -2,6 +2,9 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||||
set(CMAKE_BUILD_TYPE Release)
|
set(CMAKE_BUILD_TYPE Release)
|
||||||
endif()
|
endif()
|
||||||
|
@ -13,11 +16,10 @@ endif()
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-strict-aliasing")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-strict-aliasing")
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast")
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Ofast")
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexceptions -fno-rtti -Wno-class-memaccess")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexceptions -fno-rtti -Wno-strict-aliasing -Wno-class-memaccess")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -s")
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -s")
|
||||||
|
|
||||||
if (XMRIG_ARMv8)
|
if (XMRIG_ARMv8)
|
||||||
|
@ -46,6 +48,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
||||||
add_definitions(/D_GNU_SOURCE)
|
add_definitions(/D_GNU_SOURCE)
|
||||||
|
|
||||||
if (${CMAKE_VERSION} VERSION_LESS "3.1.0")
|
if (${CMAKE_VERSION} VERSION_LESS "3.1.0")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,18 @@
|
||||||
# Algorithms
|
# Algorithms
|
||||||
|
|
||||||
Since version 2 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant/powVariant` option (this option was removed in v2). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
Algorithm can be defined in 3 ways:
|
||||||
|
|
||||||
#### Example
|
1. By pool, using algorithm negotiation, in this case no need specify algorithm on miner side.
|
||||||
```json
|
2. Per pool `coin` option, currently only usable value for this option is `monero`.
|
||||||
{
|
3. Per pool `algo` option.
|
||||||
"pools": [
|
|
||||||
{
|
|
||||||
"url": "...",
|
|
||||||
"algo": "cn/r",
|
|
||||||
...
|
|
||||||
}
|
|
||||||
],
|
|
||||||
...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Pools with mining algorithm negotiation support.
|
Option `coin` useful for pools without algorithm negotiation support or daemon to allow automatically switch algorithm in next hard fork.
|
||||||
|
|
||||||
* [www.hashvault.pro](https://www.hashvault.pro/)
|
|
||||||
* [moneroocean.stream](https://moneroocean.stream)
|
|
||||||
|
|
||||||
## Algorithm names
|
## Algorithm names
|
||||||
|
|
||||||
| Name | Memory | Version | Notes |
|
| Name | Memory | Version | Notes |
|
||||||
|------|--------|---------|-------|
|
|------|--------|---------|-------|
|
||||||
| `rx/test` | 2 MB | 2.0.0+ | RandomX (reference configuration). |
|
| `rx/0` | 2 MB | 2.1.0+ | RandomX (Monero). |
|
||||||
| `rx/0` | 2 MB | 2.0.0+ | RandomX (reference configuration), reserved for future use. |
|
|
||||||
| `rx/wow` | 1 MB | 2.0.0+ | RandomWOW. |
|
| `rx/wow` | 1 MB | 2.0.0+ | RandomWOW. |
|
||||||
| `rx/loki` | 2 MB | 2.0.0+ | RandomXL. |
|
| `rx/loki` | 2 MB | 2.0.0+ | RandomXL. |
|
||||||
| `cn/conceal` | 2 MB | 1.9.5+ | CryptoNight variant 1 (modified). |
|
| `cn/conceal` | 2 MB | 1.9.5+ | CryptoNight variant 1 (modified). |
|
||||||
|
@ -51,3 +37,21 @@ Since version 2 mining [algorithm](#algorithm-names) should specified for each p
|
||||||
| `cn-lite/1` | 1 MB | <1.9.5+ | CryptoNight-Lite variant 1. |
|
| `cn-lite/1` | 1 MB | <1.9.5+ | CryptoNight-Lite variant 1. |
|
||||||
| `cn-lite/0` | 1 MB | <1.9.5+ | CryptoNight-Lite variant 0. |
|
| `cn-lite/0` | 1 MB | <1.9.5+ | CryptoNight-Lite variant 0. |
|
||||||
| `cn/0` | 2 MB | <1.9.5+ | CryptoNight (original). |
|
| `cn/0` | 2 MB | <1.9.5+ | CryptoNight (original). |
|
||||||
|
|
||||||
|
## Migration to v2
|
||||||
|
Since version 2 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"url": "...",
|
||||||
|
"algo": "cn/r",
|
||||||
|
"coin": null,
|
||||||
|
...
|
||||||
|
}
|
||||||
|
],
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
238
doc/CHANGELOG_OLD.md
Normal file
238
doc/CHANGELOG_OLD.md
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
# 2.0.0
|
||||||
|
**Thx to @xmrig and @SChernykh awesome work!**
|
||||||
|
* Full Rebase on XMRig 3.1.1
|
||||||
|
* randomX/wow/XL
|
||||||
|
* NUMA support
|
||||||
|
* flexible multi algorithm configuration
|
||||||
|
* unlimited switching between incompatible algorithms at runtime
|
||||||
|
* Argon2, UPX2 (Nice hashrate improvement) and CN-Conceal support integrated like in previous version
|
||||||
|
* 5-10% Hashrate improvement on ARMv8 CPUs when mining CN based algos compared to stock xmrig
|
||||||
|
* Fully compatible to XMRigCCServer 1.9.5 no server upgrade needed!
|
||||||
|
**New XMRigCCServer will be released soon with new features**
|
||||||
|
# 1.9.5
|
||||||
|
- Integrated CN-Conceal algo (algo: "cryptonight", variant: "conceal" or variant: "ccx") #259
|
||||||
|
- Integrated Argon2-512 algo "chukwa" for upcoming trtl fork (algo: "argon2-512", variant: "auto" or "chukwa") #258
|
||||||
|
- Integrated Argon2-256 algo "chukwa-wrkz" for upcoming wrkz fork (algo: "argon2-256", variant: "auto" or "wrkz")
|
||||||
|
- Added possibility to delete templates #257
|
||||||
|
- Added embedded config parsing #256
|
||||||
|
- OSX Hugepages fix #250
|
||||||
|
- Fixed non-merged template assignment
|
||||||
|
# 1.9.3
|
||||||
|
- Fixed Multihashfactor auto detection for CN-Ultralite/Extremelite #248
|
||||||
|
- Fixed donation address for UPX2/CN-Extremelite
|
||||||
|
# 1.9.2
|
||||||
|
- Integrated cn-extremelite a.k.a upx2 (algo: "cryptonight-extremelite", variant: "upx2")
|
||||||
|
- Improved hashfactor autodetection for cnv8 and r based coins
|
||||||
|
- Integrated merged templates and replace of @WORKER-ID@ in template assignment
|
||||||
|
# 1.9.1
|
||||||
|
- Fix coloring of outdated miners on Dashboard
|
||||||
|
- Autodetect for fork of CN/R(variant: "auto"), Graft(variant: "rwz"), Zelerius(variant: "zls")
|
||||||
|
# 1.9.0
|
||||||
|
- Integrated Monero CN-R variant so called CNv4, aka CN-R, aka CNv5, aka Cryptonight-R #233 (algo: "cryptonight", variant: "r")
|
||||||
|
- Integrated Wownero CN-R variant #233 (algo: "cryptonight", variant: "wow")
|
||||||
|
- Integrated Graft variant (algo: "cryptonight", variant: "rwz" OR variant: "graft")
|
||||||
|
- Integrated X-Cash variant #234 (algo: "cryptonight", variant: "double" OR variant: "heavyx" OR variant: "xcash")
|
||||||
|
- Integrated Zelerius variant (algo: "cryptonight", variant: "zls" OR variant: "zelerius")
|
||||||
|
- Add miner version column to the Dashboard (version turns red when its outdated)
|
||||||
|
- Fixed crash when remote logging is disabled
|
||||||
|
- Added config parameter --skip-self-check to skip the algo verification check on startup to improce startup speed. Use with caution and only if you know that the algos are working fine on your machine.
|
||||||
|
# 1.8.13
|
||||||
|
- Integrated HOSP variant (algo: "cryptonight", variant: "hosp")
|
||||||
|
- Added ASM code/optimization for HOSP and RTO on Intel CPUs
|
||||||
|
- Fixed memory/hugepages printout for cn-ultralite/turtle
|
||||||
|
- Fixed compile issues on some compilers
|
||||||
|
# 1.8.12
|
||||||
|
- Fixed #228 "force-pow-variant" overrules autodetect for XTLv9/Fast2
|
||||||
|
- Fixed out of source building (asm code generator)
|
||||||
|
- Fixed gcc 8 builds (self check failed)
|
||||||
|
- CN-Ultralite is shown correctly on the Dashboard
|
||||||
|
# 1.8.11
|
||||||
|
- Implemented fix for upcominng Massari fork
|
||||||
|
- Refactoring ASM code/cleanup
|
||||||
|
- Fixed broke ARMv8 code for all CN variants (self check failed)
|
||||||
|
# 1.8.10
|
||||||
|
- Fixed broken XTL variant Autodetect
|
||||||
|
# 1.8.9
|
||||||
|
- Added cn-ultralite algo used by upcoming TurtleV2 fork (algo: "cryptonight-ultralite", variant "auto")
|
||||||
|
# 1.8.8
|
||||||
|
- Added XLT v5/9 with autodetect(algo: "cryptonight", variant: "xtl" (autodetect), "xtlv9" (force v9))
|
||||||
|
- Added cn-lite variant UPX/uPlexa (algo: "cryptonight-lite", variant "upx")
|
||||||
|
- Added force-pow-variant parameter to force usage of the variant from the config and skip parsing of pow/variant from job/pool
|
||||||
|
# 1.8.7
|
||||||
|
- Implemented Template based mass config editor to simple swap configs on your rigs
|
||||||
|
# 1.8.6
|
||||||
|
- Integrated Telegram push notifications
|
||||||
|
- Fixed multi miner editor
|
||||||
|
- Added miner offline/online status push notification
|
||||||
|
- Added 0/recovered hashrate push notification
|
||||||
|
# 1.8.5
|
||||||
|
- Add remote reboot (machine) feature to Dashboard, Server & Miner
|
||||||
|
- Integrated Pushover push notifications for Offline miners and periodical status notifications on iOS and Android
|
||||||
|
# 1.8.4
|
||||||
|
- Added XFH (Freehaven-project) support aka CN-Heavy-superfast
|
||||||
|
- Hashrate improve -> CN-Fast (MSR and others) ASM code for Intel CPUs
|
||||||
|
- Hashrate improve -> CNv2 ASM code for AMD Bulldozer CPUs
|
||||||
|
- Fix memory leak in cc client component
|
||||||
|
- Alloy algo is now shown as XAO on Dashboard
|
||||||
|
# 1.8.2
|
||||||
|
- Fix for mining conceal or other coins with cn-msr
|
||||||
|
- Fixed avg.time on Dashboard
|
||||||
|
# 1.8.1
|
||||||
|
- Fix connection stuck in Failover case when DNS resolve fails #197
|
||||||
|
- Fix supported-variants announcement in login
|
||||||
|
# 1.8.0
|
||||||
|
- Integration of cnv2 aka moneroV8
|
||||||
|
- Hashrate improve -> all cnv1, cn-litev1, cnv2, xtl by adding ASM code for Intel/AMD and softaes [thx @SChernykh]
|
||||||
|
- Fixes for OSX builds [thx @djfinch]
|
||||||
|
- Fixed safe mode #173
|
||||||
|
# 1.7.0
|
||||||
|
- First official Release of XMRigCC-amd #33 #3
|
||||||
|
- Full integration of xmrigCC-amd into XMRigCCServer/Dashboard with GPUInfo / remote logging
|
||||||
|
- Config property to enable/disable config upload on startup (--cc-upload-config-on-startup) #80
|
||||||
|
- Refactoring of remote logging feature: #143
|
||||||
|
- Only deltas will be send to the XMRigCCServer
|
||||||
|
- Fetching miner log on dashboard upon need
|
||||||
|
- Maximum lines of log history kept per miner can be configured on XMRigCCServer
|
||||||
|
- Fix correct hugepages status on Dashboard
|
||||||
|
- Fix cpu affinity for single thread usage
|
||||||
|
- Add all needed security infos to XMRigCCServer logging to harden the server (f.e. fail2ban)
|
||||||
|
- Fix commandline params overwrite config.json #157
|
||||||
|
- Fix bulding of miner with API support Cannot #145
|
||||||
|
# 1.6.5
|
||||||
|
- Hashrate improve -> add autodetection mode for cpu-affinity
|
||||||
|
- Hashrate improve, more stable hashrates -> refactor memory allocation
|
||||||
|
- Add Arto (RTO) support (cn [2mb scratchpad] + ipbc mod)
|
||||||
|
- Add TubeV4 (TUBE) support (cn-heavy [4mb scratchpad] + ipbc mod + soft-aes mod)
|
||||||
|
- Add external IP to log view
|
||||||
|
- Fix memory leak in RemoteLog
|
||||||
|
- Fix crash Filelog
|
||||||
|
- Fix stop/freeze of cc communication on some miners
|
||||||
|
- Fix cn-heavy on arm processors
|
||||||
|
# 1.6.4
|
||||||
|
- Fix connection issues #130
|
||||||
|
- Remote logging (Miner log on the Dashboard)
|
||||||
|
- Add resetClientStatusList button to Dashboard #129
|
||||||
|
- Fix new version notification #132
|
||||||
|
- Add Masari (MSR) v7 support
|
||||||
|
- Add Haven Protocol (XHV) v3 support
|
||||||
|
# 1.6.3
|
||||||
|
- Added shift+click function for multi row selection to Dashboard
|
||||||
|
- Added -DBUILD_STATIC=ON/OFF option to CMake configuration to create fully static builds
|
||||||
|
- Added current algo and list of supported_varaints to login message for future usage on proxy
|
||||||
|
- Added support for latest Stellite (XTL) and Alloy (XAO) variants
|
||||||
|
- Simplification of configuration, "force-pow-variant" and "cryptonight-lite-ipbc" parameters are now deprecated see [Coin Configuration](https://github.com/Bendr0id/xmrigCC/wiki/Coin-configurations) for guidance
|
||||||
|
- Fixed leaks in transport shutdown
|
||||||
|
# 1.6.2
|
||||||
|
- Implementation of CN-Lite-IPBC algo
|
||||||
|
- Fixed Windows 32bit build / crashes
|
||||||
|
- Fixed XMRigCCServer crash when auth header is manipulated
|
||||||
|
# 1.6.1
|
||||||
|
- beta
|
||||||
|
# 1.6.0
|
||||||
|
- Complete rewrite of the stratum TCP/TLS network communication using boost::asio to fix connection issues and crashs
|
||||||
|
- Force of PoW via "variant" parameter in xmrg-proxy 2.5.2+, it now overrules local settings
|
||||||
|
- Implementation of CN-Heavy algo used by Sumokoin / Haven / ...
|
||||||
|
- XMRigDaemon now keeps the miner running event when the miner crashs
|
||||||
|
# 1.5.5
|
||||||
|
- Fixed Bad/Invalid shares and high share transmit latency
|
||||||
|
- Fixed hugepages for some older linux versions
|
||||||
|
- Fixed compatibility to xmrig-proxy 2.5.x+
|
||||||
|
- Added restart of crashed miners to xmrigDaemon
|
||||||
|
- Added force algo variant by xmrig-proxy 2.5.x+
|
||||||
|
- Added auto force of nicehash param by xmrig-proxy 2.5.x+
|
||||||
|
- Partial rebase of XMRig 2.5.2
|
||||||
|
# 1.5.2
|
||||||
|
- Fixed OSX Build
|
||||||
|
- Fixed force PoW algo version
|
||||||
|
- Added AEON test vectors for new PoW Algo
|
||||||
|
- Changed DonateStrategy to avoid peaks on donate pool when restarting multiple miners
|
||||||
|
# 1.5.1
|
||||||
|
- Applied changes for upcoming Monero v7 PoW changes starting 03/28/18 (No changes in config needed)
|
||||||
|
- Applied changes for upcoming AEON PoW changes starting 04/07/18 (No changes in config needed)
|
||||||
|
- Added option to force PoW version
|
||||||
|
- Added new design / icons
|
||||||
|
# 1.5.0
|
||||||
|
- Full SSL/TLS support for the whole communication:
|
||||||
|
- XMRigCCServer Dashboard <-> Browser
|
||||||
|
- XMRigCCServer <-> XMRigMiner
|
||||||
|
- XMRigMiner <-> Pool
|
||||||
|
- Easy rename of miner/daemon in CMakeList.txt by modifying `MINER_EXECUTABLE_NAME` and `DAEMON_EXECUTABLE_NAME` before compiling
|
||||||
|
- Dockerfile and official DockerHub image
|
||||||
|
- Added Miner uptime to Dashboard
|
||||||
|
- Rebased from XMRig 2.4.5 RC
|
||||||
|
# 1.4.0
|
||||||
|
- Fixed CPU affinity on Windows for NUMA and CPUs with lot of cores
|
||||||
|
- Implemented per thread configurable Multihash mode (double, triple, quadruple, quintuple)
|
||||||
|
- Rebased from XMRig 2.4.4
|
||||||
|
# v1.3.2
|
||||||
|
- Added start xmrigDaemonr without config file and only CCServer/auth token as params needed #14
|
||||||
|
- Dashboard now uses servertime for calculation to avoid clock drifts and false offline detection
|
||||||
|
- Finally fixed freebsd build
|
||||||
|
# v1.3.1
|
||||||
|
- Removed not working background mode for xmrigMiner/xmrigDaemon on *nix systems -> use screen/tmux or systemd service instead
|
||||||
|
- Added cpu socket to client Id tooltip on dashboard
|
||||||
|
- Fixed notification when sending command is successful or error
|
||||||
|
- Fixed #16 FreeBSD build
|
||||||
|
- Fixed miner to keep sending status to server when its not temp unavailable
|
||||||
|
- Fixed #10 CCServer spontaneously freezes and holds CPU 100%
|
||||||
|
- Merged latest xmrig master
|
||||||
|
# v1.3.0
|
||||||
|
- Fixed Soft-aes modes (av=3, av=4) Bug: #11
|
||||||
|
- Added static build for linux with old libc (CentOs 5/6, debian, ...)
|
||||||
|
- Added notification to Dashboard when miner went offline with toggleswitch
|
||||||
|
- Added multi config editor to Dashboard to modify config of multiple miners at once
|
||||||
|
- Fixed MSV_VER for latest Visual Studio builds
|
||||||
|
# v1.2.2
|
||||||
|
- Added select/deselect all to dashboard
|
||||||
|
- Fixed memory leaks in XmrigCCServer
|
||||||
|
# v1.2.1
|
||||||
|
- Refactored Dashboard to send one command to multiple miners and "beautified" dashboard
|
||||||
|
- Miner now publishs own config to XMRigCCServer on startup
|
||||||
|
- Added command to trigger miner to upload config to XMRigCCServer
|
||||||
|
- Added threads to miner info tooltip on client id
|
||||||
|
# v1.2.0
|
||||||
|
- Added configurability for thread based doublehash mode which helps you to use more of your l3 cache
|
||||||
|
- Memory optimizations / speed improvements
|
||||||
|
- Updated to latest XMRig (2.4.3) with ARM support
|
||||||
|
# v1.1.1
|
||||||
|
- Fixed table sorting for client id column on Dashboard
|
||||||
|
- Fixed Windows compilation with msys2 (gcc)
|
||||||
|
- Added ability to do static build of xmrigDaemon and xmrigMiner
|
||||||
|
- Added client version to Dashboard client id tooltip
|
||||||
|
- Added update checker to Dashboard with notification bar
|
||||||
|
# v1.1.0
|
||||||
|
- Added option to hide offline miners from Dashboard
|
||||||
|
- Added online status indicator to Dashboard client id column (green:red)
|
||||||
|
- JSON-Protocol changes to send miner info to XMRigCC server
|
||||||
|
- Added Tooltip to Dashboard column id containing new miner info (CPU, CPU flags, Cores, Threads, Memory, External IP, ...)
|
||||||
|
- Moved CCClient to own thread and changed ControlCommand processing to async to improve performance
|
||||||
|
# v1.0.9
|
||||||
|
- Integrated cpp-httplib as libcurl replacement
|
||||||
|
- Removed libcurl dependicies
|
||||||
|
- Fixed round of avgTime in Dashboard
|
||||||
|
- Removed subrepo dependencies for easier building
|
||||||
|
# v1.0.8
|
||||||
|
- Extracted common CC files to subrepo (xmrigCC-common)
|
||||||
|
- Added sum row to Dashboard
|
||||||
|
- Added dialogs (success/error) to all dashboard actions
|
||||||
|
# v1.0.7
|
||||||
|
- CCClient status update interval is now configurable
|
||||||
|
- Updated to latest head of xmrig (Optimized soft aes)
|
||||||
|
# v1.0.6
|
||||||
|
- Fixed launch in folder containing spaces (Win)
|
||||||
|
# v1.0.5
|
||||||
|
- Merged latest changes of XMRig
|
||||||
|
- Added current algo to dashboard
|
||||||
|
- Added editor for client configs to dashboard
|
||||||
|
- some cosmetics on dashboard
|
||||||
|
# v1.0.4
|
||||||
|
- Updated XMRig to 2.4.2
|
||||||
|
- Fixed "--background" not working for xmrigCCServer on Windows
|
||||||
|
# v1.0.3
|
||||||
|
- Integrated build for Windows x64
|
||||||
|
# v1.0.2
|
||||||
|
- Reenabled restart in daemon for win/linux
|
||||||
|
# v1.0.1
|
||||||
|
- Fixed windows build
|
||||||
|
# v1.0.0
|
||||||
|
- Initial public release based on xmrig version 2.4.1
|
39
doc/build/CMAKE_OPTIONS.md
vendored
Normal file
39
doc/build/CMAKE_OPTIONS.md
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# CMake options
|
||||||
|
This document contains list of useful cmake options.
|
||||||
|
|
||||||
|
## Algorithms
|
||||||
|
|
||||||
|
* **`-DWITH_CN_LITE=OFF`** disable all CryptoNight-Lite algorithms (`cn-lite/0`, `cn-lite/1`).
|
||||||
|
* **`-DWITH_CN_HEAVY=OFF`** disable all CryptoNight-Heavy algorithms (`cn-heavy/0`, `cn-heavy/xhv`, `cn-heavy/tube`).
|
||||||
|
* **`-DWITH_CN_PICO=OFF`** disable CryptoNight-Pico algorithm (`cn-pico`).
|
||||||
|
* **`-DWITH_CN_GPU=OFF`** disable CryptoNight-GPU algorithm (`cn/gpu`).
|
||||||
|
* **`-DWITH_RANDOMX=OFF`** disable RandomX algorithms (`rx/loki`, `rx/wow`).
|
||||||
|
* **`-DWITH_ARGON2=OFF`** disable Argon2 algorithms (`argon2/chukwa`, `argon2/wrkz`).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* **`-DWITH_HWLOC=OFF`**
|
||||||
|
disable [hwloc](https://github.com/xmrig/xmrig/issues/1077) support.
|
||||||
|
Disabling this feature is not recommended in most cases.
|
||||||
|
This feature add external dependency to libhwloc (1.10.0+) (except MSVC builds).
|
||||||
|
* **`-DWITH_LIBCPUID=OFF`** disable built in libcpuid support, this feature always disabled if hwloc enabled, if both hwloc and libcpuid disabled auto configuration for CPU will very limited.
|
||||||
|
* **`-DWITH_HTTP=OFF`** disable built in HTTP support, this feature used for HTTP API and daemon (solo mining) support.
|
||||||
|
* **`-DWITH_TLS=OFF`** disable SSL/TLS support (secure connections to pool). This feature add external dependency to OpenSSL.
|
||||||
|
* **`-DWITH_ASM=OFF`** disable assembly optimizations for modern CryptoNight algorithms.
|
||||||
|
* **`-DWITH_EMBEDDED_CONFIG=ON`** Enable [embedded](https://github.com/xmrig/xmrig/issues/957) config support.
|
||||||
|
|
||||||
|
## Debug options
|
||||||
|
|
||||||
|
* **`-DWITH_DEBUG_LOG=ON`** enable debug log (mostly network requests).
|
||||||
|
* **`-DHWLOC_DEBUG=ON`** enable some debug log for hwloc.
|
||||||
|
* **`-DCMAKE_BUILD_TYPE=Debug`** enable debug build, only useful for investigate crashes, this option slow down miner.
|
||||||
|
|
||||||
|
## Special build options
|
||||||
|
|
||||||
|
* **`-DXMRIG_DEPS=<path>`** path to precompiled dependensices https://github.com/xmrig/xmrig-deps
|
||||||
|
* **`-DARM_TARGET=<number>`** override ARM target, possible values `7` (ARMv7) and `8` (ARMv8).
|
||||||
|
* **`-DUV_INCLUDE_DIR=<path>`** custom path to libuv headers.
|
||||||
|
* **`-DUV_LIBRARY=<path>`** custom path to libuv library.
|
||||||
|
* **`-DHWLOC_INCLUDE_DIR=<path>`** custom path to hwloc headers.
|
||||||
|
* **`-DHWLOC_LIBRARY=<path>`** custom path to hwloc library.
|
||||||
|
* **`-DOPENSSL_ROOT_DIR=<path>`** custom path to OpenSSL.
|
234
index.html
234
index.html
|
@ -6,26 +6,55 @@
|
||||||
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css">
|
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css">
|
||||||
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/1.5.0/css/buttons.bootstrap.min.css">
|
<link rel="stylesheet" type="text/css"
|
||||||
|
href="https://cdn.datatables.net/buttons/1.5.0/css/buttons.bootstrap.min.css">
|
||||||
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/select/1.2.5/css/select.dataTables.min.css">
|
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/select/1.2.5/css/select.dataTables.min.css">
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.13.2/css/bootstrap-select.min.css">
|
<link rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.13.2/css/bootstrap-select.min.css">
|
||||||
<link rel="stylesheet" href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css">
|
<link rel="stylesheet" href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css">
|
||||||
|
|
||||||
<link rel="shortcut icon" href="https://root.graef.in:8443/static/xmrigcc/favicon.ico">
|
<link rel="shortcut icon" href="https://root.graef.in:8443/static/xmrigcc/favicon.ico">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.right{text-align:right;}
|
.right {
|
||||||
.left{text-align:left;}
|
text-align: right;
|
||||||
.center{text-align:center; padding-bottom: 50pt}
|
}
|
||||||
.center-tab{text-align: center; vertical-align: middle;}
|
|
||||||
.online { color: green}
|
|
||||||
.offline { color: red}
|
|
||||||
.paused { color: yellow}
|
|
||||||
.toggle { border-radius: 2px;}
|
|
||||||
.toggle .toggle-handle { border-radius: 2px; }
|
|
||||||
|
|
||||||
form label
|
.left {
|
||||||
{
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 50pt
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-tab {
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.online {
|
||||||
|
color: green
|
||||||
|
}
|
||||||
|
|
||||||
|
.offline {
|
||||||
|
color: red
|
||||||
|
}
|
||||||
|
|
||||||
|
.paused {
|
||||||
|
color: yellow
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle {
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle .toggle-handle {
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
form label {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
@ -43,13 +72,22 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
|
<script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
|
||||||
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
|
<script type="text/javascript" language="javascript"
|
||||||
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>
|
src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
|
||||||
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/buttons/1.5.0/js/dataTables.buttons.min.js"></script>
|
<script type="text/javascript" language="javascript"
|
||||||
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/buttons/1.5.0/js/buttons.bootstrap.min.js"></script>
|
src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>
|
||||||
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/select/1.2.4/js/dataTables.select.min.js"></script>
|
<script type="text/javascript" language="javascript"
|
||||||
<script type="text/javascript" language="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.1/jquery.timeago.min.js"></script>
|
src="https://cdn.datatables.net/buttons/1.5.0/js/dataTables.buttons.min.js"></script>
|
||||||
<script type="text/javascript" language="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js"></script>
|
<script type="text/javascript" language="javascript"
|
||||||
|
src="https://cdn.datatables.net/buttons/1.5.0/js/buttons.bootstrap.min.js"></script>
|
||||||
|
<script type="text/javascript" language="javascript"
|
||||||
|
src="https://cdn.datatables.net/select/1.2.4/js/dataTables.select.min.js"></script>
|
||||||
|
<script type="text/javascript" language="javascript"
|
||||||
|
src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.colVis.min.js"></script>
|
||||||
|
<script type="text/javascript" language="javascript"
|
||||||
|
src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.1/jquery.timeago.min.js"></script>
|
||||||
|
<script type="text/javascript" language="javascript"
|
||||||
|
src="https://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js"></script>
|
||||||
|
|
||||||
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
||||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||||
|
@ -94,15 +132,19 @@
|
||||||
);
|
);
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
var groupColumn = 5;
|
||||||
var table = $('#clientStatusList').DataTable({
|
var table = $('#clientStatusList').DataTable({
|
||||||
dom: "<'row'<'col-sm-9'B><'col-sm-3'f>><'row'<'col-sm-12't>><'row'<'col-sm-4'i><'col-sm-8'<'#serverTime'>>>",
|
dom: "<'row'<'col-sm-9'B><'col-sm-3'f>><'row'<'col-sm-12't>><'row'<'col-sm-4'i><'col-sm-8'<'#serverTime'>>>",
|
||||||
|
stateSave: true,
|
||||||
bPaginate: false,
|
bPaginate: false,
|
||||||
ajax: {
|
ajax: {
|
||||||
url: "/admin/getClientStatusList",
|
url: "/admin/getClientStatusList",
|
||||||
dataSrc: 'client_status_list'
|
dataSrc: 'client_status_list'
|
||||||
},
|
},
|
||||||
deferRender: true,
|
deferRender: true,
|
||||||
|
columnDefs: [
|
||||||
|
{"visible": false, "targets": groupColumn}
|
||||||
|
],
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
data: null,
|
data: null,
|
||||||
|
@ -115,6 +157,23 @@
|
||||||
{data: "client_status.current_pool"},
|
{data: "client_status.current_pool"},
|
||||||
{data: "client_status.current_status", render: clientStatus},
|
{data: "client_status.current_status", render: clientStatus},
|
||||||
{data: "client_status.current_algo_name", render: algoAndPowVariantName},
|
{data: "client_status.current_algo_name", render: algoAndPowVariantName},
|
||||||
|
|
||||||
|
{data: "client_status.cpu_brand", visible: false},
|
||||||
|
{data: "client_status.external_ip", visible: false},
|
||||||
|
{data: "client_status.hugepages_available", visible: false},
|
||||||
|
{data: "client_status.hugepages_enabled", visible: false},
|
||||||
|
{data: "client_status.cpu_is_x64", visible: false},
|
||||||
|
{data: "client_status.cpu_has_aes", visible: false},
|
||||||
|
{data: "client_status.hash_factor", visible: false},
|
||||||
|
{data: "client_status.total_pages", visible: false},
|
||||||
|
{data: "client_status.total_hugepages", visible: false},
|
||||||
|
{data: "client_status.current_threads", visible: false},
|
||||||
|
{data: "client_status.cpu_sockets", visible: false},
|
||||||
|
{data: "client_status.cpu_cores", visible: false},
|
||||||
|
{data: "client_status.cpu_threads", visible: false},
|
||||||
|
{data: "client_status.cpu_l2", visible: false},
|
||||||
|
{data: "client_status.cpu_l3", visible: false},
|
||||||
|
|
||||||
{data: "client_status.hashrate_short", render: round, className: "right"},
|
{data: "client_status.hashrate_short", render: round, className: "right"},
|
||||||
{data: "client_status.hashrate_medium", render: round, className: "right"},
|
{data: "client_status.hashrate_medium", render: round, className: "right"},
|
||||||
{data: "client_status.hashrate_long", render: round, className: "right"},
|
{data: "client_status.hashrate_long", render: round, className: "right"},
|
||||||
|
@ -146,11 +205,27 @@
|
||||||
},
|
},
|
||||||
order: [1, 'asc'],
|
order: [1, 'asc'],
|
||||||
lengthChange: false,
|
lengthChange: false,
|
||||||
|
drawCallback: function (settings) {
|
||||||
|
var api = this.api();
|
||||||
|
var rows = api.rows({page: 'current'}).nodes();
|
||||||
|
var last = null;
|
||||||
|
var groupByAlgo = $('#groupByAlgo').prop('checked');
|
||||||
|
|
||||||
|
api.column(groupColumn, {page: 'current'}).data().each(function (group, i) {
|
||||||
|
if (last !== group && groupByAlgo === true) {
|
||||||
|
$(rows).eq(i).before(
|
||||||
|
'<tr class="group"><td colspan="5"><b>' + group + '</b></td></tr>'
|
||||||
|
);
|
||||||
|
|
||||||
|
last = group;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
buttons: [
|
buttons: [
|
||||||
|
'colvis',
|
||||||
{
|
{
|
||||||
text: '<i class="fa fa-download"> Pull miner config</i>',
|
text: '<i class="fa fa-download"> Pull miner config</i>',
|
||||||
className: 'btn-default',
|
className: 'btn-info',
|
||||||
enabled: false,
|
|
||||||
enabled: false,
|
enabled: false,
|
||||||
action: function () {
|
action: function () {
|
||||||
table.rows({selected: true}).eq(0).each(function (index) {
|
table.rows({selected: true}).eq(0).each(function (index) {
|
||||||
|
@ -325,56 +400,56 @@
|
||||||
var sumSharedTotal = 0;
|
var sumSharedTotal = 0;
|
||||||
|
|
||||||
sumHashrateShort = api
|
sumHashrateShort = api
|
||||||
.column(5, {page: 'current'})
|
.column(21, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
sumHashrateMedium = api
|
sumHashrateMedium = api
|
||||||
.column(6, {page: 'current'})
|
.column(22, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
sumHashrateLong = api
|
sumHashrateLong = api
|
||||||
.column(7, {page: 'current'})
|
.column(23, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
sumHashrateHighest = api
|
sumHashrateHighest = api
|
||||||
.column(8, {page: 'current'})
|
.column(24, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
sumHashesTotal = api
|
sumHashesTotal = api
|
||||||
.column(9, {page: 'current'})
|
.column(25, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
avgTimeTotal = api
|
avgTimeTotal = api
|
||||||
.column(10, {page: 'current'})
|
.column(26, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return (a + b);
|
return (a + b);
|
||||||
}, 0) / api.column(10, {page: 'current'}).data().length;
|
}, 0) / api.column(26, {page: 'current'}).data().length;
|
||||||
|
|
||||||
sumSharesGood = api
|
sumSharesGood = api
|
||||||
.column(11, {page: 'current'})
|
.column(27, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
sumSharedTotal = api
|
sumSharedTotal = api
|
||||||
.column(12, {page: 'current'})
|
.column(28, {page: 'current'})
|
||||||
.data()
|
.data()
|
||||||
.reduce(function (a, b) {
|
.reduce(function (a, b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
|
@ -387,14 +462,14 @@
|
||||||
avgTimeTotal = round(avgTimeTotal);
|
avgTimeTotal = round(avgTimeTotal);
|
||||||
|
|
||||||
// update footer
|
// update footer
|
||||||
$(api.column(5).footer()).html(sumHashrateShort);
|
$(api.column(21).footer()).html(sumHashrateShort);
|
||||||
$(api.column(6).footer()).html(sumHashrateMedium);
|
$(api.column(22).footer()).html(sumHashrateMedium);
|
||||||
$(api.column(7).footer()).html(sumHashrateLong);
|
$(api.column(23).footer()).html(sumHashrateLong);
|
||||||
$(api.column(8).footer()).html(sumHashrateHighest);
|
$(api.column(24).footer()).html(sumHashrateHighest);
|
||||||
$(api.column(9).footer()).html(sumHashesTotal);
|
$(api.column(25).footer()).html(sumHashesTotal);
|
||||||
$(api.column(10).footer()).html(avgTimeTotal);
|
$(api.column(26).footer()).html(avgTimeTotal);
|
||||||
$(api.column(11).footer()).html(sumSharesGood);
|
$(api.column(27).footer()).html(sumSharesGood);
|
||||||
$(api.column(12).footer()).html(sumSharedTotal);
|
$(api.column(28).footer()).html(sumSharedTotal);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -437,7 +512,6 @@
|
||||||
table.on('select', function () {
|
table.on('select', function () {
|
||||||
var selectedRows = table.rows({selected: true}).count();
|
var selectedRows = table.rows({selected: true}).count();
|
||||||
|
|
||||||
table.button(0).enable(selectedRows > 0);
|
|
||||||
table.button(1).enable(selectedRows > 0);
|
table.button(1).enable(selectedRows > 0);
|
||||||
table.button(2).enable(selectedRows > 0);
|
table.button(2).enable(selectedRows > 0);
|
||||||
table.button(3).enable(selectedRows > 0);
|
table.button(3).enable(selectedRows > 0);
|
||||||
|
@ -445,12 +519,12 @@
|
||||||
table.button(5).enable(selectedRows > 0);
|
table.button(5).enable(selectedRows > 0);
|
||||||
table.button(6).enable(selectedRows > 0);
|
table.button(6).enable(selectedRows > 0);
|
||||||
table.button(7).enable(selectedRows > 0);
|
table.button(7).enable(selectedRows > 0);
|
||||||
|
table.button(8).enable(selectedRows > 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
table.on('deselect', function () {
|
table.on('deselect', function () {
|
||||||
var selectedRows = table.rows({selected: true}).count();
|
var selectedRows = table.rows({selected: true}).count();
|
||||||
|
|
||||||
table.button(0).enable(selectedRows > 0);
|
|
||||||
table.button(1).enable(selectedRows > 0);
|
table.button(1).enable(selectedRows > 0);
|
||||||
table.button(2).enable(selectedRows > 0);
|
table.button(2).enable(selectedRows > 0);
|
||||||
table.button(3).enable(selectedRows > 0);
|
table.button(3).enable(selectedRows > 0);
|
||||||
|
@ -458,6 +532,7 @@
|
||||||
table.button(5).enable(selectedRows > 0);
|
table.button(5).enable(selectedRows > 0);
|
||||||
table.button(6).enable(selectedRows > 0);
|
table.button(6).enable(selectedRows > 0);
|
||||||
table.button(7).enable(selectedRows > 0);
|
table.button(7).enable(selectedRows > 0);
|
||||||
|
table.button(8).enable(selectedRows > 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
table.buttons().container().appendTo('#clientStatusList_wrapper .col-sm-6:eq(0)');
|
table.buttons().container().appendTo('#clientStatusList_wrapper .col-sm-6:eq(0)');
|
||||||
|
@ -466,6 +541,10 @@
|
||||||
table.draw();
|
table.draw();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#groupByAlgo').change(function () {
|
||||||
|
table.draw();
|
||||||
|
});
|
||||||
|
|
||||||
$('#resetClientStatusList').click(function () {
|
$('#resetClientStatusList').click(function () {
|
||||||
resetClientStatusList();
|
resetClientStatusList();
|
||||||
});
|
});
|
||||||
|
@ -664,7 +743,7 @@
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "/admin/resetClientStatusList",
|
url: "/admin/resetClientStatusList",
|
||||||
dataType: "text",
|
dataType: "text",
|
||||||
data: '',
|
data: '{}',
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
setSuccess('<strong>Successfully send the reset client status list request to the Server.</strong> - Now just wait for the next refresh.');
|
setSuccess('<strong>Successfully send the reset client status list request to the Server.</strong> - Now just wait for the next refresh.');
|
||||||
},
|
},
|
||||||
|
@ -874,6 +953,7 @@
|
||||||
url: "/admin/deleteClientConfig?clientId=template_" + templateId,
|
url: "/admin/deleteClientConfig?clientId=template_" + templateId,
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
dataType: "text",
|
dataType: "text",
|
||||||
|
data : '{}',
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
setSuccess('<strong>Successfully deleted template: ' + templateId + '</strong>');
|
setSuccess('<strong>Successfully deleted template: ' + templateId + '</strong>');
|
||||||
},
|
},
|
||||||
|
@ -897,9 +977,15 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form style="padding-bottom: 25px; margin-top: -50px">
|
<form style="padding-bottom: 25px; margin-top: -50px">
|
||||||
<label><input id="hideOffline" type="checkbox" checked data-toggle="toggle" data-size="mini" data-onstyle="success" data-offstyle="danger"/><span>Hide offline miners</span></label>
|
<label><input id="hideOffline" type="checkbox" checked data-toggle="toggle" data-size="mini"
|
||||||
<label><input id="showOfflineNotification" type="checkbox" checked data-toggle="toggle" data-size="mini" data-onstyle="success" data-offstyle="danger" /><span>Notify when miner went offline</span></label>
|
data-onstyle="success" data-offstyle="danger"/><span>Hide offline miners</span></label>
|
||||||
<br/><button id="resetClientStatusList" type="button" class="btn btn-danger fa fa-trash-o"> Reset ClientStatusList</button>
|
<label><input id="showOfflineNotification" type="checkbox" checked data-toggle="toggle" data-size="mini"
|
||||||
|
data-onstyle="success" data-offstyle="danger"/><span>Notify when miner went offline</span></label>
|
||||||
|
<label><input id="groupByAlgo" type="checkbox" checked data-toggle="toggle" data-size="mini"
|
||||||
|
data-onstyle="success" data-offstyle="danger"/><span>Group by Algo</span></label>
|
||||||
|
<br/>
|
||||||
|
<button id="resetClientStatusList" type="button" class="btn btn-danger fa fa-trash-o"> Reset ClientStatusList
|
||||||
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<table id="clientStatusList" class="table table-striped table-bordered" cellspacing="0" width="100%">
|
<table id="clientStatusList" class="table table-striped table-bordered" cellspacing="0" width="100%">
|
||||||
|
@ -912,6 +998,22 @@
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
<th>Algo / PoW</th>
|
<th>Algo / PoW</th>
|
||||||
|
|
||||||
|
<th>CPU Brand</th>
|
||||||
|
<th>External IP</th>
|
||||||
|
<th>Hugepages Available</th>
|
||||||
|
<th>Hugepages Enabled</th>
|
||||||
|
<th>CPU is x64</th>
|
||||||
|
<th>CPU has aes</th>
|
||||||
|
<th>Hashfactor</th>
|
||||||
|
<th>Total Pages</th>
|
||||||
|
<th>Total Hugepages</th>
|
||||||
|
<th>Used Threads</th>
|
||||||
|
<th>CPU Sockets</th>
|
||||||
|
<th>CPU Cores</th>
|
||||||
|
<th>CPU Threads</th>
|
||||||
|
<th>CPU L2</th>
|
||||||
|
<th>CPU L3</th>
|
||||||
|
|
||||||
<th>Hashrate</th>
|
<th>Hashrate</th>
|
||||||
<th>Hashrate 1m</th>
|
<th>Hashrate 1m</th>
|
||||||
<th>Hashrate 15m</th>
|
<th>Hashrate 15m</th>
|
||||||
|
@ -948,6 +1050,21 @@
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
@ -963,7 +1080,8 @@
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button id="minerEditorSave" type="button" class="btn btn-success" data-dismiss="modal">Save</button>
|
<button id="minerEditorSave" type="button" class="btn btn-success" data-dismiss="modal">Save
|
||||||
|
</button>
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1006,9 +1124,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button id="templateEditorSave" type="button" class="btn btn-success" data-dismiss="modal">Save</button>
|
<button id="templateEditorSave" type="button" class="btn btn-success" data-dismiss="modal">Save
|
||||||
|
</button>
|
||||||
<button id="templateEditorSaveAsDialog" type="button" class="btn btn-primary">Save As...</button>
|
<button id="templateEditorSaveAsDialog" type="button" class="btn btn-primary">Save As...</button>
|
||||||
<button id="templateEditorDeleteDialog" type="button" class="btn btn-danger" data-dismiss="modal">Delete</button>
|
<button id="templateEditorDeleteDialog" type="button" class="btn btn-danger" data-dismiss="modal">
|
||||||
|
Delete
|
||||||
|
</button>
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1029,7 +1150,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button id="templateEditorSaveAs" type="button" class="btn btn-success" data-dismiss="modal">Save</button>
|
<button id="templateEditorSaveAs" type="button" class="btn btn-success" data-dismiss="modal">Save
|
||||||
|
</button>
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1049,7 +1171,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button id="templateEditorDelete" type="button" class="btn btn-danger" data-dismiss="modal">Delete</button>
|
<button id="templateEditorDelete" type="button" class="btn btn-danger" data-dismiss="modal">Delete
|
||||||
|
</button>
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1069,18 +1192,21 @@
|
||||||
<select class="selectpicker form-control" id="assignTemplateSelector"></select>
|
<select class="selectpicker form-control" id="assignTemplateSelector"></select>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
<label>
|
<label>
|
||||||
<input id="replaceWorkerId" type="checkbox" data-toggle="toggle" data-size="mini" data-onstyle="success" data-offstyle="danger" data-on="Yes" data-off="No"/>
|
<input id="replaceWorkerId" type="checkbox" data-toggle="toggle" data-size="mini"
|
||||||
|
data-onstyle="success" data-offstyle="danger" data-on="Yes" data-off="No"/>
|
||||||
<span>Replace @WORKER-ID@ with Worker-id</span>
|
<span>Replace @WORKER-ID@ with Worker-id</span>
|
||||||
</label>
|
</label>
|
||||||
<br/>
|
<br/>
|
||||||
<label>
|
<label>
|
||||||
<input id="mergeTemplate" type="checkbox" data-toggle="toggle" data-size="mini" data-onstyle="success" data-offstyle="danger" data-on="Yes" data-off="No"/>
|
<input id="mergeTemplate" type="checkbox" data-toggle="toggle" data-size="mini"
|
||||||
|
data-onstyle="success" data-offstyle="danger" data-on="Yes" data-off="No"/>
|
||||||
<span>Merge templates</span>
|
<span>Merge templates</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button id="assignTemplate" type="button" class="btn btn-success" data-dismiss="modal">Assign</button>
|
<button id="assignTemplate" type="button" class="btn btn-success" data-dismiss="modal">Assign
|
||||||
|
</button>
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
33
src/3rdparty/argon2/CMakeLists.txt
vendored
33
src/3rdparty/argon2/CMakeLists.txt
vendored
|
@ -1,13 +1,12 @@
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
project(Argon2 C)
|
project(argon2 C)
|
||||||
set(ARGON2_VERSION 1.0)
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 99)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
|
|
||||||
add_library(argon2 STATIC
|
set(ARGON2_SOURCES
|
||||||
lib/argon2.c
|
lib/argon2.c
|
||||||
lib/core.c
|
lib/core.c
|
||||||
lib/encoding.c
|
lib/encoding.c
|
||||||
|
@ -16,8 +15,9 @@ add_library(argon2 STATIC
|
||||||
lib/blake2/blake2.c
|
lib/blake2/blake2.c
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(argon2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
set(ARGON2_X86_64_ENABLED ON)
|
||||||
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
set(ARGON2_X86_64_LIBS argon2-sse2 argon2-ssse3 argon2-xop argon2-avx2 argon2-avx512f)
|
||||||
|
set(ARGON2_X86_64_SOURCES arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c)
|
||||||
|
|
||||||
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
||||||
|
@ -28,7 +28,6 @@ if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
|
|
||||||
target_compile_options(argon2-${FEATURE} PRIVATE ${MSVC_FLAG})
|
target_compile_options(argon2-${FEATURE} PRIVATE ${MSVC_FLAG})
|
||||||
target_compile_definitions(argon2-${FEATURE} PRIVATE ${DEF})
|
target_compile_definitions(argon2-${FEATURE} PRIVATE ${DEF})
|
||||||
target_link_libraries(argon2 PUBLIC argon2-${FEATURE})
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
add_feature_impl(sse2 "" HAVE_SSE2)
|
add_feature_impl(sse2 "" HAVE_SSE2)
|
||||||
|
@ -36,8 +35,6 @@ if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
add_feature_impl(xop "" HAVE_XOP)
|
add_feature_impl(xop "" HAVE_XOP)
|
||||||
add_feature_impl(avx2 "/arch:AVX2" HAVE_AVX2)
|
add_feature_impl(avx2 "/arch:AVX2" HAVE_AVX2)
|
||||||
add_feature_impl(avx512f "/arch:AVX512F" HAVE_AVX512F)
|
add_feature_impl(avx512f "/arch:AVX512F" HAVE_AVX512F)
|
||||||
|
|
||||||
target_sources(argon2 PRIVATE arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c)
|
|
||||||
elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
function(add_feature_impl FEATURE GCC_FLAG DEF)
|
function(add_feature_impl FEATURE GCC_FLAG DEF)
|
||||||
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
||||||
|
@ -67,8 +64,6 @@ elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
message("-- argon2: feature '${FEATURE}' detected!")
|
message("-- argon2: feature '${FEATURE}' detected!")
|
||||||
target_compile_definitions(argon2-${FEATURE} PRIVATE ${DEF})
|
target_compile_definitions(argon2-${FEATURE} PRIVATE ${DEF})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(argon2 PUBLIC argon2-${FEATURE})
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
add_feature_impl(sse2 -msse2 HAVE_SSE2)
|
add_feature_impl(sse2 -msse2 HAVE_SSE2)
|
||||||
|
@ -76,8 +71,18 @@ elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
add_feature_impl(xop -mxop HAVE_XOP)
|
add_feature_impl(xop -mxop HAVE_XOP)
|
||||||
add_feature_impl(avx2 -mavx2 HAVE_AVX2)
|
add_feature_impl(avx2 -mavx2 HAVE_AVX2)
|
||||||
add_feature_impl(avx512f -mavx512f HAVE_AVX512F)
|
add_feature_impl(avx512f -mavx512f HAVE_AVX512F)
|
||||||
|
|
||||||
target_sources(argon2 PRIVATE arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c)
|
|
||||||
else()
|
else()
|
||||||
target_sources(argon2 PRIVATE arch/generic/lib/argon2-arch.c)
|
set(ARGON2_X86_64_ENABLED OFF)
|
||||||
|
list(APPEND ARGON2_SOURCES arch/generic/lib/argon2-arch.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (ARGON2_X86_64_ENABLED)
|
||||||
|
set(ARGON2_LIBS ${ARGON2_X86_64_LIBS})
|
||||||
|
list(APPEND ARGON2_SOURCES ${ARGON2_X86_64_SOURCES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(argon2 STATIC ${ARGON2_SOURCES})
|
||||||
|
target_link_libraries(argon2 ${ARGON2_LIBS})
|
||||||
|
|
||||||
|
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
||||||
|
|
132
src/3rdparty/base64/base64.h
vendored
Normal file
132
src/3rdparty/base64/base64.h
vendored
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
#ifndef _BASE64_H_
|
||||||
|
#define _BASE64_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The MIT License (MIT)
|
||||||
|
* Copyright (c) 2016 tomykaira
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
class Base64
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static std::string Encode(const std::string data)
|
||||||
|
{
|
||||||
|
static constexpr char sEncodingTable[] = {
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
||||||
|
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
||||||
|
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||||||
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
||||||
|
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||||||
|
'w', 'x', 'y', 'z', '0', '1', '2', '3',
|
||||||
|
'4', '5', '6', '7', '8', '9', '+', '/'
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t in_len = data.size();
|
||||||
|
size_t out_len = 4 * ((in_len + 2) / 3);
|
||||||
|
std::string ret(out_len, '\0');
|
||||||
|
size_t i;
|
||||||
|
char* p = const_cast<char*>(ret.c_str());
|
||||||
|
|
||||||
|
for (i = 0; i < in_len - 2; i += 3)
|
||||||
|
{
|
||||||
|
*p++ = sEncodingTable[(data[i] >> 2) & 0x3F];
|
||||||
|
*p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int) (data[i + 1] & 0xF0) >> 4)];
|
||||||
|
*p++ = sEncodingTable[((data[i + 1] & 0xF) << 2) | ((int) (data[i + 2] & 0xC0) >> 6)];
|
||||||
|
*p++ = sEncodingTable[data[i + 2] & 0x3F];
|
||||||
|
}
|
||||||
|
if (i < in_len)
|
||||||
|
{
|
||||||
|
*p++ = sEncodingTable[(data[i] >> 2) & 0x3F];
|
||||||
|
if (i == (in_len - 1))
|
||||||
|
{
|
||||||
|
*p++ = sEncodingTable[((data[i] & 0x3) << 4)];
|
||||||
|
*p++ = '=';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int) (data[i + 1] & 0xF0) >> 4)];
|
||||||
|
*p++ = sEncodingTable[((data[i + 1] & 0xF) << 2)];
|
||||||
|
}
|
||||||
|
*p++ = '=';
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string Decode(const std::string& input, std::string& out)
|
||||||
|
{
|
||||||
|
static constexpr unsigned char kDecodingTable[] = {
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
|
||||||
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||||
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
|
||||||
|
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||||
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
||||||
|
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t in_len = input.size();
|
||||||
|
if (in_len % 4 != 0)
|
||||||
|
{ return "Input data size is not a multiple of 4"; }
|
||||||
|
|
||||||
|
size_t out_len = in_len / 4 * 3;
|
||||||
|
if (input[in_len - 1] == '=')
|
||||||
|
{ out_len--; }
|
||||||
|
if (input[in_len - 2] == '=')
|
||||||
|
{ out_len--; }
|
||||||
|
|
||||||
|
out.resize(out_len);
|
||||||
|
|
||||||
|
for (size_t i = 0, j = 0; i < in_len;)
|
||||||
|
{
|
||||||
|
uint32_t a = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(input[i++])];
|
||||||
|
uint32_t b = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(input[i++])];
|
||||||
|
uint32_t c = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(input[i++])];
|
||||||
|
uint32_t d = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(input[i++])];
|
||||||
|
|
||||||
|
uint32_t triple = (a << 3 * 6) + (b << 2 * 6) + (c << 1 * 6) + (d << 0 * 6);
|
||||||
|
|
||||||
|
if (j < out_len)
|
||||||
|
{ out[j++] = (triple >> 2 * 8) & 0xFF; }
|
||||||
|
if (j < out_len)
|
||||||
|
{ out[j++] = (triple >> 1 * 8) & 0xFF; }
|
||||||
|
if (j < out_len)
|
||||||
|
{ out[j++] = (triple >> 0 * 8) & 0xFF; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _BASE64_H_ */
|
3970
src/3rdparty/cpp-httplib/httplib.h
vendored
3970
src/3rdparty/cpp-httplib/httplib.h
vendored
File diff suppressed because it is too large
Load diff
97
src/3rdparty/cxxopts/CHANGELOG.md
vendored
Normal file
97
src/3rdparty/cxxopts/CHANGELOG.md
vendored
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
This is the changelog for `cxxopts`, a C++11 library for parsing command line
|
||||||
|
options. The project adheres to semantic versioning.
|
||||||
|
|
||||||
|
## Next version
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* Only search for a C++ compiler in CMakeLists.txt.
|
||||||
|
* Allow for exceptions to be disabled.
|
||||||
|
* Fix duplicate default options when there is a short and long option.
|
||||||
|
* Add `CXXOPTS_NO_EXCEPTIONS` to disable exceptions.
|
||||||
|
* Fix char parsing for space and check for length.
|
||||||
|
|
||||||
|
## 2.2
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* Allow integers to have leading zeroes.
|
||||||
|
* Build the tests by default.
|
||||||
|
* Don't check for container when showing positional help.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* Iterator inputs to `parse_positional`.
|
||||||
|
* Throw an exception if the option in `parse_positional` doesn't exist.
|
||||||
|
* Parse a delimited list in a single argument for vector options.
|
||||||
|
* Add an option to disable implicit value on booleans.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Fix a warning about possible loss of data.
|
||||||
|
* Fix version numbering in CMakeLists.txt
|
||||||
|
* Remove unused declaration of the undefined `ParseResult::get_option`.
|
||||||
|
* Throw on invalid option syntax when beginning with a `-`.
|
||||||
|
* Throw in `as` when option wasn't present.
|
||||||
|
* Fix catching exceptions by reference.
|
||||||
|
* Fix out of bounds errors parsing integers.
|
||||||
|
|
||||||
|
## 2.1.1
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Revert the change adding `const` type for `argv`, because most users expect
|
||||||
|
to pass a non-const `argv` from `main`.
|
||||||
|
|
||||||
|
## 2.1
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* Options with implicit arguments now require the `--option=value` form if
|
||||||
|
they are to be specified with an option. This is to remove the ambiguity
|
||||||
|
when a positional argument could follow an option with an implicit value.
|
||||||
|
For example, `--foo value`, where `foo` has an implicit value, will be
|
||||||
|
parsed as `--foo=implicit` and a positional argument `value`.
|
||||||
|
* Boolean values are no longer special, but are just an option with a default
|
||||||
|
and implicit value.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* Added support for `std::optional` as a storage type.
|
||||||
|
* Allow the help string to be customised.
|
||||||
|
* Use `const` for the type in the `argv` parameter, since the contents of the
|
||||||
|
arguments is never modified.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Building against GCC 4.9 was broken due to overly strict shadow warnings.
|
||||||
|
* Fixed an ambiguous overload in the `parse_positional` function when an
|
||||||
|
`initializer_list` was directly passed.
|
||||||
|
* Fixed precedence in the Boolean value regex.
|
||||||
|
|
||||||
|
## 2.0
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* `Options::parse` returns a ParseResult rather than storing the parse
|
||||||
|
result internally.
|
||||||
|
* Options with default values now get counted as appearing once if they
|
||||||
|
were not specified by the user.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* A new `ParseResult` object that is the immutable result of parsing. It
|
||||||
|
responds to the same `count` and `operator[]` as `Options` of 1.x did.
|
||||||
|
* The function `ParseResult::arguments` returns a vector of the parsed
|
||||||
|
arguments to iterate through in the order they were provided.
|
||||||
|
* The symbol `cxxopts::version` for the version of the library.
|
||||||
|
* Booleans can be specified with various strings and explicitly set false.
|
||||||
|
|
||||||
|
## 1.x
|
||||||
|
|
||||||
|
The 1.x series was the first major version of the library, with release numbers
|
||||||
|
starting to follow semantic versioning, after 0.x being unstable. It never had
|
||||||
|
a changelog maintained for it. Releases mostly contained bug fixes, with the
|
||||||
|
occasional feature added.
|
19
src/3rdparty/cxxopts/LICENSE
vendored
Normal file
19
src/3rdparty/cxxopts/LICENSE
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2014 Jarryd Beck
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
157
src/3rdparty/cxxopts/README.md
vendored
Normal file
157
src/3rdparty/cxxopts/README.md
vendored
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
[](https://travis-ci.org/jarro2783/cxxopts)
|
||||||
|
|
||||||
|
# Release versions
|
||||||
|
|
||||||
|
Note that `master` is generally a work in progress, and you probably want to use a
|
||||||
|
tagged release version.
|
||||||
|
|
||||||
|
# Quick start
|
||||||
|
|
||||||
|
This is a lightweight C++ option parser library, supporting the standard GNU
|
||||||
|
style syntax for options.
|
||||||
|
|
||||||
|
Options can be given as:
|
||||||
|
|
||||||
|
--long
|
||||||
|
--long=argument
|
||||||
|
--long argument
|
||||||
|
-a
|
||||||
|
-ab
|
||||||
|
-abc argument
|
||||||
|
|
||||||
|
where c takes an argument, but a and b do not.
|
||||||
|
|
||||||
|
Additionally, anything after `--` will be parsed as a positional argument.
|
||||||
|
|
||||||
|
## Basics
|
||||||
|
|
||||||
|
#include <cxxopts.hpp>
|
||||||
|
|
||||||
|
Create a cxxopts::Options instance.
|
||||||
|
|
||||||
|
cxxopts::Options options("MyProgram", "One line description of MyProgram");
|
||||||
|
|
||||||
|
Then use `add_options`.
|
||||||
|
|
||||||
|
options.add_options()
|
||||||
|
("d,debug", "Enable debugging")
|
||||||
|
("f,file", "File name", cxxopts::value<std::string>())
|
||||||
|
;
|
||||||
|
|
||||||
|
Options are declared with a long and an optional short option. A description
|
||||||
|
must be provided. The third argument is the value, if omitted it is boolean.
|
||||||
|
Any type can be given as long as it can be parsed, with operator>>.
|
||||||
|
|
||||||
|
To parse the command line do:
|
||||||
|
|
||||||
|
auto result = options.parse(argc, argv);
|
||||||
|
|
||||||
|
To retrieve an option use `result.count("option")` to get the number of times
|
||||||
|
it appeared, and
|
||||||
|
|
||||||
|
result["opt"].as<type>()
|
||||||
|
|
||||||
|
to get its value. If "opt" doesn't exist, or isn't of the right type, then an
|
||||||
|
exception will be thrown.
|
||||||
|
|
||||||
|
Note that the result of `options.parse` should only be used as long as the
|
||||||
|
`options` object that created it is in scope.
|
||||||
|
|
||||||
|
## Exceptions
|
||||||
|
|
||||||
|
Exceptional situations throw C++ exceptions. There are two types of
|
||||||
|
exceptions: errors defining the options, and errors when parsing a list of
|
||||||
|
arguments. All exceptions derive from `cxxopts::OptionException`. Errors
|
||||||
|
defining options derive from `cxxopts::OptionSpecException` and errors
|
||||||
|
parsing arguments derive from `cxxopts::OptionParseException`.
|
||||||
|
|
||||||
|
All exceptions define a `what()` function to get a printable string
|
||||||
|
explaining the error.
|
||||||
|
|
||||||
|
## Help groups
|
||||||
|
|
||||||
|
Options can be placed into groups for the purposes of displaying help messages.
|
||||||
|
To place options in a group, pass the group as a string to `add_options`. Then,
|
||||||
|
when displaying the help, pass the groups that you would like displayed as a
|
||||||
|
vector to the `help` function.
|
||||||
|
|
||||||
|
## Positional Arguments
|
||||||
|
|
||||||
|
Positional arguments can be optionally parsed into one or more options.
|
||||||
|
To set up positional arguments, call
|
||||||
|
|
||||||
|
options.parse_positional({"first", "second", "last"})
|
||||||
|
|
||||||
|
where "last" should be the name of an option with a container type, and the
|
||||||
|
others should have a single value.
|
||||||
|
|
||||||
|
## Default and implicit values
|
||||||
|
|
||||||
|
An option can be declared with a default or an implicit value, or both.
|
||||||
|
|
||||||
|
A default value is the value that an option takes when it is not specified
|
||||||
|
on the command line. The following specifies a default value for an option:
|
||||||
|
|
||||||
|
cxxopts::value<std::string>()->default_value("value")
|
||||||
|
|
||||||
|
An implicit value is the value that an option takes when it is given on the
|
||||||
|
command line without an argument. The following specifies an implicit value:
|
||||||
|
|
||||||
|
cxxopts::value<std::string>()->implicit_value("implicit")
|
||||||
|
|
||||||
|
If an option had both, then not specifying it would give the value `"value"`,
|
||||||
|
writing it on the command line as `--option` would give the value `"implicit"`,
|
||||||
|
and writing `--option=another` would give it the value `"another"`.
|
||||||
|
|
||||||
|
Note that the default and implicit value is always stored as a string,
|
||||||
|
regardless of the type that you want to store it in. It will be parsed as
|
||||||
|
though it was given on the command line.
|
||||||
|
|
||||||
|
## Boolean values
|
||||||
|
|
||||||
|
Boolean options have a default implicit value of `"true"`, which can be
|
||||||
|
overridden. The effect is that writing `-o` by itself will set option `o` to
|
||||||
|
`true`. However, they can also be written with various strings using `=value`.
|
||||||
|
There is no way to disambiguate positional arguments from the value following
|
||||||
|
a boolean, so we have chosen that they will be positional arguments, and
|
||||||
|
therefore, `-o false` does not work.
|
||||||
|
|
||||||
|
## `std::vector<T>` values
|
||||||
|
|
||||||
|
Parsing of list of values in form of an `std::vector<T>` is also supported, as long as `T`
|
||||||
|
can be parsed. To separate single values in a list the definition `CXXOPTS_VECTOR_DELIMITER`
|
||||||
|
is used, which is ',' by default. Ensure that you use no whitespaces between values because
|
||||||
|
those would be interpreted as the next command line option. Example for a command line option
|
||||||
|
that can be parsed as a `std::vector<double>`:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
--my_list=1,-2.1,3,4.5
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Custom help
|
||||||
|
|
||||||
|
The string after the program name on the first line of the help can be
|
||||||
|
completely replaced by calling `options.custom_help`. Note that you might
|
||||||
|
also want to override the positional help by calling `options.positional_help`.
|
||||||
|
|
||||||
|
# Linking
|
||||||
|
|
||||||
|
This is a header only library.
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
|
||||||
|
The only build requirement is a C++ compiler that supports C++11 features such as:
|
||||||
|
|
||||||
|
* regex
|
||||||
|
* constexpr
|
||||||
|
* default constructors
|
||||||
|
|
||||||
|
GCC >= 4.9 or clang >= 3.1 with libc++ are known to work.
|
||||||
|
|
||||||
|
The following compilers are known not to work:
|
||||||
|
|
||||||
|
* MSVC 2013
|
||||||
|
|
||||||
|
# TODO list
|
||||||
|
|
||||||
|
* Allow unrecognised options.
|
2214
src/3rdparty/cxxopts/cxxopts.hpp
vendored
Normal file
2214
src/3rdparty/cxxopts/cxxopts.hpp
vendored
Normal file
File diff suppressed because it is too large
Load diff
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "App.h"
|
#include "App.h"
|
||||||
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/Console.h"
|
#include "base/io/Console.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/kernel/Signals.h"
|
#include "base/kernel/Signals.h"
|
||||||
|
@ -178,7 +179,11 @@ void xmrig::App::close(bool restart)
|
||||||
m_restart = restart;
|
m_restart = restart;
|
||||||
|
|
||||||
m_signals->stop();
|
m_signals->stop();
|
||||||
|
|
||||||
|
if (m_console) {
|
||||||
m_console->stop();
|
m_console->stop();
|
||||||
|
}
|
||||||
|
|
||||||
m_controller->stop();
|
m_controller->stop();
|
||||||
|
|
||||||
Log::destroy();
|
Log::destroy();
|
||||||
|
|
|
@ -26,10 +26,8 @@
|
||||||
#ifndef XMRIG_APP_H
|
#ifndef XMRIG_APP_H
|
||||||
#define XMRIG_APP_H
|
#define XMRIG_APP_H
|
||||||
|
|
||||||
|
|
||||||
#include "base/kernel/interfaces/IConsoleListener.h"
|
#include "base/kernel/interfaces/IConsoleListener.h"
|
||||||
#include "base/kernel/interfaces/ISignalListener.h"
|
#include "base/kernel/interfaces/ISignalListener.h"
|
||||||
|
|
||||||
#include "base/cc/interfaces/ICommandListener.h"
|
#include "base/cc/interfaces/ICommandListener.h"
|
||||||
#include "cc/ControlCommand.h"
|
#include "cc/ControlCommand.h"
|
||||||
|
|
||||||
|
@ -77,5 +75,4 @@ private:
|
||||||
|
|
||||||
} /* namespace xmrig */
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_APP_H */
|
#endif /* XMRIG_APP_H */
|
||||||
|
|
|
@ -123,9 +123,6 @@ bool xmrig::CpuWorker<N>::selfTest()
|
||||||
verify2(Algorithm::CN_R, test_output_r) &&
|
verify2(Algorithm::CN_R, test_output_r) &&
|
||||||
verify(Algorithm::CN_RWZ, test_output_rwz) &&
|
verify(Algorithm::CN_RWZ, test_output_rwz) &&
|
||||||
verify(Algorithm::CN_ZLS, test_output_zls) &&
|
verify(Algorithm::CN_ZLS, test_output_zls) &&
|
||||||
#ifndef XMRIG_ARM
|
|
||||||
verify(Algorithm::CN_CONCEAL, test_output_conceal) &&
|
|
||||||
#endif
|
|
||||||
verify(Algorithm::CN_DOUBLE, test_output_double);
|
verify(Algorithm::CN_DOUBLE, test_output_double);
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
# ifdef XMRIG_ALGO_CN_GPU
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
# define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE
|
# define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "crypto/cn/CnAlgo.h"
|
||||||
#include "backend/cpu/platform/HwlocCpuInfo.h"
|
#include "backend/cpu/platform/HwlocCpuInfo.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
|
||||||
|
@ -290,6 +290,11 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
if (CnAlgo<>::base(algorithm) == Algorithm::CN_0 || CnAlgo<>::base(algorithm) == Algorithm::CN_1) {
|
||||||
|
intensity = std::min<uint32_t >(static_cast<const uint32_t &>(cacheHashes / PUs), algorithm.maxIntensity());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
# ifdef XMRIG_ALGO_CN_GPU
|
||||||
if (algorithm == Algorithm::CN_GPU) {
|
if (algorithm == Algorithm::CN_GPU) {
|
||||||
cacheHashes = PUs;
|
cacheHashes = PUs;
|
||||||
|
|
|
@ -62,7 +62,6 @@ set(SOURCES_BASE
|
||||||
src/base/io/json/JsonRequest.cpp
|
src/base/io/json/JsonRequest.cpp
|
||||||
src/base/io/log/backends/ConsoleLog.cpp
|
src/base/io/log/backends/ConsoleLog.cpp
|
||||||
src/base/io/log/backends/FileLog.cpp
|
src/base/io/log/backends/FileLog.cpp
|
||||||
src/base/io/log/backends/RemoteLog.cpp
|
|
||||||
src/base/io/log/Log.cpp
|
src/base/io/log/Log.cpp
|
||||||
src/base/io/Watcher.cpp
|
src/base/io/Watcher.cpp
|
||||||
src/base/kernel/Base.cpp
|
src/base/kernel/Base.cpp
|
||||||
|
|
|
@ -31,8 +31,11 @@
|
||||||
xmrig::Console::Console(IConsoleListener *listener)
|
xmrig::Console::Console(IConsoleListener *listener)
|
||||||
: m_listener(listener)
|
: m_listener(listener)
|
||||||
{
|
{
|
||||||
m_tty = new uv_tty_t;
|
if (!isSupported()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_tty = new uv_tty_t;
|
||||||
m_tty->data = this;
|
m_tty->data = this;
|
||||||
uv_tty_init(uv_default_loop(), m_tty, 0, 1);
|
uv_tty_init(uv_default_loop(), m_tty, 0, 1);
|
||||||
|
|
||||||
|
@ -53,6 +56,10 @@ xmrig::Console::~Console()
|
||||||
|
|
||||||
void xmrig::Console::stop()
|
void xmrig::Console::stop()
|
||||||
{
|
{
|
||||||
|
if (!m_tty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uv_tty_reset_mode();
|
uv_tty_reset_mode();
|
||||||
|
|
||||||
Handle::close(m_tty);
|
Handle::close(m_tty);
|
||||||
|
@ -60,6 +67,13 @@ void xmrig::Console::stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::Console::isSupported() const
|
||||||
|
{
|
||||||
|
const uv_handle_type type = uv_guess_handle(0);
|
||||||
|
return type == UV_TTY || type == UV_NAMED_PIPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Console::onAllocBuffer(uv_handle_t *handle, size_t, uv_buf_t *buf)
|
void xmrig::Console::onAllocBuffer(uv_handle_t *handle, size_t, uv_buf_t *buf)
|
||||||
{
|
{
|
||||||
auto console = static_cast<Console*>(handle->data);
|
auto console = static_cast<Console*>(handle->data);
|
||||||
|
|
|
@ -26,9 +26,11 @@
|
||||||
#define XMRIG_CONSOLE_H
|
#define XMRIG_CONSOLE_H
|
||||||
|
|
||||||
|
|
||||||
#include <uv.h>
|
#include "base/tools/Object.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
@ -39,18 +41,22 @@ class IConsoleListener;
|
||||||
class Console
|
class Console
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE_DEFAULT(Console)
|
||||||
|
|
||||||
Console(IConsoleListener *listener);
|
Console(IConsoleListener *listener);
|
||||||
~Console();
|
~Console();
|
||||||
|
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool isSupported() const;
|
||||||
|
|
||||||
static void onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf);
|
static void onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf);
|
||||||
static void onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf);
|
static void onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf);
|
||||||
|
|
||||||
char m_buf[1];
|
char m_buf[1] = { 0 };
|
||||||
IConsoleListener *m_listener;
|
IConsoleListener *m_listener;
|
||||||
uv_tty_t *m_tty;
|
uv_tty_t *m_tty = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
|
# include <sys/stat.h>
|
||||||
# include <ext/stdio_filebuf.h>
|
# include <ext/stdio_filebuf.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -102,7 +103,7 @@ bool xmrig::Json::save(const char *fileName, const rapidjson::Document &doc)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
# elif defined(__GNUC__)
|
# elif defined(__GNUC__)
|
||||||
const int fd = _wopen(toUtf16(fileName).c_str(), _O_WRONLY | _O_BINARY | _O_CREAT | _O_TRUNC);
|
const int fd = _wopen(toUtf16(fileName).c_str(), _O_WRONLY | _O_BINARY | _O_CREAT | _O_TRUNC, _S_IWRITE);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
|
|
||||||
|
|
||||||
#include "base/tools/Handle.h"
|
#include "base/tools/Handle.h"
|
||||||
|
@ -32,9 +32,13 @@
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
|
||||||
|
|
||||||
xmrig::ConsoleLog::ConsoleLog() :
|
xmrig::ConsoleLog::ConsoleLog()
|
||||||
m_stream(nullptr)
|
|
||||||
{
|
{
|
||||||
|
if (!isSupported()) {
|
||||||
|
Log::colors = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_tty = new uv_tty_t;
|
m_tty = new uv_tty_t;
|
||||||
|
|
||||||
if (uv_tty_init(uv_default_loop(), m_tty, 1, 0) < 0) {
|
if (uv_tty_init(uv_default_loop(), m_tty, 1, 0) < 0) {
|
||||||
|
@ -66,7 +70,7 @@ xmrig::ConsoleLog::~ConsoleLog()
|
||||||
|
|
||||||
void xmrig::ConsoleLog::print(int, const char *line, size_t, size_t size, bool colors)
|
void xmrig::ConsoleLog::print(int, const char *line, size_t, size_t size, bool colors)
|
||||||
{
|
{
|
||||||
if (Log::colors != colors) {
|
if (!m_tty || Log::colors != colors) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,12 +90,18 @@ void xmrig::ConsoleLog::print(int, const char *line, size_t, size_t size, bool c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::ConsoleLog::isSupported() const
|
||||||
|
{
|
||||||
|
const uv_handle_type type = uv_guess_handle(1);
|
||||||
|
return type == UV_TTY || type == UV_NAMED_PIPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::ConsoleLog::isWritable() const
|
bool xmrig::ConsoleLog::isWritable() const
|
||||||
{
|
{
|
||||||
if (!m_stream || uv_is_writable(m_stream) != 1) {
|
if (!m_stream || uv_is_writable(m_stream) != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uv_handle_type type = uv_guess_handle(1);
|
return isSupported();
|
||||||
return type == UV_TTY || type == UV_NAMED_PIPE;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,11 +27,12 @@
|
||||||
#define XMRIG_CONSOLELOG_H
|
#define XMRIG_CONSOLELOG_H
|
||||||
|
|
||||||
|
|
||||||
typedef struct uv_stream_s uv_stream_t;
|
using uv_stream_t = struct uv_stream_s;
|
||||||
typedef struct uv_tty_s uv_tty_t;
|
using uv_tty_t = struct uv_tty_s;
|
||||||
|
|
||||||
|
|
||||||
#include "base/kernel/interfaces/ILogBackend.h"
|
#include "base/kernel/interfaces/ILogBackend.h"
|
||||||
|
#include "base/tools/Object.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
@ -40,6 +41,8 @@ namespace xmrig {
|
||||||
class ConsoleLog : public ILogBackend
|
class ConsoleLog : public ILogBackend
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE(ConsoleLog)
|
||||||
|
|
||||||
ConsoleLog();
|
ConsoleLog();
|
||||||
~ConsoleLog() override;
|
~ConsoleLog() override;
|
||||||
|
|
||||||
|
@ -47,10 +50,11 @@ protected:
|
||||||
void print(int level, const char *line, size_t offset, size_t size, bool colors) override;
|
void print(int level, const char *line, size_t offset, size_t size, bool colors) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool isSupported() const;
|
||||||
bool isWritable() const;
|
bool isWritable() const;
|
||||||
|
|
||||||
uv_stream_t *m_stream;
|
uv_stream_t *m_stream = nullptr;
|
||||||
uv_tty_t *m_tty;
|
uv_tty_t *m_tty = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,13 +25,13 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <base/io/log/backends/RemoteLog.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "base/io/json/Json.h"
|
#include "base/io/json/Json.h"
|
||||||
#include "base/io/json/JsonChain.h"
|
#include "base/io/json/JsonChain.h"
|
||||||
#include "base/io/log/backends/ConsoleLog.h"
|
#include "base/io/log/backends/ConsoleLog.h"
|
||||||
#include "base/io/log/backends/FileLog.h"
|
#include "base/io/log/backends/FileLog.h"
|
||||||
|
#include "base/io/log/backends/RemoteLog.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/io/Watcher.h"
|
#include "base/io/Watcher.h"
|
||||||
#include "base/kernel/Base.h"
|
#include "base/kernel/Base.h"
|
||||||
|
@ -277,6 +277,7 @@ void xmrig::Base::stop()
|
||||||
d_ptr->watcher = nullptr;
|
d_ptr->watcher = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::Api *xmrig::Base::api() const
|
xmrig::Api *xmrig::Base::api() const
|
||||||
{
|
{
|
||||||
assert(d_ptr->api != nullptr);
|
assert(d_ptr->api != nullptr);
|
||||||
|
@ -284,6 +285,7 @@ xmrig::Api *xmrig::Base::api() const
|
||||||
return d_ptr->api;
|
return d_ptr->api;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::CCClient *xmrig::Base::ccClient() const
|
xmrig::CCClient *xmrig::Base::ccClient() const
|
||||||
{
|
{
|
||||||
assert(d_ptr->ccClient != nullptr);
|
assert(d_ptr->ccClient != nullptr);
|
||||||
|
@ -291,6 +293,7 @@ xmrig::CCClient *xmrig::Base::ccClient() const
|
||||||
return d_ptr->ccClient;
|
return d_ptr->ccClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::Base::reload(const rapidjson::Value &json)
|
bool xmrig::Base::reload(const rapidjson::Value &json)
|
||||||
{
|
{
|
||||||
JsonReader reader(json);
|
JsonReader reader(json);
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#ifndef XMRIG_BASECONFIG_H
|
#ifndef XMRIG_BASECONFIG_H
|
||||||
#define XMRIG_BASECONFIG_H
|
#define XMRIG_BASECONFIG_H
|
||||||
|
|
||||||
#include "base/tools/String.h"
|
|
||||||
#include "base/kernel/interfaces/IConfig.h"
|
#include "base/kernel/interfaces/IConfig.h"
|
||||||
#include "base/net/http/Http.h"
|
#include "base/net/http/Http.h"
|
||||||
#include "base/net/stratum/Pools.h"
|
#include "base/net/stratum/Pools.h"
|
||||||
|
|
|
@ -47,6 +47,7 @@ namespace xmrig
|
||||||
|
|
||||||
static const char *kAlgo = "algo";
|
static const char *kAlgo = "algo";
|
||||||
static const char *kApi = "api";
|
static const char *kApi = "api";
|
||||||
|
static const char *kCoin = "coin";
|
||||||
static const char *kHttp = "http";
|
static const char *kHttp = "http";
|
||||||
static const char *kPools = "pools";
|
static const char *kPools = "pools";
|
||||||
static const char *kCCClient = "cc-client";
|
static const char *kCCClient = "cc-client";
|
||||||
|
@ -108,6 +109,15 @@ void xmrig::BaseTransform::finalize(rapidjson::Document &doc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_coin.isValid() && doc.HasMember(kPools)) {
|
||||||
|
auto &pools = doc[kPools];
|
||||||
|
for (Value &pool : pools.GetArray()) {
|
||||||
|
if (!pool.HasMember(kCoin)) {
|
||||||
|
pool.AddMember(StringRef(kCoin), m_coin.toJSON(), allocator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,6 +133,15 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IConfig::CoinKey: /* --coin */
|
||||||
|
if (!doc.HasMember(kPools)) {
|
||||||
|
m_coin = arg;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return add(doc, kPools, kCoin, arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case IConfig::UserpassKey: /* --userpass */
|
case IConfig::UserpassKey: /* --userpass */
|
||||||
{
|
{
|
||||||
const char *p = strrchr(arg, ':');
|
const char *p = strrchr(arg, ':');
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "base/kernel/interfaces/IConfigTransform.h"
|
#include "base/kernel/interfaces/IConfigTransform.h"
|
||||||
|
#include "crypto/common/Coin.h"
|
||||||
#include "rapidjson/document.h"
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,6 +100,7 @@ protected:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Algorithm m_algorithm;
|
Algorithm m_algorithm;
|
||||||
|
Coin m_coin;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -43,6 +43,7 @@ public:
|
||||||
enum Keys {
|
enum Keys {
|
||||||
// common
|
// common
|
||||||
AlgorithmKey = 'a',
|
AlgorithmKey = 'a',
|
||||||
|
CoinKey = 1025,
|
||||||
ApiWorkerIdKey = 4002,
|
ApiWorkerIdKey = 4002,
|
||||||
ApiIdKey = 4005,
|
ApiIdKey = 4005,
|
||||||
HttpPort = 4100,
|
HttpPort = 4100,
|
||||||
|
@ -140,7 +141,6 @@ public:
|
||||||
CCAccessToken = 9007,
|
CCAccessToken = 9007,
|
||||||
CCWorkerId = 9008,
|
CCWorkerId = 9008,
|
||||||
CCUpdateInterval = 9009,
|
CCUpdateInterval = 9009,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual ~IConfig() = default;
|
virtual ~IConfig() = default;
|
||||||
|
|
|
@ -334,6 +334,9 @@ bool xmrig::Client::parseJob(const rapidjson::Value ¶ms, int *code)
|
||||||
if (algo) {
|
if (algo) {
|
||||||
job.setAlgorithm(algo);
|
job.setAlgorithm(algo);
|
||||||
}
|
}
|
||||||
|
else if (m_pool.coin().isValid()) {
|
||||||
|
job.setAlgorithm(m_pool.coin().algorithm(job.blob()[0]));
|
||||||
|
}
|
||||||
|
|
||||||
job.setHeight(Json::getUint64(params, "height"));
|
job.setHeight(Json::getUint64(params, "height"));
|
||||||
|
|
||||||
|
@ -426,7 +429,12 @@ bool xmrig::Client::verifyAlgorithm(const Algorithm &algorithm, const char *algo
|
||||||
{
|
{
|
||||||
if (!algorithm.isValid()) {
|
if (!algorithm.isValid()) {
|
||||||
if (!isQuiet()) {
|
if (!isQuiet()) {
|
||||||
LOG_ERR("[%s] Unknown/unsupported algorithm \"%s\" detected, reconnect", url(), algo);
|
if (algo == nullptr) {
|
||||||
|
LOG_ERR("[%s] unknown algorithm, make sure you set \"algo\" or \"coin\" option", url(), algo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_ERR("[%s] unsupported algorithm \"%s\" detected, reconnect", url(), algo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -436,7 +444,7 @@ bool xmrig::Client::verifyAlgorithm(const Algorithm &algorithm, const char *algo
|
||||||
m_listener->onVerifyAlgorithm(this, algorithm, &ok);
|
m_listener->onVerifyAlgorithm(this, algorithm, &ok);
|
||||||
|
|
||||||
if (!ok && !isQuiet()) {
|
if (!ok && !isQuiet()) {
|
||||||
LOG_ERR("[%s] Incompatible/disabled algorithm \"%s\" detected, reconnect", url(), algorithm.shortName());
|
LOG_ERR("[%s] incompatible/disabled algorithm \"%s\" detected, reconnect", url(), algorithm.shortName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
|
@ -900,6 +908,12 @@ void xmrig::Client::onConnect(uv_connect_t *req, int status)
|
||||||
LOG_ERR("[%s] connect error: \"%s\"", client->url(), uv_strerror(status));
|
LOG_ERR("[%s] connect error: \"%s\"", client->url(), uv_strerror(status));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (client->state() != ConnectingState) {
|
||||||
|
LOG_ERR("[%s] connect error: \"invalid state: %d\"", client->url(), client->state());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
delete req;
|
delete req;
|
||||||
client->close();
|
client->close();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <assert.h>
|
#include <cassert>
|
||||||
|
|
||||||
|
|
||||||
#include "3rdparty/http-parser/http_parser.h"
|
#include "3rdparty/http-parser/http_parser.h"
|
||||||
|
@ -225,6 +225,10 @@ bool xmrig::DaemonClient::parseJob(const rapidjson::Value ¶ms, int *code)
|
||||||
job.setDiff(Json::getUint64(params, "difficulty"));
|
job.setDiff(Json::getUint64(params, "difficulty"));
|
||||||
job.setId(blocktemplate.data() + blocktemplate.size() - 32);
|
job.setId(blocktemplate.data() + blocktemplate.size() - 32);
|
||||||
|
|
||||||
|
if (m_pool.coin().isValid()) {
|
||||||
|
job.setAlgorithm(m_pool.coin().algorithm(job.blob()[0]));
|
||||||
|
}
|
||||||
|
|
||||||
m_job = std::move(job);
|
m_job = std::move(job);
|
||||||
m_blocktemplate = std::move(blocktemplate);
|
m_blocktemplate = std::move(blocktemplate);
|
||||||
m_prevHash = Json::getString(params, "prev_hash");
|
m_prevHash = Json::getString(params, "prev_hash");
|
||||||
|
|
|
@ -73,6 +73,7 @@ public:
|
||||||
inline uint8_t fixedByte() const { return *(m_blob + 42); }
|
inline uint8_t fixedByte() const { return *(m_blob + 42); }
|
||||||
inline uint8_t index() const { return m_index; }
|
inline uint8_t index() const { return m_index; }
|
||||||
inline void reset() { m_size = 0; m_diff = 0; }
|
inline void reset() { m_size = 0; m_diff = 0; }
|
||||||
|
inline void setAlgorithm(const Algorithm::Id id) { m_algorithm = id; }
|
||||||
inline void setAlgorithm(const char *algo) { m_algorithm = algo; }
|
inline void setAlgorithm(const char *algo) { m_algorithm = algo; }
|
||||||
inline void setClientId(const String &id) { m_clientId = id; }
|
inline void setClientId(const String &id) { m_clientId = id; }
|
||||||
inline void setHeight(uint64_t height) { m_height = height; }
|
inline void setHeight(uint64_t height) { m_height = height; }
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static const char *kAlgo = "algo";
|
static const char *kAlgo = "algo";
|
||||||
|
static const char *kCoin = "coin";
|
||||||
static const char *kDaemon = "daemon";
|
static const char *kDaemon = "daemon";
|
||||||
static const char *kDaemonPollInterval = "daemon-poll-interval";
|
static const char *kDaemonPollInterval = "daemon-poll-interval";
|
||||||
static const char *kEnabled = "enabled";
|
static const char *kEnabled = "enabled";
|
||||||
|
@ -120,6 +121,7 @@ xmrig::Pool::Pool(const rapidjson::Value &object) :
|
||||||
m_fingerprint = Json::getString(object, kFingerprint);
|
m_fingerprint = Json::getString(object, kFingerprint);
|
||||||
m_pollInterval = Json::getUint64(object, kDaemonPollInterval, kDefaultPollInterval);
|
m_pollInterval = Json::getUint64(object, kDaemonPollInterval, kDefaultPollInterval);
|
||||||
m_algorithm = Json::getString(object, kAlgo);
|
m_algorithm = Json::getString(object, kAlgo);
|
||||||
|
m_coin = Json::getString(object, kCoin);
|
||||||
|
|
||||||
m_flags.set(FLAG_ENABLED, Json::getBool(object, kEnabled, true));
|
m_flags.set(FLAG_ENABLED, Json::getBool(object, kEnabled, true));
|
||||||
m_flags.set(FLAG_NICEHASH, Json::getBool(object, kNicehash));
|
m_flags.set(FLAG_NICEHASH, Json::getBool(object, kNicehash));
|
||||||
|
@ -172,7 +174,7 @@ bool xmrig::Pool::isEnabled() const
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (isDaemon() && !algorithm().isValid()) {
|
if (isDaemon() && (!algorithm().isValid() && !coin().isValid())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +188,7 @@ bool xmrig::Pool::isEqual(const Pool &other) const
|
||||||
&& m_keepAlive == other.m_keepAlive
|
&& m_keepAlive == other.m_keepAlive
|
||||||
&& m_port == other.m_port
|
&& m_port == other.m_port
|
||||||
&& m_algorithm == other.m_algorithm
|
&& m_algorithm == other.m_algorithm
|
||||||
|
&& m_coin == other.m_coin
|
||||||
&& m_fingerprint == other.m_fingerprint
|
&& m_fingerprint == other.m_fingerprint
|
||||||
&& m_host == other.m_host
|
&& m_host == other.m_host
|
||||||
&& m_password == other.m_password
|
&& m_password == other.m_password
|
||||||
|
@ -268,6 +271,7 @@ rapidjson::Value xmrig::Pool::toJSON(rapidjson::Document &doc) const
|
||||||
Value obj(kObjectType);
|
Value obj(kObjectType);
|
||||||
|
|
||||||
obj.AddMember(StringRef(kAlgo), m_algorithm.toJSON(), allocator);
|
obj.AddMember(StringRef(kAlgo), m_algorithm.toJSON(), allocator);
|
||||||
|
obj.AddMember(StringRef(kCoin), m_coin.toJSON(), allocator);
|
||||||
obj.AddMember(StringRef(kUrl), m_url.toJSON(), allocator);
|
obj.AddMember(StringRef(kUrl), m_url.toJSON(), allocator);
|
||||||
obj.AddMember(StringRef(kUser), m_user.toJSON(), allocator);
|
obj.AddMember(StringRef(kUser), m_user.toJSON(), allocator);
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
#include "crypto/common/Algorithm.h"
|
#include "crypto/common/Coin.h"
|
||||||
#include "rapidjson/fwd.h"
|
#include "rapidjson/fwd.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ public:
|
||||||
inline bool isTLS() const { return m_flags.test(FLAG_TLS); }
|
inline bool isTLS() const { return m_flags.test(FLAG_TLS); }
|
||||||
inline bool isValid() const { return !m_host.isNull() && m_port > 0; }
|
inline bool isValid() const { return !m_host.isNull() && m_port > 0; }
|
||||||
inline const Algorithm &algorithm() const { return m_algorithm; }
|
inline const Algorithm &algorithm() const { return m_algorithm; }
|
||||||
|
inline const Coin &coin() const { return m_coin; }
|
||||||
inline const String &fingerprint() const { return m_fingerprint; }
|
inline const String &fingerprint() const { return m_fingerprint; }
|
||||||
inline const String &host() const { return m_host; }
|
inline const String &host() const { return m_host; }
|
||||||
inline const String &password() const { return !m_password.isNull() ? m_password : kDefaultPassword; }
|
inline const String &password() const { return !m_password.isNull() ? m_password : kDefaultPassword; }
|
||||||
|
@ -107,6 +108,7 @@ private:
|
||||||
bool parseIPv6(const char *addr);
|
bool parseIPv6(const char *addr);
|
||||||
|
|
||||||
Algorithm m_algorithm;
|
Algorithm m_algorithm;
|
||||||
|
Coin m_coin;
|
||||||
int m_keepAlive;
|
int m_keepAlive;
|
||||||
std::bitset<FLAG_MAX> m_flags;
|
std::bitset<FLAG_MAX> m_flags;
|
||||||
String m_fingerprint;
|
String m_fingerprint;
|
||||||
|
|
|
@ -135,11 +135,12 @@ void xmrig::Pools::print() const
|
||||||
{
|
{
|
||||||
size_t i = 1;
|
size_t i = 1;
|
||||||
for (const Pool &pool : m_data) {
|
for (const Pool &pool : m_data) {
|
||||||
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("POOL #%-7zu") CSI "1;%dm%s" CLEAR " algo " WHITE_BOLD("%s"),
|
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("POOL #%-7zu") CSI "1;%dm%s" CLEAR " %s " WHITE_BOLD("%s"),
|
||||||
i,
|
i,
|
||||||
(pool.isEnabled() ? (pool.isTLS() ? 32 : 36) : 31),
|
(pool.isEnabled() ? (pool.isTLS() ? 32 : 36) : 31),
|
||||||
pool.url().data(),
|
pool.url().data(),
|
||||||
pool.algorithm().isValid() ? pool.algorithm().shortName() : "auto"
|
pool.coin().isValid() ? "coin" : "algo",
|
||||||
|
pool.coin().isValid() ? pool.coin().name() : (pool.algorithm().isValid() ? pool.algorithm().shortName() : "auto")
|
||||||
);
|
);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
|
|
52
src/base/tools/Object.h
Normal file
52
src/base/tools/Object.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_OBJECT_H
|
||||||
|
#define XMRIG_OBJECT_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
#define XMRIG_DISABLE_COPY_MOVE(X) \
|
||||||
|
X(const X &other) = delete; \
|
||||||
|
X(X &&other) = delete; \
|
||||||
|
X &operator=(const X &other) = delete; \
|
||||||
|
X &operator=(X &&other) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
#define XMRIG_DISABLE_COPY_MOVE_DEFAULT(X) \
|
||||||
|
X() = delete; \
|
||||||
|
X(const X &other) = delete; \
|
||||||
|
X(X &&other) = delete; \
|
||||||
|
X &operator=(const X &other) = delete; \
|
||||||
|
X &operator=(X &&other) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
#endif /* XMRIG_OBJECT_H */
|
122
src/cc/CCCServerConfig.cpp
Normal file
122
src/cc/CCCServerConfig.cpp
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
/* XMRigCC
|
||||||
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rapidjson/document.h>
|
||||||
|
|
||||||
|
#include "base/io/json/JsonChain.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "CCServerConfig.h"
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
T getParseResult(const cxxopts::ParseResult &parseResult, const std::string &propery, T defaultValue)
|
||||||
|
{
|
||||||
|
if (parseResult.count(propery) > 0)
|
||||||
|
{
|
||||||
|
return parseResult[propery].as<T>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CCServerConfig::CCServerConfig(cxxopts::ParseResult& parseResult)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
xmrig::JsonChain chain;
|
||||||
|
|
||||||
|
auto m_configFile = getParseResult(parseResult, "config", std::string());
|
||||||
|
if (!m_configFile.empty())
|
||||||
|
{
|
||||||
|
chain.addFile(m_configFile.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chain.addFile("config_cc.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
read(chain);
|
||||||
|
|
||||||
|
m_bindIp = getParseResult(parseResult, "bind", m_bindIp);
|
||||||
|
m_port = getParseResult(parseResult, "port", m_port);
|
||||||
|
m_adminUser = getParseResult(parseResult, "user", m_adminUser);
|
||||||
|
m_adminPass = getParseResult(parseResult, "pass", m_adminPass);
|
||||||
|
m_token = getParseResult(parseResult, "token", m_token);
|
||||||
|
m_useTLS = getParseResult(parseResult, "tls", m_useTLS);
|
||||||
|
m_keyFile = getParseResult(parseResult, "key-file", m_keyFile);
|
||||||
|
m_certFile = getParseResult(parseResult, "cert-file", m_certFile);
|
||||||
|
|
||||||
|
m_colors = !getParseResult(parseResult, "no-colors", !m_colors);
|
||||||
|
m_background = getParseResult(parseResult, "background", m_background);
|
||||||
|
m_syslog = getParseResult(parseResult, "syslog", m_syslog);
|
||||||
|
|
||||||
|
m_clientLogHistory = getParseResult(parseResult, "client-log-lines-history", m_clientLogHistory);
|
||||||
|
m_customDashboard = getParseResult(parseResult, "custom-dashboard", m_customDashboard);
|
||||||
|
m_clientConfigFolder = getParseResult(parseResult, "client-config-folder", m_clientConfigFolder);
|
||||||
|
m_logFile = getParseResult(parseResult, "log-file", m_logFile);
|
||||||
|
|
||||||
|
m_pushoverApiToken = getParseResult(parseResult, "pushover-api-token", m_pushoverApiToken);
|
||||||
|
m_pushoverUserKey = getParseResult(parseResult, "pushover-user-key", m_pushoverUserKey);
|
||||||
|
m_telegramBotToken = getParseResult(parseResult, "telegram-bot-token", m_telegramBotToken);
|
||||||
|
m_telegramChatId = getParseResult(parseResult, "telegram-chat-id", m_telegramChatId);
|
||||||
|
m_pushOfflineMiners = getParseResult(parseResult, "push-miner-offline-info", m_pushOfflineMiners);
|
||||||
|
m_pushZeroHashrateMiners = getParseResult(parseResult, "push-miner-zero-hash-info", m_pushZeroHashrateMiners);
|
||||||
|
m_pushPeriodicStatus = getParseResult(parseResult, "push-periodic-mining-status", m_pushPeriodicStatus);
|
||||||
|
}
|
||||||
|
catch (const cxxopts::OptionException& e)
|
||||||
|
{
|
||||||
|
LOG_WARN("Failed to parse params. Error: %s", e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCServerConfig::read(const xmrig::IJsonReader& reader)
|
||||||
|
{
|
||||||
|
if (reader.isEmpty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_port = reader.getInt("port", m_port);
|
||||||
|
m_bindIp = reader.getString("bind-ip", m_bindIp.c_str());
|
||||||
|
m_adminUser = reader.getString("user", m_adminUser.c_str());
|
||||||
|
m_adminPass = reader.getString("pass", m_adminPass.c_str());
|
||||||
|
m_token = reader.getString("access-token", m_token.c_str());
|
||||||
|
m_useTLS = reader.getBool("use-tls", m_useTLS);
|
||||||
|
m_keyFile = reader.getString("key-file", m_keyFile.c_str());
|
||||||
|
m_certFile = reader.getString("cert-file", m_certFile.c_str());
|
||||||
|
|
||||||
|
m_colors = reader.getBool("colors", m_colors);
|
||||||
|
m_background = reader.getBool("background", m_background);
|
||||||
|
m_syslog = reader.getBool("syslog", m_syslog);
|
||||||
|
|
||||||
|
m_clientLogHistory = reader.getInt("client-log-lines-history", m_clientLogHistory);
|
||||||
|
m_customDashboard = reader.getString("custom-dashboard", m_customDashboard.c_str());
|
||||||
|
m_clientConfigFolder = reader.getString("client-config-folder", m_clientConfigFolder.c_str());
|
||||||
|
m_logFile = reader.getString("log-file", m_logFile.c_str());
|
||||||
|
|
||||||
|
m_pushoverApiToken = reader.getString("pushover-api-token", m_pushoverApiToken.c_str());
|
||||||
|
m_pushoverUserKey = reader.getString("pushover-user-key", m_pushoverUserKey.c_str());
|
||||||
|
m_telegramBotToken = reader.getString("telegram-bot-token", m_telegramBotToken.c_str());
|
||||||
|
m_telegramChatId = reader.getString("telegram-chat-id", m_telegramChatId.c_str());
|
||||||
|
m_pushOfflineMiners = reader.getBool("push-miner-offline-info", m_pushOfflineMiners);
|
||||||
|
m_pushZeroHashrateMiners = reader.getBool("push-miner-zero-hash-info", m_pushZeroHashrateMiners);
|
||||||
|
m_pushPeriodicStatus = reader.getBool("push-periodic-mining-status", m_pushPeriodicStatus);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -16,104 +16,106 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "CCServer.h"
|
#include "base/io/log/backends/ConsoleLog.h"
|
||||||
#include "Service.h"
|
#include "base/io/log/backends/FileLog.h"
|
||||||
|
#include "base/io/json/JsonChain.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SYSLOG_H
|
||||||
|
#include "base/io/log/backends/SysLog.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "CCServerConfig.h"
|
||||||
#include "Httpd.h"
|
#include "Httpd.h"
|
||||||
#include "Console.h"
|
#include "CCServer.h"
|
||||||
#include "log/ConsoleLog.h"
|
|
||||||
#include "log/FileLog.h"
|
|
||||||
#include "log/Log.h"
|
|
||||||
#include "Options.h"
|
|
||||||
#include "Summary.h"
|
#include "Summary.h"
|
||||||
|
|
||||||
#if _WIN32
|
CCServer::CCServer(cxxopts::ParseResult& parseResult)
|
||||||
#include <winsock2.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#else
|
|
||||||
# include "unistd.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG_H
|
|
||||||
# include "log/SysLog.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CCServer *CCServer::m_self = nullptr;
|
|
||||||
|
|
||||||
|
|
||||||
CCServer::CCServer(int argc, char** argv) :
|
|
||||||
m_console(nullptr),
|
|
||||||
m_httpd(nullptr),
|
|
||||||
m_options(nullptr)
|
|
||||||
{
|
{
|
||||||
m_self = this;
|
m_config = std::make_shared<CCServerConfig>(parseResult);
|
||||||
|
|
||||||
Log::init();
|
if (!m_config->background())
|
||||||
|
{
|
||||||
m_options = Options::parse(argc, argv);
|
xmrig::Log::colors = m_config->colors();
|
||||||
if (!m_options) {
|
xmrig::Log::add(new xmrig::ConsoleLog());
|
||||||
return;
|
m_console = std::make_shared<xmrig::Console>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_options->background()) {
|
if (!m_config->logFile().empty())
|
||||||
Log::add(new ConsoleLog(m_options->colors()));
|
{
|
||||||
m_console = new Console(this);
|
xmrig::Log::add(new xmrig::FileLog(m_config->logFile().c_str()));
|
||||||
}
|
|
||||||
|
|
||||||
if (m_options->logFile()) {
|
|
||||||
Log::add(new FileLog(m_options->logFile()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG_H
|
#ifdef HAVE_SYSLOG_H
|
||||||
if (m_options->syslog()) {
|
if (m_config->syslog())
|
||||||
Log::add(new SysLog());
|
{
|
||||||
|
xmrig::Log::add(new xmrig::SysLog());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uv_signal_init(uv_default_loop(), &m_signal);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CCServer::~CCServer()
|
CCServer::~CCServer()
|
||||||
{
|
{
|
||||||
uv_tty_reset_mode();
|
m_signals.reset();
|
||||||
|
m_console.reset();
|
||||||
delete m_httpd;
|
m_httpd.reset();
|
||||||
|
m_config.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
int CCServer::start()
|
int CCServer::start()
|
||||||
{
|
{
|
||||||
if (!m_options) {
|
if (!m_config->isValid())
|
||||||
|
{
|
||||||
|
LOG_ERR("Invalid config provided");
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uv_signal_start(&m_signal, CCServer::onSignal, SIGHUP);
|
m_signals = std::make_shared<xmrig::Signals>(this);
|
||||||
uv_signal_start(&m_signal, CCServer::onSignal, SIGTERM);
|
|
||||||
uv_signal_start(&m_signal, CCServer::onSignal, SIGINT);
|
|
||||||
|
|
||||||
if (m_options->background()) {
|
if (m_config->background())
|
||||||
|
{
|
||||||
moveToBackground();
|
moveToBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
Summary::print();
|
Summary::print(m_config);
|
||||||
|
|
||||||
Service::start();
|
startUvLoopThread();
|
||||||
|
|
||||||
m_httpd = new Httpd(m_options);
|
m_httpd = std::make_shared<Httpd>(m_config);
|
||||||
if (!m_httpd->start()) {
|
int retVal = m_httpd->start();
|
||||||
return EINVAL;
|
if (retVal > 0)
|
||||||
|
{
|
||||||
|
LOG_ERR("Failed to bind %sServer to %s:%d", m_config->useTLS() ? "TLS " : "", m_config->bindIp().c_str(),
|
||||||
|
m_config->port());
|
||||||
|
}
|
||||||
|
else if (retVal < 0)
|
||||||
|
{
|
||||||
|
LOG_ERR("Invalid config. %s", m_config->useTLS() ? "Check bindIp, port and the certificate/key file"
|
||||||
|
: "Check bindIp and port");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_INFO("Server stopped. Exit.");
|
||||||
}
|
}
|
||||||
|
|
||||||
const int r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCServer::startUvLoopThread() const
|
||||||
|
{
|
||||||
|
std::thread([]()
|
||||||
|
{
|
||||||
|
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
|
||||||
uv_loop_close(uv_default_loop());
|
uv_loop_close(uv_default_loop());
|
||||||
|
}).detach();
|
||||||
Options::release();
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCServer::onConsoleCommand(char command)
|
void CCServer::onConsoleCommand(char command)
|
||||||
{
|
{
|
||||||
switch (command) {
|
switch (command)
|
||||||
|
{
|
||||||
case 'q':
|
case 'q':
|
||||||
case 'Q':
|
case 'Q':
|
||||||
stop();
|
stop();
|
||||||
|
@ -131,10 +133,12 @@ void CCServer::onConsoleCommand(char command)
|
||||||
|
|
||||||
void CCServer::stop()
|
void CCServer::stop()
|
||||||
{
|
{
|
||||||
|
m_httpd->stop();
|
||||||
|
|
||||||
uv_stop(uv_default_loop());
|
uv_stop(uv_default_loop());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCServer::onSignal(uv_signal_t* handle, int signum)
|
void CCServer::onSignal(int signum)
|
||||||
{
|
{
|
||||||
switch (signum)
|
switch (signum)
|
||||||
{
|
{
|
||||||
|
@ -154,8 +158,7 @@ void CCServer::onSignal(uv_signal_t* handle, int signum)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uv_signal_stop(handle);
|
stop();
|
||||||
m_self->stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCServer::moveToBackground()
|
void CCServer::moveToBackground()
|
||||||
|
@ -171,22 +174,26 @@ void CCServer::moveToBackground()
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int i = fork();
|
int i = fork();
|
||||||
if (i < 0) {
|
if (i < 0)
|
||||||
|
{
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i > 0) {
|
if (i > 0)
|
||||||
|
{
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
i = setsid();
|
i = setsid();
|
||||||
|
|
||||||
if (i < 0) {
|
if (i < 0)
|
||||||
|
{
|
||||||
LOG_ERR("setsid() failed (errno = %d)", errno);
|
LOG_ERR("setsid() failed (errno = %d)", errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
i = chdir("/");
|
i = chdir("/");
|
||||||
if (i < 0) {
|
if (i < 0)
|
||||||
|
{
|
||||||
LOG_ERR("chdir() failed (errno = %d)", errno);
|
LOG_ERR("chdir() failed (errno = %d)", errno);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,40 +18,39 @@
|
||||||
#ifndef __CC_SERVER_H__
|
#ifndef __CC_SERVER_H__
|
||||||
#define __CC_SERVER_H__
|
#define __CC_SERVER_H__
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <cxxopts/cxxopts.hpp>
|
||||||
|
|
||||||
#include <uv.h>
|
#include "base/kernel/interfaces/IConsoleListener.h"
|
||||||
|
#include "base/kernel/interfaces/ISignalListener.h"
|
||||||
|
#include "base/kernel/Signals.h"
|
||||||
|
#include "base/io/Console.h"
|
||||||
|
|
||||||
|
#include "CCServerConfig.h"
|
||||||
|
#include "Httpd.h"
|
||||||
|
|
||||||
#include "interfaces/IConsoleListener.h"
|
class CCServer : public xmrig::IConsoleListener, public xmrig::ISignalListener
|
||||||
|
|
||||||
|
|
||||||
class Console;
|
|
||||||
class Httpd;
|
|
||||||
class Options;
|
|
||||||
|
|
||||||
class CCServer : public IConsoleListener
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CCServer(int argc, char **argv);
|
CCServer(cxxopts::ParseResult& parseResult);
|
||||||
~CCServer();
|
~CCServer();
|
||||||
|
|
||||||
int start();
|
int start();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onConsoleCommand(char command) override;
|
void onConsoleCommand(char command) override;
|
||||||
|
void onSignal(int signum) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void stop();
|
void stop();
|
||||||
void moveToBackground();
|
void moveToBackground();
|
||||||
|
|
||||||
static void onSignal(uv_signal_t* handle, int signum);
|
std::shared_ptr<xmrig::Console> m_console;
|
||||||
|
std::shared_ptr<xmrig::Signals> m_signals;
|
||||||
|
std::shared_ptr<CCServerConfig> m_config;
|
||||||
|
std::shared_ptr<Httpd> m_httpd;
|
||||||
|
|
||||||
static CCServer* m_self;
|
void startUvLoopThread() const;
|
||||||
|
|
||||||
Console* m_console;
|
|
||||||
Httpd* m_httpd;
|
|
||||||
Options* m_options;
|
|
||||||
uv_signal_t m_signal;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
95
src/cc/CCServerConfig.h
Normal file
95
src/cc/CCServerConfig.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/* XMRigCC
|
||||||
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_CC_SERVER_CONFIG_H
|
||||||
|
#define XMRIG_CC_SERVER_CONFIG_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <rapidjson/fwd.h>
|
||||||
|
#include <cxxopts/cxxopts.hpp>
|
||||||
|
|
||||||
|
#include "base/kernel/interfaces/IJsonReader.h"
|
||||||
|
|
||||||
|
class CCServerConfig
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit CCServerConfig(cxxopts::ParseResult& parseResult);
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool read(const xmrig::IJsonReader &reader);
|
||||||
|
|
||||||
|
inline bool colors() const { return m_colors; }
|
||||||
|
inline bool background() const { return m_background; }
|
||||||
|
inline bool syslog() const { return m_syslog; }
|
||||||
|
inline bool useTLS() const { return m_useTLS; }
|
||||||
|
inline bool usePushover() const { return !m_pushoverUserKey.empty() && !m_pushoverApiToken.empty(); }
|
||||||
|
inline bool useTelegram() const { return !m_telegramBotToken.empty() && !m_telegramChatId.empty(); }
|
||||||
|
inline bool pushOfflineMiners() const { return m_pushOfflineMiners; }
|
||||||
|
inline bool pushZeroHashrateMiners() const { return m_pushZeroHashrateMiners; }
|
||||||
|
inline bool pushPeriodicStatus() const { return m_pushPeriodicStatus; }
|
||||||
|
|
||||||
|
inline std::string bindIp() const { return m_bindIp; }
|
||||||
|
inline std::string adminUser() const { return m_adminUser; }
|
||||||
|
inline std::string adminPass() const { return m_adminPass; }
|
||||||
|
inline std::string token() const { return m_token; }
|
||||||
|
inline std::string customDashboard() const { return m_customDashboard; }
|
||||||
|
inline std::string clientConfigFolder() const { return m_clientConfigFolder; }
|
||||||
|
inline std::string logFile() const { return m_logFile; }
|
||||||
|
inline std::string keyFile() const { return m_keyFile; }
|
||||||
|
inline std::string certFile() const { return m_certFile; }
|
||||||
|
inline std::string pushoverApiToken() const { return m_pushoverApiToken; }
|
||||||
|
inline std::string pushoverUserKey() const { return m_pushoverUserKey; }
|
||||||
|
inline std::string telegramBotToken() const { return m_telegramBotToken; }
|
||||||
|
inline std::string telegramChatId() const { return m_telegramChatId; }
|
||||||
|
|
||||||
|
inline int port() const { return m_port; }
|
||||||
|
inline int clientLogHistory() const { return m_clientLogHistory; }
|
||||||
|
|
||||||
|
inline bool isValid() const { return !m_bindIp.empty() &&
|
||||||
|
m_port > 0 && m_port < 65535; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_colors = true;
|
||||||
|
bool m_background = false;
|
||||||
|
bool m_syslog = false;
|
||||||
|
bool m_useTLS = false;
|
||||||
|
bool m_pushOfflineMiners = true;
|
||||||
|
bool m_pushZeroHashrateMiners = true;
|
||||||
|
bool m_pushPeriodicStatus = true;
|
||||||
|
|
||||||
|
int m_clientLogHistory = 100;
|
||||||
|
int m_port = 3344;
|
||||||
|
|
||||||
|
std::string m_bindIp = "0.0.0.0";
|
||||||
|
std::string m_adminUser = "";
|
||||||
|
std::string m_adminPass = "";
|
||||||
|
std::string m_token = "";
|
||||||
|
|
||||||
|
std::string m_customDashboard = "index.html";
|
||||||
|
std::string m_clientConfigFolder;
|
||||||
|
std::string m_logFile;
|
||||||
|
|
||||||
|
std::string m_keyFile = "server.key";
|
||||||
|
std::string m_certFile = "server.pem";
|
||||||
|
|
||||||
|
std::string m_pushoverApiToken;
|
||||||
|
std::string m_pushoverUserKey;
|
||||||
|
std::string m_telegramBotToken;
|
||||||
|
std::string m_telegramChatId;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XMRIG_CC_SERVER_CONFIG_H */
|
362
src/cc/Httpd.cpp
362
src/cc/Httpd.cpp
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -18,272 +18,198 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <microhttpd.h>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <3rdparty/cpp-httplib/httplib.h>
|
||||||
|
#include <3rdparty/base64/base64.h>
|
||||||
|
|
||||||
#include "version.h"
|
#include "base/io/log/Log.h"
|
||||||
|
|
||||||
|
#include "CCServerConfig.h"
|
||||||
#include "Service.h"
|
#include "Service.h"
|
||||||
#include "Httpd.h"
|
#include "Httpd.h"
|
||||||
#include "log/Log.h"
|
#include "version.h"
|
||||||
|
|
||||||
Httpd::Httpd(const Options *options)
|
namespace
|
||||||
: m_options(options)
|
{
|
||||||
, m_daemon(nullptr)
|
void addResponseHeader(httplib::Response& res)
|
||||||
|
{
|
||||||
|
res.set_header("Access-Control-Allow-Origin", "*");
|
||||||
|
res.set_header("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
||||||
|
res.set_header("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
||||||
|
res.set_header("WWW-Authenticate", "Basic");
|
||||||
|
res.set_header("WWW-Authenticate", "Bearer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Httpd::Httpd(const std::shared_ptr<CCServerConfig>& config)
|
||||||
|
: m_config(config)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Httpd::start()
|
Httpd::~Httpd()
|
||||||
{
|
{
|
||||||
if (!m_options->ccPort()) {
|
stop();
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifndef XMRIG_NO_TLS
|
int Httpd::start()
|
||||||
if (m_options->ccUseTls()) {
|
{
|
||||||
|
m_service = std::make_shared<Service>(m_config);
|
||||||
|
m_service->start();
|
||||||
|
|
||||||
m_keyPem = readFile(m_options->ccKeyFile());
|
#ifdef XMRIG_FEATURE_TLS
|
||||||
m_certPem = readFile(m_options->ccCertFile());
|
if (m_config->useTLS())
|
||||||
|
{
|
||||||
if (m_keyPem.empty() || m_certPem.empty()) {
|
if (m_config->keyFile().empty() || m_config->certFile().empty())
|
||||||
|
{
|
||||||
LOG_ERR("HTTPS Daemon failed to start. Unable to load Key/Cert.");
|
LOG_ERR("HTTPS Daemon failed to start. Unable to load Key/Cert.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_daemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_SSL,
|
m_srv = std::make_shared<httplib::SSLServer>(m_config->certFile().c_str(), m_config->keyFile().c_str());
|
||||||
static_cast<uint16_t>(m_options->ccPort()), nullptr, nullptr, &Httpd::handler,
|
}
|
||||||
this, MHD_OPTION_CONNECTION_TIMEOUT, (unsigned int) 25,
|
else
|
||||||
MHD_OPTION_HTTPS_MEM_KEY, m_keyPem.c_str(),
|
{
|
||||||
MHD_OPTION_HTTPS_MEM_CERT, m_certPem.c_str(),
|
|
||||||
MHD_OPTION_END);
|
|
||||||
} else {
|
|
||||||
#endif
|
#endif
|
||||||
m_daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, static_cast<uint16_t>(m_options->ccPort()), nullptr,
|
m_srv = std::make_shared<httplib::Server>();
|
||||||
nullptr, &Httpd::handler,
|
#ifdef XMRIG_FEATURE_TLS
|
||||||
this, MHD_OPTION_CONNECTION_TIMEOUT, (unsigned int) 25, MHD_OPTION_END);
|
|
||||||
# ifndef XMRIG_NO_TLS
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!m_daemon) {
|
if (!m_srv->is_valid())
|
||||||
LOG_ERR("HTTP Daemon failed to start.");
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
LOG_INFO("%s Server started on Port: %d %s", APP_NAME, m_options->ccPort(), m_options->ccUseTls() ? "with TLS" : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Httpd::readFile(const std::string &fileName)
|
|
||||||
{
|
{
|
||||||
std::stringstream data;
|
return -1;
|
||||||
std::ifstream file(fileName);
|
|
||||||
if (file) {
|
|
||||||
data << file.rdbuf();
|
|
||||||
file.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return data.str();
|
xmrig::Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CSI "1;%dm%s:%d",
|
||||||
}
|
"LISTENING",
|
||||||
|
(m_config->useTLS() ? 32 : 36),
|
||||||
|
m_config->bindIp().c_str(),
|
||||||
|
m_config->port()
|
||||||
|
);
|
||||||
|
|
||||||
unsigned Httpd::tokenAuth(struct MHD_Connection* connection, const std::string& clientIp)
|
m_srv->Get(R"(/.*)", [this](const httplib::Request& req, httplib::Response& res)
|
||||||
{
|
{
|
||||||
if (!m_options->ccToken()) {
|
int status;
|
||||||
LOG_WARN("[%s] 200 OK - WARNING AccessToken not set!", clientIp.c_str());
|
|
||||||
return MHD_HTTP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* header = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_AUTHORIZATION);
|
if (req.path.find("/client/") == 0)
|
||||||
if (m_options->ccToken() && !header) {
|
|
||||||
LOG_WARN("[%s] 401 UNAUTHORIZED", clientIp.c_str());
|
|
||||||
return MHD_HTTP_UNAUTHORIZED;
|
|
||||||
}
|
|
||||||
|
|
||||||
const size_t size = strlen(header);
|
|
||||||
if (size < 8 || strlen(m_options->ccToken()) != size - 7 || memcmp("Bearer ", header, 7) != 0) {
|
|
||||||
LOG_ERR("[%s] 403 FORBIDDEN - AccessToken wrong!", clientIp.c_str());
|
|
||||||
return MHD_HTTP_FORBIDDEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
return strncmp(m_options->ccToken(), header + 7, strlen(m_options->ccToken())) == 0 ? MHD_HTTP_OK : MHD_HTTP_FORBIDDEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned Httpd::basicAuth(struct MHD_Connection* connection, const std::string& clientIp, std::string& resp)
|
|
||||||
{
|
{
|
||||||
unsigned result = MHD_HTTP_OK;
|
status = this->bearerAuth(req, res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = this->basicAuth(req, res);
|
||||||
|
}
|
||||||
|
|
||||||
if (!m_options->ccAdminUser() || !m_options->ccAdminPass()) {
|
if (status == HTTP_OK)
|
||||||
resp = std::string("<html><body\\>"
|
{
|
||||||
|
status = this->m_service->handleGET(req, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status = status;
|
||||||
|
|
||||||
|
addResponseHeader(res);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_srv->Post(R"(/.*)", [this](const httplib::Request& req, httplib::Response& res)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
if (req.path.find("/client/") == 0)
|
||||||
|
{
|
||||||
|
status = this->bearerAuth(req, res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = this->basicAuth(req, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == HTTP_OK)
|
||||||
|
{
|
||||||
|
status = this->m_service->handlePOST(req, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status = status;
|
||||||
|
|
||||||
|
addResponseHeader(res);
|
||||||
|
});
|
||||||
|
|
||||||
|
return m_srv->listen(m_config->bindIp().c_str(), m_config->port()) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Httpd::stop()
|
||||||
|
{
|
||||||
|
if (m_srv->is_running())
|
||||||
|
{
|
||||||
|
m_srv->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Httpd::basicAuth(const httplib::Request& req, httplib::Response& res)
|
||||||
|
{
|
||||||
|
int result = HTTP_UNAUTHORIZED;
|
||||||
|
|
||||||
|
if (m_config->adminUser().empty() || m_config->adminPass().empty())
|
||||||
|
{
|
||||||
|
res.set_content(std::string("<html><body\\>"
|
||||||
"Please configure admin user and pass to view this Page."
|
"Please configure admin user and pass to view this Page."
|
||||||
"</body><html\\>");
|
"</body><html\\>"), CONTENT_TYPE_HTML);
|
||||||
|
|
||||||
LOG_ERR("[%s] 403 FORBIDDEN - Admin user/password not set!", clientIp.c_str());
|
LOG_ERR("[%s] 403 FORBIDDEN - Admin user/password not set!", req.remoteAddr.c_str());
|
||||||
result = MHD_HTTP_FORBIDDEN;
|
result = HTTP_FORBIDDEN;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
const char* header = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_AUTHORIZATION);
|
{
|
||||||
if (header) {
|
auto authHeader = req.get_header_value("Authorization");
|
||||||
char* user = nullptr;
|
auto credentials = std::string("Basic ") + Base64::Encode(m_config->adminUser() + std::string(":") + m_config->adminPass());
|
||||||
char* pass = nullptr;
|
|
||||||
|
|
||||||
user = MHD_basic_auth_get_username_password(connection, &pass);
|
if (!authHeader.empty() && credentials == authHeader)
|
||||||
if (user == nullptr || strcmp(user, m_options->ccAdminUser()) != 0 ||
|
{
|
||||||
pass == nullptr || strcmp(pass, m_options->ccAdminPass()) != 0) {
|
result = HTTP_OK;
|
||||||
|
}
|
||||||
LOG_ERR("[%s] 403 FORBIDDEN - Admin user/password wrong!", clientIp.c_str());
|
else if (authHeader.empty())
|
||||||
result = MHD_HTTP_UNAUTHORIZED;
|
{
|
||||||
|
LOG_WARN("[%s] 401 UNAUTHORIZED", req.remoteAddr.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERR("[%s] 403 FORBIDDEN - Admin user/password wrong!", req.remoteAddr.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user) {
|
res.status = result;
|
||||||
free(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pass) {
|
|
||||||
free(pass);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
LOG_WARN("[%s] 401 UNAUTHORIZED", clientIp.c_str());
|
|
||||||
result = MHD_HTTP_UNAUTHORIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Httpd::sendResponse(MHD_Connection* connection, unsigned status, MHD_Response* rsp, const char* contentType)
|
int Httpd::bearerAuth(const httplib::Request& req, httplib::Response& res)
|
||||||
{
|
{
|
||||||
if (!rsp) {
|
int result = HTTP_UNAUTHORIZED;
|
||||||
rsp = MHD_create_response_from_buffer(0, nullptr, MHD_RESPMEM_MUST_COPY);
|
|
||||||
}
|
|
||||||
|
|
||||||
MHD_add_response_header(rsp, "Content-Type", contentType);
|
if (m_config->token().empty())
|
||||||
MHD_add_response_header(rsp, "Access-Control-Allow-Origin", "*");
|
|
||||||
MHD_add_response_header(rsp, "Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
|
||||||
MHD_add_response_header(rsp, "Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
||||||
MHD_add_response_header(rsp, "WWW-Authenticate", "Basic");
|
|
||||||
MHD_add_response_header(rsp, "WWW-Authenticate", "Bearer");
|
|
||||||
|
|
||||||
int ret = MHD_queue_response(connection, status, rsp);
|
|
||||||
|
|
||||||
MHD_destroy_response(rsp);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int Httpd::handler(void* httpd, MHD_Connection* connection, const char* url, const char* method,
|
|
||||||
const char* version, const char* upload_data, size_t* upload_data_size, void** con_cls)
|
|
||||||
{
|
{
|
||||||
std::string clientIp;
|
LOG_WARN("[%s] 200 OK - WARNING AccessToken not set!", req.remoteAddr.c_str());
|
||||||
const MHD_ConnectionInfo *info = MHD_get_connection_info(connection, MHD_CONNECTION_INFO_CLIENT_ADDRESS);
|
result = HTTP_OK;
|
||||||
if (info) {
|
|
||||||
char clientHost[NI_MAXHOST];
|
|
||||||
int ec = getnameinfo(info->client_addr, sizeof(*info->client_addr), clientHost, sizeof(clientHost),
|
|
||||||
0, 0, NI_NUMERICHOST|NI_NUMERICSERV);
|
|
||||||
|
|
||||||
if (ec == 0) {
|
|
||||||
clientIp = std::string(clientHost);
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
|
||||||
if (strcmp(method, MHD_HTTP_METHOD_OPTIONS) == 0) {
|
|
||||||
LOG_INFO("[%s] OPTIONS Requested", clientIp.c_str());
|
|
||||||
return sendResponse(connection, MHD_HTTP_OK, nullptr, CONTENT_TYPE_HTML);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(method, MHD_HTTP_METHOD_GET) != 0 && strcmp(method, MHD_HTTP_METHOD_POST) != 0) {
|
|
||||||
LOG_ERR("[%s] 405 METHOD NOT ALLOWED (%s)", clientIp.c_str(), method);
|
|
||||||
return sendResponse(connection, MHD_HTTP_METHOD_NOT_ALLOWED, nullptr, CONTENT_TYPE_HTML);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strstr(url, "/client/")) {
|
|
||||||
unsigned status = static_cast<Httpd*>(httpd)->tokenAuth(connection, clientIp);
|
|
||||||
if (status != MHD_HTTP_OK) {
|
|
||||||
return sendResponse(connection, status, nullptr, CONTENT_TYPE_JSON);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
std::string resp;
|
|
||||||
unsigned status = static_cast<Httpd*>(httpd)->basicAuth(connection, clientIp, resp);
|
|
||||||
if (status != MHD_HTTP_OK) {
|
|
||||||
MHD_Response* rsp = nullptr;
|
|
||||||
if (!resp.empty()) {
|
|
||||||
rsp = MHD_create_response_from_buffer(resp.length(), (void*)resp.c_str(), MHD_RESPMEM_MUST_COPY);
|
|
||||||
}
|
|
||||||
return sendResponse(connection, status, rsp, CONTENT_TYPE_HTML);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(method, MHD_HTTP_METHOD_GET) == 0) {
|
|
||||||
return handleGET(static_cast<Httpd*>(httpd), connection, clientIp, url);
|
|
||||||
} else {
|
|
||||||
return handlePOST(static_cast<Httpd*>(httpd), connection, clientIp, url, upload_data, upload_data_size, con_cls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int Httpd::handleGET(const Httpd* httpd, struct MHD_Connection* connection, const std::string& clientIp, const char* urlPtr)
|
|
||||||
{
|
{
|
||||||
std::string resp;
|
auto authHeader = req.get_header_value("Authorization");
|
||||||
std::string url(urlPtr);
|
auto credentials = std::string("Bearer ") + m_config->token();
|
||||||
std::string clientId;
|
|
||||||
|
|
||||||
const char* clientIdPtr = MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "clientId");
|
if (!authHeader.empty() && credentials == authHeader)
|
||||||
if (clientIdPtr)
|
|
||||||
{
|
{
|
||||||
clientId = std::string(clientIdPtr);
|
result = HTTP_OK;
|
||||||
}
|
}
|
||||||
|
else if (authHeader.empty())
|
||||||
unsigned status = Service::handleGET(httpd->m_options, url, clientIp, clientId, resp);
|
|
||||||
|
|
||||||
MHD_Response* rsp = nullptr;
|
|
||||||
if (!resp.empty()) {
|
|
||||||
rsp = MHD_create_response_from_buffer(resp.length(), (void*) resp.c_str(), MHD_RESPMEM_MUST_COPY);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* contentType;
|
|
||||||
if (url == "/") {
|
|
||||||
contentType = const_cast<char*>(CONTENT_TYPE_HTML);
|
|
||||||
} else {
|
|
||||||
contentType = const_cast<char*>(CONTENT_TYPE_JSON);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sendResponse(connection, status, rsp, contentType);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Httpd::handlePOST(const Httpd* httpd, struct MHD_Connection* connection, const std::string& clientIp, const char* urlPtr, const char* upload_data,
|
|
||||||
size_t* upload_data_size, void** con_cls)
|
|
||||||
{
|
{
|
||||||
auto* cc = (ConnectionContext*)* con_cls;
|
LOG_WARN("[%s] 401 UNAUTHORIZED", req.remoteAddr.c_str());
|
||||||
if (cc == nullptr) {
|
|
||||||
cc = new ConnectionContext();
|
|
||||||
*con_cls = (void*) cc;
|
|
||||||
} else {
|
|
||||||
if (*upload_data_size != 0) {
|
|
||||||
cc->data << std::string(upload_data, *upload_data_size);
|
|
||||||
|
|
||||||
*upload_data_size = 0;
|
|
||||||
} else {
|
|
||||||
std::string resp;
|
|
||||||
std::string url(urlPtr);
|
|
||||||
std::string clientId;
|
|
||||||
|
|
||||||
const char* clientIdPtr = MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "clientId");
|
|
||||||
if (clientIdPtr) {
|
|
||||||
clientId = std::string(clientIdPtr);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
unsigned status = Service::handlePOST(httpd->m_options, url, clientIp, clientId, cc->data.str(), resp);
|
{
|
||||||
|
LOG_ERR("[%s] 403 FORBIDDEN - AccessToken wrong!", req.remoteAddr.c_str());
|
||||||
MHD_Response* rsp = nullptr;
|
result = HTTP_FORBIDDEN;
|
||||||
if (!resp.empty()) {
|
|
||||||
rsp = MHD_create_response_from_buffer(resp.length(), (void*) resp.c_str(), MHD_RESPMEM_MUST_COPY);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete cc;
|
|
||||||
*con_cls = nullptr;
|
|
||||||
|
|
||||||
return sendResponse(connection, status, rsp, CONTENT_TYPE_JSON);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MHD_YES;
|
res.status = result;
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -18,46 +18,32 @@
|
||||||
#ifndef __HTTPD_H__
|
#ifndef __HTTPD_H__
|
||||||
#define __HTTPD_H__
|
#define __HTTPD_H__
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <uv.h>
|
|
||||||
|
|
||||||
#include "Options.h"
|
#include "3rdparty/cpp-httplib/httplib.h"
|
||||||
|
|
||||||
|
#include "CCServerConfig.h"
|
||||||
struct MHD_Connection;
|
#include "Service.h"
|
||||||
struct MHD_Daemon;
|
|
||||||
struct MHD_Response;
|
|
||||||
|
|
||||||
class Httpd
|
class Httpd
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Httpd(const Options *options);
|
explicit Httpd(const std::shared_ptr<CCServerConfig>& config);
|
||||||
bool start();
|
~Httpd();
|
||||||
|
|
||||||
|
public:
|
||||||
|
int start();
|
||||||
|
void stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
int basicAuth(const httplib::Request& req, httplib::Response& res);
|
||||||
|
int bearerAuth(const httplib::Request& req, httplib::Response& res);
|
||||||
|
|
||||||
typedef struct PostContext
|
const std::shared_ptr<CCServerConfig> m_config;
|
||||||
{
|
std::shared_ptr<Service> m_service;
|
||||||
std::stringstream data;
|
std::shared_ptr<httplib::Server> m_srv;
|
||||||
} ConnectionContext;
|
|
||||||
|
|
||||||
static int sendResponse(MHD_Connection* connection, unsigned status, MHD_Response* rsp, const char* contentType);
|
|
||||||
|
|
||||||
unsigned basicAuth(MHD_Connection* connection, const std::string& clientIp, std::string &resp);
|
|
||||||
unsigned tokenAuth(MHD_Connection* connection, const std::string& clientIp);
|
|
||||||
|
|
||||||
static int handler(void* httpd, MHD_Connection* connection, const char* url, const char* method, const char* version, const char* upload_data, size_t* upload_data_size, void**con_cls);
|
|
||||||
static int handleGET(const Httpd* httpd, MHD_Connection* connection, const std::string& clientIp, const char* url);
|
|
||||||
static int handlePOST(const Httpd* httpd, MHD_Connection* connection, const std::string& clientIp, const char* url, const char* upload_data, size_t* upload_data_size, void** con_cls);
|
|
||||||
|
|
||||||
static std::string readFile(const std::string &fileName);
|
|
||||||
|
|
||||||
const Options* m_options;
|
|
||||||
MHD_Daemon* m_daemon;
|
|
||||||
|
|
||||||
std::string m_keyPem;
|
|
||||||
std::string m_certPem;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __HTTPD_H__ */
|
#endif /* __HTTPD_H__ */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -15,6 +15,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -23,10 +24,10 @@
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include "win_dirent.h"
|
#include "win_dirent.h"
|
||||||
|
#else
|
||||||
|
#include <dirent.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "log/Log.h"
|
|
||||||
#include <3rdparty/cpp-httplib/httplib.h>
|
|
||||||
#include <3rdparty/rapidjson/document.h>
|
#include <3rdparty/rapidjson/document.h>
|
||||||
#include <3rdparty/rapidjson/stringbuffer.h>
|
#include <3rdparty/rapidjson/stringbuffer.h>
|
||||||
#include <3rdparty/rapidjson/writer.h>
|
#include <3rdparty/rapidjson/writer.h>
|
||||||
|
@ -34,210 +35,204 @@
|
||||||
#include <3rdparty/rapidjson/filereadstream.h>
|
#include <3rdparty/rapidjson/filereadstream.h>
|
||||||
#include <3rdparty/rapidjson/error/en.h>
|
#include <3rdparty/rapidjson/error/en.h>
|
||||||
#include <3rdparty/rapidjson/prettywriter.h>
|
#include <3rdparty/rapidjson/prettywriter.h>
|
||||||
|
#include <3rdparty/cpp-httplib/httplib.h>
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "Service.h"
|
#include "Service.h"
|
||||||
|
|
||||||
uv_mutex_t Service::m_mutex;
|
Service::Service(const std::shared_ptr<CCServerConfig>& config)
|
||||||
uv_timer_t Service::m_timer;
|
: m_config(config)
|
||||||
|
{
|
||||||
|
|
||||||
std::map<std::string, ControlCommand> Service::m_clientCommand;
|
}
|
||||||
std::map<std::string, ClientStatus> Service::m_clientStatus;
|
|
||||||
std::map<std::string, std::list<std::string>> Service::m_clientLog;
|
|
||||||
|
|
||||||
std::list<std::string> Service::m_offlineNotified;
|
Service::~Service()
|
||||||
std::list<std::string> Service::m_zeroHashNotified;
|
{
|
||||||
|
stop();
|
||||||
uint64_t Service::m_currentServerTime = 0;
|
}
|
||||||
uint64_t Service::m_lastStatusUpdateTime = 0;
|
|
||||||
|
|
||||||
bool Service::start()
|
bool Service::start()
|
||||||
{
|
{
|
||||||
uv_mutex_init(&m_mutex);
|
#ifdef XMRIG_FEATURE_TLS
|
||||||
|
if (m_config->usePushover() || m_config->useTelegram())
|
||||||
#ifndef XMRIG_NO_TLS
|
|
||||||
if (Options::i()->ccUsePushover() || Options::i()->ccUseTelegram())
|
|
||||||
{
|
{
|
||||||
uv_timer_init(uv_default_loop(), &m_timer);
|
m_timer = std::make_shared<Timer>([&]()
|
||||||
uv_timer_start(&m_timer, Service::onPushTimer,
|
{
|
||||||
static_cast<uint64_t>(TIMER_INTERVAL),
|
auto time_point = std::chrono::system_clock::now();
|
||||||
static_cast<uint64_t>(TIMER_INTERVAL));
|
auto now = static_cast<uint64_t>(std::chrono::system_clock::to_time_t(time_point) * 1000);
|
||||||
|
|
||||||
|
if (m_config->pushOfflineMiners())
|
||||||
|
{
|
||||||
|
sendMinerOfflinePush(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_config->pushZeroHashrateMiners())
|
||||||
|
{
|
||||||
|
sendMinerZeroHashratePush(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_config->pushPeriodicStatus())
|
||||||
|
{
|
||||||
|
if (now > (m_lastStatusUpdateTime + STATUS_UPDATE_INTERVAL))
|
||||||
|
{
|
||||||
|
sendServerStatusPush(now);
|
||||||
|
m_lastStatusUpdateTime = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, TIMER_INTERVAL);
|
||||||
|
|
||||||
|
m_timer->start();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::release()
|
void Service::stop()
|
||||||
{
|
{
|
||||||
uv_mutex_lock(&m_mutex);
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
uv_timer_stop(&m_timer);
|
m_timer->stop();
|
||||||
|
|
||||||
m_clientCommand.clear();
|
m_clientCommand.clear();
|
||||||
m_clientStatus.clear();
|
m_clientStatus.clear();
|
||||||
m_clientLog.clear();
|
m_clientLog.clear();
|
||||||
|
|
||||||
uv_mutex_unlock(&m_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::handleGET(const Options* options, const std::string& url, const std::string& clientIp, const std::string& clientId, std::string& resp)
|
int Service::handleGET(const httplib::Request& req, httplib::Response& res)
|
||||||
{
|
{
|
||||||
uv_mutex_lock(&m_mutex);
|
int resultCode = HTTP_NOT_FOUND;
|
||||||
|
|
||||||
unsigned resultCode = MHD_HTTP_NOT_FOUND;
|
std::string clientId = req.get_param_value("clientId");
|
||||||
|
|
||||||
std::string params;
|
LOG_INFO("[%s] GET %s%s%s", req.remoteAddr.c_str(), req.path.c_str(), clientId.empty() ? "" : "/?clientId=", clientId.c_str());
|
||||||
|
|
||||||
|
if (req.path == "/")
|
||||||
|
{
|
||||||
|
resultCode = getAdminPage(res);
|
||||||
|
}
|
||||||
|
else if (req.path.rfind("/admin/getClientStatusList", 0) == 0)
|
||||||
|
{
|
||||||
|
resultCode = getClientStatusList(res);
|
||||||
|
}
|
||||||
|
else if (req.path.rfind("/admin/getClientConfigTemplates", 0) == 0)
|
||||||
|
{
|
||||||
|
resultCode = getClientConfigTemplates(res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (!clientId.empty())
|
if (!clientId.empty())
|
||||||
{
|
{
|
||||||
params += "?clientId=";
|
if (req.path.rfind("/client/getConfig", 0) == 0 || req.path.rfind("/admin/getClientConfig", 0) == 0)
|
||||||
params += clientId;
|
{
|
||||||
|
resultCode = getClientConfig(clientId, res);
|
||||||
}
|
}
|
||||||
|
else if (req.path.rfind("/admin/getClientCommand", 0) == 0)
|
||||||
LOG_INFO("[%s] GET '%s%s'", clientIp.c_str(), url.c_str(), params.c_str());
|
{
|
||||||
|
resultCode = getClientCommand(clientId, res);
|
||||||
if (url == "/") {
|
}
|
||||||
resultCode = getAdminPage(options, resp);
|
else if (req.path.rfind("/admin/getClientLog", 0) == 0)
|
||||||
} else if (url.rfind("/admin/getClientStatusList", 0) == 0) {
|
{
|
||||||
resultCode = getClientStatusList(resp);
|
resultCode = getClientLog(clientId, res);
|
||||||
} else if (url.rfind("/admin/getClientConfigTemplates", 0) == 0) {
|
}
|
||||||
resultCode = getClientConfigTemplates(options, resp);
|
else
|
||||||
} else {
|
{
|
||||||
if (!clientId.empty()) {
|
LOG_WARN("[%s] 404 NOT FOUND (%s)", req.remoteAddr.c_str(), req.path.c_str());
|
||||||
if (url.rfind("/client/getConfig", 0) == 0 || url.rfind("/admin/getClientConfig", 0) == 0) {
|
|
||||||
resultCode = getClientConfig(options, clientId, resp);
|
|
||||||
} else if (url.rfind("/admin/getClientCommand", 0) == 0) {
|
|
||||||
resultCode = getClientCommand(clientId, resp);
|
|
||||||
} else if (url.rfind("/admin/getClientLog", 0) == 0) {
|
|
||||||
resultCode = getClientLog(clientId, resp);
|
|
||||||
} else {
|
|
||||||
LOG_WARN("[%s] 404 NOT FOUND (%s)", clientIp.c_str(), url.c_str());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
resultCode = MHD_HTTP_BAD_REQUEST;
|
{
|
||||||
LOG_ERR("[%s] 400 BAD REQUEST - Request does not contain clientId (%s)", clientIp.c_str(), url.c_str());
|
resultCode = HTTP_BAD_REQUEST;
|
||||||
|
LOG_ERR("[%s] 400 BAD REQUEST - Request does not contain clientId (%s)",
|
||||||
|
req.remoteAddr.c_str(), req.path.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uv_mutex_unlock(&m_mutex);
|
|
||||||
|
|
||||||
return resultCode;
|
return resultCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::handlePOST(const Options* options, const std::string& url, const std::string& clientIp,
|
int Service::handlePOST(const httplib::Request& req, httplib::Response& res)
|
||||||
const std::string& clientId, const std::string& data, std::string& resp)
|
|
||||||
{
|
{
|
||||||
uv_mutex_lock(&m_mutex);
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
unsigned resultCode = MHD_HTTP_NOT_FOUND;
|
int resultCode = HTTP_NOT_FOUND;
|
||||||
|
|
||||||
|
std::string clientId = req.get_param_value("clientId");
|
||||||
|
|
||||||
|
LOG_INFO("[%s] POST %s%s%s", req.remoteAddr.c_str(), req.path.c_str(), clientId.empty() ? "" : "/?clientId=", clientId.c_str());
|
||||||
|
|
||||||
std::string params;
|
|
||||||
if (!clientId.empty())
|
if (!clientId.empty())
|
||||||
{
|
{
|
||||||
params += "?clientId=";
|
if (req.path.rfind("/client/setClientStatus", 0) == 0)
|
||||||
params += clientId;
|
{
|
||||||
|
resultCode = setClientStatus(req, clientId, res);
|
||||||
}
|
}
|
||||||
|
else if (req.path.rfind("/admin/setClientConfig", 0) == 0 || req.path.rfind("/client/setClientConfig", 0) == 0)
|
||||||
LOG_INFO("[%s] POST '%s%s', dataLen='%d'",
|
{
|
||||||
clientIp.c_str(), url.c_str(), params.c_str(), data.length());
|
resultCode = setClientConfig(req, clientId, res);
|
||||||
|
|
||||||
if (!clientId.empty()) {
|
|
||||||
if (url.rfind("/client/setClientStatus", 0) == 0) {
|
|
||||||
resultCode = setClientStatus(options, clientIp, clientId, data, resp);
|
|
||||||
} else if (url.rfind("/admin/setClientConfig", 0) == 0 || url.rfind("/client/setClientConfig", 0) == 0) {
|
|
||||||
resultCode = setClientConfig(options, clientId, data, resp);
|
|
||||||
} else if (url.rfind("/admin/setClientCommand", 0) == 0) {
|
|
||||||
resultCode = setClientCommand(clientId, data, resp);
|
|
||||||
} else if (url.rfind("/admin/deleteClientConfig", 0) == 0) {
|
|
||||||
resultCode = deleteClientConfig(options, clientId, resp);
|
|
||||||
} else {
|
|
||||||
LOG_WARN("[%s] 400 BAD REQUEST - Request does not contain clientId (%s)", clientIp.c_str(), url.c_str());
|
|
||||||
}
|
}
|
||||||
} else {
|
else if (req.path.rfind("/admin/setClientCommand", 0) == 0)
|
||||||
if (url.rfind("/admin/resetClientStatusList", 0) == 0) {
|
{
|
||||||
resultCode = resetClientStatusList(data, resp);
|
resultCode = setClientCommand(req, clientId, res);
|
||||||
} else {
|
}
|
||||||
LOG_WARN("[%s] 404 NOT FOUND (%s)", clientIp.c_str(), url.c_str());
|
else if (req.path.rfind("/admin/deleteClientConfig", 0) == 0)
|
||||||
|
{
|
||||||
|
resultCode = deleteClientConfig(clientId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resultCode = HTTP_BAD_REQUEST;
|
||||||
|
LOG_WARN("[%s] 400 BAD REQUEST - Request does not contain clientId (%s)", req.remoteAddr.c_str(), req.path.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (req.path.rfind("/admin/resetClientStatusList", 0) == 0)
|
||||||
|
{
|
||||||
|
resultCode = resetClientStatusList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_WARN("[%s] 404 NOT FOUND (%s)", req.remoteAddr.c_str(), req.path.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uv_mutex_unlock(&m_mutex);
|
|
||||||
|
|
||||||
return resultCode;
|
return resultCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::getClientConfig(const Options* options, const std::string& clientId, std::string& resp)
|
int Service::getAdminPage(httplib::Response& res)
|
||||||
{
|
{
|
||||||
unsigned resultCode = MHD_HTTP_INTERNAL_SERVER_ERROR;
|
|
||||||
|
|
||||||
std::string clientConfigFileName = getClientConfigFileName(options, clientId);
|
|
||||||
|
|
||||||
std::stringstream data;
|
std::stringstream data;
|
||||||
std::ifstream clientConfig(clientConfigFileName);
|
|
||||||
if (clientConfig) {
|
|
||||||
data << clientConfig.rdbuf();
|
|
||||||
clientConfig.close();
|
|
||||||
} else {
|
|
||||||
std::ifstream defaultConfig("default_miner_config.json");
|
|
||||||
if (defaultConfig) {
|
|
||||||
data << defaultConfig.rdbuf();
|
|
||||||
defaultConfig.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.tellp() > 0) {
|
std::ifstream customDashboard(m_config->customDashboard());
|
||||||
rapidjson::Document document;
|
if (customDashboard)
|
||||||
document.Parse(data.str().c_str());
|
|
||||||
|
|
||||||
if (!document.HasParseError()) {
|
|
||||||
rapidjson::StringBuffer buffer(0, 4096);
|
|
||||||
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
|
||||||
writer.SetMaxDecimalPlaces(10);
|
|
||||||
document.Accept(writer);
|
|
||||||
|
|
||||||
resp = buffer.GetString();
|
|
||||||
|
|
||||||
resultCode = MHD_HTTP_OK;
|
|
||||||
} else {
|
|
||||||
LOG_ERR("Not able to send client config. Client config %s is broken!", clientConfigFileName.c_str());
|
|
||||||
}
|
|
||||||
} else{
|
|
||||||
LOG_ERR("Not able to load a client config. Please check your configuration!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return resultCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned Service::setClientConfig(const Options* options, const std::string &clientId, const std::string &data, std::string &resp)
|
|
||||||
{
|
{
|
||||||
unsigned resultCode = MHD_HTTP_BAD_REQUEST;
|
data << customDashboard.rdbuf();
|
||||||
|
customDashboard.close();
|
||||||
rapidjson::Document document;
|
|
||||||
if (!document.Parse(data.c_str()).HasParseError()) {
|
|
||||||
std::string clientConfigFileName = getClientConfigFileName(options, clientId);
|
|
||||||
std::ofstream clientConfigFile(clientConfigFileName);
|
|
||||||
|
|
||||||
if (clientConfigFile){
|
|
||||||
rapidjson::StringBuffer buffer(0, 4096);
|
|
||||||
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
|
|
||||||
writer.SetMaxDecimalPlaces(10);
|
|
||||||
document.Accept(writer);
|
|
||||||
|
|
||||||
clientConfigFile << buffer.GetString();
|
|
||||||
clientConfigFile.close();
|
|
||||||
|
|
||||||
resultCode = MHD_HTTP_OK;
|
|
||||||
} else {
|
|
||||||
LOG_ERR("Not able to store client config to file %s.", clientConfigFileName.c_str());
|
|
||||||
}
|
|
||||||
} else{
|
|
||||||
LOG_ERR("Not able to store client config. The received client config for client %s is broken!", clientId.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultCode;
|
if (!data.rdbuf()->in_avail())
|
||||||
|
{
|
||||||
|
data << "<!DOCTYPE html>";
|
||||||
|
data << "<html lang=\"en\">";
|
||||||
|
data << "<head>";
|
||||||
|
data << "<meta charset=\"utf-8\">";
|
||||||
|
data << "<title>XMRigCC Dashboard</title>";
|
||||||
|
data << "</head>";
|
||||||
|
data << "<body>";
|
||||||
|
data << " <div style=\"text-align: center;\">";
|
||||||
|
data << " <h1>Please configure a Dashboard</h1>";
|
||||||
|
data << " </div>";
|
||||||
|
data << "</body>";
|
||||||
|
data << "</html>";
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::getClientStatusList(std::string& resp)
|
res.set_content(data.str(), CONTENT_TYPE_HTML);
|
||||||
|
|
||||||
|
return HTTP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Service::getClientStatusList(httplib::Response& res)
|
||||||
{
|
{
|
||||||
rapidjson::Document document;
|
rapidjson::Document document;
|
||||||
document.SetObject();
|
document.SetObject();
|
||||||
|
@ -245,7 +240,8 @@ unsigned Service::getClientStatusList(std::string& resp)
|
||||||
auto& allocator = document.GetAllocator();
|
auto& allocator = document.GetAllocator();
|
||||||
|
|
||||||
rapidjson::Value clientStatusList(rapidjson::kArrayType);
|
rapidjson::Value clientStatusList(rapidjson::kArrayType);
|
||||||
for (auto& clientStatus : m_clientStatus) {
|
for (auto& clientStatus : m_clientStatus)
|
||||||
|
{
|
||||||
rapidjson::Value clientStatusEntry(rapidjson::kObjectType);
|
rapidjson::Value clientStatusEntry(rapidjson::kObjectType);
|
||||||
clientStatusEntry.AddMember("client_status", clientStatus.second.toJson(allocator), allocator);
|
clientStatusEntry.AddMember("client_status", clientStatus.second.toJson(allocator), allocator);
|
||||||
clientStatusList.PushBack(clientStatusEntry, allocator);
|
clientStatusList.PushBack(clientStatusEntry, allocator);
|
||||||
|
@ -255,7 +251,7 @@ unsigned Service::getClientStatusList(std::string& resp)
|
||||||
m_currentServerTime = static_cast<uint64_t>(std::chrono::system_clock::to_time_t(time_point));
|
m_currentServerTime = static_cast<uint64_t>(std::chrono::system_clock::to_time_t(time_point));
|
||||||
|
|
||||||
document.AddMember("current_server_time", m_currentServerTime, allocator);
|
document.AddMember("current_server_time", m_currentServerTime, allocator);
|
||||||
document.AddMember("current_version", rapidjson::StringRef(Version::string().c_str()), allocator);
|
document.AddMember("current_version", rapidjson::StringRef(APP_VERSION), allocator);
|
||||||
document.AddMember("client_status_list", clientStatusList, allocator);
|
document.AddMember("client_status_list", clientStatusList, allocator);
|
||||||
|
|
||||||
rapidjson::StringBuffer buffer(0, 4096);
|
rapidjson::StringBuffer buffer(0, 4096);
|
||||||
|
@ -263,43 +259,70 @@ unsigned Service::getClientStatusList(std::string& resp)
|
||||||
writer.SetMaxDecimalPlaces(10);
|
writer.SetMaxDecimalPlaces(10);
|
||||||
document.Accept(writer);
|
document.Accept(writer);
|
||||||
|
|
||||||
resp = buffer.GetString();
|
res.set_content(buffer.GetString(), CONTENT_TYPE_JSON);
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
return HTTP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::setClientStatus(const Options* options, const std::string& clientIp, const std::string& clientId, const std::string& data, std::string& resp)
|
int Service::setClientStatus(const httplib::Request& req, const std::string& clientId, httplib::Response& res)
|
||||||
{
|
{
|
||||||
unsigned resultCode = MHD_HTTP_BAD_REQUEST;
|
int resultCode = HTTP_BAD_REQUEST;
|
||||||
|
|
||||||
rapidjson::Document document;
|
rapidjson::Document document;
|
||||||
if (!document.Parse(data.c_str()).HasParseError()) {
|
if (!document.Parse(req.body.c_str()).HasParseError())
|
||||||
|
{
|
||||||
ClientStatus clientStatus;
|
ClientStatus clientStatus;
|
||||||
clientStatus.parseFromJson(document);
|
clientStatus.parseFromJson(document);
|
||||||
clientStatus.setExternalIp(clientIp);
|
clientStatus.setExternalIp(req.remoteAddr);
|
||||||
|
|
||||||
setClientLog(options->ccClientLogLinesHistory(), clientId, clientStatus.getLog());
|
setClientLog(static_cast<size_t>(m_config->clientLogHistory()), clientId, clientStatus.getLog());
|
||||||
|
|
||||||
clientStatus.clearLog();
|
clientStatus.clearLog();
|
||||||
|
|
||||||
m_clientStatus[clientId] = clientStatus;
|
m_clientStatus[clientId] = clientStatus;
|
||||||
|
|
||||||
resultCode = getClientCommand(clientId, resp);
|
resultCode = getClientCommand(clientId, res);
|
||||||
|
|
||||||
if (m_clientCommand[clientId].isOneTimeCommand()) {
|
if (m_clientCommand[clientId].isOneTimeCommand())
|
||||||
|
{
|
||||||
m_clientCommand.erase(clientId);
|
m_clientCommand.erase(clientId);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
LOG_ERR("[%s] ClientStatus for client '%s' - Parse Error Occured: %d",
|
LOG_ERR("[%s] ClientStatus for client '%s' - Parse Error Occured: %d",
|
||||||
clientIp.c_str(), clientId.c_str(), document.GetParseError());
|
req.remoteAddr.c_str(), clientId.c_str(), document.GetParseError());
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultCode;
|
return resultCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::getClientCommand(const std::string& clientId, std::string& resp)
|
void Service::setClientLog(size_t maxRows, const std::string& clientId, const std::string& log)
|
||||||
|
{
|
||||||
|
if (m_clientLog.find(clientId) == m_clientLog.end())
|
||||||
|
{
|
||||||
|
m_clientLog[clientId] = std::list<std::string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* clientLog = &m_clientLog[clientId];
|
||||||
|
std::istringstream logStream(log);
|
||||||
|
|
||||||
|
std::string logLine;
|
||||||
|
while (std::getline(logStream, logLine))
|
||||||
|
{
|
||||||
|
if (clientLog->size() == maxRows)
|
||||||
|
{
|
||||||
|
clientLog->pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
clientLog->push_back(logLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Service::getClientCommand(const std::string& clientId, httplib::Response& res)
|
||||||
|
{
|
||||||
|
if (m_clientCommand.find(clientId) == m_clientCommand.end())
|
||||||
{
|
{
|
||||||
if (m_clientCommand.find(clientId) == m_clientCommand.end()) {
|
|
||||||
m_clientCommand[clientId] = ControlCommand();
|
m_clientCommand[clientId] = ControlCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,44 +339,18 @@ unsigned Service::getClientCommand(const std::string& clientId, std::string& res
|
||||||
writer.SetMaxDecimalPlaces(10);
|
writer.SetMaxDecimalPlaces(10);
|
||||||
respDocument.Accept(writer);
|
respDocument.Accept(writer);
|
||||||
|
|
||||||
resp = buffer.GetString();
|
res.set_content(buffer.GetString(), CONTENT_TYPE_JSON);
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
return HTTP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::getClientLog(const std::string& clientId, std::string& resp)
|
int Service::getClientConfigTemplates(httplib::Response& res)
|
||||||
{
|
|
||||||
if (m_clientLog.find(clientId) != m_clientLog.end()) {
|
|
||||||
rapidjson::Document respDocument;
|
|
||||||
respDocument.SetObject();
|
|
||||||
|
|
||||||
auto& allocator = respDocument.GetAllocator();
|
|
||||||
|
|
||||||
std::stringstream data;
|
|
||||||
for (auto& m_row : m_clientLog[clientId]) {
|
|
||||||
data << m_row.c_str() << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string log = data.str();
|
|
||||||
respDocument.AddMember("client_log", rapidjson::StringRef(log.c_str()), allocator);
|
|
||||||
|
|
||||||
rapidjson::StringBuffer buffer(0, 4096);
|
|
||||||
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
|
||||||
writer.SetMaxDecimalPlaces(10);
|
|
||||||
respDocument.Accept(writer);
|
|
||||||
|
|
||||||
resp = buffer.GetString();
|
|
||||||
}
|
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned Service::getClientConfigTemplates(const Options* options, std::string& resp)
|
|
||||||
{
|
{
|
||||||
std::string configFolder(".");
|
std::string configFolder(".");
|
||||||
|
|
||||||
if (options->ccClientConfigFolder() != nullptr) {
|
if (!m_config->clientConfigFolder().empty())
|
||||||
configFolder = options->ccClientConfigFolder();
|
{
|
||||||
|
configFolder = m_config->clientConfigFolder();
|
||||||
# ifdef WIN32
|
# ifdef WIN32
|
||||||
configFolder += '\\';
|
configFolder += '\\';
|
||||||
# else
|
# else
|
||||||
|
@ -364,15 +361,20 @@ unsigned Service::getClientConfigTemplates(const Options* options, std::string&
|
||||||
std::vector<std::string> templateFiles;
|
std::vector<std::string> templateFiles;
|
||||||
|
|
||||||
DIR* dirp = opendir(configFolder.c_str());
|
DIR* dirp = opendir(configFolder.c_str());
|
||||||
if (dirp) {
|
if (dirp)
|
||||||
|
{
|
||||||
struct dirent* entry;
|
struct dirent* entry;
|
||||||
while ((entry = readdir(dirp)) != NULL) {
|
while ((entry = readdir(dirp)) != NULL)
|
||||||
if (entry->d_type == DT_REG) {
|
{
|
||||||
|
if (entry->d_type == DT_REG)
|
||||||
|
{
|
||||||
std::string filename = entry->d_name;
|
std::string filename = entry->d_name;
|
||||||
std::string starting = "template_";
|
std::string starting = "template_";
|
||||||
std::string ending = "_config.json";
|
std::string ending = "_config.json";
|
||||||
|
|
||||||
if (filename.rfind(starting, 0) == 0 && filename.find(ending, (filename.length() - ending.length())) != std::string::npos) {
|
if (filename.rfind(starting, 0) == 0 &&
|
||||||
|
filename.find(ending, (filename.length() - ending.length())) != std::string::npos)
|
||||||
|
{
|
||||||
filename.erase(0, starting.length());
|
filename.erase(0, starting.length());
|
||||||
filename.erase(filename.length() - ending.length());
|
filename.erase(filename.length() - ending.length());
|
||||||
|
|
||||||
|
@ -390,7 +392,8 @@ unsigned Service::getClientConfigTemplates(const Options* options, std::string&
|
||||||
auto& allocator = respDocument.GetAllocator();
|
auto& allocator = respDocument.GetAllocator();
|
||||||
|
|
||||||
rapidjson::Value templateList(rapidjson::kArrayType);
|
rapidjson::Value templateList(rapidjson::kArrayType);
|
||||||
for (auto& templateFile : templateFiles) {
|
for (auto& templateFile : templateFiles)
|
||||||
|
{
|
||||||
rapidjson::Value templateEntry(templateFile.c_str(), allocator);
|
rapidjson::Value templateEntry(templateFile.c_str(), allocator);
|
||||||
templateList.PushBack(templateEntry, allocator);
|
templateList.PushBack(templateEntry, allocator);
|
||||||
}
|
}
|
||||||
|
@ -402,108 +405,182 @@ unsigned Service::getClientConfigTemplates(const Options* options, std::string&
|
||||||
writer.SetMaxDecimalPlaces(10);
|
writer.SetMaxDecimalPlaces(10);
|
||||||
respDocument.Accept(writer);
|
respDocument.Accept(writer);
|
||||||
|
|
||||||
resp = buffer.GetString();
|
res.set_content(buffer.GetString(), CONTENT_TYPE_JSON);
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
return HTTP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::getAdminPage(const Options* options, std::string& resp)
|
int Service::getClientConfig(const std::string& clientId, httplib::Response& res)
|
||||||
{
|
{
|
||||||
|
int resultCode = HTTP_INTERNAL_ERROR;
|
||||||
|
|
||||||
|
std::string clientConfigFileName = getClientConfigFileName(clientId);
|
||||||
|
|
||||||
std::stringstream data;
|
std::stringstream data;
|
||||||
|
std::ifstream clientConfig(clientConfigFileName);
|
||||||
if (options->ccCustomDashboard() != nullptr) {
|
if (clientConfig)
|
||||||
std::ifstream customDashboard(options->ccCustomDashboard());
|
|
||||||
if (customDashboard)
|
|
||||||
{
|
{
|
||||||
data << customDashboard.rdbuf();
|
data << clientConfig.rdbuf();
|
||||||
customDashboard.close();
|
clientConfig.close();
|
||||||
resp = data.str();
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
|
||||||
if (resp.empty()) {
|
|
||||||
data << "<!DOCTYPE html>";
|
|
||||||
data << "<html lang=\"en\">";
|
|
||||||
data << "<head>";
|
|
||||||
data << "<meta charset=\"utf-8\">";
|
|
||||||
data << "<title>XMRigCC Dashboard</title>";
|
|
||||||
data << "</head>";
|
|
||||||
data << "<body>";
|
|
||||||
data << " <div style=\"text-align: center;\">";
|
|
||||||
data << " <h1>Please configure a Dashboard</h1>";
|
|
||||||
data << " </div>";
|
|
||||||
data << "</body>";
|
|
||||||
data << "</html>";
|
|
||||||
}
|
|
||||||
|
|
||||||
resp = data.str();
|
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned Service::setClientCommand(const std::string& clientId, const std::string& data, std::string& resp)
|
|
||||||
{
|
{
|
||||||
|
std::ifstream defaultConfig("default_miner_config.json");
|
||||||
|
if (defaultConfig)
|
||||||
|
{
|
||||||
|
data << defaultConfig.rdbuf();
|
||||||
|
defaultConfig.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.tellp() > 0)
|
||||||
|
{
|
||||||
|
rapidjson::Document document;
|
||||||
|
document.Parse(data.str().c_str());
|
||||||
|
|
||||||
|
if (!document.HasParseError())
|
||||||
|
{
|
||||||
|
rapidjson::StringBuffer buffer(0, 4096);
|
||||||
|
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
||||||
|
writer.SetMaxDecimalPlaces(10);
|
||||||
|
document.Accept(writer);
|
||||||
|
|
||||||
|
res.set_content(buffer.GetString(), CONTENT_TYPE_JSON);
|
||||||
|
|
||||||
|
resultCode = HTTP_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERR("Not able to send client config. Client config %s is broken!", clientConfigFileName.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERR("Not able to load a client config. Please check your configuration!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Service::getClientLog(const std::string& clientId, httplib::Response& res)
|
||||||
|
{
|
||||||
|
if (m_clientLog.find(clientId) != m_clientLog.end())
|
||||||
|
{
|
||||||
|
rapidjson::Document respDocument;
|
||||||
|
respDocument.SetObject();
|
||||||
|
|
||||||
|
auto& allocator = respDocument.GetAllocator();
|
||||||
|
|
||||||
|
std::stringstream data;
|
||||||
|
for (auto& m_row : m_clientLog[clientId])
|
||||||
|
{
|
||||||
|
data << m_row.c_str() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string log = data.str();
|
||||||
|
respDocument.AddMember("client_log", rapidjson::StringRef(log.c_str()), allocator);
|
||||||
|
|
||||||
|
rapidjson::StringBuffer buffer(0, 4096);
|
||||||
|
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
||||||
|
writer.SetMaxDecimalPlaces(10);
|
||||||
|
respDocument.Accept(writer);
|
||||||
|
|
||||||
|
res.set_content(buffer.GetString(), CONTENT_TYPE_JSON);
|
||||||
|
}
|
||||||
|
|
||||||
|
return HTTP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Service::setClientConfig(const httplib::Request& req, const std::string& clientId, httplib::Response& res)
|
||||||
|
{
|
||||||
|
int resultCode = HTTP_BAD_REQUEST;
|
||||||
|
|
||||||
|
rapidjson::Document document;
|
||||||
|
if (!document.Parse(req.body.c_str()).HasParseError())
|
||||||
|
{
|
||||||
|
std::string clientConfigFileName = getClientConfigFileName(clientId);
|
||||||
|
std::ofstream clientConfigFile(clientConfigFileName);
|
||||||
|
|
||||||
|
if (clientConfigFile)
|
||||||
|
{
|
||||||
|
rapidjson::StringBuffer buffer(0, 4096);
|
||||||
|
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
|
||||||
|
writer.SetMaxDecimalPlaces(10);
|
||||||
|
document.Accept(writer);
|
||||||
|
|
||||||
|
clientConfigFile << buffer.GetString();
|
||||||
|
clientConfigFile.close();
|
||||||
|
|
||||||
|
resultCode = HTTP_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERR("Not able to store client config to file %s.", clientConfigFileName.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERR("Not able to store client config. The received client config for client %s is broken!", clientId.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Service::setClientCommand(const httplib::Request& req, const std::string& clientId, httplib::Response& res)
|
||||||
|
{
|
||||||
|
int resultCode = HTTP_BAD_REQUEST;
|
||||||
|
|
||||||
ControlCommand controlCommand;
|
ControlCommand controlCommand;
|
||||||
|
|
||||||
rapidjson::Document document;
|
rapidjson::Document document;
|
||||||
if (!document.Parse(data.c_str()).HasParseError()) {
|
if (!document.Parse(req.body.c_str()).HasParseError())
|
||||||
|
{
|
||||||
controlCommand.parseFromJson(document);
|
controlCommand.parseFromJson(document);
|
||||||
|
|
||||||
m_clientCommand[clientId] = controlCommand;
|
m_clientCommand[clientId] = controlCommand;
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
resultCode = HTTP_OK;
|
||||||
} else {
|
|
||||||
return MHD_HTTP_BAD_REQUEST;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::setClientLog(size_t maxRows, const std::string& clientId, const std::string& log)
|
return resultCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Service::deleteClientConfig(const std::string& clientId)
|
||||||
{
|
{
|
||||||
if (m_clientLog.find(clientId) == m_clientLog.end()) {
|
int resultCode = HTTP_BAD_REQUEST;
|
||||||
m_clientLog[clientId] = std::list<std::string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto* clientLog = &m_clientLog[clientId];
|
|
||||||
std::istringstream logStream(log);
|
|
||||||
|
|
||||||
std::string logLine;
|
if (!clientId.empty())
|
||||||
while (std::getline(logStream, logLine))
|
|
||||||
{
|
{
|
||||||
if (clientLog->size() == maxRows) {
|
std::string clientConfigFileName = getClientConfigFileName(clientId);
|
||||||
clientLog->pop_front();
|
if (!clientConfigFileName.empty() && remove(clientConfigFileName.c_str()) == 0)
|
||||||
}
|
|
||||||
|
|
||||||
clientLog->push_back(logLine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned Service::deleteClientConfig(const Options* options, const std::string& clientId, std::string& resp)
|
|
||||||
{
|
{
|
||||||
if (!clientId.empty()) {
|
resultCode = HTTP_OK;
|
||||||
std::string clientConfigFileName = getClientConfigFileName(options, clientId);
|
|
||||||
if (!clientConfigFileName.empty() && remove(clientConfigFileName.c_str()) == 0) {
|
|
||||||
return MHD_HTTP_OK;
|
|
||||||
} else {
|
|
||||||
return MHD_HTTP_NOT_FOUND;
|
|
||||||
}
|
}
|
||||||
} else {
|
else
|
||||||
return MHD_HTTP_BAD_REQUEST;
|
{
|
||||||
|
resultCode = HTTP_NOT_FOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Service::resetClientStatusList(const std::string& data, std::string& resp)
|
return resultCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Service::resetClientStatusList()
|
||||||
{
|
{
|
||||||
m_clientStatus.clear();
|
m_clientStatus.clear();
|
||||||
|
|
||||||
return MHD_HTTP_OK;
|
return HTTP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Service::getClientConfigFileName(const Options* options, const std::string& clientId)
|
std::string Service::getClientConfigFileName(const std::string& clientId)
|
||||||
{
|
{
|
||||||
std::string clientConfigFileName;
|
std::string clientConfigFileName;
|
||||||
|
|
||||||
if (options->ccClientConfigFolder() != nullptr) {
|
if (!m_config->clientConfigFolder().empty())
|
||||||
clientConfigFileName += options->ccClientConfigFolder();
|
{
|
||||||
|
clientConfigFileName += m_config->clientConfigFolder();
|
||||||
# ifdef WIN32
|
# ifdef WIN32
|
||||||
clientConfigFileName += '\\';
|
clientConfigFileName += '\\';
|
||||||
# else
|
# else
|
||||||
|
@ -516,36 +593,18 @@ std::string Service::getClientConfigFileName(const Options* options, const std::
|
||||||
return clientConfigFileName;
|
return clientConfigFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::onPushTimer(uv_timer_t* handle)
|
|
||||||
{
|
|
||||||
auto time_point = std::chrono::system_clock::now();
|
|
||||||
auto now = static_cast<uint64_t>(std::chrono::system_clock::to_time_t(time_point) * 1000);
|
|
||||||
|
|
||||||
if (Options::i()->ccPushOfflineMiners()) {
|
|
||||||
sendMinerOfflinePush(now);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Options::i()->ccPushZeroHashrateMiners()) {
|
|
||||||
sendMinerZeroHashratePush(now);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Options::i()->ccPushPeriodicStatus()) {
|
|
||||||
if (now > (m_lastStatusUpdateTime + STATUS_UPDATE_INTERVAL)) {
|
|
||||||
sendServerStatusPush(now);
|
|
||||||
m_lastStatusUpdateTime = now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Service::sendMinerOfflinePush(uint64_t now)
|
void Service::sendMinerOfflinePush(uint64_t now)
|
||||||
{
|
{
|
||||||
uint64_t offlineThreshold = now - OFFLINE_TRESHOLD_IN_MS;
|
uint64_t offlineThreshold = now - OFFLINE_TRESHOLD_IN_MS;
|
||||||
|
|
||||||
for (auto clientStatus : m_clientStatus) {
|
for (auto clientStatus : m_clientStatus)
|
||||||
|
{
|
||||||
uint64_t lastStatus = clientStatus.second.getLastStatusUpdate() * 1000;
|
uint64_t lastStatus = clientStatus.second.getLastStatusUpdate() * 1000;
|
||||||
|
|
||||||
if (lastStatus < offlineThreshold) {
|
if (lastStatus < offlineThreshold)
|
||||||
if (std::find(m_offlineNotified.begin(), m_offlineNotified.end(), clientStatus.first) == m_offlineNotified.end()) {
|
{
|
||||||
|
if (std::find(m_offlineNotified.begin(), m_offlineNotified.end(), clientStatus.first) == m_offlineNotified.end())
|
||||||
|
{
|
||||||
std::stringstream message;
|
std::stringstream message;
|
||||||
message << "Miner: " << clientStatus.first << " just went offline!";
|
message << "Miner: " << clientStatus.first << " just went offline!";
|
||||||
|
|
||||||
|
@ -554,8 +613,11 @@ void Service::sendMinerOfflinePush(uint64_t now)
|
||||||
|
|
||||||
m_offlineNotified.push_back(clientStatus.first);
|
m_offlineNotified.push_back(clientStatus.first);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if (std::find(m_offlineNotified.begin(), m_offlineNotified.end(), clientStatus.first) != m_offlineNotified.end()) {
|
else
|
||||||
|
{
|
||||||
|
if (std::find(m_offlineNotified.begin(), m_offlineNotified.end(), clientStatus.first) != m_offlineNotified.end())
|
||||||
|
{
|
||||||
std::stringstream message;
|
std::stringstream message;
|
||||||
message << "Miner: " << clientStatus.first << " is back online!";
|
message << "Miner: " << clientStatus.first << " is back online!";
|
||||||
|
|
||||||
|
@ -572,10 +634,15 @@ void Service::sendMinerZeroHashratePush(uint64_t now)
|
||||||
{
|
{
|
||||||
uint64_t offlineThreshold = now - OFFLINE_TRESHOLD_IN_MS;
|
uint64_t offlineThreshold = now - OFFLINE_TRESHOLD_IN_MS;
|
||||||
|
|
||||||
for (auto clientStatus : m_clientStatus) {
|
for (auto clientStatus : m_clientStatus)
|
||||||
if (offlineThreshold < clientStatus.second.getLastStatusUpdate() * 1000) {
|
{
|
||||||
if (clientStatus.second.getHashrateShort() == 0 && clientStatus.second.getHashrateMedium() == 0) {
|
if (offlineThreshold < clientStatus.second.getLastStatusUpdate() * 1000)
|
||||||
if (std::find(m_zeroHashNotified.begin(), m_zeroHashNotified.end(), clientStatus.first) == m_zeroHashNotified.end()) {
|
{
|
||||||
|
if (clientStatus.second.getHashrateShort() == 0 && clientStatus.second.getHashrateMedium() == 0)
|
||||||
|
{
|
||||||
|
if (std::find(m_zeroHashNotified.begin(), m_zeroHashNotified.end(), clientStatus.first) ==
|
||||||
|
m_zeroHashNotified.end())
|
||||||
|
{
|
||||||
std::stringstream message;
|
std::stringstream message;
|
||||||
message << "Miner: " << clientStatus.first << " reported 0 h/s for the last minute!";
|
message << "Miner: " << clientStatus.first << " reported 0 h/s for the last minute!";
|
||||||
|
|
||||||
|
@ -584,8 +651,12 @@ void Service::sendMinerZeroHashratePush(uint64_t now)
|
||||||
|
|
||||||
m_zeroHashNotified.push_back(clientStatus.first);
|
m_zeroHashNotified.push_back(clientStatus.first);
|
||||||
}
|
}
|
||||||
} else if (clientStatus.second.getHashrateMedium() > 0) {
|
}
|
||||||
if (std::find(m_zeroHashNotified.begin(), m_zeroHashNotified.end(), clientStatus.first) != m_zeroHashNotified.end()) {
|
else if (clientStatus.second.getHashrateMedium() > 0)
|
||||||
|
{
|
||||||
|
if (std::find(m_zeroHashNotified.begin(), m_zeroHashNotified.end(), clientStatus.first) !=
|
||||||
|
m_zeroHashNotified.end())
|
||||||
|
{
|
||||||
std::stringstream message;
|
std::stringstream message;
|
||||||
message << "Miner: " << clientStatus.first << " hashrate recovered. Reported "
|
message << "Miner: " << clientStatus.first << " hashrate recovered. Reported "
|
||||||
<< clientStatus.second.getHashrateMedium()
|
<< clientStatus.second.getHashrateMedium()
|
||||||
|
@ -614,8 +685,10 @@ void Service::sendServerStatusPush(uint64_t now)
|
||||||
uint64_t sharesTotal = 0;
|
uint64_t sharesTotal = 0;
|
||||||
uint64_t offlineThreshold = now - OFFLINE_TRESHOLD_IN_MS;
|
uint64_t offlineThreshold = now - OFFLINE_TRESHOLD_IN_MS;
|
||||||
|
|
||||||
for (auto clientStatus : m_clientStatus) {
|
for (auto clientStatus : m_clientStatus)
|
||||||
if (offlineThreshold < clientStatus.second.getLastStatusUpdate() * 1000) {
|
{
|
||||||
|
if (offlineThreshold < clientStatus.second.getLastStatusUpdate() * 1000)
|
||||||
|
{
|
||||||
onlineMiner++;
|
onlineMiner++;
|
||||||
|
|
||||||
hashrateMedium += clientStatus.second.getHashrateMedium();
|
hashrateMedium += clientStatus.second.getHashrateMedium();
|
||||||
|
@ -624,12 +697,15 @@ void Service::sendServerStatusPush(uint64_t now)
|
||||||
sharesGood += clientStatus.second.getSharesGood();
|
sharesGood += clientStatus.second.getSharesGood();
|
||||||
sharesTotal += clientStatus.second.getSharesTotal();
|
sharesTotal += clientStatus.second.getSharesTotal();
|
||||||
avgTime += clientStatus.second.getAvgTime();
|
avgTime += clientStatus.second.getAvgTime();
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
offlineMiner++;
|
offlineMiner++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_clientStatus.empty()) {
|
if (!m_clientStatus.empty())
|
||||||
|
{
|
||||||
avgTime = avgTime / m_clientStatus.size();
|
avgTime = avgTime / m_clientStatus.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,11 +721,13 @@ void Service::sendServerStatusPush(uint64_t now)
|
||||||
|
|
||||||
void Service::triggerPush(const std::string& title, const std::string& message)
|
void Service::triggerPush(const std::string& title, const std::string& message)
|
||||||
{
|
{
|
||||||
if (Options::i()->ccUsePushover()) {
|
if (m_config->usePushover())
|
||||||
|
{
|
||||||
sendViaPushover(title, message);
|
sendViaPushover(title, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Options::i()->ccUseTelegram()) {
|
if (m_config->useTelegram())
|
||||||
|
{
|
||||||
sendViaTelegram(title, message);
|
sendViaTelegram(title, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -659,13 +737,14 @@ void Service::sendViaPushover(const std::string &title, const std::string &messa
|
||||||
std::shared_ptr<httplib::Client> cli = std::make_shared<httplib::SSLClient>("api.pushover.net", 443);
|
std::shared_ptr<httplib::Client> cli = std::make_shared<httplib::SSLClient>("api.pushover.net", 443);
|
||||||
|
|
||||||
httplib::Params params;
|
httplib::Params params;
|
||||||
params.emplace("token", Options::i()->ccPushoverToken());
|
params.emplace("token", m_config->pushoverApiToken());
|
||||||
params.emplace("user", Options::i()->ccPushoverUser());
|
params.emplace("user", m_config->pushoverUserKey());
|
||||||
params.emplace("title", title);
|
params.emplace("title", title);
|
||||||
params.emplace("message", httplib::detail::encode_url(message));
|
params.emplace("message", httplib::detail::encode_url(message));
|
||||||
|
|
||||||
auto res = cli->Post("/1/messages.json", params);
|
auto res = cli->Post("/1/messages.json", params);
|
||||||
if (res) {
|
if (res)
|
||||||
|
{
|
||||||
LOG_WARN("Pushover response: %s", res->body.c_str());
|
LOG_WARN("Pushover response: %s", res->body.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -675,15 +754,16 @@ void Service::sendViaTelegram(const std::string &title, const std::string &messa
|
||||||
std::shared_ptr<httplib::Client> cli = std::make_shared<httplib::SSLClient>("api.telegram.org", 443);
|
std::shared_ptr<httplib::Client> cli = std::make_shared<httplib::SSLClient>("api.telegram.org", 443);
|
||||||
|
|
||||||
std::string text = "<b>" + title + "</b>\n\n" + message;
|
std::string text = "<b>" + title + "</b>\n\n" + message;
|
||||||
std::string path = std::string("/bot") + Options::i()->ccTelegramBotToken() + std::string("/sendMessage");
|
std::string path = std::string("/bot") + m_config->telegramBotToken() + std::string("/sendMessage");
|
||||||
|
|
||||||
httplib::Params params;
|
httplib::Params params;
|
||||||
params.emplace("chat_id", Options::i()->ccTelegramChatId());
|
params.emplace("chat_id", m_config->telegramChatId());
|
||||||
params.emplace("text", httplib::detail::encode_url(text));
|
params.emplace("text", httplib::detail::encode_url(text));
|
||||||
params.emplace("parse_mode", "HTML");
|
params.emplace("parse_mode", "HTML");
|
||||||
|
|
||||||
auto res = cli->Post(path.c_str(), params);
|
auto res = cli->Post(path.c_str(), params);
|
||||||
if (res) {
|
if (res)
|
||||||
|
{
|
||||||
LOG_WARN("Telegram response: %s", res->body.c_str());
|
LOG_WARN("Telegram response: %s", res->body.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
101
src/cc/Service.h
101
src/cc/Service.h
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -18,71 +18,84 @@
|
||||||
#ifndef __SERVICE_H__
|
#ifndef __SERVICE_H__
|
||||||
#define __SERVICE_H__
|
#define __SERVICE_H__
|
||||||
|
|
||||||
#define CONTENT_TYPE_HTML "text/html"
|
#include <memory>
|
||||||
#define CONTENT_TYPE_JSON "application/json"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <uv.h>
|
|
||||||
#include <microhttpd.h>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "Options.h"
|
#include <3rdparty/cpp-httplib/httplib.h>
|
||||||
|
|
||||||
|
#include "CCServerConfig.h"
|
||||||
#include "ClientStatus.h"
|
#include "ClientStatus.h"
|
||||||
#include "ControlCommand.h"
|
#include "ControlCommand.h"
|
||||||
|
#include "Timer.h"
|
||||||
|
|
||||||
#define TIMER_INTERVAL 10000
|
constexpr static char CONTENT_TYPE_HTML[] = "text/html";
|
||||||
#define OFFLINE_TRESHOLD_IN_MS 60000
|
constexpr static char CONTENT_TYPE_JSON[] = "application/json";
|
||||||
#define STATUS_UPDATE_INTERVAL 3600000
|
|
||||||
|
constexpr static int HTTP_OK = 200;
|
||||||
|
constexpr static int HTTP_BAD_REQUEST = 400;
|
||||||
|
constexpr static int HTTP_UNAUTHORIZED = 401;
|
||||||
|
constexpr static int HTTP_FORBIDDEN = 403;
|
||||||
|
constexpr static int HTTP_NOT_FOUND = 404;
|
||||||
|
constexpr static int HTTP_INTERNAL_ERROR = 500;
|
||||||
|
|
||||||
|
constexpr static int TIMER_INTERVAL = 10000;
|
||||||
|
constexpr static int OFFLINE_TRESHOLD_IN_MS = 60000;
|
||||||
|
constexpr static int STATUS_UPDATE_INTERVAL = 3600000;
|
||||||
|
|
||||||
class Service
|
class Service
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static bool start();
|
explicit Service(const std::shared_ptr<CCServerConfig>& config);
|
||||||
static void release();
|
~Service();
|
||||||
|
|
||||||
static unsigned handleGET(const Options* options, const std::string& url, const std::string& clientIp, const std::string& clientId, std::string& resp);
|
public:
|
||||||
static unsigned handlePOST(const Options* options, const std::string& url, const std::string& clientIp, const std::string& clientId, const std::string& data, std::string& resp);
|
bool start();
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
int handleGET(const httplib::Request& req, httplib::Response& res);
|
||||||
|
int handlePOST(const httplib::Request& req, httplib::Response& res);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static unsigned getClientConfig(const Options* options, const std::string& clientId, std::string& resp);
|
int getAdminPage(httplib::Response& res);
|
||||||
static unsigned getClientCommand(const std::string& clientId, std::string& resp);
|
|
||||||
static unsigned getClientLog(const std::string& clientId, std::string& resp);
|
|
||||||
static unsigned getClientStatusList(std::string& resp);
|
|
||||||
static unsigned getClientConfigTemplates(const Options* options, std::string& resp);
|
|
||||||
static unsigned getAdminPage(const Options* options, std::string& resp);
|
|
||||||
|
|
||||||
static unsigned setClientStatus(const Options* options, const std::string& clientIp, const std::string& clientId, const std::string& data, std::string& resp);
|
int getClientStatusList(httplib::Response& res);
|
||||||
static unsigned setClientCommand(const std::string& clientId, const std::string& data, std::string& resp);
|
int getClientCommand(const std::string& clientId, httplib::Response& res);
|
||||||
static unsigned setClientConfig(const Options* options, const std::string &clientId, const std::string &data, std::string &resp);
|
int getClientConfigTemplates(httplib::Response& res);
|
||||||
static unsigned deleteClientConfig(const Options* options, const std::string& clientId, std::string& resp);
|
int getClientConfig(const std::string& clientId, httplib::Response& res);
|
||||||
static unsigned resetClientStatusList(const std::string& data, std::string& resp);
|
int getClientLog(const std::string& clientId, httplib::Response& res);
|
||||||
|
|
||||||
static void setClientLog(size_t maxRows, const std::string& clientId, const std::string& log);
|
int setClientStatus(const httplib::Request& req, const std::string& clientId, httplib::Response& res);
|
||||||
|
int setClientCommand(const httplib::Request& req, const std::string& clientId, httplib::Response& res);
|
||||||
|
int setClientConfig(const httplib::Request& req, const std::string& clientId, httplib::Response& res);
|
||||||
|
int deleteClientConfig(const std::string& clientId);
|
||||||
|
int resetClientStatusList();
|
||||||
|
|
||||||
static std::string getClientConfigFileName(const Options *options, const std::string &clientId);
|
std::string getClientConfigFileName(const std::string& clientId);
|
||||||
|
|
||||||
static void onPushTimer(uv_timer_t* handle);
|
void setClientLog(size_t maxRows, const std::string& clientId, const std::string& log);
|
||||||
static void sendServerStatusPush(uint64_t now);
|
|
||||||
static void sendMinerOfflinePush(uint64_t now);
|
void sendServerStatusPush(uint64_t now);
|
||||||
static void sendMinerZeroHashratePush(uint64_t now);
|
void sendMinerOfflinePush(uint64_t now);
|
||||||
static void triggerPush(const std::string& title, const std::string& message);
|
void sendMinerZeroHashratePush(uint64_t now);
|
||||||
|
void triggerPush(const std::string& title, const std::string& message);
|
||||||
|
void sendViaPushover(const std::string& title, const std::string& message);
|
||||||
|
void sendViaTelegram(const std::string& title, const std::string& message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint64_t m_currentServerTime;
|
std::shared_ptr<CCServerConfig> m_config;
|
||||||
static uint64_t m_lastStatusUpdateTime;
|
std::shared_ptr<Timer> m_timer;
|
||||||
|
|
||||||
static std::map<std::string, ClientStatus> m_clientStatus;
|
uint64_t m_currentServerTime = 0;
|
||||||
static std::map<std::string, ControlCommand> m_clientCommand;
|
uint64_t m_lastStatusUpdateTime = 0;
|
||||||
static std::map<std::string, std::list<std::string>> m_clientLog;
|
|
||||||
|
|
||||||
static std::list<std::string> m_offlineNotified;
|
std::map<std::string, ClientStatus> m_clientStatus;
|
||||||
static std::list<std::string> m_zeroHashNotified;
|
std::map<std::string, ControlCommand> m_clientCommand;
|
||||||
|
std::map<std::string, std::list<std::string>> m_clientLog;
|
||||||
|
|
||||||
static uv_mutex_t m_mutex;
|
std::list<std::string> m_offlineNotified;
|
||||||
static uv_timer_t m_timer;
|
std::list<std::string> m_zeroHashNotified;
|
||||||
|
|
||||||
static void sendViaPushover(const std::string &title, const std::string &message);
|
std::mutex m_mutex;
|
||||||
|
|
||||||
static void sendViaTelegram(const std::string &title, const std::string &message);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __SERVICE_H__ */
|
#endif /* __SERVICE_H__ */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -14,80 +14,70 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <uv.h>
|
|
||||||
|
|
||||||
#include "log/Log.h"
|
#ifdef XMRIG_FEATURE_TLS
|
||||||
#include "Options.h"
|
# include <openssl/opensslv.h>
|
||||||
#include "Summary.h"
|
# include <cstring>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include "Summary.h"
|
||||||
|
|
||||||
static void print_versions()
|
static void printVersions()
|
||||||
{
|
{
|
||||||
char buf[16];
|
char buf[256] = { 0 };
|
||||||
|
|
||||||
# if defined(__clang__)
|
# if defined(__clang__)
|
||||||
snprintf(buf, 16, " clang/%d.%d.%d", __clang_major__, __clang_minor__, __clang_patchlevel__);
|
snprintf(buf, sizeof buf, "clang/%d.%d.%d", __clang_major__, __clang_minor__, __clang_patchlevel__);
|
||||||
# elif defined(__GNUC__)
|
# elif defined(__GNUC__)
|
||||||
snprintf(buf, 16, " gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
|
snprintf(buf, sizeof buf, "gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
|
||||||
# elif defined(_MSC_VER)
|
# elif defined(_MSC_VER)
|
||||||
snprintf(buf, 16, " MSVC/%d", MSVC_VERSION);
|
snprintf(buf, sizeof buf, "MSVC/%d", MSVC_VERSION);
|
||||||
# else
|
|
||||||
buf[0] = '\0';
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
Log::i()->text(Options::i()->colors() ? "\x1B[01;32m * \x1B[01;37mVERSIONS: \x1B[01;36m%s/%s\x1B[01;37m libuv/%s%s \x1B[01;36m(%s)" : " * VERSIONS: %s/%s libuv/%s%s (%s)",
|
xmrig::Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%s/%s") WHITE_BOLD(" %s") BLUE_BOLD(" (%s)"), "ABOUT", APP_NAME, APP_VERSION, buf, BUILD_TYPE);
|
||||||
APP_NAME, APP_VERSION, uv_version_string(), buf, BUILD_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_commands()
|
std::string libs;
|
||||||
{
|
|
||||||
if (Options::i()->colors()) {
|
|
||||||
Log::i()->text("\x1B[01;32m * \x1B[01;37mCOMMANDS: \x1B[01;35mq\x1B[01;37muit");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Log::i()->text(" * COMMANDS: 'q' Quit");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Summary::print_pushinfo() {
|
#if defined(XMRIG_FEATURE_TLS) && defined(OPENSSL_VERSION_TEXT)
|
||||||
if (Options::i()->ccUsePushover() || Options::i()->ccUseTelegram())
|
|
||||||
{
|
{
|
||||||
#ifndef XMRIG_NO_TLS
|
constexpr const char *v = OPENSSL_VERSION_TEXT + 8;
|
||||||
if (Options::i()->colors()) {
|
snprintf(buf, sizeof buf, "OpenSSL/%.*s ", static_cast<int>(strchr(v, ' ') - v), v);
|
||||||
Log::i()->text("\x1B[01;32m * \x1B[01;37mPUSHSERVICE: \x1B[01;32m%s%s%s",
|
libs += buf;
|
||||||
Options::i()->ccUsePushover() ? "Pushover" : "",
|
|
||||||
Options::i()->ccUsePushover() && Options::i()->ccUseTelegram() ? ", " : "",
|
|
||||||
Options::i()->ccUseTelegram() ? "Telegram" : "");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Log::i()->text(" * PUSHSERVICE: %s%s%s",
|
|
||||||
Options::i()->ccUsePushover() ? "Pushover" : "",
|
|
||||||
Options::i()->ccUsePushover() && Options::i()->ccUseTelegram() ? ", " : "",
|
|
||||||
Options::i()->ccUseTelegram() ? "Telegram" : "");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (Options::i()->colors()) {
|
|
||||||
Log::i()->text("\x1B[01;32m * \x1B[01;37mPUSHSERVICE: \x1B[01;31mUnavailable requires TLS");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Log::i()->text(" * PUSHSERVICE: Unavailable requires TLS");
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
|
||||||
if (Options::i()->colors()) {
|
|
||||||
Log::i()->text("\x1B[01;32m * \x1B[01;37mPUSHSERVICE: \x1B[01;31mDisabled");
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Log::i()->text(" * PUSHSERVICE: Disabled");
|
static void printCommands()
|
||||||
|
{
|
||||||
|
xmrig::Log::print(GREEN_BOLD(" * ") WHITE_BOLD("COMMANDS ") MAGENTA_BOLD("q") WHITE_BOLD("uit, "));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void printPushinfo(const std::shared_ptr<CCServerConfig>& config)
|
||||||
|
{
|
||||||
|
if (config->usePushover() || config->useTelegram())
|
||||||
|
{
|
||||||
|
#ifdef XMRIG_FEATURE_TLS
|
||||||
|
xmrig::Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%s%s%s"), "PUSHSERVICE",
|
||||||
|
config->usePushover() ? "Pushover" : "",
|
||||||
|
config->usePushover() && config->useTelegram() ? ", " : "",
|
||||||
|
config->useTelegram() ? "Telegram" : "");
|
||||||
|
|
||||||
|
#else
|
||||||
|
xmrig::Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") RED_BOLD("Unavailable requires TLS"), "PUSHSERVICE");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xmrig::Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") RED_BOLD("Disabled"), "PUSHSERVICE");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Summary::print()
|
void Summary::print(const std::shared_ptr<CCServerConfig>& config)
|
||||||
{
|
{
|
||||||
print_versions();
|
printVersions();
|
||||||
print_pushinfo();
|
printPushinfo(config);
|
||||||
print_commands();
|
printCommands();
|
||||||
}
|
}
|
||||||
|
|
30
src/cc/Summary.h
Normal file
30
src/cc/Summary.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/* XMRigCC
|
||||||
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIGCC_SUMMARY_H
|
||||||
|
#define XMRIGCC_SUMMARY_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include "CCServerConfig.h"
|
||||||
|
|
||||||
|
class Summary
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void print(const std::shared_ptr<CCServerConfig>& config);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XMRIGCC_SUMMARY_H */
|
97
src/cc/Timer.h
Normal file
97
src/cc/Timer.h
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/* XMRigCC
|
||||||
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __TIMER_H__
|
||||||
|
#define __TIMER_H__
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <chrono>
|
||||||
|
#include <functional>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
class Timer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Timer() {}
|
||||||
|
|
||||||
|
Timer(std::function<void(void)> func, uint64_t interval)
|
||||||
|
{
|
||||||
|
m_func = func;
|
||||||
|
m_interval = interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
~Timer()
|
||||||
|
{
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
void start()
|
||||||
|
{
|
||||||
|
m_running = true;
|
||||||
|
m_thread = std::thread([&]()
|
||||||
|
{
|
||||||
|
while (m_running)
|
||||||
|
{
|
||||||
|
auto delta = std::chrono::steady_clock::now() + std::chrono::milliseconds(m_interval);
|
||||||
|
std::this_thread::sleep_until(delta);
|
||||||
|
m_func();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
m_thread.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop()
|
||||||
|
{
|
||||||
|
m_running = false;
|
||||||
|
|
||||||
|
if (m_thread.joinable())
|
||||||
|
{
|
||||||
|
m_thread.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setFunction(std::function<void(void)> func)
|
||||||
|
{
|
||||||
|
m_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setInterval(uint64_t interval)
|
||||||
|
{
|
||||||
|
m_interval = interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isRunning()
|
||||||
|
{
|
||||||
|
return m_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t getInterval()
|
||||||
|
{
|
||||||
|
return m_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::function<void(void)> m_func;
|
||||||
|
std::thread m_thread;
|
||||||
|
|
||||||
|
uint64_t m_interval = 0;
|
||||||
|
bool m_running = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //__TIMER_H__
|
|
@ -1,5 +1,5 @@
|
||||||
/* XMRigCC
|
/* XMRigCC
|
||||||
* Copyright 2017- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
* Copyright 2019- BenDr0id <https://github.com/BenDr0id>, <ben@graef.in>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -15,10 +15,69 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <cxxopts/cxxopts.hpp>
|
||||||
#include "CCServer.h"
|
#include "CCServer.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
try
|
||||||
CCServer ccServer(argc, argv);
|
{
|
||||||
return ccServer.start();
|
cxxopts::Options options(argv[0] ,APP_NAME "Server " APP_VERSION);
|
||||||
|
options.positional_help("[optional args]");
|
||||||
|
options.show_positional_help();
|
||||||
|
|
||||||
|
options.add_options()
|
||||||
|
("b, bind", "The CC Server bind ip", cxxopts::value<std::string>()->default_value("0.0.0.0"))
|
||||||
|
("p, port", "The CC Server port", cxxopts::value<int>(), "N")
|
||||||
|
("U, user", "The CC Server admin user", cxxopts::value<std::string>())
|
||||||
|
("P, pass", "The CC Server admin pass", cxxopts::value<std::string>())
|
||||||
|
("T, token", "The CC Server access token for the CC Client", cxxopts::value<std::string>())
|
||||||
|
|
||||||
|
("t, tls", "Enable SSL/TLS support", cxxopts::value<bool>()->default_value("false"))
|
||||||
|
("K, key-file", "The private key file to use when TLS is ON", cxxopts::value<std::string>()->default_value("server.key"), "FILE")
|
||||||
|
("C, cert-file", "The cert file to use when TLS is ON", cxxopts::value<std::string>()->default_value("server.pem"), "FILE")
|
||||||
|
|
||||||
|
("B, background", "Run the Server in the background", cxxopts::value<bool>()->default_value("false"))
|
||||||
|
("S, syslog", "Log to the syslog", cxxopts::value<bool>()->default_value("false"))
|
||||||
|
("no-colors", "Disable colored output", cxxopts::value<bool>()->default_value("false"))
|
||||||
|
|
||||||
|
("pushover-user-key", "The user key for pushover notifications", cxxopts::value<std::string>())
|
||||||
|
("pushover-api-token", "The api token/keytoken of the application for pushover notification", cxxopts::value<std::string>())
|
||||||
|
("telegram-bot-token", "The bot token for telegram notifications", cxxopts::value<std::string>())
|
||||||
|
("telegram-chat-id", "The chat-id for telegram notifications", cxxopts::value<std::string>())
|
||||||
|
("push-miner-offline-info", "Push notification for offline miners and recovery", cxxopts::value<bool>()->default_value("true"))
|
||||||
|
("push-miner-zero-hash-info", "Push notification when miner reports 0 hashrate and recovers", cxxopts::value<bool>()->default_value("true"))
|
||||||
|
("push-periodic-mining-status", "Push every hour a status notification", cxxopts::value<bool>()->default_value("true"))
|
||||||
|
|
||||||
|
("custom-dashboard", "The custom dashboard to use", cxxopts::value<std::string>()->default_value("index.html"), "FILE")
|
||||||
|
("client-config-folder", "The CC Server access token for the CC Client", cxxopts::value<std::string>(), "FOLDER")
|
||||||
|
("log-file", "The log file to write", cxxopts::value<std::string>(), "FILE")
|
||||||
|
("client-log-lines-history", "Maximum lines of log history kept per miner", cxxopts::value<int>()->default_value("100"), "N")
|
||||||
|
|
||||||
|
("c, config", "The JSON-format configuration file to use", cxxopts::value<std::string>(), "FILE")
|
||||||
|
("h, help", "Print this help")
|
||||||
|
;
|
||||||
|
|
||||||
|
auto result = options.parse(argc, argv);
|
||||||
|
if (result.count("help"))
|
||||||
|
{
|
||||||
|
std::cout << options.help({""}) << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CCServer server(result);
|
||||||
|
ret = server.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const cxxopts::OptionException& e)
|
||||||
|
{
|
||||||
|
std::cout << "error parsing options: " << e.what() << std::endl;
|
||||||
|
ret = EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
"pools": [
|
"pools": [
|
||||||
{
|
{
|
||||||
"algo": null,
|
"algo": null,
|
||||||
|
"coin": null,
|
||||||
"url": "donate.graef.in:80",
|
"url": "donate.graef.in:80",
|
||||||
"user": "YOUR_WALLET_ADDRESS",
|
"user": "YOUR_WALLET_ADDRESS",
|
||||||
"pass": "x",
|
"pass": "x",
|
||||||
|
|
|
@ -3,14 +3,14 @@
|
||||||
"colors": true, // false to disable colored output
|
"colors": true, // false to disable colored output
|
||||||
"log-file": null, // log all output to a file
|
"log-file": null, // log all output to a file
|
||||||
"syslog": false, // use system log for output messages
|
"syslog": false, // use system log for output messages
|
||||||
"cc-server": {
|
"bind-ip": "0.0.0.0", // ip the CC Server will listens on
|
||||||
"port": 3344, // port the CC Server will listens on
|
"port": 3344, // port the CC Server will listens on
|
||||||
|
"user": "admin", // admin user for access CC Dashboard
|
||||||
|
"pass": "pass", // admin pass for access CC Dashboard
|
||||||
|
"access-token": "mySecret", // access token for CC Clients (should be set!!!)
|
||||||
"use-tls" : false, // use tls for CC communication (needs to be enabled on miners too)
|
"use-tls" : false, // use tls for CC communication (needs to be enabled on miners too)
|
||||||
"cert-file" : "server.pem", // when tls is turned on, use this to point to the right cert file
|
"cert-file" : "server.pem", // when tls is turned on, use this to point to the right cert file
|
||||||
"key-file" : "server.key", // when tls is turned on, use this to point to the right key file
|
"key-file" : "server.key", // when tls is turned on, use this to point to the right key file
|
||||||
"access-token": "mySecret", // access token for CC Clients (should be set!!!)
|
|
||||||
"user": "admin", // admin user for access CC Dashboard
|
|
||||||
"pass": "pass", // admin pass for access CC Dashboard
|
|
||||||
"client-config-folder" : null, // folder which contains the client-config files (null=current)
|
"client-config-folder" : null, // folder which contains the client-config files (null=current)
|
||||||
"client-log-lines-history" : 100, // maximum lines of log history kept per miner
|
"client-log-lines-history" : 100, // maximum lines of log history kept per miner
|
||||||
"custom-dashboard" : "index.html", // dashboard html file
|
"custom-dashboard" : "index.html", // dashboard html file
|
||||||
|
@ -24,4 +24,3 @@
|
||||||
"push-miner-zero-hash-info" : true, // push notification when miner reports 0 hashrate
|
"push-miner-zero-hash-info" : true, // push notification when miner reports 0 hashrate
|
||||||
"push-periodic-mining-status" : true // push periodic status notification (every hour)
|
"push-periodic-mining-status" : true // push periodic status notification (every hour)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -115,16 +115,15 @@ public:
|
||||||
{
|
{
|
||||||
active = true;
|
active = true;
|
||||||
|
|
||||||
|
if (reset) {
|
||||||
|
Nonce::reset(job.index());
|
||||||
|
}
|
||||||
|
|
||||||
for (IBackend *backend : backends) {
|
for (IBackend *backend : backends) {
|
||||||
backend->setJob(job);
|
backend->setJob(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reset) {
|
|
||||||
Nonce::reset(job.index());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Nonce::touch();
|
Nonce::touch();
|
||||||
}
|
|
||||||
|
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
Nonce::pause(false);;
|
Nonce::pause(false);;
|
||||||
|
@ -499,7 +498,6 @@ void xmrig::Miner::onRequest(IApiRequest &request)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_CC_CLIENT
|
#ifdef XMRIG_FEATURE_CC_CLIENT
|
||||||
void xmrig::Miner::onUpdateRequest(ClientStatus& clientStatus)
|
void xmrig::Miner::onUpdateRequest(ClientStatus& clientStatus)
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,6 +67,7 @@ R"===(
|
||||||
"pools": [
|
"pools": [
|
||||||
{
|
{
|
||||||
"algo": null,
|
"algo": null,
|
||||||
|
"coin": null,
|
||||||
"url": "donate.graef.in:80",
|
"url": "donate.graef.in:80",
|
||||||
"user": "YOUR_WALLET_ADDRESS",
|
"user": "YOUR_WALLET_ADDRESS",
|
||||||
"pass": "x",
|
"pass": "x",
|
||||||
|
@ -94,7 +95,7 @@ R"===(
|
||||||
"retry-pause": 5,
|
"retry-pause": 5,
|
||||||
"syslog": false,
|
"syslog": false,
|
||||||
"user-agent": null,
|
"user-agent": null,
|
||||||
"watch": false
|
"watch": true
|
||||||
}
|
}
|
||||||
)===";
|
)===";
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,6 +45,7 @@ static const char short_options[] = "a:c:kBp:Px:r:R:s:t:T:o:u:O:v:l:S";
|
||||||
|
|
||||||
static const option options[] = {
|
static const option options[] = {
|
||||||
{ "algo", 1, nullptr, IConfig::AlgorithmKey },
|
{ "algo", 1, nullptr, IConfig::AlgorithmKey },
|
||||||
|
{ "coin", 1, nullptr, IConfig::CoinKey },
|
||||||
{ "api-worker-id", 1, nullptr, IConfig::ApiWorkerIdKey },
|
{ "api-worker-id", 1, nullptr, IConfig::ApiWorkerIdKey },
|
||||||
{ "api-id", 1, nullptr, IConfig::ApiIdKey },
|
{ "api-id", 1, nullptr, IConfig::ApiIdKey },
|
||||||
{ "http-enabled", 0, nullptr, IConfig::HttpEnabledKey },
|
{ "http-enabled", 0, nullptr, IConfig::HttpEnabledKey },
|
||||||
|
|
|
@ -68,6 +68,7 @@ Options:\n\
|
||||||
rx/wow, rx/loki\n"
|
rx/wow, rx/loki\n"
|
||||||
#endif
|
#endif
|
||||||
"\
|
"\
|
||||||
|
--coin=COIN specify coin instead of algorithm\n\
|
||||||
-o, --url=URL URL of mining server\n\
|
-o, --url=URL URL of mining server\n\
|
||||||
-O, --userpass=U:P username:password pair for mining server\n\
|
-O, --userpass=U:P username:password pair for mining server\n\
|
||||||
-u, --user=USERNAME username for mining server\n\
|
-u, --user=USERNAME username for mining server\n\
|
||||||
|
|
|
@ -105,6 +105,43 @@ public:
|
||||||
return ((memory(algo) - 1) / 16) * 16;
|
return ((memory(algo) - 1) / 16) * 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline static Algorithm::Id base(Algorithm::Id algo)
|
||||||
|
{
|
||||||
|
switch (algo)
|
||||||
|
{
|
||||||
|
case Algorithm::CN_0:
|
||||||
|
case Algorithm::CN_XAO:
|
||||||
|
case Algorithm::CN_CONCEAL:
|
||||||
|
# ifdef XMRIG_ALGO_CN_LITE
|
||||||
|
case Algorithm::CN_LITE_0:
|
||||||
|
# endif
|
||||||
|
# ifdef XMRIG_ALGO_CN_HEAVY
|
||||||
|
case Algorithm::CN_HEAVY_0:
|
||||||
|
case Algorithm::CN_HEAVY_XHV:
|
||||||
|
# endif
|
||||||
|
return Algorithm::CN_0;
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_CN_GPU
|
||||||
|
case Algorithm::CN_GPU:
|
||||||
|
Algorithm::CN_GPU,
|
||||||
|
# endif
|
||||||
|
|
||||||
|
case Algorithm::CN_1:
|
||||||
|
case Algorithm::CN_FAST:
|
||||||
|
case Algorithm::CN_RTO:
|
||||||
|
# ifdef XMRIG_ALGO_CN_LITE
|
||||||
|
case Algorithm::CN_LITE_1:
|
||||||
|
# endif
|
||||||
|
# ifdef XMRIG_ALGO_CN_HEAVY
|
||||||
|
case Algorithm::CN_HEAVY_TUBE:
|
||||||
|
# endif
|
||||||
|
return Algorithm::CN_1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return Algorithm::CN_2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
constexpr const static size_t CN_MEMORY = 0x200000;
|
constexpr const static size_t CN_MEMORY = 0x200000;
|
||||||
constexpr const static uint32_t CN_ITER = 0x80000;
|
constexpr const static uint32_t CN_ITER = 0x80000;
|
||||||
|
|
|
@ -260,20 +260,6 @@ const static uint8_t test_output_double[160] = {
|
||||||
0x5E, 0x2E, 0xC1, 0x80, 0x89, 0x39, 0xB3, 0x54, 0x39, 0x52, 0x0E, 0x69, 0x3D, 0xF6, 0xC5, 0x4A
|
0x5E, 0x2E, 0xC1, 0x80, 0x89, 0x39, 0xB3, 0x54, 0x39, 0x52, 0x0E, 0x69, 0x3D, 0xF6, 0xC5, 0x4A
|
||||||
};
|
};
|
||||||
|
|
||||||
// "cn/conceal"
|
|
||||||
const static uint8_t test_output_conceal[160] = {
|
|
||||||
0xB3, 0xA1, 0x67, 0x86, 0xD2, 0xC9, 0x85, 0xEC, 0xAD, 0xC4, 0x5F, 0x91, 0x05, 0x27, 0xC7, 0xA1,
|
|
||||||
0x96, 0xF0, 0xE1, 0xE9, 0x7C, 0x87, 0x09, 0x38, 0x1D, 0x7D, 0x41, 0x93, 0x35, 0xF8, 0x16, 0x72,
|
|
||||||
0xC3, 0xBD, 0x8D, 0xE8, 0xD5, 0xAE, 0xB8, 0x59, 0x0A, 0x6C, 0xCB, 0x7B, 0x41, 0x30, 0xF7, 0x04,
|
|
||||||
0xA5, 0x7C, 0xF9, 0xCA, 0x20, 0x49, 0x9C, 0xFD, 0xE8, 0x43, 0xCF, 0x66, 0x78, 0xEA, 0x76, 0xDD,
|
|
||||||
0x91, 0x0C, 0xDE, 0x29, 0x2A, 0xE0, 0xA8, 0xCA, 0xBC, 0xAA, 0x53, 0x4C, 0x93, 0x3E, 0x7B, 0x2C,
|
|
||||||
0xF1, 0xF9, 0xE1, 0x98, 0xB2, 0x92, 0x1E, 0x19, 0x93, 0x2A, 0x74, 0x9D, 0xDB, 0x10, 0x0F, 0x16,
|
|
||||||
0xD5, 0x3D, 0xE4, 0xC4, 0x23, 0xD9, 0x2E, 0xFD, 0x79, 0x8D, 0x1E, 0x48, 0x4E, 0x46, 0x08, 0x6C,
|
|
||||||
0xFF, 0x8A, 0x49, 0xFA, 0x1E, 0xB0, 0xB6, 0x9A, 0x47, 0x1C, 0xC6, 0x30, 0x36, 0x5D, 0xFD, 0x76,
|
|
||||||
0x10, 0x07, 0x44, 0xE6, 0xC8, 0x20, 0x2A, 0x84, 0x9D, 0x70, 0x22, 0x00, 0x8B, 0x9B, 0xBD, 0x8D,
|
|
||||||
0x27, 0x49, 0xA6, 0x06, 0xDC, 0xF0, 0xA1, 0x4B, 0x50, 0xA0, 0x12, 0xCD, 0x77, 0x01, 0x4C, 0x28
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_LITE
|
#ifdef XMRIG_ALGO_CN_LITE
|
||||||
// "cn-lite/0"
|
// "cn-lite/0"
|
||||||
const static uint8_t test_output_v0_lite[160] = {
|
const static uint8_t test_output_v0_lite[160] = {
|
||||||
|
|
|
@ -116,9 +116,8 @@ static AlgoName const algorithm_names[] = {
|
||||||
{ "cryptonight-extremelite", nullptr, Algorithm::CN_EXTREMELITE_0},
|
{ "cryptonight-extremelite", nullptr, Algorithm::CN_EXTREMELITE_0},
|
||||||
# endif
|
# endif
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
{ "randomx/0", "rx/0", Algorithm::RX_0 },
|
||||||
{ "randomx/test", "rx/test", Algorithm::RX_0 },
|
{ "randomx/test", "rx/test", Algorithm::RX_0 },
|
||||||
{ "randomx/0", "rx/0", Algorithm::RX_0 },
|
|
||||||
{ "randomx/0", "rx/0", Algorithm::RX_0 },
|
|
||||||
{ "RandomX", "rx", Algorithm::RX_0 },
|
{ "RandomX", "rx", Algorithm::RX_0 },
|
||||||
{ "randomx/wow", "rx/wow", Algorithm::RX_WOW },
|
{ "randomx/wow", "rx/wow", Algorithm::RX_WOW },
|
||||||
{ "RandomWOW", nullptr, Algorithm::RX_WOW },
|
{ "RandomWOW", nullptr, Algorithm::RX_WOW },
|
||||||
|
|
103
src/crypto/common/Coin.cpp
Normal file
103
src/crypto/common/Coin.cpp
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "crypto/common/Coin.h"
|
||||||
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define strcasecmp _stricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
struct CoinName
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
const Coin::Id id;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static CoinName const coin_names[] = {
|
||||||
|
{ "monero", Coin::MONERO },
|
||||||
|
{ "xmr", Coin::MONERO },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::Algorithm::Id xmrig::Coin::algorithm(uint8_t blobVersion) const
|
||||||
|
{
|
||||||
|
if (id() == MONERO) {
|
||||||
|
return (blobVersion >= 12) ? Algorithm::RX_0 : Algorithm::CN_R;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Algorithm::INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::Coin::name() const
|
||||||
|
{
|
||||||
|
for (const auto &i : coin_names) {
|
||||||
|
if (i.id == m_id) {
|
||||||
|
return i.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rapidjson::Value xmrig::Coin::toJSON() const
|
||||||
|
{
|
||||||
|
using namespace rapidjson;
|
||||||
|
|
||||||
|
return isValid() ? Value(StringRef(name())) : Value(kNullType);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::Coin::Id xmrig::Coin::parse(const char *name)
|
||||||
|
{
|
||||||
|
if (name == nullptr || strlen(name) < 3) {
|
||||||
|
return INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &i : coin_names) {
|
||||||
|
if (strcasecmp(name, i.name) == 0) {
|
||||||
|
return i.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return INVALID;
|
||||||
|
}
|
75
src/crypto/common/Coin.h
Normal file
75
src/crypto/common/Coin.h
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_COIN_H
|
||||||
|
#define XMRIG_COIN_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "crypto/common/Algorithm.h"
|
||||||
|
#include "rapidjson/fwd.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class Coin
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Id : int {
|
||||||
|
INVALID = -1,
|
||||||
|
MONERO,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Coin() = default;
|
||||||
|
inline Coin(const char *name) : m_id(parse(name)) {}
|
||||||
|
inline Coin(Id id) : m_id(id) {}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool isEqual(const Coin &other) const { return m_id == other.m_id; }
|
||||||
|
inline bool isValid() const { return m_id != INVALID; }
|
||||||
|
inline Id id() const { return m_id; }
|
||||||
|
|
||||||
|
Algorithm::Id algorithm(uint8_t blobVersion) const;
|
||||||
|
const char *name() const;
|
||||||
|
rapidjson::Value toJSON() const;
|
||||||
|
|
||||||
|
inline bool operator!=(Coin::Id id) const { return m_id != id; }
|
||||||
|
inline bool operator!=(const Coin &other) const { return !isEqual(other); }
|
||||||
|
inline bool operator==(Coin::Id id) const { return m_id == id; }
|
||||||
|
inline bool operator==(const Coin &other) const { return isEqual(other); }
|
||||||
|
inline operator Coin::Id() const { return m_id; }
|
||||||
|
|
||||||
|
static Id parse(const char *name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Id m_id = INVALID;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_COIN_H */
|
|
@ -78,7 +78,6 @@ void xmrig::Nonce::reset(uint8_t index)
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
m_nonces[index] = 0;
|
m_nonces[index] = 0;
|
||||||
touch();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
mov rdx, rax
|
|
||||||
and eax, RANDOMX_SCRATCHPAD_MASK
|
|
||||||
lea rcx, [rsi+rax]
|
lea rcx, [rsi+rax]
|
||||||
push rcx
|
push rcx
|
||||||
xor r8, qword ptr [rcx+0]
|
xor r8, qword ptr [rcx+0]
|
||||||
|
@ -10,8 +8,6 @@
|
||||||
xor r13, qword ptr [rcx+40]
|
xor r13, qword ptr [rcx+40]
|
||||||
xor r14, qword ptr [rcx+48]
|
xor r14, qword ptr [rcx+48]
|
||||||
xor r15, qword ptr [rcx+56]
|
xor r15, qword ptr [rcx+56]
|
||||||
ror rdx, 32
|
|
||||||
and edx, RANDOMX_SCRATCHPAD_MASK
|
|
||||||
lea rcx, [rsi+rdx]
|
lea rcx, [rsi+rdx]
|
||||||
push rcx
|
push rcx
|
||||||
cvtdq2pd xmm0, qword ptr [rcx+0]
|
cvtdq2pd xmm0, qword ptr [rcx+0]
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
xor eax, eax
|
|
||||||
pop rcx
|
pop rcx
|
||||||
mov qword ptr [rcx+0], r8
|
mov qword ptr [rcx+0], r8
|
||||||
mov qword ptr [rcx+8], r9
|
mov qword ptr [rcx+8], r9
|
||||||
|
|
|
@ -12,6 +12,13 @@
|
||||||
mov rcx, rdi
|
mov rcx, rdi
|
||||||
mov rbp, qword ptr [rsi] ;# "mx", "ma"
|
mov rbp, qword ptr [rsi] ;# "mx", "ma"
|
||||||
mov rdi, qword ptr [rsi+8] ;# uint8_t* dataset
|
mov rdi, qword ptr [rsi+8] ;# uint8_t* dataset
|
||||||
|
|
||||||
|
;# dataset prefetch for the first iteration of the main loop
|
||||||
|
mov rax, rbp
|
||||||
|
shr rax, 32
|
||||||
|
and eax, RANDOMX_DATASET_BASE_MASK
|
||||||
|
prefetchnta byte ptr [rdi+rax]
|
||||||
|
|
||||||
mov rsi, rdx ;# uint8_t* scratchpad
|
mov rsi, rdx ;# uint8_t* scratchpad
|
||||||
|
|
||||||
mov rax, rbp
|
mov rax, rbp
|
||||||
|
|
|
@ -24,6 +24,13 @@
|
||||||
push rcx ;# RegisterFile& registerFile
|
push rcx ;# RegisterFile& registerFile
|
||||||
mov rbp, qword ptr [rdx] ;# "mx", "ma"
|
mov rbp, qword ptr [rdx] ;# "mx", "ma"
|
||||||
mov rdi, qword ptr [rdx+8] ;# uint8_t* dataset
|
mov rdi, qword ptr [rdx+8] ;# uint8_t* dataset
|
||||||
|
|
||||||
|
;# dataset prefetch for the first iteration of the main loop
|
||||||
|
mov rax, rbp
|
||||||
|
shr rax, 32
|
||||||
|
and eax, RANDOMX_DATASET_BASE_MASK
|
||||||
|
prefetchnta byte ptr [rdi+rax]
|
||||||
|
|
||||||
mov rsi, r8 ;# uint8_t* scratchpad
|
mov rsi, r8 ;# uint8_t* scratchpad
|
||||||
mov rbx, r9 ;# loop counter
|
mov rbx, r9 ;# loop counter
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,10 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define FORCE_INLINE __inline
|
#define FORCE_INLINE __forceinline
|
||||||
#elif defined(__GNUC__) || defined(__clang__)
|
#elif defined(__GNUC__)
|
||||||
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
#elif defined(__clang__)
|
||||||
#define FORCE_INLINE __inline__
|
#define FORCE_INLINE __inline__
|
||||||
#else
|
#else
|
||||||
#define FORCE_INLINE
|
#define FORCE_INLINE
|
||||||
|
|
|
@ -76,6 +76,8 @@ namespace randomx {
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const uint8_t* codePrefetchScratchpad = (uint8_t*)&randomx_prefetch_scratchpad;
|
||||||
|
const uint8_t* codePrefetchScratchpadEnd = (uint8_t*)&randomx_prefetch_scratchpad_end;
|
||||||
const uint8_t* codePrologue = (uint8_t*)&randomx_program_prologue;
|
const uint8_t* codePrologue = (uint8_t*)&randomx_program_prologue;
|
||||||
const uint8_t* codeLoopBegin = (uint8_t*)&randomx_program_loop_begin;
|
const uint8_t* codeLoopBegin = (uint8_t*)&randomx_program_loop_begin;
|
||||||
const uint8_t* codeLoopLoad = (uint8_t*)&randomx_program_loop_load;
|
const uint8_t* codeLoopLoad = (uint8_t*)&randomx_program_loop_load;
|
||||||
|
@ -93,6 +95,7 @@ namespace randomx {
|
||||||
const uint8_t* codeShhEnd = (uint8_t*)&randomx_sshash_end;
|
const uint8_t* codeShhEnd = (uint8_t*)&randomx_sshash_end;
|
||||||
const uint8_t* codeShhInit = (uint8_t*)&randomx_sshash_init;
|
const uint8_t* codeShhInit = (uint8_t*)&randomx_sshash_init;
|
||||||
|
|
||||||
|
const int32_t prefetchScratchpadSize = codePrefetchScratchpadEnd - codePrefetchScratchpad;
|
||||||
const int32_t prologueSize = codeLoopBegin - codePrologue;
|
const int32_t prologueSize = codeLoopBegin - codePrologue;
|
||||||
const int32_t loopLoadSize = codeProgamStart - codeLoopLoad;
|
const int32_t loopLoadSize = codeProgamStart - codeLoopLoad;
|
||||||
const int32_t readDatasetSize = codeReadDatasetLightSshInit - codeReadDataset;
|
const int32_t readDatasetSize = codeReadDatasetLightSshInit - codeReadDataset;
|
||||||
|
@ -160,7 +163,7 @@ namespace randomx {
|
||||||
static const uint8_t REX_MAXPD[] = { 0x66, 0x41, 0x0f, 0x5f };
|
static const uint8_t REX_MAXPD[] = { 0x66, 0x41, 0x0f, 0x5f };
|
||||||
static const uint8_t REX_DIVPD[] = { 0x66, 0x41, 0x0f, 0x5e };
|
static const uint8_t REX_DIVPD[] = { 0x66, 0x41, 0x0f, 0x5e };
|
||||||
static const uint8_t SQRTPD[] = { 0x66, 0x0f, 0x51 };
|
static const uint8_t SQRTPD[] = { 0x66, 0x0f, 0x51 };
|
||||||
static const uint8_t AND_OR_MOV_LDMXCSR[] = { 0x25, 0x00, 0x60, 0x00, 0x00, 0x0D, 0xC0, 0x9F, 0x00, 0x00, 0x50, 0x0F, 0xAE, 0x14, 0x24, 0x58 };
|
static const uint8_t AND_OR_MOV_LDMXCSR[] = { 0x25, 0x00, 0x60, 0x00, 0x00, 0x0D, 0xC0, 0x9F, 0x00, 0x00, 0x89, 0x44, 0x24, 0xFC, 0x0F, 0xAE, 0x54, 0x24, 0xFC };
|
||||||
static const uint8_t ROL_RAX[] = { 0x48, 0xc1, 0xc0 };
|
static const uint8_t ROL_RAX[] = { 0x48, 0xc1, 0xc0 };
|
||||||
static const uint8_t XOR_ECX_ECX[] = { 0x33, 0xC9 };
|
static const uint8_t XOR_ECX_ECX[] = { 0x33, 0xC9 };
|
||||||
static const uint8_t REX_CMP_R32I[] = { 0x41, 0x81 };
|
static const uint8_t REX_CMP_R32I[] = { 0x41, 0x81 };
|
||||||
|
@ -214,7 +217,7 @@ namespace randomx {
|
||||||
generateProgramPrologue(prog, pcfg);
|
generateProgramPrologue(prog, pcfg);
|
||||||
memcpy(code + codePos, RandomX_CurrentConfig.codeReadDatasetTweaked, readDatasetSize);
|
memcpy(code + codePos, RandomX_CurrentConfig.codeReadDatasetTweaked, readDatasetSize);
|
||||||
codePos += readDatasetSize;
|
codePos += readDatasetSize;
|
||||||
generateProgramEpilogue(prog);
|
generateProgramEpilogue(prog, pcfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitCompilerX86::generateProgramLight(Program& prog, ProgramConfiguration& pcfg, uint32_t datasetOffset) {
|
void JitCompilerX86::generateProgramLight(Program& prog, ProgramConfiguration& pcfg, uint32_t datasetOffset) {
|
||||||
|
@ -225,7 +228,7 @@ namespace randomx {
|
||||||
emitByte(CALL, code, codePos);
|
emitByte(CALL, code, codePos);
|
||||||
emit32(superScalarHashOffset - (codePos + 4), code, codePos);
|
emit32(superScalarHashOffset - (codePos + 4), code, codePos);
|
||||||
emit(codeReadDatasetLightSshFin, readDatasetLightFinSize, code, codePos);
|
emit(codeReadDatasetLightSshFin, readDatasetLightFinSize, code, codePos);
|
||||||
generateProgramEpilogue(prog);
|
generateProgramEpilogue(prog, pcfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t N>
|
template<size_t N>
|
||||||
|
@ -266,13 +269,16 @@ namespace randomx {
|
||||||
|
|
||||||
void JitCompilerX86::generateProgramPrologue(Program& prog, ProgramConfiguration& pcfg) {
|
void JitCompilerX86::generateProgramPrologue(Program& prog, ProgramConfiguration& pcfg) {
|
||||||
memset(registerUsage, -1, sizeof(registerUsage));
|
memset(registerUsage, -1, sizeof(registerUsage));
|
||||||
|
|
||||||
|
codePos = ((uint8_t*)randomx_program_prologue_first_load) - ((uint8_t*)randomx_program_prologue);
|
||||||
|
code[codePos + 2] = 0xc0 + pcfg.readReg0;
|
||||||
|
code[codePos + 5] = 0xc0 + pcfg.readReg1;
|
||||||
|
*(uint32_t*)(code + codePos + 10) = RandomX_CurrentConfig.ScratchpadL3Mask64_Calculated;
|
||||||
|
*(uint32_t*)(code + codePos + 20) = RandomX_CurrentConfig.ScratchpadL3Mask64_Calculated;
|
||||||
|
|
||||||
codePos = prologueSize;
|
codePos = prologueSize;
|
||||||
memcpy(code + codePos - 48, &pcfg.eMask, sizeof(pcfg.eMask));
|
memcpy(code + codePos - 48, &pcfg.eMask, sizeof(pcfg.eMask));
|
||||||
emit(REX_XOR_RAX_R64, code, codePos);
|
memcpy(code + codePos, codeLoopLoad, loopLoadSize);
|
||||||
emitByte(0xc0 + pcfg.readReg0, code, codePos);
|
|
||||||
emit(REX_XOR_RAX_R64, code, codePos);
|
|
||||||
emitByte(0xc0 + pcfg.readReg1, code, codePos);
|
|
||||||
memcpy(code + codePos, RandomX_CurrentConfig.codeLoopLoadTweaked, loopLoadSize);
|
|
||||||
codePos += loopLoadSize;
|
codePos += loopLoadSize;
|
||||||
for (unsigned i = 0; i < prog.getSize(); ++i) {
|
for (unsigned i = 0; i < prog.getSize(); ++i) {
|
||||||
Instruction& instr = prog(i);
|
Instruction& instr = prog(i);
|
||||||
|
@ -287,7 +293,12 @@ namespace randomx {
|
||||||
emitByte(0xc0 + pcfg.readReg3, code, codePos);
|
emitByte(0xc0 + pcfg.readReg3, code, codePos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitCompilerX86::generateProgramEpilogue(Program& prog) {
|
void JitCompilerX86::generateProgramEpilogue(Program& prog, ProgramConfiguration& pcfg) {
|
||||||
|
emit(REX_MOV_RR64, code, codePos);
|
||||||
|
emitByte(0xc0 + pcfg.readReg0, code, codePos);
|
||||||
|
emit(REX_XOR_RAX_R64, code, codePos);
|
||||||
|
emitByte(0xc0 + pcfg.readReg1, code, codePos);
|
||||||
|
emit(RandomX_CurrentConfig.codePrefetchScratchpadTweaked, prefetchScratchpadSize, code, codePos);
|
||||||
memcpy(code + codePos, codeLoopStore, loopStoreSize);
|
memcpy(code + codePos, codeLoopStore, loopStoreSize);
|
||||||
codePos += loopStoreSize;
|
codePos += loopStoreSize;
|
||||||
emit(SUB_EBX, code, codePos);
|
emit(SUB_EBX, code, codePos);
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace randomx {
|
||||||
int32_t codePos;
|
int32_t codePos;
|
||||||
|
|
||||||
void generateProgramPrologue(Program&, ProgramConfiguration&);
|
void generateProgramPrologue(Program&, ProgramConfiguration&);
|
||||||
void generateProgramEpilogue(Program&);
|
void generateProgramEpilogue(Program&, ProgramConfiguration&);
|
||||||
static void genAddressReg(Instruction&, uint8_t* code, int& codePos, bool rax = true);
|
static void genAddressReg(Instruction&, uint8_t* code, int& codePos, bool rax = true);
|
||||||
static void genAddressRegDst(Instruction&, uint8_t* code, int& codePos);
|
static void genAddressRegDst(Instruction&, uint8_t* code, int& codePos);
|
||||||
static void genAddressImm(Instruction&, uint8_t* code, int& codePos);
|
static void genAddressImm(Instruction&, uint8_t* code, int& codePos);
|
||||||
|
|
|
@ -37,7 +37,10 @@
|
||||||
#define WINABI
|
#define WINABI
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
.global DECL(randomx_prefetch_scratchpad)
|
||||||
|
.global DECL(randomx_prefetch_scratchpad_end)
|
||||||
.global DECL(randomx_program_prologue)
|
.global DECL(randomx_program_prologue)
|
||||||
|
.global DECL(randomx_program_prologue_first_load)
|
||||||
.global DECL(randomx_program_loop_begin)
|
.global DECL(randomx_program_loop_begin)
|
||||||
.global DECL(randomx_program_loop_load)
|
.global DECL(randomx_program_loop_load)
|
||||||
.global DECL(randomx_program_start)
|
.global DECL(randomx_program_start)
|
||||||
|
@ -61,6 +64,16 @@
|
||||||
|
|
||||||
#define db .byte
|
#define db .byte
|
||||||
|
|
||||||
|
DECL(randomx_prefetch_scratchpad):
|
||||||
|
mov rdx, rax
|
||||||
|
and eax, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
prefetcht0 [rsi+rax]
|
||||||
|
ror rdx, 32
|
||||||
|
and edx, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
prefetcht0 [rsi+rdx]
|
||||||
|
|
||||||
|
DECL(randomx_prefetch_scratchpad_end):
|
||||||
|
|
||||||
.balign 64
|
.balign 64
|
||||||
DECL(randomx_program_prologue):
|
DECL(randomx_program_prologue):
|
||||||
#if defined(WINABI)
|
#if defined(WINABI)
|
||||||
|
@ -71,6 +84,14 @@ DECL(randomx_program_prologue):
|
||||||
movapd xmm13, xmmword ptr [mantissaMask+rip]
|
movapd xmm13, xmmword ptr [mantissaMask+rip]
|
||||||
movapd xmm14, xmmword ptr [exp240+rip]
|
movapd xmm14, xmmword ptr [exp240+rip]
|
||||||
movapd xmm15, xmmword ptr [scaleMask+rip]
|
movapd xmm15, xmmword ptr [scaleMask+rip]
|
||||||
|
|
||||||
|
DECL(randomx_program_prologue_first_load):
|
||||||
|
xor rax, r8
|
||||||
|
xor rax, r8
|
||||||
|
mov rdx, rax
|
||||||
|
and eax, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
ror rdx, 32
|
||||||
|
and edx, RANDOMX_SCRATCHPAD_MASK
|
||||||
jmp DECL(randomx_program_loop_begin)
|
jmp DECL(randomx_program_loop_begin)
|
||||||
|
|
||||||
.balign 64
|
.balign 64
|
||||||
|
|
|
@ -28,7 +28,10 @@ IFDEF RAX
|
||||||
|
|
||||||
_RANDOMX_JITX86_STATIC SEGMENT PAGE READ EXECUTE
|
_RANDOMX_JITX86_STATIC SEGMENT PAGE READ EXECUTE
|
||||||
|
|
||||||
|
PUBLIC randomx_prefetch_scratchpad
|
||||||
|
PUBLIC randomx_prefetch_scratchpad_end
|
||||||
PUBLIC randomx_program_prologue
|
PUBLIC randomx_program_prologue
|
||||||
|
PUBLIC randomx_program_prologue_first_load
|
||||||
PUBLIC randomx_program_loop_begin
|
PUBLIC randomx_program_loop_begin
|
||||||
PUBLIC randomx_program_loop_load
|
PUBLIC randomx_program_loop_load
|
||||||
PUBLIC randomx_program_start
|
PUBLIC randomx_program_start
|
||||||
|
@ -50,15 +53,36 @@ RANDOMX_SCRATCHPAD_MASK EQU 2097088
|
||||||
RANDOMX_DATASET_BASE_MASK EQU 2147483584
|
RANDOMX_DATASET_BASE_MASK EQU 2147483584
|
||||||
RANDOMX_CACHE_MASK EQU 4194303
|
RANDOMX_CACHE_MASK EQU 4194303
|
||||||
|
|
||||||
|
randomx_prefetch_scratchpad PROC
|
||||||
|
mov rdx, rax
|
||||||
|
and eax, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
prefetcht0 [rsi+rax]
|
||||||
|
ror rdx, 32
|
||||||
|
and edx, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
prefetcht0 [rsi+rdx]
|
||||||
|
randomx_prefetch_scratchpad ENDP
|
||||||
|
|
||||||
|
randomx_prefetch_scratchpad_end PROC
|
||||||
|
randomx_prefetch_scratchpad_end ENDP
|
||||||
|
|
||||||
ALIGN 64
|
ALIGN 64
|
||||||
randomx_program_prologue PROC
|
randomx_program_prologue PROC
|
||||||
include asm/program_prologue_win64.inc
|
include asm/program_prologue_win64.inc
|
||||||
movapd xmm13, xmmword ptr [mantissaMask]
|
movapd xmm13, xmmword ptr [mantissaMask]
|
||||||
movapd xmm14, xmmword ptr [exp240]
|
movapd xmm14, xmmword ptr [exp240]
|
||||||
movapd xmm15, xmmword ptr [scaleMask]
|
movapd xmm15, xmmword ptr [scaleMask]
|
||||||
jmp randomx_program_loop_begin
|
|
||||||
randomx_program_prologue ENDP
|
randomx_program_prologue ENDP
|
||||||
|
|
||||||
|
randomx_program_prologue_first_load PROC
|
||||||
|
xor rax, r8
|
||||||
|
xor rax, r8
|
||||||
|
mov rdx, rax
|
||||||
|
and eax, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
ror rdx, 32
|
||||||
|
and edx, RANDOMX_SCRATCHPAD_MASK
|
||||||
|
jmp randomx_program_loop_begin
|
||||||
|
randomx_program_prologue_first_load ENDP
|
||||||
|
|
||||||
ALIGN 64
|
ALIGN 64
|
||||||
include asm/program_xmm_constants.inc
|
include asm/program_xmm_constants.inc
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
void randomx_prefetch_scratchpad();
|
||||||
|
void randomx_prefetch_scratchpad_end();
|
||||||
void randomx_program_prologue();
|
void randomx_program_prologue();
|
||||||
|
void randomx_program_prologue_first_load();
|
||||||
void randomx_program_loop_begin();
|
void randomx_program_loop_begin();
|
||||||
void randomx_program_loop_load();
|
void randomx_program_loop_load();
|
||||||
void randomx_program_start();
|
void randomx_program_start();
|
||||||
|
|
|
@ -149,9 +149,9 @@ RandomX_ConfigurationBase::RandomX_ConfigurationBase()
|
||||||
memcpy(codeReadDatasetLightSshInitTweaked, a, b - a);
|
memcpy(codeReadDatasetLightSshInitTweaked, a, b - a);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const uint8_t* a = (const uint8_t*)&randomx_program_loop_load;
|
const uint8_t* a = (const uint8_t*)&randomx_prefetch_scratchpad;
|
||||||
const uint8_t* b = (const uint8_t*)&randomx_program_start;
|
const uint8_t* b = (const uint8_t*)&randomx_prefetch_scratchpad_end;
|
||||||
memcpy(codeLoopLoadTweaked, a, b - a);
|
memcpy(codePrefetchScratchpadTweaked, a, b - a);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -177,8 +177,8 @@ void RandomX_ConfigurationBase::Apply()
|
||||||
ScratchpadL3Mask64_Calculated = ((ScratchpadL3_Size / sizeof(uint64_t)) / 8 - 1) * 64;
|
ScratchpadL3Mask64_Calculated = ((ScratchpadL3_Size / sizeof(uint64_t)) / 8 - 1) * 64;
|
||||||
|
|
||||||
#if defined(_M_X64) || defined(__x86_64__)
|
#if defined(_M_X64) || defined(__x86_64__)
|
||||||
*(uint32_t*)(codeLoopLoadTweaked + 4) = ScratchpadL3Mask64_Calculated;
|
*(uint32_t*)(codePrefetchScratchpadTweaked + 4) = ScratchpadL3Mask64_Calculated;
|
||||||
*(uint32_t*)(codeLoopLoadTweaked + 50) = ScratchpadL3Mask64_Calculated;
|
*(uint32_t*)(codePrefetchScratchpadTweaked + 18) = ScratchpadL3Mask64_Calculated;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ConditionMask_Calculated = (1 << JumpBits) - 1;
|
ConditionMask_Calculated = (1 << JumpBits) - 1;
|
||||||
|
|
|
@ -116,7 +116,7 @@ struct RandomX_ConfigurationBase
|
||||||
uint8_t codeShhPrefetchTweaked[20];
|
uint8_t codeShhPrefetchTweaked[20];
|
||||||
uint8_t codeReadDatasetTweaked[64];
|
uint8_t codeReadDatasetTweaked[64];
|
||||||
uint8_t codeReadDatasetLightSshInitTweaked[68];
|
uint8_t codeReadDatasetLightSshInitTweaked[68];
|
||||||
uint8_t codeLoopLoadTweaked[140];
|
uint8_t codePrefetchScratchpadTweaked[32];
|
||||||
|
|
||||||
uint32_t CacheLineAlignMask_Calculated;
|
uint32_t CacheLineAlignMask_Calculated;
|
||||||
uint32_t DatasetExtraItems_Calculated;
|
uint32_t DatasetExtraItems_Calculated;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2018-2019, tevador <tevador@gmail.com>
|
Copyright (c) 2018-2019, tevador <tevador@gmail.com>
|
||||||
|
Copyright (c) 2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
@ -28,337 +29,91 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "crypto/randomx/soft_aes.h"
|
#include "crypto/randomx/soft_aes.h"
|
||||||
|
|
||||||
alignas(16) const uint8_t sbox[256] = {
|
alignas(64) uint32_t lutEnc0[256];
|
||||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
alignas(64) uint32_t lutEnc1[256];
|
||||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
|
alignas(64) uint32_t lutEnc2[256];
|
||||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
|
alignas(64) uint32_t lutEnc3[256];
|
||||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
|
|
||||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
|
|
||||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
|
|
||||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
|
|
||||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
|
|
||||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
|
|
||||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
|
|
||||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
|
|
||||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
|
|
||||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
|
||||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
|
|
||||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
|
|
||||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutEnc0[256] = {
|
alignas(64) uint32_t lutDec0[256];
|
||||||
0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
|
alignas(64) uint32_t lutDec1[256];
|
||||||
0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec,
|
alignas(64) uint32_t lutDec2[256];
|
||||||
0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb,
|
alignas(64) uint32_t lutDec3[256];
|
||||||
0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b,
|
|
||||||
0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83,
|
|
||||||
0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a,
|
|
||||||
0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f,
|
|
||||||
0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea,
|
|
||||||
0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b,
|
|
||||||
0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
|
|
||||||
0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6,
|
|
||||||
0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85,
|
|
||||||
0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511,
|
|
||||||
0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b,
|
|
||||||
0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1,
|
|
||||||
0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf,
|
|
||||||
0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e,
|
|
||||||
0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6,
|
|
||||||
0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b,
|
|
||||||
0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
|
|
||||||
0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8,
|
|
||||||
0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2,
|
|
||||||
0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949,
|
|
||||||
0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810,
|
|
||||||
0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
|
|
||||||
0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f,
|
|
||||||
0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c,
|
|
||||||
0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27,
|
|
||||||
0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433,
|
|
||||||
0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
|
|
||||||
0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0,
|
|
||||||
0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutEnc1[256] = {
|
static uint32_t mul_gf2(uint32_t b, uint32_t c)
|
||||||
0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154,
|
{
|
||||||
0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d, 0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a,
|
uint32_t s = 0;
|
||||||
0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b,
|
for (uint32_t i = b, j = c, k = 1; (k < 0x100) && j; k <<= 1)
|
||||||
0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b,
|
{
|
||||||
0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f,
|
if (j & k)
|
||||||
0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f,
|
{
|
||||||
0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, 0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5,
|
s ^= i;
|
||||||
0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f,
|
j ^= k;
|
||||||
0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb,
|
|
||||||
0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397,
|
|
||||||
0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, 0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed,
|
|
||||||
0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a,
|
|
||||||
0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194,
|
|
||||||
0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81, 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3,
|
|
||||||
0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104,
|
|
||||||
0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d,
|
|
||||||
0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f, 0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39,
|
|
||||||
0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695,
|
|
||||||
0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83,
|
|
||||||
0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76,
|
|
||||||
0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, 0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4,
|
|
||||||
0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b,
|
|
||||||
0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0,
|
|
||||||
0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018,
|
|
||||||
0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751,
|
|
||||||
0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, 0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85,
|
|
||||||
0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, 0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12,
|
|
||||||
0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9,
|
|
||||||
0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, 0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7,
|
|
||||||
0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a,
|
|
||||||
0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8,
|
|
||||||
0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11, 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutEnc2[256] = {
|
|
||||||
0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5,
|
|
||||||
0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b, 0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76,
|
|
||||||
0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0,
|
|
||||||
0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0,
|
|
||||||
0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc,
|
|
||||||
0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15,
|
|
||||||
0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, 0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a,
|
|
||||||
0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75,
|
|
||||||
0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, 0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0,
|
|
||||||
0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784,
|
|
||||||
0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, 0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b,
|
|
||||||
0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf,
|
|
||||||
0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485,
|
|
||||||
0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f, 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8,
|
|
||||||
0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5,
|
|
||||||
0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2,
|
|
||||||
0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec, 0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917,
|
|
||||||
0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573,
|
|
||||||
0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, 0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388,
|
|
||||||
0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db,
|
|
||||||
0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, 0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c,
|
|
||||||
0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79,
|
|
||||||
0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9,
|
|
||||||
0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808,
|
|
||||||
0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6,
|
|
||||||
0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, 0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a,
|
|
||||||
0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, 0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e,
|
|
||||||
0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e,
|
|
||||||
0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, 0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794,
|
|
||||||
0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
|
|
||||||
0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868,
|
|
||||||
0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f, 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutEnc3[256] = {
|
|
||||||
0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5,
|
|
||||||
0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b, 0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676,
|
|
||||||
0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0,
|
|
||||||
0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0,
|
|
||||||
0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc,
|
|
||||||
0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515,
|
|
||||||
0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, 0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a,
|
|
||||||
0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575,
|
|
||||||
0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0,
|
|
||||||
0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484,
|
|
||||||
0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, 0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b,
|
|
||||||
0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf,
|
|
||||||
0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585,
|
|
||||||
0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f, 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8,
|
|
||||||
0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f, 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5,
|
|
||||||
0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2,
|
|
||||||
0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, 0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717,
|
|
||||||
0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373,
|
|
||||||
0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888,
|
|
||||||
0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb,
|
|
||||||
0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c,
|
|
||||||
0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979,
|
|
||||||
0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9,
|
|
||||||
0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808,
|
|
||||||
0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6,
|
|
||||||
0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, 0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a,
|
|
||||||
0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, 0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e,
|
|
||||||
0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e,
|
|
||||||
0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, 0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494,
|
|
||||||
0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
|
|
||||||
0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868,
|
|
||||||
0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutDec0[256] = {
|
|
||||||
0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
|
|
||||||
0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5,
|
|
||||||
0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b,
|
|
||||||
0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e,
|
|
||||||
0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
|
|
||||||
0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9,
|
|
||||||
0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566,
|
|
||||||
0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3, 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed,
|
|
||||||
0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4,
|
|
||||||
0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd,
|
|
||||||
0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060,
|
|
||||||
0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879,
|
|
||||||
0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000, 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c,
|
|
||||||
0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624,
|
|
||||||
0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
|
|
||||||
0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14,
|
|
||||||
0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b,
|
|
||||||
0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684,
|
|
||||||
0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177,
|
|
||||||
0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
|
|
||||||
0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f,
|
|
||||||
0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382,
|
|
||||||
0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb,
|
|
||||||
0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef,
|
|
||||||
0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
|
|
||||||
0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117,
|
|
||||||
0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546,
|
|
||||||
0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d,
|
|
||||||
0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a,
|
|
||||||
0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
|
|
||||||
0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff,
|
|
||||||
0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutDec1[256] = {
|
|
||||||
0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x03e34b93,
|
|
||||||
0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525, 0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f,
|
|
||||||
0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1, 0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6,
|
|
||||||
0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da, 0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44,
|
|
||||||
0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd, 0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4,
|
|
||||||
0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245, 0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994,
|
|
||||||
0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7, 0xd373ab23, 0x024b72e2, 0x8f1fe357, 0xab55662a,
|
|
||||||
0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5, 0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c,
|
|
||||||
0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1, 0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a,
|
|
||||||
0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475, 0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51,
|
|
||||||
0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46, 0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff,
|
|
||||||
0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777, 0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db,
|
|
||||||
0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000, 0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e,
|
|
||||||
0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627, 0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a,
|
|
||||||
0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e, 0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16,
|
|
||||||
0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d, 0x0d090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8,
|
|
||||||
0x19f15785, 0x0775af4c, 0xdd99eebb, 0x607fa3fd, 0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34,
|
|
||||||
0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863, 0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420,
|
|
||||||
0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d, 0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0,
|
|
||||||
0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722, 0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef,
|
|
||||||
0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836, 0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4,
|
|
||||||
0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462, 0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5,
|
|
||||||
0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3, 0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b,
|
|
||||||
0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8, 0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6,
|
|
||||||
0x9be7bad9, 0x366f4ace, 0x099fead4, 0x7cb029d6, 0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0,
|
|
||||||
0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315, 0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f,
|
|
||||||
0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x0496e4df, 0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f,
|
|
||||||
0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e, 0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13,
|
|
||||||
0x61d79a8c, 0x0ca1377a, 0x14f8598e, 0x3c13eb89, 0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c,
|
|
||||||
0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf, 0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
|
|
||||||
0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f, 0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41,
|
|
||||||
0x01a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490, 0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutDec2[256] = {
|
|
||||||
0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e, 0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303,
|
|
||||||
0x302055fa, 0x76adf66d, 0xcc889176, 0x02f5254c, 0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3,
|
|
||||||
0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0, 0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9,
|
|
||||||
0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59, 0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8,
|
|
||||||
0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71, 0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a,
|
|
||||||
0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f, 0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b,
|
|
||||||
0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8, 0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab,
|
|
||||||
0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508, 0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82,
|
|
||||||
0xcf8a2b1c, 0x79a792b4, 0x07f3f0f2, 0x694ea1e2, 0xda65cdf4, 0x0506d5be, 0x34d11f62, 0xa6c48afe,
|
|
||||||
0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb, 0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110,
|
|
||||||
0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd, 0x5491b58d, 0xc471055d, 0x06046fd4, 0x5060ff15,
|
|
||||||
0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e, 0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee,
|
|
||||||
0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000, 0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72,
|
|
||||||
0x0efdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739, 0x0f0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e,
|
|
||||||
0x0a0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91, 0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a,
|
|
||||||
0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17, 0x090e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9,
|
|
||||||
0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60, 0x01f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e,
|
|
||||||
0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1, 0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011,
|
|
||||||
0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1, 0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3,
|
|
||||||
0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264, 0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90,
|
|
||||||
0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b, 0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf,
|
|
||||||
0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246, 0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af,
|
|
||||||
0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312, 0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb,
|
|
||||||
0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a, 0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8,
|
|
||||||
0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c, 0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066,
|
|
||||||
0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8, 0x04f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6,
|
|
||||||
0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04, 0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51,
|
|
||||||
0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41, 0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347,
|
|
||||||
0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c, 0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1,
|
|
||||||
0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37, 0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
|
|
||||||
0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40, 0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0x0dff4195,
|
|
||||||
0xa8397101, 0x0c08deb3, 0xb4d89ce4, 0x566490c1, 0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257,
|
|
||||||
};
|
|
||||||
|
|
||||||
alignas(16) const uint32_t lutDec3[256] = {
|
|
||||||
0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3,
|
|
||||||
0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02, 0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362,
|
|
||||||
0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe, 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
|
|
||||||
0x03e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952, 0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9,
|
|
||||||
0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9, 0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace,
|
|
||||||
0x63184adf, 0xe582311a, 0x97603351, 0x62457f53, 0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08,
|
|
||||||
0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b, 0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55,
|
|
||||||
0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837, 0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216,
|
|
||||||
0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269, 0x65cdf4da, 0x06d5be05, 0xd11f6234, 0xc48afea6,
|
|
||||||
0x349d532e, 0xa2a055f3, 0x0532e18a, 0xa475ebf6, 0x0b39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e,
|
|
||||||
0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6, 0x91b58d54, 0x71055dc4, 0x046fd406, 0x60ff1550,
|
|
||||||
0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9, 0xb0bd42e8, 0x07888b89, 0xe7385b19, 0x79dbeec8,
|
|
||||||
0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000, 0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a,
|
|
||||||
0xfdfbff0e, 0x0f563885, 0x3d1ed5ae, 0x3627392d, 0x0a64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36,
|
|
||||||
0x0cb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b, 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
|
|
||||||
0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b, 0x0e0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e,
|
|
||||||
0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f, 0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb,
|
|
||||||
0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4, 0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6,
|
|
||||||
0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129, 0x1d4b2f9e, 0xdcf330b2, 0x0dec5286, 0x77d0e3c1,
|
|
||||||
0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9, 0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033,
|
|
||||||
0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4, 0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
|
|
||||||
0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e, 0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3,
|
|
||||||
0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225, 0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b,
|
|
||||||
0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f, 0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815,
|
|
||||||
0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0, 0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2,
|
|
||||||
0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7, 0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691,
|
|
||||||
0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496, 0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165,
|
|
||||||
0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b, 0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6,
|
|
||||||
0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13, 0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147,
|
|
||||||
0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7, 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
|
|
||||||
0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d,
|
|
||||||
0x397101a8, 0x08deb30c, 0xd89ce4b4, 0x6490c156, 0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8,
|
|
||||||
};
|
|
||||||
|
|
||||||
rx_vec_i128 soft_aesenc(rx_vec_i128 in, rx_vec_i128 key) {
|
|
||||||
uint32_t s0, s1, s2, s3;
|
|
||||||
|
|
||||||
s0 = rx_vec_i128_w(in);
|
|
||||||
s1 = rx_vec_i128_z(in);
|
|
||||||
s2 = rx_vec_i128_y(in);
|
|
||||||
s3 = rx_vec_i128_x(in);
|
|
||||||
|
|
||||||
rx_vec_i128 out = rx_set_int_vec_i128(
|
|
||||||
(lutEnc0[s0 & 0xff] ^ lutEnc1[(s3 >> 8) & 0xff] ^ lutEnc2[(s2 >> 16) & 0xff] ^ lutEnc3[s1 >> 24]),
|
|
||||||
(lutEnc0[s1 & 0xff] ^ lutEnc1[(s0 >> 8) & 0xff] ^ lutEnc2[(s3 >> 16) & 0xff] ^ lutEnc3[s2 >> 24]),
|
|
||||||
(lutEnc0[s2 & 0xff] ^ lutEnc1[(s1 >> 8) & 0xff] ^ lutEnc2[(s0 >> 16) & 0xff] ^ lutEnc3[s3 >> 24]),
|
|
||||||
(lutEnc0[s3 & 0xff] ^ lutEnc1[(s2 >> 8) & 0xff] ^ lutEnc2[(s1 >> 16) & 0xff] ^ lutEnc3[s0 >> 24])
|
|
||||||
);
|
|
||||||
|
|
||||||
return rx_xor_vec_i128(out, key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rx_vec_i128 soft_aesdec(rx_vec_i128 in, rx_vec_i128 key) {
|
i <<= 1;
|
||||||
uint32_t s0, s1, s2, s3;
|
if (i & 0x100)
|
||||||
|
i ^= (1 << 8) | (1 << 4) | (1 << 3) | (1 << 1) | (1 << 0);
|
||||||
s0 = rx_vec_i128_w(in);
|
|
||||||
s1 = rx_vec_i128_z(in);
|
|
||||||
s2 = rx_vec_i128_y(in);
|
|
||||||
s3 = rx_vec_i128_x(in);
|
|
||||||
|
|
||||||
rx_vec_i128 out = rx_set_int_vec_i128(
|
|
||||||
(lutDec0[s0 & 0xff] ^ lutDec1[(s1 >> 8) & 0xff] ^ lutDec2[(s2 >> 16) & 0xff] ^ lutDec3[s3 >> 24]),
|
|
||||||
(lutDec0[s1 & 0xff] ^ lutDec1[(s2 >> 8) & 0xff] ^ lutDec2[(s3 >> 16) & 0xff] ^ lutDec3[s0 >> 24]),
|
|
||||||
(lutDec0[s2 & 0xff] ^ lutDec1[(s3 >> 8) & 0xff] ^ lutDec2[(s0 >> 16) & 0xff] ^ lutDec3[s1 >> 24]),
|
|
||||||
(lutDec0[s3 & 0xff] ^ lutDec1[(s0 >> 8) & 0xff] ^ lutDec2[(s1 >> 16) & 0xff] ^ lutDec3[s2 >> 24])
|
|
||||||
);
|
|
||||||
|
|
||||||
return rx_xor_vec_i128(out, key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ROTL8(x,shift) ((uint8_t) ((x) << (shift)) | ((x) >> (8 - (shift))))
|
||||||
|
|
||||||
|
static struct SAESInitializer
|
||||||
|
{
|
||||||
|
SAESInitializer()
|
||||||
|
{
|
||||||
|
static uint8_t sbox[256];
|
||||||
|
static uint8_t sbox_reverse[256];
|
||||||
|
|
||||||
|
uint8_t p = 1, q = 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
p = p ^ (p << 1) ^ (p & 0x80 ? 0x1B : 0);
|
||||||
|
|
||||||
|
q ^= q << 1;
|
||||||
|
q ^= q << 2;
|
||||||
|
q ^= q << 4;
|
||||||
|
q ^= (q & 0x80) ? 0x09 : 0;
|
||||||
|
|
||||||
|
const uint8_t value = q ^ ROTL8(q, 1) ^ ROTL8(q, 2) ^ ROTL8(q, 3) ^ ROTL8(q, 4) ^ 0x63;
|
||||||
|
sbox[p] = value;
|
||||||
|
sbox_reverse[value] = p;
|
||||||
|
} while (p != 1);
|
||||||
|
|
||||||
|
sbox[0] = 0x63;
|
||||||
|
sbox_reverse[0x63] = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < 0x100; ++i)
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint32_t w;
|
||||||
|
uint8_t p[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t s = sbox[i];
|
||||||
|
p[0] = mul_gf2(s, 2);
|
||||||
|
p[1] = s;
|
||||||
|
p[2] = s;
|
||||||
|
p[3] = mul_gf2(s, 3);
|
||||||
|
|
||||||
|
lutEnc0[i] = w; w = (w << 8) | (w >> 24);
|
||||||
|
lutEnc1[i] = w; w = (w << 8) | (w >> 24);
|
||||||
|
lutEnc2[i] = w; w = (w << 8) | (w >> 24);
|
||||||
|
lutEnc3[i] = w;
|
||||||
|
|
||||||
|
s = sbox_reverse[i];
|
||||||
|
p[0] = mul_gf2(s, 0xe);
|
||||||
|
p[1] = mul_gf2(s, 0x9);
|
||||||
|
p[2] = mul_gf2(s, 0xd);
|
||||||
|
p[3] = mul_gf2(s, 0xb);
|
||||||
|
|
||||||
|
lutDec0[i] = w; w = (w << 8) | (w >> 24);
|
||||||
|
lutDec1[i] = w; w = (w << 8) | (w >> 24);
|
||||||
|
lutDec2[i] = w; w = (w << 8) | (w >> 24);
|
||||||
|
lutDec3[i] = w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} aes_initializer;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2018-2019, tevador <tevador@gmail.com>
|
Copyright (c) 2018-2019, tevador <tevador@gmail.com>
|
||||||
|
Copyright (c) 2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
@ -31,16 +32,80 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "crypto/randomx/intrin_portable.h"
|
#include "crypto/randomx/intrin_portable.h"
|
||||||
|
|
||||||
rx_vec_i128 soft_aesenc(rx_vec_i128 in, rx_vec_i128 key);
|
extern uint32_t lutEnc0[256];
|
||||||
|
extern uint32_t lutEnc1[256];
|
||||||
|
extern uint32_t lutEnc2[256];
|
||||||
|
extern uint32_t lutEnc3[256];
|
||||||
|
extern uint32_t lutDec0[256];
|
||||||
|
extern uint32_t lutDec1[256];
|
||||||
|
extern uint32_t lutDec2[256];
|
||||||
|
extern uint32_t lutDec3[256];
|
||||||
|
|
||||||
rx_vec_i128 soft_aesdec(rx_vec_i128 in, rx_vec_i128 key);
|
template<bool soft> rx_vec_i128 aesenc(rx_vec_i128 in, rx_vec_i128 key);
|
||||||
|
template<bool soft> rx_vec_i128 aesdec(rx_vec_i128 in, rx_vec_i128 key);
|
||||||
|
|
||||||
template<bool soft>
|
template<>
|
||||||
inline rx_vec_i128 aesenc(rx_vec_i128 in, rx_vec_i128 key) {
|
FORCE_INLINE rx_vec_i128 aesenc<true>(rx_vec_i128 in, rx_vec_i128 key) {
|
||||||
return soft ? soft_aesenc(in, key) : rx_aesenc_vec_i128(in, key);
|
volatile uint8_t s[16];
|
||||||
|
memcpy((void*) s, &in, 16);
|
||||||
|
|
||||||
|
uint32_t s0 = lutEnc0[s[ 0]];
|
||||||
|
uint32_t s1 = lutEnc0[s[ 4]];
|
||||||
|
uint32_t s2 = lutEnc0[s[ 8]];
|
||||||
|
uint32_t s3 = lutEnc0[s[12]];
|
||||||
|
|
||||||
|
s0 ^= lutEnc1[s[ 5]];
|
||||||
|
s1 ^= lutEnc1[s[ 9]];
|
||||||
|
s2 ^= lutEnc1[s[13]];
|
||||||
|
s3 ^= lutEnc1[s[ 1]];
|
||||||
|
|
||||||
|
s0 ^= lutEnc2[s[10]];
|
||||||
|
s1 ^= lutEnc2[s[14]];
|
||||||
|
s2 ^= lutEnc2[s[ 2]];
|
||||||
|
s3 ^= lutEnc2[s[ 6]];
|
||||||
|
|
||||||
|
s0 ^= lutEnc3[s[15]];
|
||||||
|
s1 ^= lutEnc3[s[ 3]];
|
||||||
|
s2 ^= lutEnc3[s[ 7]];
|
||||||
|
s3 ^= lutEnc3[s[11]];
|
||||||
|
|
||||||
|
return rx_xor_vec_i128(rx_set_int_vec_i128(s3, s2, s1, s0), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<bool soft>
|
template<>
|
||||||
inline rx_vec_i128 aesdec(rx_vec_i128 in, rx_vec_i128 key) {
|
FORCE_INLINE rx_vec_i128 aesdec<true>(rx_vec_i128 in, rx_vec_i128 key) {
|
||||||
return soft ? soft_aesdec(in, key) : rx_aesdec_vec_i128(in, key);
|
volatile uint8_t s[16];
|
||||||
|
memcpy((void*) s, &in, 16);
|
||||||
|
|
||||||
|
uint32_t s0 = lutDec0[s[ 0]];
|
||||||
|
uint32_t s1 = lutDec0[s[ 4]];
|
||||||
|
uint32_t s2 = lutDec0[s[ 8]];
|
||||||
|
uint32_t s3 = lutDec0[s[12]];
|
||||||
|
|
||||||
|
s0 ^= lutDec1[s[13]];
|
||||||
|
s1 ^= lutDec1[s[ 1]];
|
||||||
|
s2 ^= lutDec1[s[ 5]];
|
||||||
|
s3 ^= lutDec1[s[ 9]];
|
||||||
|
|
||||||
|
s0 ^= lutDec2[s[10]];
|
||||||
|
s1 ^= lutDec2[s[14]];
|
||||||
|
s2 ^= lutDec2[s[ 2]];
|
||||||
|
s3 ^= lutDec2[s[ 6]];
|
||||||
|
|
||||||
|
s0 ^= lutDec3[s[ 7]];
|
||||||
|
s1 ^= lutDec3[s[11]];
|
||||||
|
s2 ^= lutDec3[s[15]];
|
||||||
|
s3 ^= lutDec3[s[ 3]];
|
||||||
|
|
||||||
|
return rx_xor_vec_i128(rx_set_int_vec_i128(s3, s2, s1, s0), key);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
FORCE_INLINE rx_vec_i128 aesenc<false>(rx_vec_i128 in, rx_vec_i128 key) {
|
||||||
|
return rx_aesenc_vec_i128(in, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
FORCE_INLINE rx_vec_i128 aesdec<false>(rx_vec_i128 in, rx_vec_i128 key) {
|
||||||
|
return rx_aesdec_vec_i128(in, key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,13 +72,13 @@ bool xmrig::RxDataset::init(const uint8_t *seed, uint32_t numThreads)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t datasetItemCount = randomx_dataset_item_count();
|
const uint64_t datasetItemCount = randomx_dataset_item_count();
|
||||||
|
|
||||||
if (numThreads > 1) {
|
if (numThreads > 1) {
|
||||||
std::vector<std::thread> threads;
|
std::vector<std::thread> threads;
|
||||||
threads.reserve(numThreads);
|
threads.reserve(numThreads);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < numThreads; ++i) {
|
for (uint64_t i = 0; i < numThreads; ++i) {
|
||||||
const uint32_t a = (datasetItemCount * i) / numThreads;
|
const uint32_t a = (datasetItemCount * i) / numThreads;
|
||||||
const uint32_t b = (datasetItemCount * (i + 1)) / numThreads;
|
const uint32_t b = (datasetItemCount * (i + 1)) / numThreads;
|
||||||
threads.emplace_back(randomx_init_dataset, m_dataset, m_cache->get(), a, b - a);
|
threads.emplace_back(randomx_init_dataset, m_dataset, m_cache->get(), a, b - a);
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
#include "net/strategies/DonateStrategy.h"
|
#include "net/strategies/DonateStrategy.h"
|
||||||
#include "rapidjson/document.h"
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_API
|
#ifdef XMRIG_FEATURE_API
|
||||||
# include "base/api/Api.h"
|
# include "base/api/Api.h"
|
||||||
# include "base/api/interfaces/IApiRequest.h"
|
# include "base/api/interfaces/IApiRequest.h"
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Controller;
|
class Controller;
|
||||||
class IStrategy;
|
class IStrategy;
|
||||||
|
|
||||||
|
@ -53,7 +52,6 @@ public:
|
||||||
~Network() override;
|
~Network() override;
|
||||||
|
|
||||||
inline IStrategy *strategy() const { return m_strategy; }
|
inline IStrategy *strategy() const { return m_strategy; }
|
||||||
|
|
||||||
void connect();
|
void connect();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -28,14 +28,14 @@
|
||||||
#define APP_ID "XMRigCC"
|
#define APP_ID "XMRigCC"
|
||||||
#define APP_NAME "XMRigCC"
|
#define APP_NAME "XMRigCC"
|
||||||
#define APP_DESC "XMRigCC CPU miner"
|
#define APP_DESC "XMRigCC CPU miner"
|
||||||
#define APP_VERSION "2.0.0"
|
#define APP_VERSION "2.1.0"
|
||||||
#define APP_DOMAIN ""
|
#define APP_DOMAIN ""
|
||||||
#define APP_SITE "https://github.com/BenDr0id/xmrigCC/"
|
#define APP_SITE "https://github.com/BenDr0id/xmrigCC/"
|
||||||
#define APP_COPYRIGHT "Copyright (C) 2017- XMRigCC"
|
#define APP_COPYRIGHT "Copyright (C) 2017- XMRigCC"
|
||||||
#define APP_KIND "cpu"
|
#define APP_KIND "cpu"
|
||||||
|
|
||||||
#define APP_VER_MAJOR 2
|
#define APP_VER_MAJOR 2
|
||||||
#define APP_VER_MINOR 0
|
#define APP_VER_MINOR 1
|
||||||
#define APP_VER_PATCH 0
|
#define APP_VER_PATCH 0
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
project("xmrig-test" C)
|
|
||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
|
|
||||||
include(CTest)
|
|
||||||
|
|
||||||
add_subdirectory(unity)
|
|
||||||
#add_subdirectory(cryptonight)
|
|
||||||
#add_subdirectory(cryptonight_lite)
|
|
||||||
#add_subdirectory(autoconf)
|
|
||||||
add_subdirectory(cpu)
|
|
|
@ -1,16 +0,0 @@
|
||||||
set(SOURCES
|
|
||||||
autoconf.c
|
|
||||||
../../cpu.h
|
|
||||||
../../cpu.c
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(autoconf_app ${SOURCES})
|
|
||||||
target_link_libraries(autoconf_app unity)
|
|
||||||
|
|
||||||
include_directories(../..)
|
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing")
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2")
|
|
||||||
add_definitions(-DBUILD_TEST)
|
|
||||||
|
|
||||||
add_test(autoconf_test autoconf_app)
|
|
|
@ -1,152 +0,0 @@
|
||||||
#include <unity.h>
|
|
||||||
|
|
||||||
#include "cpu.h"
|
|
||||||
#include "options.h"
|
|
||||||
|
|
||||||
struct cpu_info cpu_info = { 0 };
|
|
||||||
|
|
||||||
|
|
||||||
static void set_cpu_info(int total_logical_cpus, int l2_cache, int l3_cache) {
|
|
||||||
cpu_info.total_cores = total_logical_cpus;
|
|
||||||
cpu_info.total_logical_cpus = total_logical_cpus;
|
|
||||||
cpu_info.l2_cache = l2_cache;
|
|
||||||
cpu_info.l3_cache = l3_cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCounti7(void) {
|
|
||||||
set_cpu_info(8, 1024, 8192); // 4C/8T 8 MB (Generic i7 CPU)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(2, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(8, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(6, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(5, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 60));
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 50));
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 35));
|
|
||||||
TEST_ASSERT_EQUAL_INT(2, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 20));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCounti5(void) {
|
|
||||||
set_cpu_info(4, 1024, 6144); // 2C/4T 6 MB (Generic i5 CPU)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 75));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 75));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCounti3(void) {
|
|
||||||
set_cpu_info(4, 512, 3072); // 2C/4T 3 MB (Generic i3 CPU)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 75));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 75));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCountR7(void) {
|
|
||||||
set_cpu_info(16, 4096, 16384); // 8C/16T 16 MB (AMD Ryzen 7)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(8, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(8, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 75));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(16, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(8, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(12, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(8, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 75));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCountTwoE5620(void) {
|
|
||||||
set_cpu_info(16, 2048, 24576); // 8C/16T 24 MB (Two E5620)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(12, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(6, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(12, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(6, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 75));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(16, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(12, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(12, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(12, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 75));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCountVCPU(void) {
|
|
||||||
set_cpu_info(1, 1024, 15360); // 1C/1T 15 MB (Single core Virtual CPU)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 75));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 75));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_autoconf_should_GetOptimalThreadsCountNoL3(void) {
|
|
||||||
set_cpu_info(8, 8192, 0); // 4C/8T (Multi core Virtual CPU without L3 cache)
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(2, get_optimal_threads_count(ALGO_CRYPTONIGHT, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(8, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 100));
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, true, 100));
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(6, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 75));
|
|
||||||
TEST_ASSERT_EQUAL_INT(5, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 60));
|
|
||||||
TEST_ASSERT_EQUAL_INT(4, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 50));
|
|
||||||
TEST_ASSERT_EQUAL_INT(3, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 35));
|
|
||||||
TEST_ASSERT_EQUAL_INT(2, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 20));
|
|
||||||
TEST_ASSERT_EQUAL_INT(1, get_optimal_threads_count(ALGO_CRYPTONIGHT_LITE, false, 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
UNITY_BEGIN();
|
|
||||||
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCounti7);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCounti5);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCounti3);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCountR7);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCountR7);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCountTwoE5620);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCountVCPU);
|
|
||||||
RUN_TEST(test_autoconf_should_GetOptimalThreadsCountNoL3);
|
|
||||||
|
|
||||||
return UNITY_END();
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
set(SOURCES
|
|
||||||
cryptonight.c
|
|
||||||
../../options.h
|
|
||||||
../../algo/cryptonight/cryptonight.h
|
|
||||||
../../algo/cryptonight/cryptonight.c
|
|
||||||
../../algo/cryptonight/cryptonight_av1_aesni.c
|
|
||||||
../../algo/cryptonight/cryptonight_av2_aesni_double.c
|
|
||||||
../../algo/cryptonight/cryptonight_av3_softaes.c
|
|
||||||
../../algo/cryptonight/cryptonight_av4_softaes_double.c
|
|
||||||
../../crypto/c_keccak.c
|
|
||||||
../../crypto/c_blake256.c
|
|
||||||
../../crypto/c_groestl.c
|
|
||||||
../../crypto/c_jh.c
|
|
||||||
../../crypto/c_skein.c
|
|
||||||
../../crypto/soft_aes.c
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(cryptonight_app ${SOURCES})
|
|
||||||
target_link_libraries(cryptonight_app unity)
|
|
||||||
|
|
||||||
include_directories(../..)
|
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -fno-strict-aliasing")
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2")
|
|
||||||
add_definitions(-DBUILD_TEST)
|
|
||||||
add_definitions(-DXMRIG_NO_AEON)
|
|
||||||
|
|
||||||
add_test(cryptonight_test cryptonight_app)
|
|
|
@ -1,136 +0,0 @@
|
||||||
#include <unity.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <mm_malloc.h>
|
|
||||||
|
|
||||||
#include "options.h"
|
|
||||||
#include "algo/cryptonight/cryptonight.h"
|
|
||||||
|
|
||||||
bool opt_double_hash = false;
|
|
||||||
|
|
||||||
const static char input1[152] = {
|
|
||||||
0x03, 0x05, 0xA0, 0xDB, 0xD6, 0xBF, 0x05, 0xCF, 0x16, 0xE5, 0x03, 0xF3, 0xA6, 0x6F, 0x78, 0x00,
|
|
||||||
0x7C, 0xBF, 0x34, 0x14, 0x43, 0x32, 0xEC, 0xBF, 0xC2, 0x2E, 0xD9, 0x5C, 0x87, 0x00, 0x38, 0x3B,
|
|
||||||
0x30, 0x9A, 0xCE, 0x19, 0x23, 0xA0, 0x96, 0x4B, 0x00, 0x00, 0x00, 0x08, 0xBA, 0x93, 0x9A, 0x62,
|
|
||||||
0x72, 0x4C, 0x0D, 0x75, 0x81, 0xFC, 0xE5, 0x76, 0x1E, 0x9D, 0x8A, 0x0E, 0x6A, 0x1C, 0x3F, 0x92,
|
|
||||||
0x4F, 0xDD, 0x84, 0x93, 0xD1, 0x11, 0x56, 0x49, 0xC0, 0x5E, 0xB6, 0x01,
|
|
||||||
0x01, 0x00, 0xFB, 0x8E, 0x8A, 0xC8, 0x05, 0x89, 0x93, 0x23, 0x37, 0x1B, 0xB7, 0x90, 0xDB, 0x19,
|
|
||||||
0x21, 0x8A, 0xFD, 0x8D, 0xB8, 0xE3, 0x75, 0x5D, 0x8B, 0x90, 0xF3, 0x9B, 0x3D, 0x55, 0x06, 0xA9,
|
|
||||||
0xAB, 0xCE, 0x4F, 0xA9, 0x12, 0x24, 0x45, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x81, 0x46, 0xD4, 0x9F,
|
|
||||||
0xA9, 0x3E, 0xE7, 0x24, 0xDE, 0xB5, 0x7D, 0x12, 0xCB, 0xC6, 0xC6, 0xF3, 0xB9, 0x24, 0xD9, 0x46,
|
|
||||||
0x12, 0x7C, 0x7A, 0x97, 0x41, 0x8F, 0x93, 0x48, 0x82, 0x8F, 0x0F, 0x02,
|
|
||||||
};
|
|
||||||
|
|
||||||
const static char input2[] = "This is a test";
|
|
||||||
const static char input3[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus pellentesque metus.";
|
|
||||||
|
|
||||||
|
|
||||||
void cryptonight_av1_aesni(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
void cryptonight_av2_aesni_double(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
void cryptonight_av3_softaes(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
void cryptonight_av4_softaes_double(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
|
|
||||||
|
|
||||||
static char hash[64];
|
|
||||||
#define RESULT1 "1a3ffbee909b420d91f7be6e5fb56db71b3110d886011e877ee5786afd080100"
|
|
||||||
#define RESULT1_DOUBLE "1a3ffbee909b420d91f7be6e5fb56db71b3110d886011e877ee5786afd0801001b606a3f4a07d6489a1bcd07697bd16696b61c8ae982f61a90160f4e52828a7f"
|
|
||||||
#define RESULT2 "a084f01d1437a09c6985401b60d43554ae105802c5f5d8a9b3253649c0be6605"
|
|
||||||
#define RESULT3 "0bbe54bd26caa92a1d436eec71cbef02560062fa689fe14d7efcf42566b411cf"
|
|
||||||
|
|
||||||
|
|
||||||
static char *bin2hex(const unsigned char *p, size_t len)
|
|
||||||
{
|
|
||||||
char *s = malloc((len * 2) + 1);
|
|
||||||
if (!s) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
sprintf(s + (i * 2), "%02x", (unsigned int) p[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void * create_ctx(int ratio) {
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) _mm_malloc(sizeof(struct ScratchPad), 16);
|
|
||||||
ctx->memory = (uint8_t *) _mm_malloc(MEMORY * ratio, 16);
|
|
||||||
|
|
||||||
return ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void free_ctx(struct ScratchPad *ctx) {
|
|
||||||
_mm_free(ctx->memory);
|
|
||||||
_mm_free(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_av1_should_CalcHash(void) {
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(1);
|
|
||||||
|
|
||||||
cryptonight_av1_aesni(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
cryptonight_av1_aesni(input2, strlen(input2), &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT2, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
cryptonight_av1_aesni(input3, strlen(input3), &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT3, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_av2_should_CalcHash(void)
|
|
||||||
{
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(2);
|
|
||||||
|
|
||||||
cryptonight_av2_aesni_double(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1_DOUBLE, bin2hex(hash, 64));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_av3_should_CalcHash(void)
|
|
||||||
{
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(1);
|
|
||||||
|
|
||||||
cryptonight_av3_softaes(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
cryptonight_av3_softaes(input2, strlen(input2), &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT2, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
cryptonight_av3_softaes(input3, strlen(input3), &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT3, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_av4_should_CalcHash(void)
|
|
||||||
{
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(2);
|
|
||||||
|
|
||||||
cryptonight_av4_softaes_double(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1_DOUBLE, bin2hex(hash, 64));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
UNITY_BEGIN();
|
|
||||||
|
|
||||||
RUN_TEST(test_cryptonight_av1_should_CalcHash);
|
|
||||||
RUN_TEST(test_cryptonight_av2_should_CalcHash);
|
|
||||||
RUN_TEST(test_cryptonight_av3_should_CalcHash);
|
|
||||||
RUN_TEST(test_cryptonight_av4_should_CalcHash);
|
|
||||||
|
|
||||||
return UNITY_END();
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
set(SOURCES
|
|
||||||
cryptonight_lite.c
|
|
||||||
../../options.h
|
|
||||||
../../algo/cryptonight/cryptonight.h
|
|
||||||
../../algo/cryptonight/cryptonight.c
|
|
||||||
../../algo/cryptonight-lite/cryptonight_lite_av1_aesni.c
|
|
||||||
../../algo/cryptonight-lite/cryptonight_lite_av2_aesni_double.c
|
|
||||||
../../algo/cryptonight-lite/cryptonight_lite_av3_softaes.c
|
|
||||||
../../algo/cryptonight-lite/cryptonight_lite_av4_softaes_double.c
|
|
||||||
../../crypto/c_keccak.c
|
|
||||||
../../crypto/c_blake256.c
|
|
||||||
../../crypto/c_groestl.c
|
|
||||||
../../crypto/c_jh.c
|
|
||||||
../../crypto/c_skein.c
|
|
||||||
../../crypto/soft_aes.c
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(cryptonight_lite_app ${SOURCES})
|
|
||||||
target_link_libraries(cryptonight_lite_app unity)
|
|
||||||
|
|
||||||
include_directories(../..)
|
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -fno-strict-aliasing")
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2")
|
|
||||||
add_definitions(-DBUILD_TEST)
|
|
||||||
|
|
||||||
add_test(cryptonight_lite_test cryptonight_lite_app)
|
|
|
@ -1,124 +0,0 @@
|
||||||
#include <unity.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <mm_malloc.h>
|
|
||||||
|
|
||||||
#include "options.h"
|
|
||||||
#include "algo/cryptonight/cryptonight.h"
|
|
||||||
|
|
||||||
bool opt_double_hash = false;
|
|
||||||
enum mining_algo opt_algo = ALGO_CRYPTONIGHT_LITE;
|
|
||||||
|
|
||||||
const static char input1[152] = {
|
|
||||||
0x03, 0x05, 0xA0, 0xDB, 0xD6, 0xBF, 0x05, 0xCF, 0x16, 0xE5, 0x03, 0xF3, 0xA6, 0x6F, 0x78, 0x00,
|
|
||||||
0x7C, 0xBF, 0x34, 0x14, 0x43, 0x32, 0xEC, 0xBF, 0xC2, 0x2E, 0xD9, 0x5C, 0x87, 0x00, 0x38, 0x3B,
|
|
||||||
0x30, 0x9A, 0xCE, 0x19, 0x23, 0xA0, 0x96, 0x4B, 0x00, 0x00, 0x00, 0x08, 0xBA, 0x93, 0x9A, 0x62,
|
|
||||||
0x72, 0x4C, 0x0D, 0x75, 0x81, 0xFC, 0xE5, 0x76, 0x1E, 0x9D, 0x8A, 0x0E, 0x6A, 0x1C, 0x3F, 0x92,
|
|
||||||
0x4F, 0xDD, 0x84, 0x93, 0xD1, 0x11, 0x56, 0x49, 0xC0, 0x5E, 0xB6, 0x01,
|
|
||||||
0x01, 0x00, 0xFB, 0x8E, 0x8A, 0xC8, 0x05, 0x89, 0x93, 0x23, 0x37, 0x1B, 0xB7, 0x90, 0xDB, 0x19,
|
|
||||||
0x21, 0x8A, 0xFD, 0x8D, 0xB8, 0xE3, 0x75, 0x5D, 0x8B, 0x90, 0xF3, 0x9B, 0x3D, 0x55, 0x06, 0xA9,
|
|
||||||
0xAB, 0xCE, 0x4F, 0xA9, 0x12, 0x24, 0x45, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x81, 0x46, 0xD4, 0x9F,
|
|
||||||
0xA9, 0x3E, 0xE7, 0x24, 0xDE, 0xB5, 0x7D, 0x12, 0xCB, 0xC6, 0xC6, 0xF3, 0xB9, 0x24, 0xD9, 0x46,
|
|
||||||
0x12, 0x7C, 0x7A, 0x97, 0x41, 0x8F, 0x93, 0x48, 0x82, 0x8F, 0x0F, 0x02,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void cryptonight_av1_aesni(const void* input, size_t size, void* output, struct ScratchPad* ctx) {}
|
|
||||||
void cryptonight_av2_aesni_double(const void* input, size_t size, void* output, struct ScratchPad* ctx) {}
|
|
||||||
void cryptonight_av3_softaes(const void* input, size_t size, void* output, struct ScratchPad* ctx) {}
|
|
||||||
void cryptonight_av4_softaes_double(const void* input, size_t size, void* output, struct ScratchPad* ctx) {}
|
|
||||||
|
|
||||||
void cryptonight_lite_av1_aesni(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
void cryptonight_lite_av2_aesni_double(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
void cryptonight_lite_av3_softaes(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
void cryptonight_lite_av4_softaes_double(const void* input, size_t size, void* output, struct ScratchPad* ctx);
|
|
||||||
|
|
||||||
|
|
||||||
static char hash[64];
|
|
||||||
#define RESULT1 "3695b4b53bb00358b0ad38dc160feb9e004eece09b83a72ef6ba9864d3510c88"
|
|
||||||
#define RESULT1_DOUBLE "3695b4b53bb00358b0ad38dc160feb9e004eece09b83a72ef6ba9864d3510c8828a22bad3f93d1408fca472eb5ad1cbe75f21d053c8ce5b3af105a57713e21dd"
|
|
||||||
|
|
||||||
|
|
||||||
static char *bin2hex(const unsigned char *p, size_t len)
|
|
||||||
{
|
|
||||||
char *s = malloc((len * 2) + 1);
|
|
||||||
if (!s) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
sprintf(s + (i * 2), "%02x", (unsigned int) p[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void * create_ctx(int ratio) {
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) _mm_malloc(sizeof(struct ScratchPad), 16);
|
|
||||||
ctx->memory = (uint8_t *) _mm_malloc(MEMORY_LITE * ratio, 16);
|
|
||||||
|
|
||||||
return ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void free_ctx(struct ScratchPad *ctx) {
|
|
||||||
_mm_free(ctx->memory);
|
|
||||||
_mm_free(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_lite_av1_should_CalcHash(void) {
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(1);
|
|
||||||
|
|
||||||
cryptonight_lite_av1_aesni(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_lite_av2_should_CalcHash(void)
|
|
||||||
{
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(2);
|
|
||||||
|
|
||||||
cryptonight_lite_av2_aesni_double(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1_DOUBLE, bin2hex(hash, 64));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_lite_av3_should_CalcHash(void) {
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(1);
|
|
||||||
|
|
||||||
cryptonight_lite_av3_softaes(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1, bin2hex(hash, 32));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void test_cryptonight_lite_av4_should_CalcHash(void)
|
|
||||||
{
|
|
||||||
struct ScratchPad *ctx = (struct ScratchPad*) create_ctx(2);
|
|
||||||
|
|
||||||
cryptonight_lite_av4_softaes_double(input1, 76, &hash, ctx);
|
|
||||||
TEST_ASSERT_EQUAL_STRING(RESULT1_DOUBLE, bin2hex(hash, 64));
|
|
||||||
|
|
||||||
free_ctx(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
UNITY_BEGIN();
|
|
||||||
|
|
||||||
RUN_TEST(test_cryptonight_lite_av1_should_CalcHash);
|
|
||||||
RUN_TEST(test_cryptonight_lite_av2_should_CalcHash);
|
|
||||||
RUN_TEST(test_cryptonight_lite_av3_should_CalcHash);
|
|
||||||
RUN_TEST(test_cryptonight_lite_av4_should_CalcHash);
|
|
||||||
|
|
||||||
return UNITY_END();
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
add_library(unity STATIC unity.c)
|
|
||||||
target_include_directories(unity PUBLIC .)
|
|
1446
test/unity/unity.c
1446
test/unity/unity.c
File diff suppressed because it is too large
Load diff
|
@ -1,293 +0,0 @@
|
||||||
/* ==========================================
|
|
||||||
Unity Project - A Test Framework for C
|
|
||||||
Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
|
|
||||||
[Released under MIT License. Please refer to license.txt for details]
|
|
||||||
========================================== */
|
|
||||||
|
|
||||||
#ifndef UNITY_FRAMEWORK_H
|
|
||||||
#define UNITY_FRAMEWORK_H
|
|
||||||
#define UNITY
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "unity_internals.h"
|
|
||||||
|
|
||||||
void setUp(void);
|
|
||||||
void tearDown(void);
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Configuration Options
|
|
||||||
*-------------------------------------------------------
|
|
||||||
* All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above.
|
|
||||||
|
|
||||||
* Integers/longs/pointers
|
|
||||||
* - Unity attempts to automatically discover your integer sizes
|
|
||||||
* - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in <stdint.h>
|
|
||||||
* - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in <limits.h>
|
|
||||||
* - If you cannot use the automatic methods above, you can force Unity by using these options:
|
|
||||||
* - define UNITY_SUPPORT_64
|
|
||||||
* - set UNITY_INT_WIDTH
|
|
||||||
* - set UNITY_LONG_WIDTH
|
|
||||||
* - set UNITY_POINTER_WIDTH
|
|
||||||
|
|
||||||
* Floats
|
|
||||||
* - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons
|
|
||||||
* - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT
|
|
||||||
* - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats
|
|
||||||
* - define UNITY_FLOAT_VERBOSE to print floating point values in errors (uses sprintf)
|
|
||||||
* - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons
|
|
||||||
* - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default)
|
|
||||||
* - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE
|
|
||||||
* - define UNITY_DOUBLE_TYPE to specify something other than double
|
|
||||||
* - define UNITY_DOUBLE_VERBOSE to print floating point values in errors (uses sprintf)
|
|
||||||
* - define UNITY_VERBOSE_NUMBER_MAX_LENGTH to change maximum length of printed numbers (used by sprintf)
|
|
||||||
|
|
||||||
* Output
|
|
||||||
* - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired
|
|
||||||
* - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure
|
|
||||||
|
|
||||||
* Optimization
|
|
||||||
* - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge
|
|
||||||
* - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests.
|
|
||||||
|
|
||||||
* Test Cases
|
|
||||||
* - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script
|
|
||||||
|
|
||||||
* Parameterized Tests
|
|
||||||
* - you'll want to create a define of TEST_CASE(...) which basically evaluates to nothing
|
|
||||||
|
|
||||||
* Tests with Arguments
|
|
||||||
* - you'll want to define UNITY_USE_COMMAND_LINE_ARGS if you have the test runner passing arguments to Unity
|
|
||||||
|
|
||||||
*-------------------------------------------------------
|
|
||||||
* Basic Fail and Ignore
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message))
|
|
||||||
#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL)
|
|
||||||
#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message))
|
|
||||||
#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL)
|
|
||||||
#define TEST_ONLY()
|
|
||||||
|
|
||||||
/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails.
|
|
||||||
* This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */
|
|
||||||
#define TEST_PASS() longjmp(Unity.AbortFrame, 1)
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Asserts (simple)
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Boolean */
|
|
||||||
#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE")
|
|
||||||
#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE")
|
|
||||||
#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE")
|
|
||||||
#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE")
|
|
||||||
#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL")
|
|
||||||
#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL")
|
|
||||||
|
|
||||||
/* Integers (of all sizes) */
|
|
||||||
#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal")
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, NULL)
|
|
||||||
|
|
||||||
/* Integer Ranges (of all sizes) */
|
|
||||||
#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
|
|
||||||
/* Structs and Strings */
|
|
||||||
#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL)
|
|
||||||
|
|
||||||
/* Arrays */
|
|
||||||
#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL)
|
|
||||||
|
|
||||||
/* Floating Point (If Enabled) */
|
|
||||||
#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL)
|
|
||||||
|
|
||||||
/* Double (If Enabled) */
|
|
||||||
#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL)
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL)
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Asserts (with additional messages)
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Boolean */
|
|
||||||
#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message))
|
|
||||||
|
|
||||||
/* Integers (of all sizes) */
|
|
||||||
#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, (message))
|
|
||||||
|
|
||||||
/* Integer Ranges (of all sizes) */
|
|
||||||
#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
|
|
||||||
/* Structs and Strings */
|
|
||||||
#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message))
|
|
||||||
|
|
||||||
/* Arrays */
|
|
||||||
#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message))
|
|
||||||
|
|
||||||
/* Floating Point (If Enabled) */
|
|
||||||
#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message))
|
|
||||||
|
|
||||||
/* Double (If Enabled) */
|
|
||||||
#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message))
|
|
||||||
#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message))
|
|
||||||
|
|
||||||
/* end of UNITY_FRAMEWORK_H */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,749 +0,0 @@
|
||||||
/* ==========================================
|
|
||||||
Unity Project - A Test Framework for C
|
|
||||||
Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
|
|
||||||
[Released under MIT License. Please refer to license.txt for details]
|
|
||||||
========================================== */
|
|
||||||
|
|
||||||
#ifndef UNITY_INTERNALS_H
|
|
||||||
#define UNITY_INTERNALS_H
|
|
||||||
|
|
||||||
#ifdef UNITY_INCLUDE_CONFIG_H
|
|
||||||
#include "unity_config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
#ifndef UNITY_EXCLUDE_MATH_H
|
|
||||||
#include <math.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Unity Attempts to Auto-Detect Integer Types
|
|
||||||
* Attempt 1: UINT_MAX, ULONG_MAX in <limits.h>, or default to 32 bits
|
|
||||||
* Attempt 2: UINTPTR_MAX in <stdint.h>, or default to same size as long
|
|
||||||
* The user may override any of these derived constants:
|
|
||||||
* UNITY_INT_WIDTH, UNITY_LONG_WIDTH, UNITY_POINTER_WIDTH */
|
|
||||||
#ifndef UNITY_EXCLUDE_STDINT_H
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_EXCLUDE_LIMITS_H
|
|
||||||
#include <limits.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Guess Widths If Not Specified
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Determine the size of an int, if not already specified.
|
|
||||||
* We cannot use sizeof(int), because it is not yet defined
|
|
||||||
* at this stage in the translation of the C program.
|
|
||||||
* Therefore, infer it from UINT_MAX if possible. */
|
|
||||||
#ifndef UNITY_INT_WIDTH
|
|
||||||
#ifdef UINT_MAX
|
|
||||||
#if (UINT_MAX == 0xFFFF)
|
|
||||||
#define UNITY_INT_WIDTH (16)
|
|
||||||
#elif (UINT_MAX == 0xFFFFFFFF)
|
|
||||||
#define UNITY_INT_WIDTH (32)
|
|
||||||
#elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF)
|
|
||||||
#define UNITY_INT_WIDTH (64)
|
|
||||||
#endif
|
|
||||||
#else /* Set to default */
|
|
||||||
#define UNITY_INT_WIDTH (32)
|
|
||||||
#endif /* UINT_MAX */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Determine the size of a long, if not already specified. */
|
|
||||||
#ifndef UNITY_LONG_WIDTH
|
|
||||||
#ifdef ULONG_MAX
|
|
||||||
#if (ULONG_MAX == 0xFFFF)
|
|
||||||
#define UNITY_LONG_WIDTH (16)
|
|
||||||
#elif (ULONG_MAX == 0xFFFFFFFF)
|
|
||||||
#define UNITY_LONG_WIDTH (32)
|
|
||||||
#elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF)
|
|
||||||
#define UNITY_LONG_WIDTH (64)
|
|
||||||
#endif
|
|
||||||
#else /* Set to default */
|
|
||||||
#define UNITY_LONG_WIDTH (32)
|
|
||||||
#endif /* ULONG_MAX */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Determine the size of a pointer, if not already specified. */
|
|
||||||
#ifndef UNITY_POINTER_WIDTH
|
|
||||||
#ifdef UINTPTR_MAX
|
|
||||||
#if (UINTPTR_MAX <= 0xFFFF)
|
|
||||||
#define UNITY_POINTER_WIDTH (16)
|
|
||||||
#elif (UINTPTR_MAX <= 0xFFFFFFFF)
|
|
||||||
#define UNITY_POINTER_WIDTH (32)
|
|
||||||
#elif (UINTPTR_MAX <= 0xFFFFFFFFFFFFFFFF)
|
|
||||||
#define UNITY_POINTER_WIDTH (64)
|
|
||||||
#endif
|
|
||||||
#else /* Set to default */
|
|
||||||
#define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH
|
|
||||||
#endif /* UINTPTR_MAX */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Int Support (Define types based on detected sizes)
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if (UNITY_INT_WIDTH == 32)
|
|
||||||
typedef unsigned char _UU8;
|
|
||||||
typedef unsigned short _UU16;
|
|
||||||
typedef unsigned int _UU32;
|
|
||||||
typedef signed char _US8;
|
|
||||||
typedef signed short _US16;
|
|
||||||
typedef signed int _US32;
|
|
||||||
#elif (UNITY_INT_WIDTH == 16)
|
|
||||||
typedef unsigned char _UU8;
|
|
||||||
typedef unsigned int _UU16;
|
|
||||||
typedef unsigned long _UU32;
|
|
||||||
typedef signed char _US8;
|
|
||||||
typedef signed int _US16;
|
|
||||||
typedef signed long _US32;
|
|
||||||
#else
|
|
||||||
#error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* 64-bit Support
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef UNITY_SUPPORT_64
|
|
||||||
#if UNITY_LONG_WIDTH == 64 || UNITY_POINTER_WIDTH == 64
|
|
||||||
#define UNITY_SUPPORT_64
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_SUPPORT_64
|
|
||||||
/* No 64-bit Support */
|
|
||||||
typedef _UU32 _U_UINT;
|
|
||||||
typedef _US32 _U_SINT;
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* 64-bit Support */
|
|
||||||
#if (UNITY_LONG_WIDTH == 32)
|
|
||||||
typedef unsigned long long _UU64;
|
|
||||||
typedef signed long long _US64;
|
|
||||||
#elif (UNITY_LONG_WIDTH == 64)
|
|
||||||
typedef unsigned long _UU64;
|
|
||||||
typedef signed long _US64;
|
|
||||||
#else
|
|
||||||
#error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported)
|
|
||||||
#endif
|
|
||||||
typedef _UU64 _U_UINT;
|
|
||||||
typedef _US64 _U_SINT;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Pointer Support
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if (UNITY_POINTER_WIDTH == 32)
|
|
||||||
typedef _UU32 _UP;
|
|
||||||
#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32
|
|
||||||
#elif (UNITY_POINTER_WIDTH == 64)
|
|
||||||
typedef _UU64 _UP;
|
|
||||||
#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64
|
|
||||||
#elif (UNITY_POINTER_WIDTH == 16)
|
|
||||||
typedef _UU16 _UP;
|
|
||||||
#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16
|
|
||||||
#else
|
|
||||||
#error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_PTR_ATTRIBUTE
|
|
||||||
#define UNITY_PTR_ATTRIBUTE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_INTERNAL_PTR
|
|
||||||
#define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void*
|
|
||||||
/* #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const _UU8* */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Float Support
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifdef UNITY_EXCLUDE_FLOAT
|
|
||||||
|
|
||||||
/* No Floating Point Support */
|
|
||||||
#undef UNITY_INCLUDE_FLOAT
|
|
||||||
#undef UNITY_FLOAT_PRECISION
|
|
||||||
#undef UNITY_FLOAT_TYPE
|
|
||||||
#undef UNITY_FLOAT_VERBOSE
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef UNITY_INCLUDE_FLOAT
|
|
||||||
#define UNITY_INCLUDE_FLOAT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Floating Point Support */
|
|
||||||
#ifndef UNITY_FLOAT_PRECISION
|
|
||||||
#define UNITY_FLOAT_PRECISION (0.00001f)
|
|
||||||
#endif
|
|
||||||
#ifndef UNITY_FLOAT_TYPE
|
|
||||||
#define UNITY_FLOAT_TYPE float
|
|
||||||
#endif
|
|
||||||
typedef UNITY_FLOAT_TYPE _UF;
|
|
||||||
|
|
||||||
#ifndef isinf
|
|
||||||
/* The value of Inf - Inf is NaN */
|
|
||||||
#define isinf(n) (isnan((n) - (n)) && !isnan(n))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef isnan
|
|
||||||
/* NaN is the only floating point value that does NOT equal itself.
|
|
||||||
* Therefore if n != n, then it is NaN. */
|
|
||||||
#define isnan(n) ((n != n) ? 1 : 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef isneg
|
|
||||||
#define isneg(n) ((n < 0.0f) ? 1 : 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ispos
|
|
||||||
#define ispos(n) ((n > 0.0f) ? 1 : 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Double Float Support
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* unlike FLOAT, we DON'T include by default */
|
|
||||||
#ifndef UNITY_EXCLUDE_DOUBLE
|
|
||||||
#ifndef UNITY_INCLUDE_DOUBLE
|
|
||||||
#define UNITY_EXCLUDE_DOUBLE
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNITY_EXCLUDE_DOUBLE
|
|
||||||
|
|
||||||
/* No Floating Point Support */
|
|
||||||
#undef UNITY_DOUBLE_PRECISION
|
|
||||||
#undef UNITY_DOUBLE_TYPE
|
|
||||||
#undef UNITY_DOUBLE_VERBOSE
|
|
||||||
|
|
||||||
#ifdef UNITY_INCLUDE_DOUBLE
|
|
||||||
#undef UNITY_INCLUDE_DOUBLE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNITY_FLOAT_VERBOSE
|
|
||||||
typedef _UF _UD;
|
|
||||||
/* For parameter in UnityPrintFloat, double promotion required */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Double Floating Point Support */
|
|
||||||
#ifndef UNITY_DOUBLE_PRECISION
|
|
||||||
#define UNITY_DOUBLE_PRECISION (1e-12f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_DOUBLE_TYPE
|
|
||||||
#define UNITY_DOUBLE_TYPE double
|
|
||||||
#endif
|
|
||||||
typedef UNITY_DOUBLE_TYPE _UD;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNITY_DOUBLE_VERBOSE
|
|
||||||
#ifndef UNITY_FLOAT_VERBOSE
|
|
||||||
#define UNITY_FLOAT_VERBOSE
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Output Method: stdout (DEFAULT)
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
#ifndef UNITY_OUTPUT_CHAR
|
|
||||||
/* Default to using putchar, which is defined in stdio.h */
|
|
||||||
#include <stdio.h>
|
|
||||||
#define UNITY_OUTPUT_CHAR(a) (void)putchar(a)
|
|
||||||
#else
|
|
||||||
/* If defined as something else, make sure we declare it here so it's ready for use */
|
|
||||||
#ifndef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION
|
|
||||||
extern void UNITY_OUTPUT_CHAR(int);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_OUTPUT_FLUSH
|
|
||||||
/* Default to using fflush, which is defined in stdio.h */
|
|
||||||
#include <stdio.h>
|
|
||||||
#define UNITY_OUTPUT_FLUSH (void)fflush(stdout)
|
|
||||||
#else
|
|
||||||
/* If defined as something else, make sure we declare it here so it's ready for use */
|
|
||||||
#ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION
|
|
||||||
extern void UNITY_OUTPUT_FLUSH(void);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_OUTPUT_FLUSH
|
|
||||||
#define UNITY_FLUSH_CALL()
|
|
||||||
#else
|
|
||||||
#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_PRINT_EOL
|
|
||||||
#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n')
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_OUTPUT_START
|
|
||||||
#define UNITY_OUTPUT_START()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_OUTPUT_COMPLETE
|
|
||||||
#define UNITY_OUTPUT_COMPLETE()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Footprint
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef UNITY_LINE_TYPE
|
|
||||||
#define UNITY_LINE_TYPE _U_UINT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_COUNTER_TYPE
|
|
||||||
#define UNITY_COUNTER_TYPE _U_UINT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Language Features Available
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
#if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA)
|
|
||||||
# ifdef __GNUC__ /* includes clang */
|
|
||||||
# if !(defined(__WIN32__) && defined(__clang__)) && !defined(__TMS470__)
|
|
||||||
# define UNITY_WEAK_ATTRIBUTE __attribute__((weak))
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNITY_NO_WEAK
|
|
||||||
# undef UNITY_WEAK_ATTRIBUTE
|
|
||||||
# undef UNITY_WEAK_PRAGMA
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Internal Structs Needed
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
typedef void (*UnityTestFunction)(void);
|
|
||||||
|
|
||||||
#define UNITY_DISPLAY_RANGE_INT (0x10)
|
|
||||||
#define UNITY_DISPLAY_RANGE_UINT (0x20)
|
|
||||||
#define UNITY_DISPLAY_RANGE_HEX (0x40)
|
|
||||||
#define UNITY_DISPLAY_RANGE_AUTO (0x80)
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
UNITY_DISPLAY_STYLE_INT = sizeof(int)+ UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO,
|
|
||||||
UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT,
|
|
||||||
UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT,
|
|
||||||
UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT,
|
|
||||||
#ifdef UNITY_SUPPORT_64
|
|
||||||
UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO,
|
|
||||||
UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT,
|
|
||||||
UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT,
|
|
||||||
UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT,
|
|
||||||
#ifdef UNITY_SUPPORT_64
|
|
||||||
UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX,
|
|
||||||
UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX,
|
|
||||||
UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX,
|
|
||||||
#ifdef UNITY_SUPPORT_64
|
|
||||||
UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UNITY_DISPLAY_STYLE_UNKNOWN
|
|
||||||
} UNITY_DISPLAY_STYLE_T;
|
|
||||||
|
|
||||||
#ifndef UNITY_EXCLUDE_FLOAT
|
|
||||||
typedef enum _UNITY_FLOAT_TRAIT_T
|
|
||||||
{
|
|
||||||
UNITY_FLOAT_IS_NOT_INF = 0,
|
|
||||||
UNITY_FLOAT_IS_INF,
|
|
||||||
UNITY_FLOAT_IS_NOT_NEG_INF,
|
|
||||||
UNITY_FLOAT_IS_NEG_INF,
|
|
||||||
UNITY_FLOAT_IS_NOT_NAN,
|
|
||||||
UNITY_FLOAT_IS_NAN,
|
|
||||||
UNITY_FLOAT_IS_NOT_DET,
|
|
||||||
UNITY_FLOAT_IS_DET,
|
|
||||||
UNITY_FLOAT_INVALID_TRAIT
|
|
||||||
} UNITY_FLOAT_TRAIT_T;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _Unity
|
|
||||||
{
|
|
||||||
const char* TestFile;
|
|
||||||
const char* CurrentTestName;
|
|
||||||
#ifndef UNITY_EXCLUDE_DETAILS
|
|
||||||
const char* CurrentDetail1;
|
|
||||||
const char* CurrentDetail2;
|
|
||||||
#endif
|
|
||||||
UNITY_LINE_TYPE CurrentTestLineNumber;
|
|
||||||
UNITY_COUNTER_TYPE NumberOfTests;
|
|
||||||
UNITY_COUNTER_TYPE TestFailures;
|
|
||||||
UNITY_COUNTER_TYPE TestIgnores;
|
|
||||||
UNITY_COUNTER_TYPE CurrentTestFailed;
|
|
||||||
UNITY_COUNTER_TYPE CurrentTestIgnored;
|
|
||||||
jmp_buf AbortFrame;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct _Unity Unity;
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Suite Management
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
void UnityBegin(const char* filename);
|
|
||||||
int UnityEnd(void);
|
|
||||||
void UnityConcludeTest(void);
|
|
||||||
void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum);
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Details Support
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifdef UNITY_EXCLUDE_DETAILS
|
|
||||||
#define UNITY_CLR_DETAILS()
|
|
||||||
#define UNITY_SET_DETAIL(d1)
|
|
||||||
#define UNITY_SET_DETAILS(d1,d2)
|
|
||||||
#else
|
|
||||||
#define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; }
|
|
||||||
#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = 0; }
|
|
||||||
#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = d2; }
|
|
||||||
|
|
||||||
#ifndef UNITY_DETAIL1_NAME
|
|
||||||
#define UNITY_DETAIL1_NAME "Function"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_DETAIL2_NAME
|
|
||||||
#define UNITY_DETAIL2_NAME "Argument"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Output
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
void UnityPrint(const char* string);
|
|
||||||
void UnityPrintMask(const _U_UINT mask, const _U_UINT number);
|
|
||||||
void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style);
|
|
||||||
void UnityPrintNumber(const _U_SINT number);
|
|
||||||
void UnityPrintNumberUnsigned(const _U_UINT number);
|
|
||||||
void UnityPrintNumberHex(const _U_UINT number, const char nibbles);
|
|
||||||
|
|
||||||
#ifdef UNITY_FLOAT_VERBOSE
|
|
||||||
void UnityPrintFloat(const _UD number);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Assertion Functions
|
|
||||||
*-------------------------------------------------------
|
|
||||||
* Use the macros below this section instead of calling
|
|
||||||
* these directly. The macros have a consistent naming
|
|
||||||
* convention and will pull in file and line information
|
|
||||||
* for you. */
|
|
||||||
|
|
||||||
void UnityAssertEqualNumber(const _U_SINT expected,
|
|
||||||
const _U_SINT actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber,
|
|
||||||
const UNITY_DISPLAY_STYLE_T style);
|
|
||||||
|
|
||||||
void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
|
|
||||||
UNITY_INTERNAL_PTR actual,
|
|
||||||
const _UU32 num_elements,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber,
|
|
||||||
const UNITY_DISPLAY_STYLE_T style);
|
|
||||||
|
|
||||||
void UnityAssertBits(const _U_SINT mask,
|
|
||||||
const _U_SINT expected,
|
|
||||||
const _U_SINT actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertEqualString(const char* expected,
|
|
||||||
const char* actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertEqualStringLen(const char* expected,
|
|
||||||
const char* actual,
|
|
||||||
const _UU32 length,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertEqualStringArray( const char** expected,
|
|
||||||
const char** actual,
|
|
||||||
const _UU32 num_elements,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected,
|
|
||||||
UNITY_INTERNAL_PTR actual,
|
|
||||||
const _UU32 length,
|
|
||||||
const _UU32 num_elements,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertNumbersWithin(const _U_UINT delta,
|
|
||||||
const _U_SINT expected,
|
|
||||||
const _U_SINT actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber,
|
|
||||||
const UNITY_DISPLAY_STYLE_T style);
|
|
||||||
|
|
||||||
void UnityFail(const char* message, const UNITY_LINE_TYPE line);
|
|
||||||
|
|
||||||
void UnityIgnore(const char* message, const UNITY_LINE_TYPE line);
|
|
||||||
|
|
||||||
#ifndef UNITY_EXCLUDE_FLOAT
|
|
||||||
void UnityAssertFloatsWithin(const _UF delta,
|
|
||||||
const _UF expected,
|
|
||||||
const _UF actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected,
|
|
||||||
UNITY_PTR_ATTRIBUTE const _UF* actual,
|
|
||||||
const _UU32 num_elements,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertFloatSpecial(const _UF actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber,
|
|
||||||
const UNITY_FLOAT_TRAIT_T style);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_EXCLUDE_DOUBLE
|
|
||||||
void UnityAssertDoublesWithin(const _UD delta,
|
|
||||||
const _UD expected,
|
|
||||||
const _UD actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected,
|
|
||||||
UNITY_PTR_ATTRIBUTE const _UD* actual,
|
|
||||||
const _UU32 num_elements,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber);
|
|
||||||
|
|
||||||
void UnityAssertDoubleSpecial(const _UD actual,
|
|
||||||
const char* msg,
|
|
||||||
const UNITY_LINE_TYPE lineNumber,
|
|
||||||
const UNITY_FLOAT_TRAIT_T style);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Error Strings We Might Need
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
extern const char UnityStrErrFloat[];
|
|
||||||
extern const char UnityStrErrDouble[];
|
|
||||||
extern const char UnityStrErr64[];
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Running Macros
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0)
|
|
||||||
|
|
||||||
#define TEST_ABORT() {longjmp(Unity.AbortFrame, 1);}
|
|
||||||
|
|
||||||
/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */
|
|
||||||
#ifndef RUN_TEST
|
|
||||||
#ifdef __STDC_VERSION__
|
|
||||||
#if __STDC_VERSION__ >= 199901L
|
|
||||||
#define RUN_TEST(...) UnityDefaultTestRun(RUN_TEST_FIRST(__VA_ARGS__), RUN_TEST_SECOND(__VA_ARGS__))
|
|
||||||
#define RUN_TEST_FIRST(...) RUN_TEST_FIRST_HELPER(__VA_ARGS__, throwaway)
|
|
||||||
#define RUN_TEST_FIRST_HELPER(first, ...) (first), #first
|
|
||||||
#define RUN_TEST_SECOND(...) RUN_TEST_SECOND_HELPER(__VA_ARGS__, __LINE__, throwaway)
|
|
||||||
#define RUN_TEST_SECOND_HELPER(first, second, ...) (second)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If we can't do the tricky version, we'll just have to require them to always include the line number */
|
|
||||||
#ifndef RUN_TEST
|
|
||||||
#ifdef CMOCK
|
|
||||||
#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num)
|
|
||||||
#else
|
|
||||||
#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TEST_LINE_NUM (Unity.CurrentTestLineNumber)
|
|
||||||
#define TEST_IS_IGNORED (Unity.CurrentTestIgnored)
|
|
||||||
#define UNITY_NEW_TEST(a) \
|
|
||||||
Unity.CurrentTestName = (a); \
|
|
||||||
Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \
|
|
||||||
Unity.NumberOfTests++;
|
|
||||||
|
|
||||||
#ifndef UNITY_BEGIN
|
|
||||||
#define UNITY_BEGIN() UnityBegin(__FILE__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UNITY_END
|
|
||||||
#define UNITY_END() UnityEnd()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UNITY_UNUSED(x) (void)(sizeof(x))
|
|
||||||
|
|
||||||
/*-----------------------------------------------
|
|
||||||
* Command Line Argument Support
|
|
||||||
*-----------------------------------------------*/
|
|
||||||
|
|
||||||
#ifdef UNITY_USE_COMMAND_LINE_ARGS
|
|
||||||
int UnityParseOptions(int argc, char** argv);
|
|
||||||
int UnityTestMatches(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Basic Fail and Ignore
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
|
|
||||||
/*-------------------------------------------------------
|
|
||||||
* Test Asserts
|
|
||||||
*-------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define UNITY_TEST_ASSERT(condition, line, message) if (condition) {} else {UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message));}
|
|
||||||
#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message))
|
|
||||||
#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message))
|
|
||||||
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU8 )(expected), (_U_SINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU16)(expected), (_U_SINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU32)(expected), (_U_SINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
|
|
||||||
#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((_U_SINT)(mask), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
|
|
||||||
#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
|
|
||||||
#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
|
|
||||||
#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
|
|
||||||
#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
|
|
||||||
#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
|
|
||||||
#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
|
|
||||||
#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
|
|
||||||
#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
|
|
||||||
#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
|
|
||||||
#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
|
|
||||||
#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
|
|
||||||
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UP)(expected), (_U_SINT)(_UP)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (_UU32)(len), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), 1, (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(_UP*)(expected), (UNITY_INTERNAL_PTR)(_UP*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
|
|
||||||
#ifdef UNITY_SUPPORT_64
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
|
|
||||||
#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
|
|
||||||
#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
|
|
||||||
#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
|
|
||||||
#else
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNITY_EXCLUDE_FLOAT
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
|
|
||||||
#else
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((_UF)(delta), (_UF)(expected), (_UF)(actual), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((_UF)(expected) * (_UF)UNITY_FLOAT_PRECISION, (_UF)(expected), (_UF)(actual), (UNITY_LINE_TYPE)(line), (message))
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((_UF*)(expected), (_UF*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line))
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN)
|
|
||||||
#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNITY_EXCLUDE_DOUBLE
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
|
|
||||||
#else
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((_UD)(delta), (_UD)(expected), (_UD)(actual), (message), (UNITY_LINE_TYPE)line)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((_UD)(expected) * (_UD)UNITY_DOUBLE_PRECISION, (_UD)expected, (_UD)actual, (UNITY_LINE_TYPE)(line), message)
|
|
||||||
#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((_UD*)(expected), (_UD*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN)
|
|
||||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* End of UNITY_INTERNALS_H */
|
|
||||||
#endif
|
|
Loading…
Add table
Add a link
Reference in a new issue