1
0
mirror of https://github.com/xmrig/xmrig.git synced 2025-12-08 00:15:04 -05:00

Compare commits

...

303 Commits

Author SHA1 Message Date
XMRig
fc1bbbba6e v2.13.1 2019-02-25 21:23:59 +07:00
xmrig
d6788e4c46 Update CHANGELOG.md 2019-02-25 21:13:24 +07:00
XMRig
3ab7c8344e Merge branch 'dev' 2019-02-25 21:07:27 +07:00
xmrig
9155e6a2a0 Merge pull request #946 from SChernykh/feature-softaes
Optimized soft AES implementations
2019-02-25 16:11:49 +07:00
XMRig
948f23c7d9 Small code cleanups. 2019-02-25 15:54:21 +07:00
SChernykh
d4d0c69b5d Fixed compilation error in Linux 2019-02-24 20:23:52 +01:00
SChernykh
488cec09dd Optimized soft AES implementations
cn-pico: +6.7%
cn/half: +6.2%
cn/2: +4.3%
cn-heavy: +9.1%
cn/wow, cn/r: 2.4-2.6 times faster
2019-02-24 20:04:09 +01:00
XMRig
a5dcd6dd1f v2.13.1-dev 2019-02-23 10:00:20 +07:00
XMRig
d9066dc817 Merge branch 'master' into dev 2019-02-23 09:59:42 +07:00
XMRig
cac240104e Sync changes with AMD miner. 2019-02-21 19:03:53 +07:00
XMRig
eec5ca5535 v2.13.0 2019-02-21 17:37:05 +07:00
XMRig
060655fc6c Merge branch 'dev' 2019-02-21 17:36:36 +07:00
xmrig
5bd2b8fd3f Update CHANGELOG.md 2019-02-21 16:58:42 +07:00
XMRig
ac58ece16e Allow expired shares. 2019-02-21 14:20:23 +07:00
XMRig
a0553264a4 Merge branch 'dev' of github.com:xmrig/xmrig into dev 2019-02-20 09:10:07 +07:00
XMRig
1c16cfedfc v2.13.0-dev 2019-02-20 09:07:39 +07:00
XMRig
1ea34b31a1 #932 Fixed "cn-pico/trtl" performance. 2019-02-19 11:26:19 +07:00
XMRig
55c8ac6736 Merge branch 'evo' into dev 2019-02-19 10:12:42 +07:00
XMRig
601453bff6 Expired shares not allowed for cn/r. 2019-02-19 09:57:21 +07:00
XMRig
1bd51dcf2e Fixed msvc2015/msys2 build & code cleanup. 2019-02-19 09:15:06 +07:00
XMRig
41feb756bf Merge branch 'feature-cn4' of https://github.com/SChernykh/xmrig into evo 2019-02-19 08:15:36 +07:00
XMRig
3393ea346b Removed unused code. 2019-02-19 07:49:39 +07:00
XMRig
84f85b4200 Sync changes. 2019-02-18 19:02:40 +07:00
SChernykh
415600b8c9 Use public name CryptonightR for Monero's variant 4 2019-02-18 08:03:41 +01:00
XMRig
b7c17cf1a0 Fixed Linux build. 2019-02-18 12:39:52 +07:00
XMRig
de975adb8a Revert variant into summary output. 2019-02-18 08:14:42 +07:00
SChernykh
764767d317 Support for Cryptonight variant 4 (Monero) 2019-02-17 18:17:14 +01:00
XMRig
9c088eabc2 Implemented dynamic pool reload. 2019-02-17 19:29:33 +07:00
XMRig
7c789a0d3c Added "enabled" field to pools. 2019-02-17 15:55:05 +07:00
XMRig
bdff4064a2 Create pools directly from JSON objects. 2019-02-17 15:43:55 +07:00
XMRig
3a0fdcac6f Create network strategies in Pools class. 2019-02-17 11:25:25 +07:00
XMRig
ee4f6e28f0 * [WIP] More unification in Pools class. 2019-02-17 10:51:32 +07:00
XMRig
f6699b5929 [WIP] Use unified Pools class. 2019-02-17 08:53:37 +07:00
XMRig
ee667144e8 Move network classes into xmrig namespace. 2019-02-17 06:59:19 +07:00
XMRig
dbdcc14672 Move Pool.h/Pool.cpp. 2019-02-16 09:56:08 +07:00
XMRig
4f188a2cd8 Add Signals class. 2019-02-15 14:21:40 +07:00
XMRig
70d6e0e62c Use early exit for --help and --version options. 2019-02-15 09:11:18 +07:00
XMRig
14e7c82512 Prevent config reload after initial save. 2019-02-15 07:06:48 +07:00
XMRig
f4d2dec628 Added classes Process and Arguments. 2019-02-15 05:42:46 +07:00
XMRig
0450c31449 Rewritten watch feature. 2019-02-15 04:59:20 +07:00
XMRig
b368ffacdb Added class Json. 2019-02-14 18:14:38 +07:00
XMRig
2df204f8a8 v2.12.1-dev 2019-02-14 06:00:42 +07:00
XMRig
d554f1c12a Merge branch 'master' into dev 2019-02-14 06:00:12 +07:00
XMRig
ca5fb6e8f0 v2.12.0 2019-02-13 09:28:06 +07:00
XMRig
7f5ac83050 Merge branch 'dev' 2019-02-13 09:27:10 +07:00
xmrig
3688cd9b6c Update CHANGELOG.md 2019-02-13 09:17:30 +07:00
XMRig
33a3ae59bd Removed "cn/r" alias and fixed build without ASM. 2019-02-13 00:18:40 +07:00
XMRig
8cf56438f6 Merge branch 'feature-cn-wow' into dev 2019-02-12 04:47:09 +07:00
XMRig
4a781cee8b Expired shares prohibited for cn/wow. 2019-02-12 03:15:36 +07:00
XMRig
8d316c17f0 Add block version check for pools without algorithm negotiation. 2019-02-11 07:07:09 +07:00
XMRig
42e0d35207 Show height only if it specified by pool. 2019-02-11 06:22:20 +07:00
XMRig
a6813ef4f5 Temporary added "cn/r" alias for test pool. 2019-02-11 05:46:43 +07:00
SChernykh
36ce144d35 Fixed ARM code 2019-02-10 16:04:24 +01:00
SChernykh
65dab8371b Removed unused variable 2019-02-10 15:46:55 +01:00
SChernykh
c2e15e2b86 Fixed ARM compilation 2019-02-10 15:34:31 +01:00
SChernykh
e3f2c38fff CryptonightR support for Wownero 2019-02-10 15:21:17 +01:00
XMRig
73852f44c6 v2.11.1-dev 2019-02-10 01:30:54 +07:00
XMRig
01428acc65 Merge branch 'master' into dev 2019-02-10 01:30:12 +07:00
XMRig
9dd223d5b1 v2.11.0 2019-02-09 22:06:38 +07:00
XMRig
c27c577c5e Merge branch 'dev' 2019-02-09 22:06:10 +07:00
xmrig
a1fec1c797 Update CHANGELOG.md 2019-02-09 16:36:28 +07:00
XMRig
a5f77eb16a #925 Fixed self test on recent macOS. 2019-02-09 03:48:24 +07:00
XMRig
5b3ad39a9e v2.11.0-dev 2019-02-08 17:25:09 +07:00
XMRig
1a2aaf210c Sync changes. 2019-02-08 16:55:21 +07:00
XMRig
a6a0fb965a Fixed self test, cn/gpu not support multihash mode. 2019-02-06 01:27:50 +07:00
XMRig
aabdff2cc9 Fixed floating-point rounding, resolved conflict between cn/2 and cn/gpu. Thanks @SChernykh. 2019-02-06 00:38:55 +07:00
XMRig
3f8898f228 Sync changes. 2019-02-05 18:47:54 +07:00
XMRig
ab60add9d5 #749 Use HWCAP to detect AES feature on ARMv8, thanks @lhirlimann. 2019-02-04 03:03:10 +07:00
XMRig
7e4858db2a Allow override ARM arch detection and support for ARMv8 without crypto extension. 2019-02-04 02:23:05 +07:00
XMRig
885a2cab21 Merge branch 'feature-cn-gpu' into dev 2019-02-04 00:14:14 +07:00
XMRig
3337f5ac43 Fix ARM builds with clang. 2019-02-03 20:43:49 +07:00
XMRig
5f113a47cf Fix typo. 2019-02-03 20:34:24 +07:00
XMRig
f4170ec7bc Add ARM support for cn/gpu. 2019-02-03 20:28:13 +07:00
XMRig
e9069a381e Disable cn/gpu for 32bit builds. 2019-02-03 16:49:17 +07:00
XMRig
ca18622ad0 Disable -Ofast for gcc and cn/gpu. 2019-02-03 16:00:06 +07:00
XMRig
eac6a97a2e Fix Linux build. 2019-02-03 14:48:11 +07:00
XMRig
bd4bc9ba4d Added reference implementation for cn/gpu (cn-gpu). 2019-02-03 14:44:23 +07:00
XMRig
7605c4241f v2.10.1-dev 2019-02-02 01:33:25 +07:00
XMRig
bb583afcff Merge branch 'master' into dev 2019-02-02 01:32:52 +07:00
xmrig
5a2cf85b6c Update CHANGELOG.md 2019-01-23 19:44:14 +07:00
xmrig
80de5766ac Update CHANGELOG.md 2019-01-23 19:39:55 +07:00
XMRig
2c0183dcef v2.10.0 2019-01-23 19:31:45 +07:00
XMRig
8a90fc699e Merge branch 'dev' 2019-01-23 19:29:54 +07:00
XMRig
b1816005fd Sync changes with proxy. 2019-01-21 19:16:49 +07:00
XMRig
f478fa843d Better fix for memory allocation, thanks @SChernykh. 2019-01-21 17:27:45 +07:00
XMRig
046c345f65 Fix memory allocation. 2019-01-21 01:44:15 +07:00
XMRig
9692f92c6b New default value for max-cpu-usage option is 100 (instead of 75) also this option now deprecated. 2019-01-21 00:37:36 +07:00
XMRig
bc26d2ede6 #904 Add ASM implementation. 2019-01-21 00:32:24 +07:00
XMRig
36b01f136f #904 Initial support for "cn-pico/trtl". 2019-01-20 19:52:44 +07:00
XMRig
ca43d155d8 v2.9.5-dev 2019-01-20 15:13:01 +07:00
XMRig
e04d0f504c Merge branch 'master' into dev 2019-01-20 15:12:26 +07:00
XMRig
acca8f79cf v2.9.4 2019-01-19 23:55:30 +07:00
XMRig
2c38f693d7 Merge branch 'dev' 2019-01-19 23:54:50 +07:00
xmrig
4faa95b460 Update CHANGELOG.md 2019-01-19 23:53:39 +07:00
xmrig
5f9ebdf149 Merge pull request #915 from SChernykh/dev
Make JIT memory read-only after patching is done
2019-01-19 17:55:54 +07:00
SChernykh
31a571dc70 Make JIT memory read-only after patching is done 2019-01-19 11:22:54 +01:00
XMRig
897ff83dcd #913 Increase max blob size for MSR secor upgrade. 2019-01-18 21:44:44 +07:00
XMRig
a63794ccd6 v2.9.4-dev 2019-01-17 20:43:25 +07:00
XMRig
b15e605614 Merge branch 'master' into dev 2019-01-17 20:41:52 +07:00
XMRig
18335392a1 Merge branch 'master' of github.com:xmrig/xmrig 2019-01-17 12:22:00 +07:00
XMRig
b1c22da6a1 v2.9.3 2019-01-17 12:21:39 +07:00
xmrig
b95ff65eae Update CHANGELOG.md 2019-01-17 12:20:37 +07:00
xmrig
005a09cd98 Merge pull request #912 from SChernykh/master
Correct FP rounding mode for cn/half
2019-01-17 12:12:03 +07:00
SChernykh
e0f5066ded Correct FP rounding mode for cn/half 2019-01-17 00:49:48 +01:00
XMRig
2b15bcbb4f Don't use __builtin___clear_cache on FreeBSD. 2019-01-16 17:53:47 +07:00
xmrig
db646d5d2d Merge pull request #910 from ehaupt/patch-1
FreeBSD needs pthread
2019-01-16 17:50:53 +07:00
Emanuel Haupt
b58e20dde4 FreeBSD needs pthread
FreeBSD needs the pthread linker flag.
2019-01-16 10:55:45 +01:00
XMRig
b11e772acc v2.9.2 2019-01-16 09:17:35 +07:00
xmrig
d1bc03351b Merge pull request #907 from SChernykh/master
Fixed crash in patchCode() on Linux
2019-01-16 09:09:51 +07:00
SChernykh
d1f551da2c Fixed compilation error on Windows 2019-01-16 00:24:34 +01:00
SChernykh
6425c53d61 Fixed crash in patchCode() on Linux 2019-01-16 00:09:00 +01:00
XMRig
118e547175 Restored compatibility with https://stellite.hashvault.pro. 2019-01-16 02:22:29 +07:00
XMRig
d696daf5af Merge branch 'dev' 2019-01-16 00:42:06 +07:00
xmrig
ac60d9426c Update README.md 2019-01-16 00:34:48 +07:00
XMRig
209796a07e v2.9.0 2019-01-16 00:32:02 +07:00
XMRig
a1f19305f4 Merge branch 'dev' 2019-01-16 00:30:15 +07:00
xmrig
dd3243aa70 Update CHANGELOG.md 2019-01-16 00:28:49 +07:00
XMRig
09893bfd36 Fix warnings on macOS. 2019-01-15 18:28:35 +07:00
XMRig
a98c475a3c Fixed wrong ASM code alignment on macOS, thanks @SChernykh. 2019-01-15 18:18:04 +07:00
XMRig
59b147b6fb Merge branch 'pr905' into dev 2019-01-15 02:18:30 +07:00
XMRig
17f28667b3 Code-style/copyright cleanup. 2019-01-15 02:15:36 +07:00
XMRig
63a62e7ea0 Merge branch 'dev' of https://github.com/SChernykh/xmrig into pr905 2019-01-15 01:37:53 +07:00
SChernykh
56cacbd5bc Fixes for Visual Studio 2019-01-14 16:38:28 +01:00
SChernykh
8b9d5cff91 Added ASM code patching when loading
For CNv2 variants with different iterations and memory size.
2019-01-14 15:34:55 +01:00
XMRig
eede1b4881 Allow ignore block version. 2019-01-14 20:59:39 +07:00
XMRig
492449e9fb #899 Add ASM implementation for cn/half. 2019-01-14 18:09:16 +07:00
XMRig
b43336582d Rename ASM files. 2019-01-13 23:00:41 +07:00
XMRig
67863a427d Rename "cn/xtlv9" to "cn/half". 2019-01-13 19:42:27 +07:00
XMRig
1382857c83 #899 Fixed ARM build. 2019-01-13 15:24:04 +07:00
XMRig
84c2cadc50 #899 Initial support for "cn/xtlv9" (C++ only). 2019-01-13 15:03:36 +07:00
XMRig
16b4fd0ff5 Update variant detection for nicehash.com and minergate.com. 2019-01-09 21:47:03 +07:00
XMRig
cfe3995aa8 Sync changes. 2019-01-09 16:43:36 +07:00
XMRig
5382216725 Merge branch 'pr857' into dev 2018-11-20 08:19:29 +07:00
XMRig
c06f77b9e9 Better compiler name and version handling on Linux and macOS for user-agent string. 2018-11-20 08:18:39 +07:00
XMRig
0c930e277b Merge branch 'upstream-osx-compilers' of https://github.com/rivoreo/xmrig into pr857 2018-11-20 08:03:05 +07:00
XMRig
2a2712ab90 Sync changes. 2018-11-20 07:24:14 +07:00
XMRig
9f6f599d78 Sync changes. 2018-11-11 03:18:56 +07:00
XMRig
a76243a65e Sync changes with proxy. 2018-11-06 00:50:28 +07:00
WHR
16babcc6bc Fix impossible to build for OS X without clang 2018-10-30 21:15:49 +08:00
XMRig
3d60b3cc62 #844 Fixed copy/paste typo in comment. 2018-10-25 14:07:15 +07:00
XMRig
acd042c234 #839 Fixed FreeBSD compile. 2018-10-24 09:55:40 +07:00
XMRig
a2e384df58 Merge branch 'feature-asm-bulldozer' into dev 2018-10-22 23:24:26 +07:00
XMRig
735180ac04 Fixed MSVC 2015 build. 2018-10-22 23:17:54 +07:00
XMRig
06a84499d7 Fixed MSYS2 build & copyright 2018-10-22 23:08:29 +07:00
XMRig
caa70a1e9d Merge branch 'dev' of https://github.com/SChernykh/xmrig into feature-asm-bulldozer 2018-10-22 22:52:53 +07:00
XMRig
deb832c9c6 Restore old method for total threads count detection. 2018-10-21 23:52:23 +07:00
XMRig
d7feb2719e v2.8.5-dev 2018-10-21 23:29:17 +07:00
SChernykh
4b91978af6 Added asm optimized code for AMD Bulldozer 2018-10-21 18:29:03 +02:00
XMRig
7e078f2d07 Merge branch 'master' into dev 2018-10-21 23:25:06 +07:00
xmrig
2b0b71b9f6 Update CHANGELOG.md 2018-10-19 10:41:32 +07:00
xmrig
938e652c45 Update CHANGELOG.md 2018-10-19 10:26:12 +07:00
xmrig
20bd22ea22 Update README.md 2018-10-19 10:19:18 +07:00
xmrig
c7c9d20b8b Update CHANGELOG.md 2018-10-19 09:59:14 +07:00
XMRig
dd6aeb26e8 v2.8.3 2018-10-19 09:56:28 +07:00
XMRig
ba0df6e973 Merge branch 'dev' 2018-10-19 09:52:09 +07:00
xmrig
a0f48adf5c Merge pull request #814 from 0xc0d32/patch-1
Update Pool.cpp
2018-10-19 09:40:00 +07:00
_0xc0d32
2b0cac5d4d Update Pool.cpp
Fixed to #813
2018-10-18 22:42:47 -03:00
XMRig
afeaabdca4 v2.8.2-dev 2018-10-15 18:22:45 +07:00
XMRig
6b584a78b2 Merge branch 'master' into dev 2018-10-15 18:21:37 +07:00
xmrig
4bf248f513 Update README.md 2018-10-09 07:41:40 +07:00
XMRig
93b54f8f44 v2.8.1 2018-10-09 07:22:23 +07:00
XMRig
dd7c776ff4 Merge branch 'dev' 2018-10-09 07:19:07 +07:00
xmrig
ff3ae25d16 Update CHANGELOG.md 2018-10-09 07:12:31 +07:00
XMRig
bdc16df418 #777 Make EOF as verbose error too. 2018-10-09 03:47:39 +07:00
XMRig
9ef59366ba Sync changes with proxy. 2018-10-09 02:32:29 +07:00
XMRig
dda8157a7b Add "--tls", "--tls-fingerprint", "--asm" and "--dry-run" to help output. 2018-10-09 01:35:33 +07:00
xmrig
023062b2f1 Update README.md 2018-10-09 01:32:07 +07:00
XMRig
ad92c3b025 Add ASM detection for builds without libcpuid. 2018-10-06 15:13:55 +03:00
xmrig
8f3d405b34 Update CHANGELOG.md 2018-10-06 14:25:59 +03:00
XMRig
20268d5291 #753 Removed unnecessary ext_family and ext_model checks. 2018-10-04 19:10:47 +03:00
XMRig
152c4f2f1b #768 Fixed build error with MSVC 2015 and enabled ASM code. 2018-10-02 17:50:19 +03:00
XMRig
c2f6c70044 #769 Fixed regression with colors. 2018-10-02 13:14:32 +03:00
XMRig
9a70f0e564 v2.8.1-dev 2018-10-02 01:22:13 +03:00
XMRig
0efd995b9b Merge branch 'master' into dev 2018-10-02 01:18:18 +03:00
xmrig
a33fbe32c6 Update README.md 2018-10-01 13:36:03 +03:00
XMRig
dc6d6bd539 v2.8.0-rc 2018-09-30 20:06:46 +03:00
XMRig
880747d0e0 Merge branch 'dev' 2018-09-30 19:59:25 +03:00
XMRig
dc67352ac5 Update default config.json. 2018-09-30 17:57:25 +03:00
xmrig
cb87c244c3 Update README.md 2018-09-30 17:44:10 +03:00
xmrig
ae25c01d36 Merge pull request #766 from Roboto12/patch-1
Update Asm.cpp
2018-09-30 17:36:07 +03:00
xmrig
fa38d97192 Update CHANGELOG.md 2018-09-30 16:20:20 +03:00
XMRig
9a173ce91e Fix default value for "restricted" option. 2018-09-29 18:05:38 +03:00
Roboto12
fbba3d1be6 Update Asm.cpp
parse(value.IsBool()) should be changed to parse(value.GetBool()), otherwise if the 'asm' parameter in config has a boolean value, it will be parse as 'true' even if it's actually 'false'.
2018-09-28 19:18:37 +03:00
xmrig
782a91f7e6 Update README.md 2018-09-28 12:37:21 +03:00
xmrig
52e871b810 Update README.md 2018-09-28 12:36:14 +03:00
XMRig
143da8380e Add "autosave" config option. 2018-09-27 19:07:04 +03:00
XMRig
a63677e255 Fix missing "asm" in generated config. 2018-09-27 17:17:19 +03:00
XMRig
850150dc00 Merge branch 'dev' of github.com:xmrig/xmrig into dev 2018-09-26 20:37:32 +03:00
XMRig
0d197f8906 New donations proxy addresses with SSL/TLS support. 2018-09-26 20:35:27 +03:00
xmrig
03b4e160ec Update CHANGELOG.md 2018-09-25 10:16:29 +03:00
xmrig
18dc19b1e8 Update CHANGELOG.md 2018-09-25 10:15:41 +03:00
XMRig
0d9db273a0 Fix template declaration. 2018-09-25 09:40:09 +03:00
XMRig
1a3de05096 Added ASM code for double hash mode, thanks @SChernykh. 2018-09-25 09:25:47 +03:00
XMRig
c9928a873d Merge branch 'feature-asm' into dev 2018-09-24 23:21:23 +03:00
XMRig
ebcdac7d13 Fixed crash when use ASM code for MSYS2, thanks @SChernykh. 2018-09-24 20:43:31 +03:00
XMRig
f4a867b70f Fix 32bit build. 2018-09-24 14:57:30 +03:00
XMRig
c2fcf23855 Implemented "asm" option. 2018-09-24 14:19:26 +03:00
XMRig
ba65a34a01 Initial ASM wrapper. 2018-09-24 09:51:21 +03:00
XMRig
f163aad38c Fix macOS/Clang build. 2018-09-23 20:45:10 +03:00
XMRig
dd27c42293 Initial compile with ASM. 2018-09-23 20:16:33 +03:00
XMRig
0c20d7a125 Auto-detect proper asm variant. 2018-09-23 19:09:05 +03:00
XMRig
c9fd8061c2 Fix Linux build. 2018-09-23 18:07:44 +03:00
XMRig
ee4d980955 Old static class Cpu replaced to interface ICpuInfo. 2018-09-23 17:51:56 +03:00
XMRig
1f609c7ebd Update libcpuid to recent git version. 2018-09-23 13:05:03 +03:00
xmrig
cf76d9254a Merge pull request #761 from SChernykh/dev
Cryptonight variant 2 - final version
2018-09-23 07:47:02 +03:00
SChernykh
d8ca5ef205 Cryptonight variant 2 - final version
Reference code: https://github.com/monero-project/monero/pull/4404

I tested it on x86 with av=1-10 and on ARM with av=1-4, self test passed.
2018-09-22 17:21:32 +02:00
XMRig
30791de5bc Don't use static OpenSSL on Linux by default. 2018-09-22 16:01:27 +03:00
XMRig
3a7e8647bb Fix for automatic variant specified by pool/proxy. 2018-09-22 15:54:31 +03:00
xmrig
f1a1e0814c Update CHANGELOG.md 2018-09-22 08:54:56 +03:00
xmrig
feb1a758c1 Update CHANGELOG.md 2018-09-22 08:42:15 +03:00
XMRig
0adad68471 # Fixed send buffer overflow and increase send buffer size. 2018-09-20 07:33:32 +03:00
XMRig
dc76879188 Merge branch 'feature-tls' into dev 2018-09-18 04:13:40 +03:00
XMRig
bcd27ca259 Sync changes. 2018-09-18 04:04:25 +03:00
XMRig
4c4e0593a7 Enable TLS by default. 2018-09-17 09:24:18 +03:00
XMRig
2189fe94ed Fix Linux build. 2018-09-17 06:37:53 +03:00
XMRig
a2d2c0418d Fix gcc build with OpenSSL 1.1.1 2018-09-17 01:43:44 +03:00
XMRig
1059189e2c Skip TLS pools if miner built without TLS support. 2018-09-17 01:02:17 +03:00
XMRig
7da9e7a599 Added TLS fingerprint validation. 2018-09-16 08:14:22 +03:00
XMRig
bc9130ded3 Show TLS version. 2018-09-16 06:35:49 +03:00
XMRig
2f3939396e Move shared summary to xmrig::CommonConfig. 2018-09-16 05:04:20 +03:00
XMRig
14ac7b556e Initial TLS support. 2018-09-16 03:06:54 +03:00
XMRig
812cd9760f Added debug thread log. 2018-09-15 16:48:57 +03:00
XMRig
93216a51f4 Fix compile error on macOS. 2018-09-14 22:04:52 +03:00
XMRig
357fbac62b Suppress rapidjson warnings on gcc 8 2018-09-14 21:42:42 +03:00
XMRig
0bc9016124 v2.8.0-dev 2018-09-13 11:20:10 +03:00
XMRig
310ad7fa37 Merge branch 'feature-cn-variant2' into dev 2018-09-13 11:16:10 +03:00
XMRig
23914e9a9f "xmrig::cn_uses_variant1" replaced to "xmrig::cn_base_variant". 2018-09-10 18:35:12 +03:00
XMRig
bb3990a076 Rewrite automatic variant handling. 2018-09-03 15:39:55 +03:00
XMRig
a27dfa8b70 Add WITH_DEBUG_LOG CMake option. 2018-09-03 01:26:19 +03:00
XMRig
a3873930a0 Fixed automatic variant. 2018-09-01 00:31:31 +03:00
XMRig
b948474d01 Small fixes. 2018-09-01 00:00:38 +03:00
XMRig
85946b0c40 Fixed numeric variant 2 in config file. 2018-08-31 23:55:50 +03:00
XMRig
075565e6fa Fix invalid hashes with gcc 7.1. 2018-08-31 23:32:33 +03:00
XMRig
eef4d9b102 Fixed 32 bit support. 2018-08-31 23:19:10 +03:00
XMRig
f11aad515b Fixed gcc build. 2018-08-31 21:51:34 +03:00
XMRig
85b829a1e3 Merge branch 'dev' of https://github.com/SChernykh/xmrig into feature-cn-variant2 2018-08-31 19:46:15 +03:00
XMRig
73fca9114e * Fixed API ID collision. 2018-08-31 18:30:51 +03:00
XMRig
57479cef8c Sync changes. 2018-08-31 18:01:15 +03:00
SChernykh
ea1658c818 Fixed spaces 2018-08-29 20:27:17 +02:00
SChernykh
7c4b718789 Fixed performance degradation for v0 & v1 2018-08-29 20:15:08 +02:00
SChernykh
f151c7131d Removed excess code for v0 & v1 2018-08-29 19:52:33 +02:00
SChernykh
36a562e1f1 Cryptonight variant 2 support
Reference code: https://github.com/monero-project/monero/pull/4218
2018-08-28 23:42:15 +02:00
xmrig
dd8590e6c8 Update ALGORITHMS.md 2018-07-29 19:23:55 +07:00
XMRig
f7b029eb05 Sync changes with AMD miner. 2018-07-20 03:37:07 +07:00
XMRig
e8d6514bd3 2.6.5-dev 2018-07-20 03:18:38 +07:00
XMRig
95092bfadb Merge branch 'master' into dev 2018-07-20 03:06:59 +07:00
xmrig
08e791b60d Update README.md 2018-07-12 02:11:25 +07:00
XMRig
6b7030cd6f v2.6.4 2018-07-12 00:48:30 +07:00
XMRig
b736f0a558 Merge branch 'dev' 2018-07-12 00:39:30 +07:00
xmrig
807b2e9d6e Update ALGORITHMS.md 2018-07-11 20:51:30 +07:00
xmrig
034d2f0c08 Update ALGORITHMS.md 2018-07-11 20:50:55 +07:00
xmrig
4a39321d74 Update CHANGELOG.md 2018-07-11 20:42:16 +07:00
XMRig
0041e9f0c1 Add new algorithms for ARM. 2018-07-10 00:29:16 +07:00
XMRig
969a26fb5d Optimize cn-heavy/tube. 2018-07-09 22:28:53 +07:00
XMRig
dac12a122f Add cn-heavy/tube. 2018-07-09 20:21:53 +07:00
XMRig
2702b6ffc8 Add reference hashes for cn/xao and cn/rto. 2018-07-09 16:54:39 +07:00
XMRig
25bac30862 Added "cn/xao" and "cn/rto". 2018-07-09 16:12:45 +07:00
XMRig
a8de81a51b #714 Simplify cn-heavy/xhv. 2018-07-09 00:23:27 +07:00
XMRig
b719bbfefc Better variant detection for nicehash.com and minergate.com. 2018-06-16 16:08:08 +07:00
XMRig
de6ee749fe #692 Add support for global algorithm variant. 2018-06-14 23:49:30 +07:00
XMRig
33d9094cdc Sync changes with proxy. 2018-06-14 21:49:27 +07:00
XMRig
63fed427f4 2.6.4-dev 2018-06-14 21:25:57 +07:00
XMRig
ae89ca0a5f Merge branch 'master' into dev 2018-06-14 21:06:09 +07:00
XMRig
25dce61369 Merge branch 'dev' 2018-06-13 21:49:13 +07:00
xmrig
8cb7483b2c Update README.md 2018-06-13 21:43:47 +07:00
xmrig
1e2fde0df1 Update CHANGELOG.md 2018-06-11 18:34:24 +07:00
XMRig
859515315c v2.6.3 2018-06-11 16:09:50 +07:00
XMRig
7f169e391d Merge branch 'dev' 2018-06-11 16:05:57 +07:00
XMRig
6a7a7ada2e Fix ARM build. 2018-06-11 15:44:45 +07:00
xmrig
21b2e2ca1e Update CHANGELOG.md 2018-06-11 15:23:06 +07:00
XMRig
1d31f1b0b8 Fix command line option "-a cn-heavy". 2018-06-11 12:26:49 +07:00
XMRig
dab4239aca Added support for cn-heavy/xhv. 2018-06-11 12:00:59 +07:00
XMRig
8908c2c027 Added support for "cn/msr" also known as "cn-fast". 2018-06-10 19:48:34 +07:00
XMRig
974cb4162a Fix Linux build. 2018-06-07 07:17:30 +07:00
XMRig
dba78717fa Move dry-run option to common code. 2018-06-05 11:48:31 +07:00
XMRig
48a214c3f1 Move files. 2018-06-05 07:34:58 +07:00
XMRig
e320b2e928 #672 Reverted back "cryptonight-light" and exit if no valid algorithm specified. 2018-06-04 02:09:29 +07:00
XMRig
1748a7bd57 Fix double hash mode too. 2018-06-03 05:42:10 +07:00
XMRig
6cf24936df #551 Fixed cn-heavy for ARMv8. 2018-06-03 02:56:49 +07:00
XMRig
651637d637 #446 Better fix, second variable always aligned. 2018-06-03 00:22:26 +07:00
XMRig
26ee5028e1 Use native checks instead of XMRIG_ARMv8. 2018-06-03 00:09:59 +07:00
XMRig
d900a6d9dd #446 Fixed SIGBUS error on 32 bit ARM CPUs. 2018-06-02 04:37:12 +07:00
XMRig
5d6a622b18 New detailed hashrate report. 2018-06-01 02:33:21 +07:00
XMRig
009bd1a507 Sync changes with amd miner and update summary. 2018-06-01 01:48:31 +07:00
XMRig
34a3454784 Small fix in CMakeLists.txt. 2018-05-20 14:27:46 +07:00
XMRig
14f0e8658c Sync changes with proxy. 2018-05-19 14:44:50 +07:00
XMRig
6dda4ad41c Merge branch 'feature-log-enhancement' into dev 2018-05-19 14:33:26 +07:00
XMRig
2b3f7f43ce Fix Linux build. 2018-05-19 13:47:27 +07:00
XMRig
5019493332 Correctly reset colors in FileLog. 2018-05-19 13:06:49 +07:00
XMRig
0086020b5c Optimize logs architecture. 2018-05-19 11:48:15 +07:00
XMRig
adc6adb6d5 Merge branch 'master' into dev 2018-05-19 11:06:17 +07:00
xmrig
8ab9f0f860 Merge pull request #629 from rivoreo/upstream-fix-log-file
#629 Fix FileLog (--log-file) fails on non-seekable files
2018-05-17 11:52:43 +07:00
WHR
19f409a85b Fix FileLog error 'invalid seek' on non-seekable files 2018-05-15 03:12:12 +08:00
XMRig
6a4f817693 #615 Fixed build without libcpuid. 2018-05-08 06:19:10 +07:00
XMRig
4cd7af3da1 Merge branch 'master' of github.com:xmrig/xmrig 2018-05-08 02:39:27 +07:00
XMRig
d7d3fec058 #614 Fix display issue with huge pages percentage when colors disabled. 2018-05-08 02:39:11 +07:00
xmrig
8d61df7cc9 Update README.md 2018-05-07 14:27:48 +07:00
xmrig
b383a382eb Update README.md 2018-05-07 02:37:23 +07:00
xmrig
bee1285e3a Update CHANGELOG.md 2018-05-07 02:17:20 +07:00
XMRig
c89889cc57 #607 Fixed donation bug. 2018-05-07 02:09:25 +07:00
XMRig
a1c5afa383 Fix Termux build. 2018-05-07 00:56:39 +07:00
XMRig
a00024cf51 Fixed ARMv8 build. 2018-05-05 22:44:20 +07:00
XMRig
a5325d9021 Merge branch 'master' into dev 2018-05-05 19:32:30 +07:00
190 changed files with 26203 additions and 3697 deletions

View File

@@ -1,3 +1,84 @@
# v2.13.1
[#946](https://github.com/xmrig/xmrig/pull/946) Optimized software AES implementations for CPUs without hardware AES support. `cn/r`, `cn/wow` up to 2.6 times faster, 4-9% improvements for other algorithms.
# v2.13.0
- **[#938](https://github.com/xmrig/xmrig/issues/938) Added support for new algorithm `cryptonight/r`, short alias `cn/r` (also known as CryptoNightR or CryptoNight variant 4), for upcoming [Monero](https://www.getmonero.org/) fork on March 9, thanks [@SChernykh](https://github.com/SChernykh).**
- [#939](https://github.com/xmrig/xmrig/issues/939) Added support for dynamic (runtime) pools reload.
- [#932](https://github.com/xmrig/xmrig/issues/932) Fixed `cn-pico` hashrate drop, regression since v2.11.0.
# v2.12.0
- [#929](https://github.com/xmrig/xmrig/pull/929) Added support for new algorithm `cryptonight/wow`, short alias `cn/wow` (also known as CryptonightR), for upcoming [Wownero](http://wownero.org) fork on February 14.
# v2.11.0
- [#928](https://github.com/xmrig/xmrig/issues/928) Added support for new algorithm `cryptonight/gpu`, short alias `cn/gpu` (original name `cryptonight-gpu`), for upcoming [Ryo currency](https://ryo-currency.com) fork on February 14.
- [#749](https://github.com/xmrig/xmrig/issues/749) Added support for detect hardware AES in runtime on ARMv8 platforms.
- [#292](https://github.com/xmrig/xmrig/issues/292) Fixed build on ARMv8 platforms if compiler not support hardware AES.
# v2.10.0
- [#904](https://github.com/xmrig/xmrig/issues/904) Added new algorithm `cn-pico/trtl` (aliases `cryptonight-turtle`, `cn-trtl`) for upcoming TurtleCoin (TRTL) fork.
- Default value for option `max-cpu-usage` changed to `100` also this option now deprecated.
# v2.9.4
- [#913](https://github.com/xmrig/xmrig/issues/913) Fixed Masari (MSR) support (this update required for upcoming fork).
- [#915](https://github.com/xmrig/xmrig/pull/915) Improved security, JIT memory now read-only after patching.
# v2.9.3
- [#909](https://github.com/xmrig/xmrig/issues/909) Fixed compile errors on FreeBSD.
- [#912](https://github.com/xmrig/xmrig/pull/912) Fixed, C++ implementation of `cn/half` was produce up to 13% of invalid hashes.
# v2.9.2
- [#907](https://github.com/xmrig/xmrig/pull/907) Fixed crash on Linux.
# v2.9.1
- Restored compatibility with https://stellite.hashvault.pro.
# v2.9.0
- [#899](https://github.com/xmrig/xmrig/issues/899) Added support for new algorithm `cn/half` for Masari and Stellite forks.
- [#834](https://github.com/xmrig/xmrig/pull/834) Added ASM optimized code for AMD Bulldozer.
- [#839](https://github.com/xmrig/xmrig/issues/839) Fixed FreeBSD compile.
- [#857](https://github.com/xmrig/xmrig/pull/857) Fixed impossible to build for macOS without clang.
# v2.8.3
- [#813](https://github.com/xmrig/xmrig/issues/813) Fixed critical bug with Minergate pool and variant 2.
# v2.8.1
- [#768](https://github.com/xmrig/xmrig/issues/768) Fixed build with Visual Studio 2015.
- [#769](https://github.com/xmrig/xmrig/issues/769) Fixed regression, some ANSI escape sequences was in log with disabled colors.
- [#777](https://github.com/xmrig/xmrig/issues/777) Better report about pool connection issues.
- Simplified checks for ASM auto detection, only AES support necessary.
- Added missing options to `--help` output.
# v2.8.0
- **[#753](https://github.com/xmrig/xmrig/issues/753) Added new algorithm [CryptoNight variant 2](https://github.com/xmrig/xmrig/issues/753) for Monero fork, thanks [@SChernykh](https://github.com/SChernykh).**
- Added global and per thread option `"asm"` and and command line equivalent.
- **[#758](https://github.com/xmrig/xmrig/issues/758) Added SSL/TLS support for secure connections to pools.**
- Added per pool options `"tls"` and `"tls-fingerprint"` and command line equivalents.
- [#767](https://github.com/xmrig/xmrig/issues/767) Added config autosave feature, same with GPU miners.
- [#245](https://github.com/xmrig/xmrig-proxy/issues/245) Fixed API ID collision when run multiple miners on same machine.
- [#757](https://github.com/xmrig/xmrig/issues/757) Fixed send buffer overflow.
# v2.6.4
- [#700](https://github.com/xmrig/xmrig/issues/700) `cryptonight-lite/ipbc` replaced to `cryptonight-heavy/tube` for **Bittube (TUBE)**.
- Added `cryptonight/rto` (cryptonight variant 1 with IPBC/TUBE mod) variant for **Arto (RTO)** coin.
- Added `cryptonight/xao` (original cryptonight with bigger iteration count) variant for **Alloy (XAO)** coin.
- Better variant detection for **nicehash.com** and **minergate.com**.
- [#692](https://github.com/xmrig/xmrig/issues/692) Added support for specify both algorithm and variant via single `algo` option.
# v2.6.3
- **Added support for new cryptonight-heavy variant xhv** (`cn-heavy/xhv`) for upcoming Haven Protocol fork.
- **Added support for new cryptonight variant msr** (`cn/msr`) also known as `cryptonight-fast` for upcoming Masari fork.
- Added new detailed hashrate report.
- [#446](https://github.com/xmrig/xmrig/issues/446) Likely fixed SIGBUS error on 32 bit ARM CPUs.
- [#551](https://github.com/xmrig/xmrig/issues/551) Fixed `cn-heavy` algorithm on ARMv8.
- [#614](https://github.com/xmrig/xmrig/issues/614) Fixed display issue with huge pages percentage when colors disabled.
- [#615](https://github.com/xmrig/xmrig/issues/615) Fixed build without libcpuid.
- [#629](https://github.com/xmrig/xmrig/pull/629) Fixed file logging with non-seekable files.
- [#672](https://github.com/xmrig/xmrig/pull/672) Reverted back `cryptonight-light` and exit if no valid algorithm specified.
# v2.6.2
- [#607](https://github.com/xmrig/xmrig/issues/607) Fixed donation bug.
- [#610](https://github.com/xmrig/xmrig/issues/610) Fixed ARM build.
# v2.6.1 # v2.6.1
- [#168](https://github.com/xmrig/xmrig-proxy/issues/168) Added support for [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/blob/dev/doc/STRATUM_EXT.md#1-mining-algorithm-negotiation). - [#168](https://github.com/xmrig/xmrig-proxy/issues/168) Added support for [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/blob/dev/doc/STRATUM_EXT.md#1-mining-algorithm-negotiation).
- Added IPBC coin support, base algorithm `cn-lite` variant `ipbc`. - Added IPBC coin support, base algorithm `cn-lite` variant `ipbc`.

View File

@@ -1,12 +1,17 @@
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
project(xmrig) project(xmrig)
option(WITH_LIBCPUID "Use Libcpuid" ON) option(WITH_LIBCPUID "Use Libcpuid" ON)
option(WITH_AEON "CryptoNight-Lite support" ON) option(WITH_AEON "CryptoNight-Lite support" ON)
option(WITH_SUMO "CryptoNight-Heavy support" ON) option(WITH_SUMO "CryptoNight-Heavy support" ON)
option(WITH_IPBC "CryptoNight-IPBC support" ON) option(WITH_CN_PICO "CryptoNight-Pico support" ON)
option(WITH_HTTPD "HTTP REST API" ON) option(WITH_CN_GPU "CryptoNight-GPU support" ON)
option(BUILD_STATIC "Build static binary" OFF) option(WITH_HTTPD "HTTP REST API" ON)
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
option(WITH_TLS "Enable OpenSSL support" ON)
option(WITH_ASM "Enable ASM PoW implementations" ON)
option(BUILD_STATIC "Build static binary" OFF)
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
include (CheckIncludeFile) include (CheckIncludeFile)
include (cmake/cpu.cmake) include (cmake/cpu.cmake)
@@ -15,19 +20,42 @@ include (cmake/cpu.cmake)
set(HEADERS set(HEADERS
src/api/NetworkState.h src/api/NetworkState.h
src/App.h src/App.h
src/base/io/Json.h
src/base/io/Watcher.h
src/base/kernel/interfaces/IConfigListener.h
src/base/kernel/interfaces/ISignalListener.h
src/base/kernel/interfaces/IWatcherListener.h
src/base/kernel/Entry.h
src/base/kernel/Process.h
src/base/kernel/Signals.h
src/base/net/Pool.h
src/base/net/Pools.h
src/base/tools/Arguments.h
src/base/tools/Handle.h
src/base/tools/String.h
src/common/config/CommonConfig.h src/common/config/CommonConfig.h
src/common/config/ConfigLoader.h src/common/config/ConfigLoader.h
src/common/config/ConfigWatcher.h src/common/config/ConfigWatcher.h
src/common/Console.h src/common/Console.h
src/common/cpu/Cpu.h
src/common/crypto/Algorithm.h src/common/crypto/Algorithm.h
src/common/crypto/keccak.h src/common/crypto/keccak.h
src/common/interfaces/IClientListener.h
src/common/interfaces/IConfig.h
src/common/interfaces/IConfigCreator.h
src/common/interfaces/IConsoleListener.h
src/common/interfaces/IControllerListener.h
src/common/interfaces/ICpuInfo.h
src/common/interfaces/ILogBackend.h
src/common/interfaces/IStrategy.h
src/common/interfaces/IStrategyListener.h
src/common/log/BasicLog.h
src/common/log/ConsoleLog.h src/common/log/ConsoleLog.h
src/common/log/FileLog.h src/common/log/FileLog.h
src/common/log/Log.h src/common/log/Log.h
src/common/net/Client.h src/common/net/Client.h
src/common/net/Id.h src/common/net/Id.h
src/common/net/Job.h src/common/net/Job.h
src/common/net/Pool.h
src/common/net/Storage.h src/common/net/Storage.h
src/common/net/strategies/FailoverStrategy.h src/common/net/strategies/FailoverStrategy.h
src/common/net/strategies/SinglePoolStrategy.h src/common/net/strategies/SinglePoolStrategy.h
@@ -36,21 +64,10 @@ set(HEADERS
src/common/utils/c_str.h src/common/utils/c_str.h
src/common/utils/mm_malloc.h src/common/utils/mm_malloc.h
src/common/xmrig.h src/common/xmrig.h
src/core/Config.cpp
src/core/ConfigLoader_platform.h src/core/ConfigLoader_platform.h
src/core/Controller.h src/core/Controller.h
src/Cpu.h
src/interfaces/IClientListener.h
src/interfaces/IConfig.h
src/interfaces/IConfigCreator.h
src/interfaces/IConsoleListener.h
src/interfaces/IControllerListener.h
src/interfaces/IJobResultListener.h src/interfaces/IJobResultListener.h
src/interfaces/ILogBackend.h
src/interfaces/IStrategy.h
src/interfaces/IStrategyListener.h
src/interfaces/IThread.h src/interfaces/IThread.h
src/interfaces/IWatcherListener.h
src/interfaces/IWorker.h src/interfaces/IWorker.h
src/Mem.h src/Mem.h
src/net/JobResult.h src/net/JobResult.h
@@ -79,6 +96,7 @@ set(HEADERS_CRYPTO
src/crypto/hash.h src/crypto/hash.h
src/crypto/skein_port.h src/crypto/skein_port.h
src/crypto/soft_aes.h src/crypto/soft_aes.h
src/crypto/asm/CryptonightR_template.h
) )
if (XMRIG_ARM) if (XMRIG_ARM)
@@ -90,18 +108,28 @@ endif()
set(SOURCES set(SOURCES
src/api/NetworkState.cpp src/api/NetworkState.cpp
src/App.cpp src/App.cpp
src/base/io/Json.cpp
src/base/io/Watcher.cpp
src/base/kernel/Entry.cpp
src/base/kernel/Process.cpp
src/base/kernel/Signals.cpp
src/base/net/Pool.cpp
src/base/net/Pools.cpp
src/base/tools/Arguments.cpp
src/base/tools/Handle.cpp
src/base/tools/String.cpp
src/common/config/CommonConfig.cpp src/common/config/CommonConfig.cpp
src/common/config/ConfigLoader.cpp src/common/config/ConfigLoader.cpp
src/common/config/ConfigWatcher.cpp src/common/config/ConfigWatcher.cpp
src/common/Console.cpp src/common/Console.cpp
src/common/crypto/Algorithm.cpp src/common/crypto/Algorithm.cpp
src/common/crypto/keccak.cpp src/common/crypto/keccak.cpp
src/common/log/BasicLog.cpp
src/common/log/ConsoleLog.cpp src/common/log/ConsoleLog.cpp
src/common/log/FileLog.cpp src/common/log/FileLog.cpp
src/common/log/Log.cpp src/common/log/Log.cpp
src/common/net/Client.cpp src/common/net/Client.cpp
src/common/net/Job.cpp src/common/net/Job.cpp
src/common/net/Pool.cpp
src/common/net/strategies/FailoverStrategy.cpp src/common/net/strategies/FailoverStrategy.cpp
src/common/net/strategies/SinglePoolStrategy.cpp src/common/net/strategies/SinglePoolStrategy.cpp
src/common/net/SubmitResult.cpp src/common/net/SubmitResult.cpp
@@ -126,14 +154,15 @@ set(SOURCES_CRYPTO
src/crypto/c_blake256.c src/crypto/c_blake256.c
src/crypto/c_jh.c src/crypto/c_jh.c
src/crypto/c_skein.c src/crypto/c_skein.c
src/crypto/CryptonightR_gen.cpp
) )
if (WIN32) if (WIN32)
set(SOURCES_OS set(SOURCES_OS
res/app.rc res/app.rc
src/App_win.cpp src/App_win.cpp
src/base/io/Json_win.cpp
src/common/Platform_win.cpp src/common/Platform_win.cpp
src/Cpu_win.cpp
src/Mem_win.cpp src/Mem_win.cpp
) )
@@ -142,23 +171,23 @@ if (WIN32)
elseif (APPLE) elseif (APPLE)
set(SOURCES_OS set(SOURCES_OS
src/App_unix.cpp src/App_unix.cpp
src/base/io/Json_unix.cpp
src/common/Platform_mac.cpp src/common/Platform_mac.cpp
src/Cpu_mac.cpp
src/Mem_unix.cpp src/Mem_unix.cpp
) )
else() else()
set(SOURCES_OS set(SOURCES_OS
src/App_unix.cpp src/App_unix.cpp
src/base/io/Json_unix.cpp
src/common/Platform_unix.cpp src/common/Platform_unix.cpp
src/Cpu_unix.cpp
src/Mem_unix.cpp src/Mem_unix.cpp
) )
set(EXTRA_LIBS pthread rt) if (CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
endif() set(EXTRA_LIBS kvm pthread)
else()
if (CMAKE_SYSTEM_NAME STREQUAL FreeBSD) set(EXTRA_LIBS pthread rt dl)
set(EXTRA_LIBS ${EXTRA_LIBS} kvm) endif()
endif() endif()
if (CMAKE_SYSTEM_NAME MATCHES "Linux") if (CMAKE_SYSTEM_NAME MATCHES "Linux")
@@ -170,7 +199,6 @@ endif()
add_definitions(/D__STDC_FORMAT_MACROS) add_definitions(/D__STDC_FORMAT_MACROS)
add_definitions(/DUNICODE) add_definitions(/DUNICODE)
#add_definitions(/DAPP_DEBUG)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
@@ -183,17 +211,22 @@ if (WITH_LIBCPUID)
include_directories(src/3rdparty/libcpuid) include_directories(src/3rdparty/libcpuid)
set(CPUID_LIB cpuid) set(CPUID_LIB cpuid)
set(SOURCES_CPUID src/Cpu.cpp) set(SOURCES_CPUID src/core/cpu/AdvancedCpuInfo.h src/core/cpu/AdvancedCpuInfo.cpp src/core/cpu/Cpu.cpp)
else() else()
add_definitions(/DXMRIG_NO_LIBCPUID) add_definitions(/DXMRIG_NO_LIBCPUID)
set(SOURCES_CPUID src/common/cpu/BasicCpuInfo.h src/common/cpu/Cpu.cpp)
if (XMRIG_ARM) if (XMRIG_ARM)
set(SOURCES_CPUID src/Cpu_arm.cpp) set(SOURCES_CPUID ${SOURCES_CPUID} src/common/cpu/BasicCpuInfo_arm.cpp)
else() else()
set(SOURCES_CPUID src/Cpu_stub.cpp) set(SOURCES_CPUID ${SOURCES_CPUID} src/common/cpu/BasicCpuInfo.cpp)
endif() endif()
endif() endif()
include(cmake/OpenSSL.cmake)
include(cmake/asm.cmake)
include(cmake/cn-gpu.cmake)
CHECK_INCLUDE_FILE (syslog.h HAVE_SYSLOG_H) CHECK_INCLUDE_FILE (syslog.h HAVE_SYSLOG_H)
if (HAVE_SYSLOG_H) if (HAVE_SYSLOG_H)
add_definitions(/DHAVE_SYSLOG_H) add_definitions(/DHAVE_SYSLOG_H)
@@ -212,6 +245,10 @@ if (NOT WITH_IPBC)
add_definitions(/DXMRIG_NO_IPBC) add_definitions(/DXMRIG_NO_IPBC)
endif() endif()
if (NOT WITH_CN_PICO)
add_definitions(/DXMRIG_NO_CN_PICO)
endif()
if (WITH_HTTPD) if (WITH_HTTPD)
find_package(MHD) find_package(MHD)
@@ -233,6 +270,7 @@ if (WITH_HTTPD)
message(FATAL_ERROR "microhttpd NOT found: use `-DWITH_HTTPD=OFF` to build without http deamon support") message(FATAL_ERROR "microhttpd NOT found: use `-DWITH_HTTPD=OFF` to build without http deamon support")
endif() endif()
else() else()
set(HTTPD_SOURCES "")
set(MHD_LIBRARY "") set(MHD_LIBRARY "")
add_definitions(/DXMRIG_NO_HTTPD) add_definitions(/DXMRIG_NO_HTTPD)
add_definitions(/DXMRIG_NO_API) add_definitions(/DXMRIG_NO_API)
@@ -246,5 +284,9 @@ if (BUILD_STATIC)
set(CMAKE_EXE_LINKER_FLAGS " -static") set(CMAKE_EXE_LINKER_FLAGS " -static")
endif() endif()
add_executable(xmrig ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${HTTPD_SOURCES}) if (WITH_DEBUG_LOG)
target_link_libraries(xmrig ${UV_LIBRARIES} ${MHD_LIBRARY} ${EXTRA_LIBS} ${CPUID_LIB}) add_definitions(/DAPP_DEBUG)
endif()
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${HTTPD_SOURCES} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES})
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${MHD_LIBRARY} ${EXTRA_LIBS} ${CPUID_LIB})

View File

@@ -1,7 +1,5 @@
# XMRig # XMRig
:warning: **You must update miners to version 2.5 before April 6 due [Monero PoW change](https://getmonero.org/2018/02/11/PoW-change-and-key-reuse.html).**
[![Github All Releases](https://img.shields.io/github/downloads/xmrig/xmrig/total.svg)](https://github.com/xmrig/xmrig/releases) [![Github All Releases](https://img.shields.io/github/downloads/xmrig/xmrig/total.svg)](https://github.com/xmrig/xmrig/releases)
[![GitHub release](https://img.shields.io/github/release/xmrig/xmrig/all.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub release](https://img.shields.io/github/release/xmrig/xmrig/all.svg)](https://github.com/xmrig/xmrig/releases)
[![GitHub Release Date](https://img.shields.io/github/release-date-pre/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub Release Date](https://img.shields.io/github/release-date-pre/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/releases)
@@ -52,14 +50,21 @@ Use [config.xmrig.com](https://config.xmrig.com/xmrig) to generate, edit or shar
### Options ### Options
``` ```
-a, --algo=ALGO cryptonight (default) or cryptonight-lite -a, --algo=ALGO specify the algorithm to use
cryptonight
cryptonight-lite
cryptonight-heavy
-o, --url=URL URL of mining server -o, --url=URL URL of mining server
-O, --userpass=U:P username:password pair for mining server -O, --userpass=U:P username:password pair for mining server
-u, --user=USERNAME username for mining server -u, --user=USERNAME username for mining server
-p, --pass=PASSWORD password for mining server -p, --pass=PASSWORD password for mining server
--rig-id=ID rig identifier for pool-side statistics (needs pool support)
-t, --threads=N number of miner threads -t, --threads=N number of miner threads
-v, --av=N algorithm variation, 0 auto select -v, --av=N algorithm variation, 0 auto select
-k, --keepalive send keepalived for prevent timeout (need pool support) -k, --keepalive send keepalived packet for prevent timeout (needs pool support)
--nicehash enable nicehash.com support
--tls enable SSL/TLS support (needs pool support)
--tls-fingerprint=F pool TLS certificate fingerprint, if set enable strict certificate pinning
-r, --retries=N number of times to retry before switch to backup server (default: 5) -r, --retries=N number of times to retry before switch to backup server (default: 5)
-R, --retry-pause=N time to pause between retries (default: 5) -R, --retry-pause=N time to pause between retries (default: 5)
--cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1 --cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1
@@ -75,23 +80,38 @@ Use [config.xmrig.com](https://config.xmrig.com/xmrig) to generate, edit or shar
-S, --syslog use system log for output messages -S, --syslog use system log for output messages
--max-cpu-usage=N maximum CPU usage for automatic threads mode (default 75) --max-cpu-usage=N maximum CPU usage for automatic threads mode (default 75)
--safe safe adjust threads and av settings for current CPU --safe safe adjust threads and av settings for current CPU
--nicehash enable nicehash/xmrig-proxy support --asm=ASM ASM code for cn/2, possible values: auto, none, intel, ryzen.
--print-time=N print hashrate report every N seconds --print-time=N print hashrate report every N seconds
--api-port=N port for the miner API --api-port=N port for the miner API
--api-access-token=T access token for API --api-access-token=T access token for API
--api-worker-id=ID custom worker-id for API --api-worker-id=ID custom worker-id for API
--api-id=ID custom instance ID for API
--api-ipv6 enable IPv6 support for API
--api-no-restricted enable full remote access (only if API token set)
--dry-run test configuration and exit
-h, --help display this help and exit -h, --help display this help and exit
-V, --version output version information and exit -V, --version output version information and exit
``` ```
Also you can use configuration via config file, default **config.json**. You can load multiple config files and combine it with command line options. Also you can use configuration via config file, default name **config.json**. Some options available only via config file: [`autosave`](https://github.com/xmrig/xmrig/issues/767), [`hw-aes`](https://github.com/xmrig/xmrig/issues/563). `watch` option currently not implemented in miners only in proxy.
## Algorithm variations ## Algorithm variations
Since version 0.8.0.
* `--av=1` For CPUs with hardware AES. - `av` option used for automatic and simple threads mode (when you specify only threads count).
* `--av=2` Lower power mode (double hash) of `1`. - For [advanced threads mode](https://github.com/xmrig/xmrig/issues/563) each thread configured individually and `av` option not used.
* `--av=3` Software AES implementation.
* `--av=4` Lower power mode (double hash) of `3`. | av | Hashes per round | Hardware AES |
|----|------------------|--------------|
| 1 | 1 (Single) | yes |
| 2 | 2 (Double) | yes |
| 3 | 1 (Single) | no |
| 4 | 2 (Double) | no |
| 5 | 3 (Triple) | yes |
| 6 | 4 (Quard) | yes |
| 7 | 5 (Penta) | yes |
| 8 | 3 (Triple) | no |
| 9 | 4 (Quard) | no |
| 10 | 5 (Penta) | no |
## Common Issues ## Common Issues
### HUGE PAGES unavailable ### HUGE PAGES unavailable
@@ -100,8 +120,7 @@ Since version 0.8.0.
## Other information ## Other information
* No HTTP support, only stratum protocol support. * No HTTP support, only stratum protocol support.
* No TLS support. * Default donation 5% (5 minutes in 100 minutes) can be reduced to 1% via option `donate-level`.
* Default donation 5% (5 minutes in 100 minutes) can be reduced to 1% via command line option `--donate-level`.
### CPU mining performance ### CPU mining performance
@@ -121,15 +140,7 @@ Please note performance is highly dependent on system load. The numbers above ar
* XMR: `48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD` * XMR: `48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD`
* BTC: `1P7ujsXeX7GxQwHNnJsRMgAdNkFZmNVqJT` * BTC: `1P7ujsXeX7GxQwHNnJsRMgAdNkFZmNVqJT`
## Release checksums
### SHA-256
```
f8e1957e8bfd7f281a76d1e42694049c67f39dea90ac36e9d589c14cdf8924bc xmrig-2.6.1-xenial-amd64.tar.gz/xmrig-2.6.1/xmrig
472c7aaf5aacc1212bfd3f2f96daca4f42d64e2d0db0872891328e7d8503d0c8 xmrig-2.6.1-gcc-win32.zip/xmrig.exe
d53154cef24c884b2be539ac13bfb6e7dba6bbc53b62e91f2877637d43fa4b15 xmrig-2.6.1-gcc-win64.zip/xmrig.exe
a253381b617463e6e1193d49b8afbf720a1c376621da7429d97f192668cd59ad xmrig-2.6.1-msvc-win64.zip/xmrig.exe
```
## Contacts ## Contacts
* support@xmrig.com * support@xmrig.com
* [reddit](https://www.reddit.com/user/XMRig/) * [reddit](https://www.reddit.com/user/XMRig/)
* [twitter](https://twitter.com/xmrig_dev)

25
cmake/OpenSSL.cmake Normal file
View File

@@ -0,0 +1,25 @@
if (WITH_TLS)
set(OPENSSL_ROOT_DIR ${XMRIG_DEPS})
if (WIN32)
set(OPENSSL_USE_STATIC_LIBS TRUE)
set(OPENSSL_MSVC_STATIC_RT TRUE)
set(EXTRA_LIBS ${EXTRA_LIBS} Crypt32)
endif()
find_package(OpenSSL)
if (OPENSSL_FOUND)
set(TLS_SOURCES src/common/net/Tls.h src/common/net/Tls.cpp)
include_directories(${OPENSSL_INCLUDE_DIR})
else()
message(FATAL_ERROR "OpenSSL NOT found: use `-DWITH_TLS=OFF` to build without TLS support")
endif()
else()
set(TLS_SOURCES "")
set(OPENSSL_LIBRARIES "")
add_definitions(/DXMRIG_NO_TLS)
set(CMAKE_PROJECT_NAME "${CMAKE_PROJECT_NAME}-notls")
endif()

45
cmake/asm.cmake Normal file
View File

@@ -0,0 +1,45 @@
if (WITH_ASM AND NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
set(XMRIG_ASM_LIBRARY "xmrig-asm")
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
enable_language(ASM_MASM)
if (MSVC_TOOLSET_VERSION GREATER_EQUAL 141)
set(XMRIG_ASM_FILES
"src/crypto/asm/cn_main_loop.asm"
"src/crypto/asm/CryptonightR_template.asm"
)
else()
set(XMRIG_ASM_FILES
"src/crypto/asm/win64/cn_main_loop.asm"
"src/crypto/asm/win64/CryptonightR_template.asm"
)
endif()
set_property(SOURCE ${XMRIG_ASM_FILES} PROPERTY ASM_MASM)
else()
enable_language(ASM)
if (WIN32 AND CMAKE_C_COMPILER_ID MATCHES GNU)
set(XMRIG_ASM_FILES
"src/crypto/asm/win64/cn_main_loop.S"
"src/crypto/asm/win64/CryptonightR_template.S"
)
else()
set(XMRIG_ASM_FILES
"src/crypto/asm/cn_main_loop.S"
"src/crypto/asm/CryptonightR_template.S"
)
endif()
set_property(SOURCE ${XMRIG_ASM_FILES} PROPERTY C)
endif()
add_library(${XMRIG_ASM_LIBRARY} STATIC ${XMRIG_ASM_FILES})
set(XMRIG_ASM_SOURCES src/crypto/Asm.h src/crypto/Asm.cpp)
set_property(TARGET ${XMRIG_ASM_LIBRARY} PROPERTY LINKER_LANGUAGE C)
else()
set(XMRIG_ASM_SOURCES "")
set(XMRIG_ASM_LIBRARY "")
add_definitions(/DXMRIG_NO_ASM)
endif()

23
cmake/cn-gpu.cmake Normal file
View File

@@ -0,0 +1,23 @@
if (WITH_CN_GPU AND CMAKE_SIZEOF_VOID_P EQUAL 8)
if (XMRIG_ARM)
set(CN_GPU_SOURCES src/crypto/cn_gpu_arm.cpp)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
set_source_files_properties(src/crypto/cn_gpu_arm.cpp PROPERTIES COMPILE_FLAGS "-O3")
endif()
else()
set(CN_GPU_SOURCES src/crypto/cn_gpu_avx.cpp src/crypto/cn_gpu_ssse3.cpp)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
set_source_files_properties(src/crypto/cn_gpu_avx.cpp PROPERTIES COMPILE_FLAGS "-O3 -mavx2")
set_source_files_properties(src/crypto/cn_gpu_ssse3.cpp PROPERTIES COMPILE_FLAGS "-O3")
elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
set_source_files_properties(src/crypto/cn_gpu_avx.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX")
endif()
endif()
else()
set(CN_GPU_SOURCES "")
add_definitions(/DXMRIG_NO_CN_GPU)
endif()

View File

@@ -7,19 +7,37 @@ if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$")
add_definitions(/DRAPIDJSON_SSE2) add_definitions(/DRAPIDJSON_SSE2)
endif() endif()
if (NOT ARM_TARGET)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64)$") if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8-a)$")
set(XMRIG_ARM ON) set(ARM_TARGET 8)
set(XMRIG_ARMv8 ON) elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7|armv7f|armv7s|armv7k|armv7-a|armv7l)$")
set(WITH_LIBCPUID OFF) set(ARM_TARGET 7)
endif()
add_definitions(/DXMRIG_ARM) endif()
add_definitions(/DXMRIG_ARMv8)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7|armv7f|armv7s|armv7k|armv7-a|armv7l)$") if (ARM_TARGET AND ARM_TARGET GREATER 6)
set(XMRIG_ARM ON) set(XMRIG_ARM ON)
set(XMRIG_ARMv7 ON) set(WITH_LIBCPUID OFF)
set(WITH_LIBCPUID OFF) add_definitions(/DXMRIG_ARM)
add_definitions(/DXMRIG_ARM) message(STATUS "Use ARM_TARGET=${ARM_TARGET} (${CMAKE_SYSTEM_PROCESSOR})")
add_definitions(/DXMRIG_ARMv7)
include(CheckCXXCompilerFlag)
if (ARM_TARGET EQUAL 8)
set(XMRIG_ARMv8 ON)
add_definitions(/DXMRIG_ARMv8)
CHECK_CXX_COMPILER_FLAG(-march=armv8-a+crypto XMRIG_ARM_CRYPTO)
if (XMRIG_ARM_CRYPTO)
add_definitions(/DXMRIG_ARM_CRYPTO)
set(ARM8_CXX_FLAGS "-march=armv8-a+crypto")
else()
set(ARM8_CXX_FLAGS "-march=armv8-a")
endif()
elseif (ARM_TARGET EQUAL 7)
set(XMRIG_ARMv7 ON)
add_definitions(/DXMRIG_ARMv7)
endif()
endif() endif()

View File

@@ -15,12 +15,12 @@ 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 -fno-exceptions -fno-rtti") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-exceptions -fno-rtti -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)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crypto") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARM8_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crypto -flax-vector-conversions") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARM8_CXX_FLAGS} -flax-vector-conversions")
elseif (XMRIG_ARMv7) elseif (XMRIG_ARMv7)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -flax-vector-conversions") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -flax-vector-conversions")
@@ -60,8 +60,8 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -funroll-loops -fmerge-all-constants") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -funroll-loops -fmerge-all-constants")
if (XMRIG_ARMv8) if (XMRIG_ARMv8)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crypto") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARM8_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crypto") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARM8_CXX_FLAGS}")
elseif (XMRIG_ARMv7) elseif (XMRIG_ARMv7)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon -march=${CMAKE_SYSTEM_PROCESSOR}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon -march=${CMAKE_SYSTEM_PROCESSOR}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -march=${CMAKE_SYSTEM_PROCESSOR}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -march=${CMAKE_SYSTEM_PROCESSOR}")

View File

@@ -6,38 +6,25 @@ Algorithm selection splitted to 2 parts:
* Global base algorithm per miner or proxy instance, `algo` option. Possible values: `cryptonight`, `cryptonight-lite`, `cryptonight-heavy`. * Global base algorithm per miner or proxy instance, `algo` option. Possible values: `cryptonight`, `cryptonight-lite`, `cryptonight-heavy`.
* Algorithm variant specified separately for each pool, `variant` option. * Algorithm variant specified separately for each pool, `variant` option.
* [Full table for supported algorithm and variants.](https://github.com/xmrig/xmrig-proxy/blob/master/doc/STRATUM_EXT.md#14-algorithm-names-and-variants)
#### Example
```json
{
"algo": "cryptonight",
...
"pools": [
{
"url": "...",
"variant": 1,
...
}
],
...
}
```
Possible variants for `cryptonight`: ## Mining algorithm negotiation
* `0` Original cryptonight.
* `1` cryptonight variant 1, also known as cryptonight v7 or monero7.
* `"xtl"` Stellite coin variant.
Possible variants for `cryptonight-lite`:
* `0` Original cryptonight-lite.
* `1` cryptonight-lite variant 1, also known as cryptonight-lite v7 or aeon7.
* `"ipbc"` IPBC coin variant.
For `cryptonight-heavy` currently no variants.
### Cheatsheet
You mine **Sumokoin** or **Haven Protocol**?
Your algorithm is `cryptonight-heavy` no variant option need.
You mine **Aeon**, **TurtleCoin** or **IPBC**?
Your base algorithm is `cryptonight-lite`:
Variants:
* Aeon: `-1` autodetect. `0` right now, `1` after fork.
* TurtleCoin: `1`.
* IPBC: `"ipbc"`.
In all other cases base algorithm is `cryptonight`.
### Mining algorithm negotiation
If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) miner will choice proper variant automaticaly and if you choice wrong base algorithm you will see error message. If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) miner will choice proper variant automaticaly and if you choice wrong base algorithm you will see error message.
Pools with mining algorithm negotiation support. Pools with mining algorithm negotiation support.

File diff suppressed because it is too large Load Diff

View File

@@ -1,53 +1,71 @@
/* /*
* Copyright 2008 Veselin Georgiev, * Copyright 2008 Veselin Georgiev,
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail) * anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* *
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __ASM_BITS_H__ #ifndef __ASM_BITS_H__
#define __ASM_BITS_H__ #define __ASM_BITS_H__
#include "libcpuid.h" #include "libcpuid.h"
/* Determine Compiler: */ /* Determine Compiler: */
#if defined(_MSC_VER) #if defined(_MSC_VER)
# define COMPILER_MICROSOFT #if !defined(COMPILER_MICROSOFT)
#elif defined(__GNUC__) # define COMPILER_MICROSOFT
# define COMPILER_GCC #endif
#endif #elif defined(__GNUC__)
#if !defined(COMPILER_GCC)
/* Determine Platform */ # define COMPILER_GCC
#if defined(__x86_64__) || defined(_M_AMD64) #endif
# define PLATFORM_X64 #elif defined(__clang__)
#elif defined(__i386__) || defined(_M_IX86) #if !defined(COMPILER_CLANG)
# define PLATFORM_X86 # define COMPILER_CLANG
#endif #endif
#endif
/* Under Windows/AMD64 with MSVC, inline assembly isn't supported */
#if (defined(COMPILER_GCC) && defined(PLATFORM_X64)) || defined(PLATFORM_X86) /* Determine Platform */
# define INLINE_ASM_SUPPORTED #if defined(__x86_64__) || defined(_M_AMD64)
#endif #if !defined(PLATFORM_X64)
# define PLATFORM_X64
int cpuid_exists_by_eflags(void); #endif
void exec_cpuid(uint32_t *regs); #elif defined(__i386__) || defined(_M_IX86)
void busy_sse_loop(int cycles); #if !defined(PLATFORM_X86)
# define PLATFORM_X86
#endif /* __ASM_BITS_H__ */ #endif
#elif defined(__ARMEL__)
#if !defined(PLATFORM_ARM)
# define PLATFORM_ARM
#endif
#endif
/* Under Windows/AMD64 with MSVC, inline assembly isn't supported */
#if (((defined(COMPILER_GCC) || defined(COMPILER_CLANG))) && \
(defined(PLATFORM_X64) || defined(PLATFORM_X86) || defined(PLATFORM_ARM))) || \
(defined(COMPILER_MICROSOFT) && defined(PLATFORM_X86))
# define INLINE_ASM_SUPPORTED
#endif
int cpuid_exists_by_eflags(void);
void exec_cpuid(uint32_t *regs);
void busy_sse_loop(int cycles);
#endif /* __ASM_BITS_H__ */

View File

@@ -221,42 +221,42 @@ static void load_features_common(struct cpu_raw_data_t* raw, struct cpu_id_t* da
static cpu_vendor_t cpuid_vendor_identify(const uint32_t *raw_vendor, char *vendor_str) static cpu_vendor_t cpuid_vendor_identify(const uint32_t *raw_vendor, char *vendor_str)
{ {
int i; int i;
cpu_vendor_t vendor = VENDOR_UNKNOWN; cpu_vendor_t vendor = VENDOR_UNKNOWN;
const struct { cpu_vendor_t vendor; char match[16]; } const struct { cpu_vendor_t vendor; char match[16]; }
matchtable[NUM_CPU_VENDORS] = { matchtable[NUM_CPU_VENDORS] = {
/* source: http://www.sandpile.org/ia32/cpuid.htm */ /* source: http://www.sandpile.org/ia32/cpuid.htm */
{ VENDOR_INTEL , "GenuineIntel" }, { VENDOR_INTEL , "GenuineIntel" },
{ VENDOR_AMD , "AuthenticAMD" }, { VENDOR_AMD , "AuthenticAMD" },
{ VENDOR_CYRIX , "CyrixInstead" }, { VENDOR_CYRIX , "CyrixInstead" },
{ VENDOR_NEXGEN , "NexGenDriven" }, { VENDOR_NEXGEN , "NexGenDriven" },
{ VENDOR_TRANSMETA , "GenuineTMx86" }, { VENDOR_TRANSMETA , "GenuineTMx86" },
{ VENDOR_UMC , "UMC UMC UMC " }, { VENDOR_UMC , "UMC UMC UMC " },
{ VENDOR_CENTAUR , "CentaurHauls" }, { VENDOR_CENTAUR , "CentaurHauls" },
{ VENDOR_RISE , "RiseRiseRise" }, { VENDOR_RISE , "RiseRiseRise" },
{ VENDOR_SIS , "SiS SiS SiS " }, { VENDOR_SIS , "SiS SiS SiS " },
{ VENDOR_NSC , "Geode by NSC" }, { VENDOR_NSC , "Geode by NSC" },
}; };
memcpy(vendor_str + 0, &raw_vendor[1], 4); memcpy(vendor_str + 0, &raw_vendor[1], 4);
memcpy(vendor_str + 4, &raw_vendor[3], 4); memcpy(vendor_str + 4, &raw_vendor[3], 4);
memcpy(vendor_str + 8, &raw_vendor[2], 4); memcpy(vendor_str + 8, &raw_vendor[2], 4);
vendor_str[12] = 0; vendor_str[12] = 0;
/* Determine vendor: */ /* Determine vendor: */
for (i = 0; i < NUM_CPU_VENDORS; i++) for (i = 0; i < NUM_CPU_VENDORS; i++)
if (!strcmp(vendor_str, matchtable[i].match)) { if (!strcmp(vendor_str, matchtable[i].match)) {
vendor = matchtable[i].vendor; vendor = matchtable[i].vendor;
break; break;
} }
return vendor; return vendor;
} }
static int cpuid_basic_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data) static int cpuid_basic_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
{ {
int i, j, basic, xmodel, xfamily, ext; int i, j, basic, xmodel, xfamily, ext;
char brandstr[64] = {0}; char brandstr[64] = {0};
data->vendor = cpuid_vendor_identify(raw->basic_cpuid[0], data->vendor_str); data->vendor = cpuid_vendor_identify(raw->basic_cpuid[0], data->vendor_str);
if (data->vendor == VENDOR_UNKNOWN) if (data->vendor == VENDOR_UNKNOWN)
return set_error(ERR_CPU_UNKN); return set_error(ERR_CPU_UNKN);

View File

@@ -60,7 +60,7 @@
*/ */
/** @mainpage A simple libcpuid introduction /** @mainpage A simple libcpuid introduction
* *
* LibCPUID provides CPU identification and access to the CPUID and RDTSC * LibCPUID provides CPU identification and access to the CPUID and RDTSC
* instructions on the x86. * instructions on the x86.
* <p> * <p>
@@ -82,6 +82,7 @@
*/ */
/** @defgroup libcpuid LibCPUID /** @defgroup libcpuid LibCPUID
* @brief LibCPUID provides CPU identification
@{ */ @{ */
/* Include some integer type specifications: */ /* Include some integer type specifications: */
@@ -535,23 +536,23 @@ typedef enum {
* @brief Describes common library error codes * @brief Describes common library error codes
*/ */
typedef enum { typedef enum {
ERR_OK = 0, /*!< "No error" */ ERR_OK = 0, /*!< No error */
ERR_NO_CPUID = -1, /*!< "CPUID instruction is not supported" */ ERR_NO_CPUID = -1, /*!< CPUID instruction is not supported */
ERR_NO_RDTSC = -2, /*!< "RDTSC instruction is not supported" */ ERR_NO_RDTSC = -2, /*!< RDTSC instruction is not supported */
ERR_NO_MEM = -3, /*!< "Memory allocation failed" */ ERR_NO_MEM = -3, /*!< Memory allocation failed */
ERR_OPEN = -4, /*!< "File open operation failed" */ ERR_OPEN = -4, /*!< File open operation failed */
ERR_BADFMT = -5, /*!< "Bad file format" */ ERR_BADFMT = -5, /*!< Bad file format */
ERR_NOT_IMP = -6, /*!< "Not implemented" */ ERR_NOT_IMP = -6, /*!< Not implemented */
ERR_CPU_UNKN = -7, /*!< "Unsupported processor" */ ERR_CPU_UNKN = -7, /*!< Unsupported processor */
ERR_NO_RDMSR = -8, /*!< "RDMSR instruction is not supported" */ ERR_NO_RDMSR = -8, /*!< RDMSR instruction is not supported */
ERR_NO_DRIVER= -9, /*!< "RDMSR driver error (generic)" */ ERR_NO_DRIVER= -9, /*!< RDMSR driver error (generic) */
ERR_NO_PERMS = -10, /*!< "No permissions to install RDMSR driver" */ ERR_NO_PERMS = -10, /*!< No permissions to install RDMSR driver */
ERR_EXTRACT = -11, /*!< "Cannot extract RDMSR driver (read only media?)" */ ERR_EXTRACT = -11, /*!< Cannot extract RDMSR driver (read only media?) */
ERR_HANDLE = -12, /*!< "Bad handle" */ ERR_HANDLE = -12, /*!< Bad handle */
ERR_INVMSR = -13, /*!< "Invalid MSR" */ ERR_INVMSR = -13, /*!< Invalid MSR */
ERR_INVCNB = -14, /*!< "Invalid core number" */ ERR_INVCNB = -14, /*!< Invalid core number */
ERR_HANDLE_R = -15, /*!< "Error on handle read" */ ERR_HANDLE_R = -15, /*!< Error on handle read */
ERR_INVRANGE = -16, /*!< "Invalid given range" */ ERR_INVRANGE = -16, /*!< Invalid given range */
} cpu_error_t; } cpu_error_t;
/** /**
@@ -668,7 +669,7 @@ struct cpu_epc_t cpuid_get_epc(int index, const struct cpu_raw_data_t* raw);
const char* cpuid_lib_version(void); const char* cpuid_lib_version(void);
#ifdef __cplusplus #ifdef __cplusplus
}; /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -75,8 +75,9 @@ enum _intel_bits_t {
_3 = LBIT( 14 ), _3 = LBIT( 14 ),
_5 = LBIT( 15 ), _5 = LBIT( 15 ),
_7 = LBIT( 16 ), _7 = LBIT( 16 ),
XEON_ = LBIT( 17 ), _9 = LBIT( 17 ),
ATOM_ = LBIT( 18 ), XEON_ = LBIT( 18 ),
ATOM_ = LBIT( 19 ),
}; };
typedef enum _intel_bits_t intel_bits_t; typedef enum _intel_bits_t intel_bits_t;

View File

@@ -32,6 +32,32 @@
#ifndef __LIBCPUID_TYPES_H__ #ifndef __LIBCPUID_TYPES_H__
#define __LIBCPUID_TYPES_H__ #define __LIBCPUID_TYPES_H__
#include <stdint.h> #if !defined(_MSC_VER) || _MSC_VER >= 1600
# include <stdint.h>
#else
/* we have to provide our own: */
# if !defined(__int32_t_defined)
typedef int int32_t;
# endif
# if !defined(__uint32_t_defined)
typedef unsigned uint32_t;
# endif
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
#if (defined _MSC_VER) && (_MSC_VER <= 1300)
/* MSVC 6.0: no long longs ... */
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else
/* all other sane compilers: */
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
#endif
#endif
#endif /* __LIBCPUID_TYPES_H__ */ #endif /* __LIBCPUID_TYPES_H__ */

View File

@@ -49,6 +49,10 @@ enum _amd_model_codes_t {
_1400, _1400,
_1500, _1500,
_1600, _1600,
_1900,
_2400,
_2500,
_2700,
}; };
static void load_amd_features(struct cpu_raw_data_t* raw, struct cpu_id_t* data) static void load_amd_features(struct cpu_raw_data_t* raw, struct cpu_id_t* data)

View File

@@ -376,7 +376,7 @@ static intel_code_and_bits_t get_brand_code_and_bits(struct cpu_id_t* data)
bits |= bit_matchtable[i].bit; bits |= bit_matchtable[i].bit;
} }
if ((i = match_pattern(bs, "Core(TM) [im][357]")) != 0) { if ((i = match_pattern(bs, "Core(TM) [im][3579]")) != 0) {
bits |= CORE_; bits |= CORE_;
i--; i--;
switch (bs[i + 9]) { switch (bs[i + 9]) {
@@ -387,6 +387,7 @@ static intel_code_and_bits_t get_brand_code_and_bits(struct cpu_id_t* data)
case '3': bits |= _3; break; case '3': bits |= _3; break;
case '5': bits |= _5; break; case '5': bits |= _5; break;
case '7': bits |= _7; break; case '7': bits |= _7; break;
case '9': bits |= _9; break;
} }
} }
for (i = 0; i < COUNT_OF(matchtable); i++) for (i = 0; i < COUNT_OF(matchtable); i++)

View File

@@ -5,7 +5,9 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2018 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 * 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
@@ -28,12 +30,13 @@
#include "api/Api.h" #include "api/Api.h"
#include "App.h" #include "App.h"
#include "base/kernel/Signals.h"
#include "common/Console.h" #include "common/Console.h"
#include "common/cpu/Cpu.h"
#include "common/log/Log.h" #include "common/log/Log.h"
#include "common/Platform.h" #include "common/Platform.h"
#include "core/Config.h" #include "core/Config.h"
#include "core/Controller.h" #include "core/Controller.h"
#include "Cpu.h"
#include "crypto/CryptoNight.h" #include "crypto/CryptoNight.h"
#include "Mem.h" #include "Mem.h"
#include "net/Network.h" #include "net/Network.h"
@@ -47,35 +50,27 @@
#endif #endif
App *App::m_self = nullptr; xmrig::App::App(Process *process) :
App::App(int argc, char **argv) :
m_console(nullptr), m_console(nullptr),
m_httpd(nullptr) m_httpd(nullptr),
m_signals(nullptr)
{ {
m_self = this; m_controller = new Controller(process);
if (m_controller->init() != 0) {
m_controller = new xmrig::Controller();
if (m_controller->init(argc, argv) != 0) {
return; return;
} }
if (!m_controller->config()->isBackground()) { if (!m_controller->config()->isBackground()) {
m_console = new Console(this); m_console = new Console(this);
} }
uv_signal_init(uv_default_loop(), &m_sigHUP);
uv_signal_init(uv_default_loop(), &m_sigINT);
uv_signal_init(uv_default_loop(), &m_sigTERM);
} }
App::~App() xmrig::App::~App()
{ {
uv_tty_reset_mode(); uv_tty_reset_mode();
delete m_signals;
delete m_console; delete m_console;
delete m_controller; delete m_controller;
@@ -85,15 +80,13 @@ App::~App()
} }
int App::exec() int xmrig::App::exec()
{ {
if (!m_controller->isReady()) { if (!m_controller->isReady()) {
return 2; return 2;
} }
uv_signal_start(&m_sigHUP, App::onSignal, SIGHUP); m_signals = new Signals(this);
uv_signal_start(&m_sigINT, App::onSignal, SIGINT);
uv_signal_start(&m_sigTERM, App::onSignal, SIGTERM);
background(); background();
@@ -103,7 +96,6 @@ int App::exec()
if (m_controller->config()->isDryRun()) { if (m_controller->config()->isDryRun()) {
LOG_NOTICE("OK"); LOG_NOTICE("OK");
release();
return 0; return 0;
} }
@@ -130,12 +122,11 @@ int App::exec()
const int r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); const int r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
uv_loop_close(uv_default_loop()); uv_loop_close(uv_default_loop());
release();
return r; return r;
} }
void App::onConsoleCommand(char command) void xmrig::App::onConsoleCommand(char command)
{ {
switch (command) { switch (command) {
case 'h': case 'h':
@@ -170,21 +161,7 @@ void App::onConsoleCommand(char command)
} }
void App::close() void xmrig::App::onSignal(int signum)
{
m_controller->network()->stop();
Workers::stop();
uv_stop(uv_default_loop());
}
void App::release()
{
}
void App::onSignal(uv_signal_t *handle, int signum)
{ {
switch (signum) switch (signum)
{ {
@@ -201,9 +178,17 @@ void App::onSignal(uv_signal_t *handle, int signum)
break; break;
default: default:
break; return;
} }
uv_signal_stop(handle); close();
m_self->close(); }
void xmrig::App::close()
{
m_controller->network()->stop();
Workers::stop();
uv_stop(uv_default_loop());
} }

View File

@@ -5,7 +5,9 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,54 +23,51 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __APP_H__ #ifndef XMRIG_APP_H
#define __APP_H__ #define XMRIG_APP_H
#include <uv.h> #include "base/kernel/interfaces/ISignalListener.h"
#include "common/interfaces/IConsoleListener.h"
#include "interfaces/IConsoleListener.h"
class Console; class Console;
class Httpd; class Httpd;
class Network;
class Options;
namespace xmrig { namespace xmrig {
class Controller;
}
class App : public IConsoleListener class Controller;
class Network;
class Process;
class Signals;
class App : public IConsoleListener, public ISignalListener
{ {
public: public:
App(int argc, char **argv); App(Process *process);
~App(); ~App() override;
int exec(); int exec();
protected: protected:
void onConsoleCommand(char command) override; void onConsoleCommand(char command) override;
void onSignal(int signum) override;
private: private:
void background(); void background();
void close(); void close();
void release();
static void onSignal(uv_signal_t *handle, int signum); Console *m_console;
Controller *m_controller;
static App *m_self; Httpd *m_httpd;
Signals *m_signals;
Console *m_console;
Httpd *m_httpd;
uv_signal_t m_sigHUP;
uv_signal_t m_sigINT;
uv_signal_t m_sigTERM;
xmrig::Controller *m_controller;
}; };
#endif /* __APP_H__ */ } /* namespace xmrig */
#endif /* XMRIG_APP_H */

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -34,7 +35,7 @@
#include "core/Controller.h" #include "core/Controller.h"
void App::background() void xmrig::App::background()
{ {
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -31,7 +32,7 @@
#include "core/Config.h" #include "core/Config.h"
void App::background() void xmrig::App::background()
{ {
if (!m_controller->config()->isBackground()) { if (!m_controller->config()->isBackground()) {
return; return;

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -33,7 +34,6 @@ bool Mem::m_enabled = true;
int Mem::m_flags = 0; int Mem::m_flags = 0;
MemInfo Mem::create(cryptonight_ctx **ctx, xmrig::Algo algorithm, size_t count) MemInfo Mem::create(cryptonight_ctx **ctx, xmrig::Algo algorithm, size_t count)
{ {
using namespace xmrig; using namespace xmrig;
@@ -41,11 +41,9 @@ MemInfo Mem::create(cryptonight_ctx **ctx, xmrig::Algo algorithm, size_t count)
MemInfo info; MemInfo info;
info.size = cn_select_memory(algorithm) * count; info.size = cn_select_memory(algorithm) * count;
# ifndef XMRIG_NO_AEON constexpr const size_t align_size = 2 * 1024 * 1024;
info.size += info.size % cn_select_memory<CRYPTONIGHT>(); info.size = ((info.size + align_size - 1) / align_size) * align_size;
# endif info.pages = info.size / align_size;
info.pages = info.size / cn_select_memory<CRYPTONIGHT>();
allocate(info, m_enabled); allocate(info, m_enabled);
@@ -53,6 +51,14 @@ MemInfo Mem::create(cryptonight_ctx **ctx, xmrig::Algo algorithm, size_t count)
cryptonight_ctx *c = static_cast<cryptonight_ctx *>(_mm_malloc(sizeof(cryptonight_ctx), 4096)); cryptonight_ctx *c = static_cast<cryptonight_ctx *>(_mm_malloc(sizeof(cryptonight_ctx), 4096));
c->memory = info.memory + (i * cn_select_memory(algorithm)); c->memory = info.memory + (i * cn_select_memory(algorithm));
uint8_t* p = reinterpret_cast<uint8_t*>(allocateExecutableMemory(0x4000));
c->generated_code = reinterpret_cast<cn_mainloop_fun_ms_abi>(p);
c->generated_code_double = reinterpret_cast<cn_mainloop_double_fun_ms_abi>(p + 0x2000);
c->generated_code_data.variant = xmrig::VARIANT_MAX;
c->generated_code_data.height = (uint64_t)(-1);
c->generated_code_double_data = c->generated_code_data;
ctx[i] = c; ctx[i] = c;
} }

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -22,8 +23,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __MEM_H__ #ifndef XMRIG_MEM_H
#define __MEM_H__ #define XMRIG_MEM_H
#include <stddef.h> #include <stddef.h>
@@ -59,6 +60,10 @@ public:
static void init(bool enabled); static void init(bool enabled);
static void release(cryptonight_ctx **ctx, size_t count, MemInfo &info); static void release(cryptonight_ctx **ctx, size_t count, MemInfo &info);
static void *allocateExecutableMemory(size_t size);
static void protectExecutableMemory(void *p, size_t size);
static void flushInstructionCache(void *p, size_t size);
static inline bool isHugepagesAvailable() { return (m_flags & HugepagesAvailable) != 0; } static inline bool isHugepagesAvailable() { return (m_flags & HugepagesAvailable) != 0; }
private: private:
@@ -70,4 +75,4 @@ private:
}; };
#endif /* __MEM_H__ */ #endif /* XMRIG_MEM_H */

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -87,3 +88,27 @@ void Mem::release(MemInfo &info)
_mm_free(info.memory); _mm_free(info.memory);
} }
} }
void *Mem::allocateExecutableMemory(size_t size)
{
# if defined(__APPLE__)
return mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);
# else
return mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
# endif
}
void Mem::protectExecutableMemory(void *p, size_t size)
{
mprotect(p, size, PROT_READ | PROT_EXEC);
}
void Mem::flushInstructionCache(void *p, size_t size)
{
# ifndef __FreeBSD__
__builtin___clear_cache(reinterpret_cast<char*>(p), reinterpret_cast<char*>(p) + size);
# endif
}

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -182,3 +183,22 @@ void Mem::release(MemInfo &info)
_mm_free(info.memory); _mm_free(info.memory);
} }
} }
void *Mem::allocateExecutableMemory(size_t size)
{
return VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
}
void Mem::protectExecutableMemory(void *p, size_t size)
{
DWORD oldProtect;
VirtualProtect(p, size, PAGE_EXECUTE_READ, &oldProtect);
}
void Mem::flushInstructionCache(void *p, size_t size)
{
::FlushInstructionCache(GetCurrentProcess(), p, size);
}

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <support@xmrig.com>
* *
* 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
@@ -27,44 +28,42 @@
#include <uv.h> #include <uv.h>
#include "base/net/Pool.h"
#include "common/cpu/Cpu.h"
#include "common/log/Log.h" #include "common/log/Log.h"
#include "common/net/Pool.h"
#include "core/Config.h" #include "core/Config.h"
#include "core/Controller.h" #include "core/Controller.h"
#include "Cpu.h" #include "crypto/Asm.h"
#include "Mem.h" #include "Mem.h"
#include "Summary.h" #include "Summary.h"
#include "version.h" #include "version.h"
static void print_versions(xmrig::Config *config) #ifndef XMRIG_NO_ASM
static const char *coloredAsmNames[] = {
"\x1B[1;31mnone\x1B[0m",
"auto",
"\x1B[1;32mintel\x1B[0m",
"\x1B[1;32mryzen\x1B[0m",
"\x1B[1;32mbulldozer\x1B[0m"
};
inline static const char *asmName(xmrig::Assembly assembly, bool colors)
{ {
char buf[16]; return colors ? coloredAsmNames[assembly] : xmrig::Asm::toString(assembly);
# if defined(__clang__)
snprintf(buf, 16, " clang/%d.%d.%d", __clang_major__, __clang_minor__, __clang_patchlevel__);
# elif defined(__GNUC__)
snprintf(buf, 16, " gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# elif defined(_MSC_VER)
snprintf(buf, 16, " MSVC/%d", MSVC_VERSION);
# else
buf[0] = '\0';
# endif
Log::i()->text(config->isColors() ? "\x1B[01;32m * \x1B[01;37mVERSIONS: \x1B[01;36mXMRig/%s\x1B[01;37m libuv/%s%s" : " * VERSIONS: XMRig/%s libuv/%s%s",
APP_VERSION, uv_version_string(), buf);
} }
#endif
static void print_memory(xmrig::Config *config) { static void print_memory(xmrig::Config *config) {
# ifdef _WIN32 # ifdef _WIN32
if (config->isColors()) { if (config->isColors()) {
Log::i()->text("\x1B[01;32m * \x1B[01;37mHUGE PAGES: %s", Log::i()->text(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") "%s",
Mem::isHugepagesAvailable() ? "\x1B[01;32mavailable" : "\x1B[01;31munavailable"); "HUGE PAGES", Mem::isHugepagesAvailable() ? "\x1B[1;32mavailable" : "\x1B[01;31munavailable");
} }
else { else {
Log::i()->text(" * HUGE PAGES: %s", Mem::isHugepagesAvailable() ? "available" : "unavailable"); Log::i()->text(" * %-13s%s", "HUGE PAGES", Mem::isHugepagesAvailable() ? "available" : "unavailable");
} }
# endif # endif
} }
@@ -72,20 +71,30 @@ static void print_memory(xmrig::Config *config) {
static void print_cpu(xmrig::Config *config) static void print_cpu(xmrig::Config *config)
{ {
using namespace xmrig;
if (config->isColors()) { if (config->isColors()) {
Log::i()->text("\x1B[01;32m * \x1B[01;37mCPU: %s (%d) %sx64 %sAES-NI", Log::i()->text(GREEN_BOLD(" * ") WHITE_BOLD("%-13s%s (%d)") " %sx64 %sAES %sAVX2",
Cpu::brand(), "CPU",
Cpu::sockets(), Cpu::info()->brand(),
Cpu::isX64() ? "\x1B[01;32m" : "\x1B[01;31m-", Cpu::info()->sockets(),
Cpu::hasAES() ? "\x1B[01;32m" : "\x1B[01;31m-"); Cpu::info()->isX64() ? "\x1B[1;32m" : "\x1B[1;31m-",
Cpu::info()->hasAES() ? "\x1B[1;32m" : "\x1B[1;31m-",
Cpu::info()->hasAVX2() ? "\x1B[1;32m" : "\x1B[1;31m-");
# ifndef XMRIG_NO_LIBCPUID # ifndef XMRIG_NO_LIBCPUID
Log::i()->text("\x1B[01;32m * \x1B[01;37mCPU L2/L3: %.1f MB/%.1f MB", Cpu::l2() / 1024.0, Cpu::l3() / 1024.0); Log::i()->text(GREEN_BOLD(" * ") WHITE_BOLD("%-13s%.1f MB/%.1f MB"), "CPU L2/L3", Cpu::info()->L2() / 1024.0, Cpu::info()->L3() / 1024.0);
# endif # endif
} }
else { else {
Log::i()->text(" * CPU: %s (%d) %sx64 %sAES-NI", Cpu::brand(), Cpu::sockets(), Cpu::isX64() ? "" : "-", Cpu::hasAES() ? "" : "-"); Log::i()->text(" * %-13s%s (%d) %sx64 %sAES %sAVX2",
"CPU",
Cpu::info()->brand(),
Cpu::info()->sockets(),
Cpu::info()->isX64() ? "" : "-",
Cpu::info()->hasAES() ? "" : "-",
Cpu::info()->hasAVX2() ? "" : "-");
# ifndef XMRIG_NO_LIBCPUID # ifndef XMRIG_NO_LIBCPUID
Log::i()->text(" * CPU L2/L3: %.1f MB/%.1f MB", Cpu::l2() / 1024.0, Cpu::l3() / 1024.0); Log::i()->text(" * %-13s%.1f MB/%.1f MB", "CPU L2/L3", Cpu::info()->L2() / 1024.0, Cpu::info()->L3() / 1024.0);
# endif # endif
} }
} }
@@ -94,87 +103,66 @@ static void print_cpu(xmrig::Config *config)
static void print_threads(xmrig::Config *config) static void print_threads(xmrig::Config *config)
{ {
if (config->threadsMode() != xmrig::Config::Advanced) { if (config->threadsMode() != xmrig::Config::Advanced) {
char buf[32]; char buf[32] = { 0 };
if (config->affinity() != -1L) { if (config->affinity() != -1L) {
snprintf(buf, 32, ", affinity=0x%" PRIX64, config->affinity()); snprintf(buf, sizeof buf, ", affinity=0x%" PRIX64, config->affinity());
}
else {
buf[0] = '\0';
} }
Log::i()->text(config->isColors() ? "\x1B[01;32m * \x1B[01;37mTHREADS: \x1B[01;36m%d\x1B[01;37m, %s, av=%d, %sdonate=%d%%%s" : " * THREADS: %d, %s, av=%d, %sdonate=%d%%%s", Log::i()->text(config->isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%d") WHITE_BOLD(", %s, av=%d, %sdonate=%d%%") WHITE_BOLD("%s")
: " * %-13s%d, %s, av=%d, %sdonate=%d%%%s",
"THREADS",
config->threadsCount(), config->threadsCount(),
config->algorithm().name(), config->algorithm().name(),
config->algoVariant(), config->algoVariant(),
config->isColors() && config->donateLevel() == 0 ? "\x1B[01;31m" : "", config->isColors() && config->donateLevel() == 0 ? "\x1B[1;31m" : "",
config->donateLevel(), config->donateLevel(),
buf); buf);
} }
else { else {
Log::i()->text(config->isColors() ? "\x1B[01;32m * \x1B[01;37mTHREADS: \x1B[01;36m%d\x1B[01;37m, %s, %sdonate=%d%%" : " * THREADS: %d, %s, %sdonate=%d%%", Log::i()->text(config->isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%d") WHITE_BOLD(", %s, %sdonate=%d%%")
: " * %-13s%d, %s, %sdonate=%d%%",
"THREADS",
config->threadsCount(), config->threadsCount(),
config->algorithm().name(), config->algorithm().name(),
config->isColors() && config->donateLevel() == 0 ? "\x1B[01;31m" : "", config->isColors() && config->donateLevel() == 0 ? "\x1B[1;31m" : "",
config->donateLevel()); config->donateLevel());
} }
}
# ifndef XMRIG_NO_ASM
if (config->assembly() == xmrig::ASM_AUTO) {
const xmrig::Assembly assembly = xmrig::Cpu::info()->assembly();
static void print_pools(xmrig::Config *config) Log::i()->text(config->isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13sauto:%s")
{ : " * %-13sauto:%s", "ASSEMBLY", asmName(assembly, config->isColors()));
const std::vector<Pool> &pools = config->pools();
for (size_t i = 0; i < pools.size(); ++i) {
Log::i()->text(config->isColors() ? "\x1B[01;32m * \x1B[01;37mPOOL #%d: \x1B[01;36m%s" : " * POOL #%d: %s",
i + 1,
pools[i].url()
);
} }
else {
# ifdef APP_DEBUG Log::i()->text(config->isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13s%s") : " * %-13s%s", "ASSEMBLY", asmName(config->assembly(), config->isColors()));
for (const Pool &pool : pools) {
pool.print();
} }
# endif # endif
} }
#ifndef XMRIG_NO_API
static void print_api(xmrig::Config *config)
{
const int port = config->apiPort();
if (port == 0) {
return;
}
Log::i()->text(config->isColors() ? "\x1B[01;32m * \x1B[01;37mAPI BIND: \x1B[01;36m%s:%d" : " * API BIND: %s:%d",
config->isApiIPv6() ? "[::]" : "0.0.0.0", port);
}
#endif
static void print_commands(xmrig::Config *config) static void print_commands(xmrig::Config *config)
{ {
if (config->isColors()) { if (config->isColors()) {
Log::i()->text("\x1B[01;32m * \x1B[01;37mCOMMANDS: \x1B[01;35mh\x1B[01;37mashrate, \x1B[01;35mp\x1B[01;37mause, \x1B[01;35mr\x1B[01;37mesume"); Log::i()->text(GREEN_BOLD(" * ") WHITE_BOLD("COMMANDS ") MAGENTA_BOLD("h") WHITE_BOLD("ashrate, ")
MAGENTA_BOLD("p") WHITE_BOLD("ause, ")
MAGENTA_BOLD("r") WHITE_BOLD("esume"));
} }
else { else {
Log::i()->text(" * COMMANDS: 'h' hashrate, 'p' pause, 'r' resume"); Log::i()->text(" * COMMANDS 'h' hashrate, 'p' pause, 'r' resume");
} }
} }
void Summary::print(xmrig::Controller *controller) void Summary::print(xmrig::Controller *controller)
{ {
print_versions(controller->config()); controller->config()->printVersions();
print_memory(controller->config()); print_memory(controller->config());
print_cpu(controller->config()); print_cpu(controller->config());
print_threads(controller->config()); print_threads(controller->config());
print_pools(controller->config()); controller->config()->printPools();
controller->config()->printAPI();
# ifndef XMRIG_NO_API
print_api(controller->config());
# endif
print_commands(controller->config()); print_commands(controller->config());
} }

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -62,7 +63,7 @@ void Api::exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply)
} }
void Api::tick(const NetworkState &network) void Api::tick(const xmrig::NetworkState &network)
{ {
if (!m_router) { if (!m_router) {
return; return;

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,8 +22,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __API_H__ #ifndef XMRIG_API_H
#define __API_H__ #define XMRIG_API_H
#include <uv.h> #include <uv.h>
@@ -30,13 +31,13 @@
class ApiRouter; class ApiRouter;
class Hashrate; class Hashrate;
class NetworkState;
namespace xmrig { namespace xmrig {
class Controller; class Controller;
class HttpReply; class HttpReply;
class HttpRequest; class HttpRequest;
class NetworkState;
} }
@@ -47,10 +48,10 @@ public:
static void release(); static void release();
static void exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply); static void exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply);
static void tick(const NetworkState &results); static void tick(const xmrig::NetworkState &results);
private: private:
static ApiRouter *m_router; static ApiRouter *m_router;
}; };
#endif /* __API_H__ */ #endif /* XMRIG_API_H */

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -35,14 +36,13 @@
#include "api/ApiRouter.h" #include "api/ApiRouter.h"
#include "common/api/HttpReply.h" #include "common/api/HttpReply.h"
#include "common/api/HttpRequest.h" #include "common/api/HttpRequest.h"
#include "common/cpu/Cpu.h"
#include "common/crypto/keccak.h" #include "common/crypto/keccak.h"
#include "common/net/Job.h" #include "common/net/Job.h"
#include "common/Platform.h" #include "common/Platform.h"
#include "core/Config.h" #include "core/Config.h"
#include "core/Controller.h" #include "core/Controller.h"
#include "Cpu.h"
#include "interfaces/IThread.h" #include "interfaces/IThread.h"
#include "Mem.h"
#include "rapidjson/document.h" #include "rapidjson/document.h"
#include "rapidjson/prettywriter.h" #include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h" #include "rapidjson/stringbuffer.h"
@@ -67,7 +67,7 @@ ApiRouter::ApiRouter(xmrig::Controller *controller) :
memset(m_workerId, 0, sizeof(m_workerId)); memset(m_workerId, 0, sizeof(m_workerId));
setWorkerId(controller->config()->apiWorkerId()); setWorkerId(controller->config()->apiWorkerId());
genId(); genId(controller->config()->apiId());
} }
@@ -120,7 +120,7 @@ void ApiRouter::exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply)
} }
void ApiRouter::tick(const NetworkState &network) void ApiRouter::tick(const xmrig::NetworkState &network)
{ {
m_network = network; m_network = network;
} }
@@ -134,7 +134,7 @@ void ApiRouter::onConfigChanged(xmrig::Config *config, xmrig::Config *previousCo
void ApiRouter::finalize(xmrig::HttpReply &reply, rapidjson::Document &doc) const void ApiRouter::finalize(xmrig::HttpReply &reply, rapidjson::Document &doc) const
{ {
rapidjson::StringBuffer buffer(0, 4096); rapidjson::StringBuffer buffer(nullptr, 4096);
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer); rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
writer.SetMaxDecimalPlaces(10); writer.SetMaxDecimalPlaces(10);
doc.Accept(writer); doc.Accept(writer);
@@ -145,10 +145,15 @@ void ApiRouter::finalize(xmrig::HttpReply &reply, rapidjson::Document &doc) cons
} }
void ApiRouter::genId() void ApiRouter::genId(const char *id)
{ {
memset(m_id, 0, sizeof(m_id)); memset(m_id, 0, sizeof(m_id));
if (id && strlen(id) > 0) {
strncpy(m_id, id, sizeof(m_id) - 1);
return;
}
uv_interface_address_t *interfaces; uv_interface_address_t *interfaces;
int count = 0; int count = 0;
@@ -160,14 +165,16 @@ void ApiRouter::genId()
if (!interfaces[i].is_internal && interfaces[i].address.address4.sin_family == AF_INET) { if (!interfaces[i].is_internal && interfaces[i].address.address4.sin_family == AF_INET) {
uint8_t hash[200]; uint8_t hash[200];
const size_t addrSize = sizeof(interfaces[i].phys_addr); const size_t addrSize = sizeof(interfaces[i].phys_addr);
const size_t inSize = strlen(APP_KIND) + addrSize; const size_t inSize = strlen(APP_KIND) + addrSize + sizeof(uint16_t);
const uint16_t port = static_cast<uint16_t>(m_controller->config()->apiPort());
uint8_t *input = new uint8_t[inSize](); uint8_t *input = new uint8_t[inSize]();
memcpy(input, interfaces[i].phys_addr, addrSize); memcpy(input, &port, sizeof(uint16_t));
memcpy(input + addrSize, APP_KIND, strlen(APP_KIND)); memcpy(input + sizeof(uint16_t), interfaces[i].phys_addr, addrSize);
memcpy(input + sizeof(uint16_t) + addrSize, APP_KIND, strlen(APP_KIND));
xmrig::keccak(input, inSize, hash); xmrig::keccak(input, inSize, hash);
Job::toHex(hash, 8, m_id); xmrig::Job::toHex(hash, 8, m_id);
delete [] input; delete [] input;
break; break;
@@ -232,13 +239,14 @@ void ApiRouter::getIdentify(rapidjson::Document &doc) const
void ApiRouter::getMiner(rapidjson::Document &doc) const void ApiRouter::getMiner(rapidjson::Document &doc) const
{ {
using namespace xmrig;
auto &allocator = doc.GetAllocator(); auto &allocator = doc.GetAllocator();
rapidjson::Value cpu(rapidjson::kObjectType); rapidjson::Value cpu(rapidjson::kObjectType);
cpu.AddMember("brand", rapidjson::StringRef(Cpu::brand()), allocator); cpu.AddMember("brand", rapidjson::StringRef(Cpu::info()->brand()), allocator);
cpu.AddMember("aes", Cpu::hasAES(), allocator); cpu.AddMember("aes", Cpu::info()->hasAES(), allocator);
cpu.AddMember("x64", Cpu::isX64(), allocator); cpu.AddMember("x64", Cpu::info()->isX64(), allocator);
cpu.AddMember("sockets", Cpu::sockets(), allocator); cpu.AddMember("sockets", Cpu::info()->sockets(), allocator);
doc.AddMember("version", APP_VERSION, allocator); doc.AddMember("version", APP_VERSION, allocator);
doc.AddMember("kind", APP_KIND, allocator); doc.AddMember("kind", APP_KIND, allocator);
@@ -285,13 +293,16 @@ void ApiRouter::getThreads(rapidjson::Document &doc) const
const std::vector<xmrig::IThread *> &threads = m_controller->config()->threads(); const std::vector<xmrig::IThread *> &threads = m_controller->config()->threads();
rapidjson::Value list(rapidjson::kArrayType); rapidjson::Value list(rapidjson::kArrayType);
size_t i = 0;
for (const xmrig::IThread *thread : threads) { for (const xmrig::IThread *thread : threads) {
rapidjson::Value value = thread->toAPI(doc); rapidjson::Value value = thread->toAPI(doc);
rapidjson::Value hashrate(rapidjson::kArrayType); rapidjson::Value hashrate(rapidjson::kArrayType);
hashrate.PushBack(normalize(hr->calc(thread->index(), Hashrate::ShortInterval)), allocator); hashrate.PushBack(normalize(hr->calc(i, Hashrate::ShortInterval)), allocator);
hashrate.PushBack(normalize(hr->calc(thread->index(), Hashrate::MediumInterval)), allocator); hashrate.PushBack(normalize(hr->calc(i, Hashrate::MediumInterval)), allocator);
hashrate.PushBack(normalize(hr->calc(thread->index(), Hashrate::LargeInterval)), allocator); hashrate.PushBack(normalize(hr->calc(i, Hashrate::LargeInterval)), allocator);
i++;
value.AddMember("hashrate", hashrate, allocator); value.AddMember("hashrate", hashrate, allocator);
list.PushBack(value, allocator); list.PushBack(value, allocator);

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,12 +22,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __APIROUTER_H__ #ifndef XMRIG_APIROUTER_H
#define __APIROUTER_H__ #define XMRIG_APIROUTER_H
#include "api/NetworkState.h" #include "api/NetworkState.h"
#include "interfaces/IControllerListener.h" #include "common/interfaces/IControllerListener.h"
#include "rapidjson/fwd.h" #include "rapidjson/fwd.h"
@@ -44,19 +45,19 @@ class ApiRouter : public xmrig::IControllerListener
{ {
public: public:
ApiRouter(xmrig::Controller *controller); ApiRouter(xmrig::Controller *controller);
~ApiRouter(); ~ApiRouter() override;
void get(const xmrig::HttpRequest &req, xmrig::HttpReply &reply) const; void get(const xmrig::HttpRequest &req, xmrig::HttpReply &reply) const;
void exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply); void exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply);
void tick(const NetworkState &results); void tick(const xmrig::NetworkState &results);
protected: protected:
void onConfigChanged(xmrig::Config *config, xmrig::Config *previousConfig) override; void onConfigChanged(xmrig::Config *config, xmrig::Config *previousConfig) override;
private: private:
void finalize(xmrig::HttpReply &reply, rapidjson::Document &doc) const; void finalize(xmrig::HttpReply &reply, rapidjson::Document &doc) const;
void genId(); void genId(const char *id);
void getConnection(rapidjson::Document &doc) const; void getConnection(rapidjson::Document &doc) const;
void getHashrate(rapidjson::Document &doc) const; void getHashrate(rapidjson::Document &doc) const;
void getIdentify(rapidjson::Document &doc) const; void getIdentify(rapidjson::Document &doc) const;
@@ -66,10 +67,10 @@ private:
void setWorkerId(const char *id); void setWorkerId(const char *id);
void updateWorkerId(const char *id, const char *previousId); void updateWorkerId(const char *id, const char *previousId);
char m_id[17]; char m_id[32];
char m_workerId[128]; char m_workerId[128];
NetworkState m_network; xmrig::NetworkState m_network;
xmrig::Controller *m_controller; xmrig::Controller *m_controller;
}; };
#endif /* __APIROUTER_H__ */ #endif /* XMRIG_APIROUTER_H */

View File

@@ -32,7 +32,7 @@
#include "common/net/SubmitResult.h" #include "common/net/SubmitResult.h"
NetworkState::NetworkState() : xmrig::NetworkState::NetworkState() :
diff(0), diff(0),
accepted(0), accepted(0),
failures(0), failures(0),
@@ -44,13 +44,13 @@ NetworkState::NetworkState() :
} }
int NetworkState::connectionTime() const int xmrig::NetworkState::connectionTime() const
{ {
return m_active ? (int)((uv_now(uv_default_loop()) - m_connectionTime) / 1000) : 0; return m_active ? (int)((uv_now(uv_default_loop()) - m_connectionTime) / 1000) : 0;
} }
uint32_t NetworkState::avgTime() const uint32_t xmrig::NetworkState::avgTime() const
{ {
if (m_latency.empty()) { if (m_latency.empty()) {
return 0; return 0;
@@ -60,7 +60,7 @@ uint32_t NetworkState::avgTime() const
} }
uint32_t NetworkState::latency() const uint32_t xmrig::NetworkState::latency() const
{ {
const size_t calls = m_latency.size(); const size_t calls = m_latency.size();
if (calls == 0) { if (calls == 0) {
@@ -74,7 +74,7 @@ uint32_t NetworkState::latency() const
} }
void NetworkState::add(const SubmitResult &result, const char *error) void xmrig::NetworkState::add(const SubmitResult &result, const char *error)
{ {
if (error) { if (error) {
rejected++; rejected++;
@@ -94,7 +94,7 @@ void NetworkState::add(const SubmitResult &result, const char *error)
} }
void NetworkState::setPool(const char *host, int port, const char *ip) void xmrig::NetworkState::setPool(const char *host, int port, const char *ip)
{ {
snprintf(pool, sizeof(pool) - 1, "%s:%d", host, port); snprintf(pool, sizeof(pool) - 1, "%s:%d", host, port);
@@ -103,7 +103,7 @@ void NetworkState::setPool(const char *host, int port, const char *ip)
} }
void NetworkState::stop() void xmrig::NetworkState::stop()
{ {
m_active = false; m_active = false;
diff = 0; diff = 0;

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.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 * 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
@@ -21,14 +22,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __NETWORKSTATE_H__ #ifndef XMRIG_NETWORKSTATE_H
#define __NETWORKSTATE_H__ #define XMRIG_NETWORKSTATE_H
#include <array> #include <array>
#include <vector> #include <vector>
namespace xmrig {
class SubmitResult; class SubmitResult;
@@ -58,4 +62,8 @@ private:
uint64_t m_connectionTime; uint64_t m_connectionTime;
}; };
#endif /* __NETWORKSTATE_H__ */
} /* namespace xmrig */
#endif /* XMRIG_NETWORKSTATE_H */

49
src/base/io/Json.cpp Normal file
View File

@@ -0,0 +1,49 @@
/* 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/>.
*/
#include "base/io/Json.h"
#include "rapidjson/document.h"
bool xmrig::Json::getBool(const rapidjson::Value &obj, const char *key, bool defaultValue)
{
auto i = obj.FindMember(key);
if (i != obj.MemberEnd() && i->value.IsBool()) {
return i->value.GetBool();
}
return defaultValue;
}
const char *xmrig::Json::getString(const rapidjson::Value &obj, const char *key, const char *defaultValue)
{
auto i = obj.FindMember(key);
if (i != obj.MemberEnd() && i->value.IsString()) {
return i->value.GetString();
}
return defaultValue;
}

49
src/base/io/Json.h Normal file
View File

@@ -0,0 +1,49 @@
/* 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_JSON_H
#define XMRIG_JSON_H
#include "rapidjson/fwd.h"
namespace xmrig {
class Json
{
public:
static bool getBool(const rapidjson::Value &obj, const char *key, bool defaultValue = false);
static const char *getString(const rapidjson::Value &obj, const char *key, const char *defaultValue = nullptr);
static bool get(const char *fileName, rapidjson::Document &doc);
static bool save(const char *fileName, const rapidjson::Document &doc);
};
} /* namespace xmrig */
#endif /* XMRIG_JSON_H */

62
src/base/io/Json_unix.cpp Normal file
View File

@@ -0,0 +1,62 @@
/* 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/>.
*/
#include <fstream>
#include "base/io/Json.h"
#include "rapidjson/document.h"
#include "rapidjson/istreamwrapper.h"
#include "rapidjson/ostreamwrapper.h"
#include "rapidjson/prettywriter.h"
bool xmrig::Json::get(const char *fileName, rapidjson::Document &doc)
{
std::ifstream ifs(fileName, std::ios_base::in | std::ios_base::binary);
if (!ifs.is_open()) {
return false;
}
rapidjson::IStreamWrapper isw(ifs);
doc.ParseStream<rapidjson::kParseCommentsFlag | rapidjson::kParseTrailingCommasFlag>(isw);
return !doc.HasParseError() && doc.IsObject();
}
bool xmrig::Json::save(const char *fileName, const rapidjson::Document &doc)
{
std::ofstream ofs(fileName, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
if (!ofs.is_open()) {
return false;
}
rapidjson::OStreamWrapper osw(ofs);
rapidjson::PrettyWriter<rapidjson::OStreamWrapper> writer(osw);
doc.Accept(writer);
return true;
}

124
src/base/io/Json_win.cpp Normal file
View File

@@ -0,0 +1,124 @@
/* 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/>.
*/
#include <windows.h>
#ifdef __GNUC__
# include <fcntl.h>
# include <ext/stdio_filebuf.h>
#endif
#include <fstream>
#include "base/io/Json.h"
#include "rapidjson/document.h"
#include "rapidjson/istreamwrapper.h"
#include "rapidjson/ostreamwrapper.h"
#include "rapidjson/prettywriter.h"
#if defined(_MSC_VER) || defined (__GNUC__)
static std::wstring toUtf16(const char *str)
{
const int size = static_cast<int>(strlen(str));
std::wstring ret;
int len = MultiByteToWideChar(CP_UTF8, 0, str, size, nullptr, 0);
if (len > 0) {
ret.resize(static_cast<size_t>(len));
MultiByteToWideChar(CP_UTF8, 0, str, size, &ret[0], len);
}
return ret;
}
#endif
bool xmrig::Json::get(const char *fileName, rapidjson::Document &doc)
{
using namespace rapidjson;
constexpr const std::ios_base::openmode mode = std::ios_base::in | std::ios_base::binary;
# if defined(_MSC_VER)
std::ifstream ifs(toUtf16(fileName), mode);
if (!ifs.is_open()) {
return false;
}
# elif defined(__GNUC__)
const int fd = _wopen(toUtf16(fileName).c_str(), _O_RDONLY | _O_BINARY);
if (fd == -1) {
return false;
}
__gnu_cxx::stdio_filebuf<char> buf(fd, mode);
std::istream ifs(&buf);
# else
std::ifstream ifs(fileName, mode);
if (!ifs.is_open()) {
return false;
}
# endif
IStreamWrapper isw(ifs);
doc.ParseStream<kParseCommentsFlag | kParseTrailingCommasFlag>(isw);
return !doc.HasParseError() && doc.IsObject();
}
bool xmrig::Json::save(const char *fileName, const rapidjson::Document &doc)
{
using namespace rapidjson;
constexpr const std::ios_base::openmode mode = std::ios_base::out | std::ios_base::binary | std::ios_base::trunc;
# if defined(_MSC_VER)
std::ofstream ofs(toUtf16(fileName), mode);
if (!ofs.is_open()) {
return false;
}
# elif defined(__GNUC__)
const int fd = _wopen(toUtf16(fileName).c_str(), _O_WRONLY | _O_BINARY | _O_TRUNC);
if (fd == -1) {
return false;
}
__gnu_cxx::stdio_filebuf<char> buf(fd, mode);
std::ostream ofs(&buf);
# else
std::ofstream ofs(fileName, mode);
if (!ofs.is_open()) {
return false;
}
# endif
OStreamWrapper osw(ofs);
PrettyWriter<OStreamWrapper> writer(osw);
doc.Accept(writer);
return true;
}

94
src/base/io/Watcher.cpp Normal file
View File

@@ -0,0 +1,94 @@
/* 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/>.
*/
#include <uv.h>
#include "base/kernel/interfaces/IWatcherListener.h"
#include "base/io/Watcher.h"
#include "base/tools/Handle.h"
xmrig::Watcher::Watcher(const String &path, IWatcherListener *listener) :
m_listener(listener),
m_path(path)
{
m_fsEvent = new uv_fs_event_t;
uv_fs_event_init(uv_default_loop(), m_fsEvent);
m_timer = new uv_timer_t;
uv_timer_init(uv_default_loop(), m_timer);
m_fsEvent->data = m_timer->data = this;
start();
}
xmrig::Watcher::~Watcher()
{
Handle::close(m_timer);
Handle::close(m_fsEvent);
}
void xmrig::Watcher::onTimer(uv_timer_t *handle)
{
static_cast<Watcher *>(handle->data)->reload();
}
void xmrig::Watcher::onFsEvent(uv_fs_event_t *handle, const char *filename, int, int)
{
if (!filename) {
return;
}
static_cast<Watcher *>(handle->data)->queueUpdate();
}
void xmrig::Watcher::queueUpdate()
{
uv_timer_stop(m_timer);
uv_timer_start(m_timer, xmrig::Watcher::onTimer, kDelay, 0);
}
void xmrig::Watcher::reload()
{
m_listener->onFileChanged(m_path);
# ifndef _WIN32
uv_fs_event_stop(m_fsEvent);
start();
# endif
}
void xmrig::Watcher::start()
{
uv_fs_event_start(m_fsEvent, xmrig::Watcher::onFsEvent, m_path, 0);
}

67
src/base/io/Watcher.h Normal file
View File

@@ -0,0 +1,67 @@
/* 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_WATCHER_H
#define XMRIG_WATCHER_H
#include "base/tools/String.h"
typedef struct uv_fs_event_s uv_fs_event_t;
typedef struct uv_timer_s uv_timer_t;
namespace xmrig {
class IWatcherListener;
class Watcher
{
public:
Watcher(const String &path, IWatcherListener *listener);
~Watcher();
private:
constexpr static int kDelay = 500;
static void onFsEvent(uv_fs_event_t *handle, const char *filename, int events, int status);
static void onTimer(uv_timer_t *handle);
void queueUpdate();
void reload();
void start();
IWatcherListener *m_listener;
String m_path;
uv_fs_event_t *m_fsEvent;
uv_timer_t *m_timer;
};
} /* namespace xmrig */
#endif /* XMRIG_WATCHER_H */

120
src/base/kernel/Entry.cpp Normal file
View File

@@ -0,0 +1,120 @@
/* 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/>.
*/
#include <uv.h>
#ifndef XMRIG_NO_HTTPD
# include <microhttpd.h>
#endif
#ifndef XMRIG_NO_TLS
# include <openssl/opensslv.h>
#endif
#include "base/kernel/Entry.h"
#include "base/kernel/Process.h"
#include "core/usage.h"
#include "version.h"
static int showVersion()
{
printf(APP_NAME " " APP_VERSION "\n built on " __DATE__
# if defined(__clang__)
" with clang " __clang_version__);
# elif defined(__GNUC__)
" with GCC");
printf(" %d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# elif defined(_MSC_VER)
" with MSVC");
printf(" %d", MSVC_VERSION);
# else
);
# endif
printf("\n features:"
# if defined(__i386__) || defined(_M_IX86)
" 32-bit"
# elif defined(__x86_64__) || defined(_M_AMD64)
" 64-bit"
# endif
# if defined(__AES__) || defined(_MSC_VER)
" AES"
# endif
"\n");
printf("\nlibuv/%s\n", uv_version_string());
# ifndef XMRIG_NO_HTTPD
printf("microhttpd/%s\n", MHD_get_version());
# endif
# if !defined(XMRIG_NO_TLS) && defined(OPENSSL_VERSION_TEXT)
{
constexpr const char *v = OPENSSL_VERSION_TEXT + 8;
printf("OpenSSL/%.*s\n", static_cast<int>(strchr(v, ' ') - v), v);
}
# endif
return 0;
}
xmrig::Entry::Id xmrig::Entry::get(const Process &process)
{
const Arguments &args = process.arguments();
if (args.hasArg("-h") || args.hasArg("--help")) {
return Usage;
}
if (args.hasArg("-V") || args.hasArg("--version")) {
return Version;
}
return Default;
}
int xmrig::Entry::exec(const Process &, Id id)
{
switch (id) {
case Usage:
printf(usage);
return 0;
case Version:
return showVersion();
default:
break;
}
return 1;
}

52
src/base/kernel/Entry.h Normal file
View 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_ENTRY_H
#define XMRIG_ENTRY_H
namespace xmrig {
class Process;
class Entry
{
public:
enum Id {
Default,
Usage,
Version
};
static Id get(const Process &process);
static int exec(const Process &process, Id id);
};
} /* namespace xmrig */
#endif /* XMRIG_ENTRY_H */

101
src/base/kernel/Process.cpp Normal file
View File

@@ -0,0 +1,101 @@
/* 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/>.
*/
#include <uv.h>
#include <time.h>
#include "base/kernel/Process.h"
static size_t location(xmrig::Process::Location location, char *buf, size_t max)
{
using namespace xmrig;
size_t size = max;
if (location == Process::ExeLocation) {
return uv_exepath(buf, &size) < 0 ? 0 : size;
}
if (location == Process::CwdLocation) {
return uv_cwd(buf, &size) < 0 ? 0 : size;
}
return 0;
}
xmrig::Process::Process(int argc, char **argv) :
m_arguments(argc, argv)
{
srand(static_cast<unsigned int>(static_cast<uintptr_t>(time(nullptr)) ^ reinterpret_cast<uintptr_t>(this)));
}
xmrig::Process::~Process()
{
}
xmrig::String xmrig::Process::location(Location location, const char *fileName) const
{
constexpr const size_t max = 520;
char *buf = new char[max]();
size_t size = ::location(location, buf, max);
if (size == 0) {
delete [] buf;
return String();
}
if (fileName == nullptr) {
return buf;
}
if (location == ExeLocation) {
char *p = strrchr(buf, kDirSeparator);
if (p == nullptr) {
delete [] buf;
return String();
}
size = static_cast<size_t>(p - buf);
}
if ((size + strlen(fileName) + 2) >= max) {
delete [] buf;
return String();
}
buf[size] = kDirSeparator;
strcpy(buf + size + 1, fileName);
return buf;
}

64
src/base/kernel/Process.h Normal file
View File

@@ -0,0 +1,64 @@
/* 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_PROCESS_H
#define XMRIG_PROCESS_H
#include "base/tools/Arguments.h"
namespace xmrig {
class Process
{
public:
enum Location {
ExeLocation,
CwdLocation
};
# ifdef WIN32
constexpr const static char kDirSeparator = '\\';
# else
constexpr const static char kDirSeparator = '/';
# endif
Process(int argc, char **argv);
~Process();
String location(Location location, const char *fileName = nullptr) const;
inline const Arguments &arguments() const { return m_arguments; }
private:
Arguments m_arguments;
};
} /* namespace xmrig */
#endif /* XMRIG_PROCESS_H */

View File

@@ -5,6 +5,7 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@@ -21,46 +22,42 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __CPU_H__
#define __CPU_H__ #include <uv.h>
#include <stdint.h> #include "base/kernel/interfaces/ISignalListener.h"
#include "base/kernel/Signals.h"
#include "base/tools/Handle.h"
class Cpu static const int signums[xmrig::Signals::kSignalsCount] = { SIGHUP, SIGINT, SIGTERM };
xmrig::Signals::Signals(ISignalListener *listener)
: m_listener(listener)
{ {
public: for (size_t i = 0; i < kSignalsCount; ++i) {
enum Flags { uv_signal_t *signal = new uv_signal_t;
X86_64 = 1, signal->data = this;
AES = 2,
BMI2 = 4
};
static size_t optimalThreadsCount(size_t size, int maxCpuUsage); m_signals[i] = signal;
static void init();
static inline bool hasAES() { return (m_flags & AES) != 0; } uv_signal_init(uv_default_loop(), signal);
static inline bool isX64() { return (m_flags & X86_64) != 0; } uv_signal_start(signal, xmrig::Signals::onSignal, signums[i]);
static inline const char *brand() { return m_brand; } }
static inline int cores() { return m_totalCores; } }
static inline int l2() { return m_l2_cache; }
static inline int l3() { return m_l3_cache; }
static inline int sockets() { return m_sockets; }
static inline int threads() { return m_totalThreads; }
private:
static void initCommon();
static bool m_l2_exclusive;
static char m_brand[64];
static int m_flags;
static int m_l2_cache;
static int m_l3_cache;
static int m_sockets;
static int m_totalCores;
static size_t m_totalThreads;
};
#endif /* __CPU_H__ */ xmrig::Signals::~Signals()
{
for (size_t i = 0; i < kSignalsCount; ++i) {
Handle::close(m_signals[i]);
}
}
void xmrig::Signals::onSignal(uv_signal_t *handle, int signum)
{
static_cast<xmrig::Signals *>(handle->data)->m_listener->onSignal(signum);
}

62
src/base/kernel/Signals.h Normal file
View File

@@ -0,0 +1,62 @@
/* 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_SIGNALS_H
#define XMRIG_SIGNALS_H
#include <stddef.h>
typedef struct uv_signal_s uv_signal_t;
namespace xmrig {
class ISignalListener;
class Signals
{
public:
constexpr static const size_t kSignalsCount = 3;
Signals(ISignalListener *listener);
~Signals();
private:
void close(int signum);
static void onSignal(uv_signal_t *handle, int signum);
ISignalListener *m_listener;
uv_signal_t *m_signals[kSignalsCount];
};
} /* namespace xmrig */
#endif /* XMRIG_SIGNALS_H */

View File

@@ -0,0 +1,47 @@
/* 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_ICONFIGLISTENER_H
#define XMRIG_ICONFIGLISTENER_H
namespace xmrig {
class IConfig;
class IConfigListener
{
public:
virtual ~IConfigListener() = default;
virtual void onNewConfig(IConfig *config) = 0;
};
} /* namespace xmrig */
#endif // XMRIG_ICONFIGLISTENER_H

View File

@@ -0,0 +1,47 @@
/* 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_ISIGNALLISTENER_H
#define XMRIG_ISIGNALLISTENER_H
namespace xmrig {
class String;
class ISignalListener
{
public:
virtual ~ISignalListener() = default;
virtual void onSignal(int signum) = 0;
};
} /* namespace xmrig */
#endif // XMRIG_ISIGNALLISTENER_H

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,26 +22,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __IWATCHERLISTENER_H__ #ifndef XMRIG_IWATCHERLISTENER_H
#define __IWATCHERLISTENER_H__ #define XMRIG_IWATCHERLISTENER_H
namespace xmrig { namespace xmrig {
class IConfig; class String;
class IWatcherListener class IWatcherListener
{ {
public: public:
virtual ~IWatcherListener() {} virtual ~IWatcherListener() = default;
virtual void onNewConfig(IConfig *config) = 0; virtual void onFileChanged(const String &fileName) = 0;
}; };
} /* namespace xmrig */ } /* namespace xmrig */
#endif // __IWATCHERLISTENER_H__ #endif // XMRIG_IWATCHERLISTENER_H

497
src/base/net/Pool.cpp Normal file
View File

@@ -0,0 +1,497 @@
/* 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-2019 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/>.
*/
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "base/io/Json.h"
#include "base/net/Pool.h"
#include "rapidjson/document.h"
#ifdef APP_DEBUG
# include "common/log/Log.h"
#endif
#ifdef _MSC_VER
# define strncasecmp _strnicmp
# define strcasecmp _stricmp
#endif
static const char *kEnabled = "enabled";
static const char *kFingerprint = "tls-fingerprint";
static const char *kKeepalive = "keepalive";
static const char *kNicehash = "nicehash";
static const char *kPass = "pass";
static const char *kRigId = "rig-id";
static const char *kTls = "tls";
static const char *kUrl = "url";
static const char *kUser = "user";
static const char *kVariant = "variant";
xmrig::Pool::Pool() :
m_enabled(true),
m_nicehash(false),
m_tls(false),
m_keepAlive(0),
m_port(kDefaultPort)
{
}
/**
* @brief Parse url.
*
* Valid urls:
* example.com
* example.com:3333
* stratum+tcp://example.com
* stratum+tcp://example.com:3333
*
* @param url
*/
xmrig::Pool::Pool(const char *url) :
m_enabled(true),
m_nicehash(false),
m_tls(false),
m_keepAlive(0),
m_port(kDefaultPort)
{
parse(url);
}
xmrig::Pool::Pool(const rapidjson::Value &object) :
m_enabled(true),
m_nicehash(false),
m_tls(false),
m_keepAlive(0),
m_port(kDefaultPort)
{
if (!parse(Json::getString(object, kUrl))) {
return;
}
setUser(Json::getString(object, kUser));
setPassword(Json::getString(object, kPass));
setRigId(Json::getString(object, kRigId));
setNicehash(Json::getBool(object, kNicehash));
const rapidjson::Value &keepalive = object[kKeepalive];
if (keepalive.IsInt()) {
setKeepAlive(keepalive.GetInt());
}
else if (keepalive.IsBool()) {
setKeepAlive(keepalive.GetBool());
}
const rapidjson::Value &variant = object[kVariant];
if (variant.IsString()) {
algorithm().parseVariant(variant.GetString());
}
else if (variant.IsInt()) {
algorithm().parseVariant(variant.GetInt());
}
m_enabled = Json::getBool(object, kEnabled, true);
m_tls = Json::getBool(object, kTls);
m_fingerprint = Json::getString(object, kFingerprint);
}
xmrig::Pool::Pool(const char *host, uint16_t port, const char *user, const char *password, int keepAlive, bool nicehash, bool tls) :
m_nicehash(nicehash),
m_tls(tls),
m_keepAlive(keepAlive),
m_host(host),
m_password(password),
m_user(user),
m_port(port)
{
const size_t size = m_host.size() + 8;
assert(size > 8);
char *url = new char[size]();
snprintf(url, size - 1, "%s:%d", m_host.data(), m_port);
m_url = url;
}
bool xmrig::Pool::isCompatible(const Algorithm &algorithm) const
{
if (m_algorithms.empty()) {
return true;
}
for (const auto &a : m_algorithms) {
if (algorithm == a) {
return true;
}
}
# ifdef XMRIG_PROXY_PROJECT
if (m_algorithm.algo() == xmrig::CRYPTONIGHT && algorithm.algo() == xmrig::CRYPTONIGHT) {
return m_algorithm.variant() == xmrig::VARIANT_XTL || m_algorithm.variant() == xmrig::VARIANT_MSR;
}
# endif
return false;
}
bool xmrig::Pool::isEnabled() const
{
# ifdef XMRIG_NO_TLS
if (isTLS()) {
return false;
}
# endif
return m_enabled && isValid() && algorithm().isValid();
}
bool xmrig::Pool::isEqual(const Pool &other) const
{
return (m_nicehash == other.m_nicehash
&& m_enabled == other.m_enabled
&& m_tls == other.m_tls
&& m_keepAlive == other.m_keepAlive
&& m_port == other.m_port
&& m_algorithm == other.m_algorithm
&& m_fingerprint == other.m_fingerprint
&& m_host == other.m_host
&& m_password == other.m_password
&& m_rigId == other.m_rigId
&& m_url == other.m_url
&& m_user == other.m_user);
}
bool xmrig::Pool::parse(const char *url)
{
assert(url != nullptr);
const char *p = strstr(url, "://");
const char *base = url;
if (p) {
if (strncasecmp(url, "stratum+tcp://", 14) == 0) {
m_tls = false;
}
else if (strncasecmp(url, "stratum+ssl://", 14) == 0) {
m_tls = true;
}
else {
return false;
}
base = url + 14;
}
if (!strlen(base) || *base == '/') {
return false;
}
m_url = url;
if (base[0] == '[') {
return parseIPv6(base);
}
const char *port = strchr(base, ':');
if (!port) {
m_host = base;
return true;
}
const size_t size = static_cast<size_t>(port++ - base + 1);
char *host = new char[size]();
memcpy(host, base, size - 1);
m_host = host;
m_port = static_cast<uint16_t>(strtol(port, nullptr, 10));
return true;
}
bool xmrig::Pool::setUserpass(const char *userpass)
{
const char *p = strchr(userpass, ':');
if (!p) {
return false;
}
char *user = new char[p - userpass + 1]();
strncpy(user, userpass, static_cast<size_t>(p - userpass));
m_user = user;
m_password = p + 1;
return true;
}
rapidjson::Value xmrig::Pool::toJSON(rapidjson::Document &doc) const
{
using namespace rapidjson;
auto &allocator = doc.GetAllocator();
Value obj(kObjectType);
obj.AddMember(StringRef(kUrl), m_url.toJSON(), allocator);
obj.AddMember(StringRef(kUser), m_user.toJSON(), allocator);
obj.AddMember(StringRef(kPass), m_password.toJSON(), allocator);
obj.AddMember(StringRef(kRigId), m_rigId.toJSON(), allocator);
# ifndef XMRIG_PROXY_PROJECT
obj.AddMember(StringRef(kNicehash), isNicehash(), allocator);
# endif
if (m_keepAlive == 0 || m_keepAlive == kKeepAliveTimeout) {
obj.AddMember(StringRef(kKeepalive), m_keepAlive > 0, allocator);
}
else {
obj.AddMember(StringRef(kKeepalive), m_keepAlive, allocator);
}
switch (m_algorithm.variant()) {
case VARIANT_AUTO:
case VARIANT_0:
case VARIANT_1:
obj.AddMember(StringRef(kVariant), m_algorithm.variant(), allocator);
break;
case VARIANT_2:
obj.AddMember(StringRef(kVariant), 2, allocator);
break;
default:
obj.AddMember(StringRef(kVariant), StringRef(m_algorithm.variantName()), allocator);
break;
}
obj.AddMember(StringRef(kEnabled), m_enabled, allocator);
obj.AddMember(StringRef(kTls), isTLS(), allocator);
obj.AddMember(StringRef(kFingerprint), m_fingerprint.toJSON(), allocator);
return obj;
}
void xmrig::Pool::adjust(const Algorithm &algorithm)
{
if (!isValid()) {
return;
}
if (!m_algorithm.isValid()) {
m_algorithm.setAlgo(algorithm.algo());
adjustVariant(algorithm.variant());
}
rebuild();
}
void xmrig::Pool::setAlgo(const xmrig::Algorithm &algorithm)
{
m_algorithm = algorithm;
rebuild();
}
#ifdef APP_DEBUG
void xmrig::Pool::print() const
{
LOG_NOTICE("url: %s", m_url.data());
LOG_DEBUG ("host: %s", m_host.data());
LOG_DEBUG ("port: %d", static_cast<int>(m_port));
LOG_DEBUG ("user: %s", m_user.data());
LOG_DEBUG ("pass: %s", m_password.data());
LOG_DEBUG ("rig-id %s", m_rigId.data());
LOG_DEBUG ("algo: %s", m_algorithm.name());
LOG_DEBUG ("nicehash: %d", static_cast<int>(m_nicehash));
LOG_DEBUG ("keepAlive: %d", m_keepAlive);
}
#endif
bool xmrig::Pool::parseIPv6(const char *addr)
{
const char *end = strchr(addr, ']');
if (!end) {
return false;
}
const char *port = strchr(end, ':');
if (!port) {
return false;
}
const size_t size = static_cast<size_t>(end - addr);
char *host = new char[size]();
memcpy(host, addr + 1, size - 1);
m_host = host;
m_port = static_cast<uint16_t>(strtol(port + 1, nullptr, 10));
return true;
}
void xmrig::Pool::addVariant(xmrig::Variant variant)
{
const xmrig::Algorithm algorithm(m_algorithm.algo(), variant);
if (!algorithm.isValid() || m_algorithm == algorithm) {
return;
}
m_algorithms.push_back(algorithm);
}
void xmrig::Pool::adjustVariant(const xmrig::Variant variantHint)
{
# ifndef XMRIG_PROXY_PROJECT
using namespace xmrig;
if (m_host.contains(".nicehash.com")) {
m_keepAlive = false;
m_nicehash = true;
bool valid = true;
switch (m_port) {
case 3355:
case 33355:
valid = m_algorithm.algo() == CRYPTONIGHT && m_host.contains("cryptonight.");
m_algorithm.setVariant(VARIANT_0);
break;
case 3363:
case 33363:
valid = m_algorithm.algo() == CRYPTONIGHT && m_host.contains("cryptonightv7.");
m_algorithm.setVariant(VARIANT_1);
break;
case 3364:
valid = m_algorithm.algo() == CRYPTONIGHT_HEAVY && m_host.contains("cryptonightheavy.");
m_algorithm.setVariant(VARIANT_0);
break;
case 3367:
case 33367:
valid = m_algorithm.algo() == CRYPTONIGHT && m_host.contains("cryptonightv8.");
m_algorithm.setVariant(VARIANT_2);
break;
default:
break;
}
if (!valid) {
m_algorithm.setAlgo(INVALID_ALGO);
}
m_tls = m_port > 33000;
return;
}
if (m_host.contains(".minergate.com")) {
m_keepAlive = false;
bool valid = true;
m_algorithm.setVariant(VARIANT_1);
if (m_host.contains("xmr.pool.")) {
valid = m_algorithm.algo() == CRYPTONIGHT;
m_algorithm.setVariant(m_port == 45700 ? VARIANT_AUTO : VARIANT_0);
}
else if (m_host.contains("aeon.pool.") && m_port == 45690) {
valid = m_algorithm.algo() == CRYPTONIGHT_LITE;
m_algorithm.setVariant(VARIANT_1);
}
if (!valid) {
m_algorithm.setAlgo(INVALID_ALGO);
}
return;
}
if (variantHint != VARIANT_AUTO) {
m_algorithm.setVariant(variantHint);
return;
}
if (m_algorithm.variant() != VARIANT_AUTO) {
return;
}
if (m_algorithm.algo() == CRYPTONIGHT_HEAVY) {
m_algorithm.setVariant(VARIANT_0);
}
else if (m_algorithm.algo() == CRYPTONIGHT_LITE) {
m_algorithm.setVariant(VARIANT_1);
}
# endif
}
void xmrig::Pool::rebuild()
{
m_algorithms.clear();
if (!m_algorithm.isValid()) {
return;
}
m_algorithms.push_back(m_algorithm);
# ifndef XMRIG_PROXY_PROJECT
addVariant(VARIANT_4);
addVariant(VARIANT_WOW);
addVariant(VARIANT_2);
addVariant(VARIANT_1);
addVariant(VARIANT_0);
addVariant(VARIANT_HALF);
addVariant(VARIANT_XTL);
addVariant(VARIANT_TUBE);
addVariant(VARIANT_MSR);
addVariant(VARIANT_XHV);
addVariant(VARIANT_XAO);
addVariant(VARIANT_RTO);
addVariant(VARIANT_GPU);
addVariant(VARIANT_AUTO);
# endif
}

124
src/base/net/Pool.h Normal file
View File

@@ -0,0 +1,124 @@
/* 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_POOL_H
#define XMRIG_POOL_H
#include <vector>
#include "base/tools/String.h"
#include "common/crypto/Algorithm.h"
#include "rapidjson/fwd.h"
namespace xmrig {
class Pool
{
public:
constexpr static const char *kDefaultPassword = "x";
constexpr static const char *kDefaultUser = "x";
constexpr static uint16_t kDefaultPort = 3333;
constexpr static int kKeepAliveTimeout = 60;
Pool();
Pool(const char *url);
Pool(const rapidjson::Value &object);
Pool(const char *host,
uint16_t port,
const char *user = nullptr,
const char *password = nullptr,
int keepAlive = 0,
bool nicehash = false,
bool tls = false
);
inline bool isNicehash() const { return m_nicehash; }
inline bool isTLS() const { return m_tls; }
inline bool isValid() const { return !m_host.isNull() && m_port > 0; }
inline const char *fingerprint() const { return m_fingerprint.data(); }
inline const char *host() const { return m_host.data(); }
inline const char *password() const { return !m_password.isNull() ? m_password.data() : kDefaultPassword; }
inline const char *rigId() const { return m_rigId.data(); }
inline const char *url() const { return m_url.data(); }
inline const char *user() const { return !m_user.isNull() ? m_user.data() : kDefaultUser; }
inline const Algorithm &algorithm() const { return m_algorithm; }
inline const Algorithms &algorithms() const { return m_algorithms; }
inline int keepAlive() const { return m_keepAlive; }
inline uint16_t port() const { return m_port; }
inline void setFingerprint(const char *fingerprint) { m_fingerprint = fingerprint; }
inline void setKeepAlive(int keepAlive) { m_keepAlive = keepAlive >= 0 ? keepAlive : 0; }
inline void setKeepAlive(bool enable) { setKeepAlive(enable ? kKeepAliveTimeout : 0); }
inline void setNicehash(bool nicehash) { m_nicehash = nicehash; }
inline void setPassword(const char *password) { m_password = password; }
inline void setRigId(const char *rigId) { m_rigId = rigId; }
inline void setTLS(bool tls) { m_tls = tls; }
inline void setUser(const char *user) { m_user = user; }
inline Algorithm &algorithm() { return m_algorithm; }
inline bool operator!=(const Pool &other) const { return !isEqual(other); }
inline bool operator==(const Pool &other) const { return isEqual(other); }
bool isCompatible(const Algorithm &algorithm) const;
bool isEnabled() const;
bool isEqual(const Pool &other) const;
bool parse(const char *url);
bool setUserpass(const char *userpass);
rapidjson::Value toJSON(rapidjson::Document &doc) const;
void adjust(const Algorithm &algorithm);
void setAlgo(const Algorithm &algorithm);
# ifdef APP_DEBUG
void print() const;
# endif
private:
bool parseIPv6(const char *addr);
void addVariant(Variant variant);
void adjustVariant(const Variant variantHint);
void rebuild();
Algorithm m_algorithm;
Algorithms m_algorithms;
bool m_enabled;
bool m_nicehash;
bool m_tls;
int m_keepAlive;
String m_fingerprint;
String m_host;
String m_password;
String m_rigId;
String m_url;
String m_user;
uint16_t m_port;
};
} /* namespace xmrig */
#endif /* XMRIG_POOL_H */

207
src/base/net/Pools.cpp Normal file
View File

@@ -0,0 +1,207 @@
/* 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/>.
*/
#include "base/net/Pools.h"
#include "common/log/Log.h"
#include "common/net/strategies/FailoverStrategy.h"
#include "common/net/strategies/SinglePoolStrategy.h"
#include "rapidjson/document.h"
xmrig::Pools::Pools() :
m_retries(5),
m_retryPause(5)
{
# ifdef XMRIG_PROXY_PROJECT
m_retries = 2;
m_retryPause = 1;
# endif
}
xmrig::Pool &xmrig::Pools::current()
{
if (m_data.empty()) {
m_data.push_back(Pool());
}
return m_data.back();
}
bool xmrig::Pools::isEqual(const Pools &other) const
{
if (m_data.size() != other.m_data.size() || m_retries != other.m_retries || m_retryPause != other.m_retryPause) {
return false;
}
return std::equal(m_data.begin(), m_data.end(), other.m_data.begin());
}
bool xmrig::Pools::setUrl(const char *url)
{
if (m_data.empty() || m_data.back().isValid()) {
Pool pool(url);
if (pool.isValid()) {
m_data.push_back(std::move(pool));
return true;
}
return false;
}
current().parse(url);
return m_data.back().isValid();
}
xmrig::IStrategy *xmrig::Pools::createStrategy(IStrategyListener *listener) const
{
if (active() == 1) {
for (const Pool &pool : m_data) {
if (pool.isEnabled()) {
return new SinglePoolStrategy(pool, retryPause(), retries(), listener);
}
}
}
FailoverStrategy *strategy = new FailoverStrategy(retryPause(), retries(), listener);
for (const Pool &pool : m_data) {
if (pool.isEnabled()) {
strategy->add(pool);
}
}
return strategy;
}
rapidjson::Value xmrig::Pools::toJSON(rapidjson::Document &doc) const
{
using namespace rapidjson;
auto &allocator = doc.GetAllocator();
Value pools(kArrayType);
for (const Pool &pool : m_data) {
pools.PushBack(pool.toJSON(doc), allocator);
}
return pools;
}
size_t xmrig::Pools::active() const
{
size_t count = 0;
for (const Pool &pool : m_data) {
if (pool.isEnabled()) {
count++;
}
}
return count;
}
void xmrig::Pools::adjust(const Algorithm &algorithm)
{
for (Pool &pool : m_data) {
pool.adjust(algorithm);
}
}
void xmrig::Pools::load(const rapidjson::Value &pools)
{
m_data.clear();
for (const rapidjson::Value &value : pools.GetArray()) {
if (!value.IsObject()) {
continue;
}
Pool pool(value);
if (pool.isValid()) {
m_data.push_back(std::move(pool));
}
}
}
void xmrig::Pools::print() const
{
size_t i = 1;
for (const Pool &pool : m_data) {
if (Log::colors) {
const int color = pool.isEnabled() ? (pool.isTLS() ? 32 : 36) : 31;
Log::i()->text(GREEN_BOLD(" * ") WHITE_BOLD("POOL #%-7zu") "\x1B[1;%dm%s\x1B[0m variant " WHITE_BOLD("%s"),
i,
color,
pool.url(),
pool.algorithm().variantName()
);
}
else {
Log::i()->text(" * POOL #%-7zu%s%s variant=%s %s",
i,
pool.isEnabled() ? "" : "-",
pool.url(),
pool.algorithm().variantName(),
pool.isTLS() ? "TLS" : ""
);
}
i++;
}
# ifdef APP_DEBUG
LOG_NOTICE("POOLS --------------------------------------------------------------------");
for (const Pool &pool : m_data) {
pool.print();
}
LOG_NOTICE("--------------------------------------------------------------------------");
# endif
}
void xmrig::Pools::setRetries(int retries)
{
if (retries > 0 && retries <= 1000) {
m_retries = retries;
}
}
void xmrig::Pools::setRetryPause(int retryPause)
{
if (retryPause > 0 && retryPause <= 3600) {
m_retryPause = retryPause;
}
}

88
src/base/net/Pools.h Normal file
View File

@@ -0,0 +1,88 @@
/* 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_POOLS_H
#define XMRIG_POOLS_H
#include <vector>
#include "base/net/Pool.h"
namespace xmrig {
class IStrategy;
class IStrategyListener;
class Pools
{
public:
Pools();
inline bool setUserpass(const char *userpass) { return current().setUserpass(userpass); }
inline const std::vector<Pool> &data() const { return m_data; }
inline int retries() const { return m_retries; }
inline int retryPause() const { return m_retryPause; }
inline void setFingerprint(const char *fingerprint) { current().setFingerprint(fingerprint); }
inline void setKeepAlive(bool enable) { current().setKeepAlive(enable); }
inline void setKeepAlive(int keepAlive) { current().setKeepAlive(keepAlive); }
inline void setNicehash(bool enable) { current().setNicehash(enable); }
inline void setPassword(const char *password) { current().setPassword(password); }
inline void setRigId(const char *rigId) { current().setRigId(rigId); }
inline void setTLS(bool enable) { current().setTLS(enable); }
inline void setUser(const char *user) { current().setUser(user); }
inline void setVariant(const char *variant) { current().algorithm().parseVariant(variant); }
inline void setVariant(int variant) { current().algorithm().parseVariant(variant); }
inline bool operator!=(const Pools &other) const { return !isEqual(other); }
inline bool operator==(const Pools &other) const { return isEqual(other); }
bool isEqual(const Pools &other) const;
bool setUrl(const char *url);
IStrategy *createStrategy(IStrategyListener *listener) const;
rapidjson::Value toJSON(rapidjson::Document &doc) const;
size_t active() const;
void adjust(const Algorithm &algorithm);
void load(const rapidjson::Value &pools);
void print() const;
void setRetries(int retries);
void setRetryPause(int retryPause);
private:
Pool &current();
int m_retries;
int m_retryPause;
std::vector<Pool> m_data;
};
} /* namespace xmrig */
#endif /* XMRIG_POOLS_H */

View File

@@ -0,0 +1,76 @@
/* 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/>.
*/
#include <algorithm>
#include <uv.h>
#include "base/tools/Arguments.h"
xmrig::Arguments::Arguments(int argc, char **argv) :
m_argv(argv),
m_argc(argc)
{
uv_setup_args(argc, argv);
for (size_t i = 0; i < static_cast<size_t>(argc); ++i) {
add(argv[i]);
}
}
bool xmrig::Arguments::hasArg(const char *name) const
{
if (m_argc == 1) {
return false;
}
return std::find(m_data.begin() + 1, m_data.end(), name) != m_data.end();
}
void xmrig::Arguments::add(const char *arg)
{
if (arg == nullptr) {
return;
}
const size_t size = strlen(arg);
if (size > 4 && arg[0] == '-' && arg[1] == '-') {
const char *p = strstr(arg, "=");
if (p) {
const size_t keySize = static_cast<size_t>(p - arg);
m_data.push_back(String(arg, keySize));
m_data.push_back(arg + keySize + 1);
return;
}
}
m_data.push_back(arg);
}

View File

@@ -0,0 +1,61 @@
/* 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_ARGUMENTS_H
#define XMRIG_ARGUMENTS_H
#include <vector>
#include "base/tools/String.h"
namespace xmrig {
class Arguments
{
public:
Arguments(int argc, char **argv);
bool hasArg(const char *name) const;
inline char **argv() const { return m_argv; }
inline const std::vector<String> &data() const { return m_data; }
inline int argc() const { return m_argc; }
private:
void add(const char *arg);
char **m_argv;
int m_argc;
std::vector<String> m_data;
};
} /* namespace xmrig */
#endif /* XMRIG_ARGUMENTS_H */

79
src/base/tools/Handle.cpp Normal file
View File

@@ -0,0 +1,79 @@
/* 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/>.
*/
#include <uv.h>
#include "base/tools/Handle.h"
void xmrig::Handle::close(uv_fs_event_t *handle)
{
if (handle) {
uv_fs_event_stop(handle);
close(reinterpret_cast<uv_handle_t *>(handle));
}
}
void xmrig::Handle::close(uv_getaddrinfo_t *handle)
{
if (handle) {
uv_cancel(reinterpret_cast<uv_req_t *>(handle));
close(reinterpret_cast<uv_handle_t *>(handle));
}
}
void xmrig::Handle::close(uv_handle_t *handle)
{
uv_close(handle, [](uv_handle_t *handle) { delete handle; });
}
void xmrig::Handle::close(uv_signal_t *handle)
{
if (handle) {
uv_signal_stop(handle);
close(reinterpret_cast<uv_handle_t *>(handle));
}
}
void xmrig::Handle::close(uv_tcp_t *handle)
{
if (handle) {
close(reinterpret_cast<uv_handle_t *>(handle));
}
}
void xmrig::Handle::close(uv_timer_s *handle)
{
if (handle) {
uv_timer_stop(handle);
close(reinterpret_cast<uv_handle_t *>(handle));
}
}

55
src/base/tools/Handle.h Normal file
View File

@@ -0,0 +1,55 @@
/* 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_HANDLE_H
#define XMRIG_HANDLE_H
typedef struct uv_fs_event_s uv_fs_event_t;
typedef struct uv_getaddrinfo_s uv_getaddrinfo_t;
typedef struct uv_handle_s uv_handle_t;
typedef struct uv_signal_s uv_signal_t;
typedef struct uv_tcp_s uv_tcp_t;
typedef struct uv_timer_s uv_timer_t;
namespace xmrig {
class Handle
{
public:
static void close(uv_fs_event_t *handle);
static void close(uv_getaddrinfo_t *handle);
static void close(uv_handle_t *handle);
static void close(uv_signal_t *handle);
static void close(uv_tcp_t *handle);
static void close(uv_timer_t *handle);
};
} /* namespace xmrig */
#endif /* XMRIG_HANDLE_H */

225
src/base/tools/String.cpp Normal file
View File

@@ -0,0 +1,225 @@
/* 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 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 "base/tools/String.h"
#include "rapidjson/document.h"
xmrig::String::String(const char *str) :
m_data(nullptr),
m_size(str == nullptr ? 0 : strlen(str))
{
if (m_size == 0) {
return;
}
m_data = new char[m_size + 1];
memcpy(m_data, str, m_size + 1);
}
xmrig::String::String(const char *str, size_t size) :
m_data(nullptr),
m_size(size)
{
if (str == nullptr) {
m_size = 0;
return;
}
m_data = new char[m_size + 1];
memcpy(m_data, str, m_size);
m_data[m_size] = '\0';
}
xmrig::String::String(const String &other) :
m_data(nullptr),
m_size(other.m_size)
{
if (other.m_data == nullptr) {
return;
}
m_data = new char[m_size + 1];
memcpy(m_data, other.m_data, m_size + 1);
}
bool xmrig::String::isEqual(const char *str) const
{
return (m_data != nullptr && str != nullptr && strcmp(m_data, str) == 0) || (m_data == nullptr && str == nullptr);
}
bool xmrig::String::isEqual(const String &other) const
{
if (m_size != other.m_size) {
return false;
}
return (m_data != nullptr && other.m_data != nullptr && memcmp(m_data, other.m_data, m_size) == 0) || (m_data == nullptr && other.m_data == nullptr);
}
rapidjson::Value xmrig::String::toJSON() const
{
using namespace rapidjson;
return isNull() ? Value(kNullType) : Value(StringRef(m_data));
}
rapidjson::Value xmrig::String::toJSON(rapidjson::Document &doc) const
{
using namespace rapidjson;
return isNull() ? Value(kNullType) : Value(m_data, doc.GetAllocator());
}
std::vector<xmrig::String> xmrig::String::split(char sep) const
{
std::vector<xmrig::String> out;
if (m_size == 0) {
return out;
}
size_t start = 0;
size_t pos = 0;
for (pos = 0; pos < m_size; ++pos) {
if (m_data[pos] == sep) {
if ((pos - start) > 0) {
out.push_back(String(m_data + start, pos - start));
}
start = pos + 1;
}
}
if ((pos - start) > 0) {
out.push_back(String(m_data + start, pos - start));
}
return out;
}
xmrig::String xmrig::String::join(const std::vector<xmrig::String> &vec, char sep)
{
if (vec.empty()) {
return String();
}
size_t size = vec.size();
for (const String &str : vec) {
size += str.size();
}
size_t offset = 0;
char *buf = new char[size];
for (const String &str : vec) {
memcpy(buf + offset, str.data(), str.size());
offset += str.size() + 1;
if (offset < size) {
buf[offset - 1] = sep;
}
}
buf[size - 1] = '\0';
return String(buf);
}
void xmrig::String::copy(const char *str)
{
delete [] m_data;
if (str == nullptr) {
m_size = 0;
m_data = nullptr;
return;
}
m_size = strlen(str);
m_data = new char[m_size + 1];
memcpy(m_data, str, m_size + 1);
}
void xmrig::String::copy(const String &other)
{
if (m_size > 0) {
if (m_size == other.m_size) {
memcpy(m_data, other.m_data, m_size + 1);
return;
}
delete [] m_data;
}
delete [] m_data;
if (other.m_data == nullptr) {
m_size = 0;
m_data = nullptr;
return;
}
m_size = other.m_size;
m_data = new char[m_size + 1];
memcpy(m_data, other.m_data, m_size + 1);
}
void xmrig::String::move(char *str)
{
delete [] m_data;
m_size = str == nullptr ? 0 : strlen(str);
m_data = str;
}
void xmrig::String::move(String &&other)
{
delete [] m_data;
m_data = other.m_data;
m_size = other.m_size;
other.m_data = nullptr;
other.m_size = 0;
}

104
src/base/tools/String.h Normal file
View File

@@ -0,0 +1,104 @@
/* 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 2016-2018 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_STRING_H
#define XMRIG_STRING_H
#include <utility>
#include <vector>
#include "rapidjson/fwd.h"
namespace xmrig {
/**
* @brief Simple C string wrapper.
*
* 1. I know about std:string.
* 2. For some reason I prefer don't use std:string in miner, eg because of file size of MSYS2 builds.
* 3. nullptr and JSON conversion supported.
*/
class String
{
public:
inline String() : m_data(nullptr), m_size(0) {}
inline String(char *str) : m_data(str), m_size(str == nullptr ? 0 : strlen(str)) {}
inline String(String &&other) : m_data(other.m_data), m_size(other.m_size) { other.m_data = nullptr; other.m_size = 0; }
String(const char *str);
String(const char *str, size_t size);
String(const String &other);
inline ~String() { delete [] m_data; }
bool isEqual(const char *str) const;
bool isEqual(const String &other) const;
inline bool contains(const char *str) const { return isNull() ? false : strstr(m_data, str) != nullptr; }
inline bool isEmpty() const { return size() == 0; }
inline bool isNull() const { return m_data == nullptr; }
inline char *data() { return m_data; }
inline const char *data() const { return m_data; }
inline size_t size() const { return m_size; }
inline bool operator!=(const char *str) const { return !isEqual(str); }
inline bool operator!=(const String &other) const { return !isEqual(other); }
inline bool operator<(const String &str) const { return strcmp(data(), str.data()) < 0; }
inline bool operator==(const char *str) const { return isEqual(str); }
inline bool operator==(const String &other) const { return isEqual(other); }
inline operator const char*() const { return m_data; }
inline String &operator=(char *str) { move(str); return *this; }
inline String &operator=(const char *str) { copy(str); return *this; }
inline String &operator=(const String &str) { copy(str); return *this; }
inline String &operator=(String &&other) { move(std::move(other)); return *this; }
rapidjson::Value toJSON() const;
rapidjson::Value toJSON(rapidjson::Document &doc) const;
std::vector<xmrig::String> split(char sep) const;
static String join(const std::vector<xmrig::String> &vec, char sep);
private:
void copy(const char *str);
void copy(const String &other);
void move(char *str);
void move(String &&other);
char *m_data;
size_t m_size;
};
} /* namespace xmrig */
#endif /* XMRIG_STRING_H */

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.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 * 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
@@ -26,38 +27,33 @@
#include <uv.h> #include <uv.h>
#ifndef XMRIG_NO_TLS
# include <openssl/ssl.h>
# include <openssl/err.h>
#endif
#include "Platform.h" #include "Platform.h"
char Platform::m_defaultConfigName[520] = { 0 }; xmrig::String Platform::m_userAgent;
xmrig::c_str Platform::m_userAgent;
const char *Platform::defaultConfigName() void Platform::init(const char *userAgent)
{ {
size_t size = 520; # ifndef XMRIG_NO_TLS
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
ERR_load_crypto_strings();
SSL_load_error_strings();
OpenSSL_add_all_digests();
# endif
if (*m_defaultConfigName) { if (userAgent) {
return m_defaultConfigName; m_userAgent = userAgent;
} }
else {
if (uv_exepath(m_defaultConfigName, &size) < 0) { m_userAgent = createUserAgent();
return nullptr;
} }
if (size < 500) {
# ifdef WIN32
char *p = strrchr(m_defaultConfigName, '\\');
# else
char *p = strrchr(m_defaultConfigName, '/');
# endif
if (p) {
strcpy(p + 1, "config.json");
return m_defaultConfigName;
}
}
*m_defaultConfigName = '\0';
return nullptr;
} }

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.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 * 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
@@ -21,31 +22,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __PLATFORM_H__ #ifndef XMRIG_PLATFORM_H
#define __PLATFORM_H__ #define XMRIG_PLATFORM_H
#include <stdint.h> #include <stdint.h>
#include "common/utils/c_str.h" #include "base/tools/String.h"
class Platform class Platform
{ {
public: public:
static bool setThreadAffinity(uint64_t cpu_id); static bool setThreadAffinity(uint64_t cpu_id);
static const char *defaultConfigName(); static uint32_t setTimerResolution(uint32_t resolution);
static void init(const char *userAgent); static void init(const char *userAgent);
static void restoreTimerResolution();
static void setProcessPriority(int priority); static void setProcessPriority(int priority);
static void setThreadPriority(int priority); static void setThreadPriority(int priority);
static inline const char *userAgent() { return m_userAgent.data(); } static inline const char *userAgent() { return m_userAgent; }
private: private:
static char m_defaultConfigName[520]; static char *createUserAgent();
static xmrig::c_str m_userAgent;
static xmrig::String m_userAgent;
}; };
#endif /* __PLATFORM_H__ */ #endif /* XMRIG_PLATFORM_H */

View File

@@ -38,17 +38,22 @@
#endif #endif
static inline char *createUserAgent() char *Platform::createUserAgent()
{ {
const size_t max = 160; constexpr const size_t max = 256;
char *buf = new char[max]; char *buf = new char[max]();
int length = snprintf(buf, max, "%s/%s (Macintosh; Intel Mac OS X) libuv/%s", APP_NAME, APP_VERSION, uv_version_string());
# ifdef XMRIG_NVIDIA_PROJECT # ifdef XMRIG_NVIDIA_PROJECT
const int cudaVersion = cuda_get_runtime_version(); const int cudaVersion = cuda_get_runtime_version();
snprintf(buf, max, "%s/%s (Macintosh; Intel Mac OS X) libuv/%s CUDA/%d.%d clang/%d.%d.%d", APP_NAME, APP_VERSION, uv_version_string(), cudaVersion / 1000, cudaVersion % 100, __clang_major__, __clang_minor__, __clang_patchlevel__); length += snprintf(buf + length, max - length, " CUDA/%d.%d", cudaVersion / 1000, cudaVersion % 100);
# else # endif
snprintf(buf, max, "%s/%s (Macintosh; Intel Mac OS X) libuv/%s clang/%d.%d.%d", APP_NAME, APP_VERSION, uv_version_string(), __clang_major__, __clang_minor__, __clang_patchlevel__);
# ifdef __clang__
length += snprintf(buf + length, max - length, " clang/%d.%d.%d", __clang_major__, __clang_minor__, __clang_patchlevel__);
# elif defined(__GNUC__)
length += snprintf(buf + length, max - length, " gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# endif # endif
return buf; return buf;
@@ -65,20 +70,19 @@ bool Platform::setThreadAffinity(uint64_t cpu_id)
} }
void Platform::init(const char *userAgent) uint32_t Platform::setTimerResolution(uint32_t resolution)
{
return resolution;
}
void Platform::restoreTimerResolution()
{ {
if (userAgent) {
m_userAgent = userAgent;
}
else {
m_userAgent = createUserAgent();
}
} }
void Platform::setProcessPriority(int priority) void Platform::setProcessPriority(int priority)
{ {
} }

View File

@@ -29,11 +29,13 @@
#endif #endif
#include <pthread.h>
#include <sched.h> #include <sched.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <unistd.h>
#include <uv.h> #include <uv.h>
@@ -50,11 +52,11 @@ typedef cpuset_t cpu_set_t;
#endif #endif
static inline char *createUserAgent() char *Platform::createUserAgent()
{ {
const size_t max = 160; constexpr const size_t max = 256;
char *buf = new char[max]; char *buf = new char[max]();
int length = snprintf(buf, max, "%s/%s (Linux ", APP_NAME, APP_VERSION); int length = snprintf(buf, max, "%s/%s (Linux ", APP_NAME, APP_VERSION);
# if defined(__x86_64__) # if defined(__x86_64__)
@@ -68,7 +70,9 @@ static inline char *createUserAgent()
length += snprintf(buf + length, max - length, " CUDA/%d.%d", cudaVersion / 1000, cudaVersion % 100); length += snprintf(buf + length, max - length, " CUDA/%d.%d", cudaVersion / 1000, cudaVersion % 100);
# endif # endif
# ifdef __GNUC__ # ifdef __clang__
length += snprintf(buf + length, max - length, " clang/%d.%d.%d", __clang_major__, __clang_minor__, __clang_patchlevel__);
# elif defined(__GNUC__)
length += snprintf(buf + length, max - length, " gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); length += snprintf(buf + length, max - length, " gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# endif # endif
@@ -90,14 +94,14 @@ bool Platform::setThreadAffinity(uint64_t cpu_id)
} }
void Platform::init(const char *userAgent) uint32_t Platform::setTimerResolution(uint32_t resolution)
{
return resolution;
}
void Platform::restoreTimerResolution()
{ {
if (userAgent) {
m_userAgent = userAgent;
}
else {
m_userAgent = createUserAgent();
}
} }
@@ -106,7 +110,6 @@ void Platform::setProcessPriority(int priority)
} }
void Platform::setThreadPriority(int priority) void Platform::setThreadPriority(int priority)
{ {
if (priority == -1) { if (priority == -1) {

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2018 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 * 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
@@ -22,6 +23,7 @@
*/ */
#include <algorithm>
#include <winsock2.h> #include <winsock2.h>
#include <windows.h> #include <windows.h>
#include <uv.h> #include <uv.h>
@@ -37,6 +39,11 @@
#endif #endif
#ifdef XMRIG_AMD_PROJECT
static uint32_t timerResolution = 0;
#endif
static inline OSVERSIONINFOEX winOsVersion() static inline OSVERSIONINFOEX winOsVersion()
{ {
typedef NTSTATUS (NTAPI *RtlGetVersionFunction)(LPOSVERSIONINFO); typedef NTSTATUS (NTAPI *RtlGetVersionFunction)(LPOSVERSIONINFO);
@@ -55,12 +62,12 @@ static inline OSVERSIONINFOEX winOsVersion()
} }
static inline char *createUserAgent() char *Platform::createUserAgent()
{ {
const auto osver = winOsVersion(); const auto osver = winOsVersion();
const size_t max = 160; constexpr const size_t max = 256;
char *buf = new char[max]; char *buf = new char[max]();
int length = snprintf(buf, max, "%s/%s (Windows NT %lu.%lu", APP_NAME, APP_VERSION, osver.dwMajorVersion, osver.dwMinorVersion); int length = snprintf(buf, max, "%s/%s (Windows NT %lu.%lu", APP_NAME, APP_VERSION, osver.dwMajorVersion, osver.dwMinorVersion);
# if defined(__x86_64__) || defined(_M_AMD64) # if defined(__x86_64__) || defined(_M_AMD64)
@@ -94,14 +101,31 @@ bool Platform::setThreadAffinity(uint64_t cpu_id)
} }
void Platform::init(const char *userAgent) uint32_t Platform::setTimerResolution(uint32_t resolution)
{ {
if (userAgent) { # ifdef XMRIG_AMD_PROJECT
m_userAgent = userAgent; TIMECAPS tc;
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
return 0;
} }
else {
m_userAgent = createUserAgent(); timerResolution = std::min<uint32_t>(std::max<uint32_t>(tc.wPeriodMin, resolution), tc.wPeriodMax);
return timeBeginPeriod(timerResolution) == TIMERR_NOERROR ? timerResolution : 0;
# else
return resolution;
# endif
}
void Platform::restoreTimerResolution()
{
# ifdef XMRIG_AMD_PROJECT
if (timerResolution) {
timeEndPeriod(timerResolution);
} }
# endif
} }
@@ -132,6 +156,7 @@ void Platform::setProcessPriority(int priority)
case 5: case 5:
prio = REALTIME_PRIORITY_CLASS; prio = REALTIME_PRIORITY_CLASS;
break;
default: default:
break; break;

View File

@@ -147,7 +147,7 @@ int xmrig::HttpRequest::end(int status, MHD_Response *rsp)
MHD_add_response_header(rsp, "Content-Type", "application/json"); MHD_add_response_header(rsp, "Content-Type", "application/json");
MHD_add_response_header(rsp, "Access-Control-Allow-Origin", "*"); MHD_add_response_header(rsp, "Access-Control-Allow-Origin", "*");
MHD_add_response_header(rsp, "Access-Control-Allow-Methods", "GET, PUT"); MHD_add_response_header(rsp, "Access-Control-Allow-Methods", "GET, PUT");
MHD_add_response_header(rsp, "Access-Control-Allow-Headers", "Authorization"); MHD_add_response_header(rsp, "Access-Control-Allow-Headers", "Authorization, Content-Type");
const int ret = MHD_queue_response(m_connection, status, rsp); const int ret = MHD_queue_response(m_connection, status, rsp);
MHD_destroy_response(rsp); MHD_destroy_response(rsp);

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -29,46 +30,156 @@
#include <uv.h> #include <uv.h>
#ifndef XMRIG_NO_HTTPD
# include <microhttpd.h>
#endif
#ifndef XMRIG_NO_TLS
# include <openssl/opensslv.h>
#endif
#ifdef XMRIG_AMD_PROJECT
# if defined(__APPLE__)
# include <OpenCL/cl.h>
# else
# include "3rdparty/CL/cl.h"
# endif
#endif
#ifdef XMRIG_NVIDIA_PROJECT
# include "nvidia/cryptonight.h"
#endif
#include "base/io/Json.h"
#include "common/config/CommonConfig.h" #include "common/config/CommonConfig.h"
#include "common/log/Log.h" #include "common/log/Log.h"
#include "donate.h" #include "donate.h"
#include "rapidjson/document.h" #include "rapidjson/document.h"
#include "rapidjson/filewritestream.h" #include "rapidjson/filewritestream.h"
#include "rapidjson/prettywriter.h" #include "rapidjson/prettywriter.h"
#include "version.h"
xmrig::CommonConfig::CommonConfig() : xmrig::CommonConfig::CommonConfig() :
m_algorithm(CRYPTONIGHT, VARIANT_AUTO),
m_adjusted(false), m_adjusted(false),
m_apiIPv6(false), m_apiIPv6(false),
m_apiRestricted(true), m_apiRestricted(true),
m_autoSave(true),
m_background(false), m_background(false),
m_colors(true), m_dryRun(false),
m_syslog(false), m_syslog(false),
# ifdef XMRIG_PROXY_PROJECT
m_watch(true), m_watch(true),
# else
m_watch(false), // TODO: enable config file watch by default when this feature propertly handled and tested.
# endif
m_apiPort(0), m_apiPort(0),
m_donateLevel(kDefaultDonateLevel), m_donateLevel(kDefaultDonateLevel),
m_printTime(60), m_printTime(60),
m_retries(5),
m_retryPause(5),
m_state(NoneState) m_state(NoneState)
{ {
m_pools.push_back(Pool()); }
# ifdef XMRIG_PROXY_PROJECT
m_retries = 2; bool xmrig::CommonConfig::isColors() const
m_retryPause = 1; {
return Log::colors;
}
void xmrig::CommonConfig::printAPI()
{
# ifndef XMRIG_NO_API
if (apiPort() == 0) {
return;
}
Log::i()->text(isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN("%s:") CYAN_BOLD("%d")
: " * %-13s%s:%d",
"API BIND", isApiIPv6() ? "[::]" : "0.0.0.0", apiPort());
# endif # endif
} }
xmrig::CommonConfig::~CommonConfig() void xmrig::CommonConfig::printPools()
{ {
m_pools.print();
}
void xmrig::CommonConfig::printVersions()
{
char buf[256] = { 0 };
# if defined(__clang__)
snprintf(buf, sizeof buf, "clang/%d.%d.%d", __clang_major__, __clang_minor__, __clang_patchlevel__);
# elif defined(__GNUC__)
snprintf(buf, sizeof buf, "gcc/%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# elif defined(_MSC_VER)
snprintf(buf, sizeof buf, "MSVC/%d", MSVC_VERSION);
# endif
Log::i()->text(isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%s/%s") WHITE_BOLD(" %s")
: " * %-13s%s/%s %s",
"ABOUT", APP_NAME, APP_VERSION, buf);
# if defined(XMRIG_AMD_PROJECT)
# if CL_VERSION_2_0
const char *ocl = "2.0";
# elif CL_VERSION_1_2
const char *ocl = "1.2";
# elif CL_VERSION_1_1
const char *ocl = "1.1";
# elif CL_VERSION_1_0
const char *ocl = "1.0";
# else
const char *ocl = "0.0";
# endif
int length = snprintf(buf, sizeof buf, "OpenCL/%s ", ocl);
# elif defined(XMRIG_NVIDIA_PROJECT)
const int cudaVersion = cuda_get_runtime_version();
int length = snprintf(buf, sizeof buf, "CUDA/%d.%d ", cudaVersion / 1000, cudaVersion % 100);
# else
memset(buf, 0, 16);
# if !defined(XMRIG_NO_HTTPD) || !defined(XMRIG_NO_TLS)
int length = 0;
# endif
# endif
# if !defined(XMRIG_NO_TLS) && defined(OPENSSL_VERSION_TEXT)
{
constexpr const char *v = OPENSSL_VERSION_TEXT + 8;
length += snprintf(buf + length, (sizeof buf) - length, "OpenSSL/%.*s ", static_cast<int>(strchr(v, ' ') - v), v);
}
# endif
# ifndef XMRIG_NO_HTTPD
length += snprintf(buf + length, (sizeof buf) - length, "microhttpd/%s ", MHD_get_version());
# endif
Log::i()->text(isColors() ? GREEN_BOLD(" * ") WHITE_BOLD("%-13slibuv/%s %s")
: " * %-13slibuv/%s %s",
"LIBS", uv_version_string(), buf);
}
bool xmrig::CommonConfig::save()
{
if (m_fileName.isNull()) {
return false;
}
rapidjson::Document doc;
getJSON(doc);
if (Json::save(m_fileName, doc)) {
LOG_NOTICE("configuration saved to: \"%s\"", m_fileName.data());
return true;
}
return false;
} }
@@ -83,20 +194,12 @@ bool xmrig::CommonConfig::finalize()
} }
if (!m_algorithm.isValid()) { if (!m_algorithm.isValid()) {
m_algorithm.setAlgo(CRYPTONIGHT); return false;
} }
for (Pool &pool : m_pools) { m_pools.adjust(m_algorithm);
pool.adjust(m_algorithm.algo());
if (pool.isValid() && pool.algorithm().isValid()) { if (!m_pools.active()) {
m_activePools.push_back(std::move(pool));
}
}
m_pools.clear();
if (m_activePools.empty()) {
m_state = ErrorState; m_state = ErrorState;
return false; return false;
} }
@@ -118,17 +221,21 @@ bool xmrig::CommonConfig::parseBoolean(int key, bool enable)
break; break;
case KeepAliveKey: /* --keepalive */ case KeepAliveKey: /* --keepalive */
m_pools.back().setKeepAlive(enable ? Pool::kKeepAliveTimeout : 0); m_pools.setKeepAlive(enable);
break;
case TlsKey: /* --tls */
m_pools.setTLS(enable);
break; break;
# ifndef XMRIG_PROXY_PROJECT # ifndef XMRIG_PROXY_PROJECT
case NicehashKey: /* --nicehash */ case NicehashKey: /* --nicehash */
m_pools.back().setNicehash(enable); m_pools.setNicehash(enable);
break; break;
# endif # endif
case ColorKey: /* --no-color */ case ColorKey: /* --no-color */
m_colors = enable; Log::colors = enable;
break; break;
case WatchKey: /* watch */ case WatchKey: /* watch */
@@ -137,9 +244,19 @@ bool xmrig::CommonConfig::parseBoolean(int key, bool enable)
case ApiIPv6Key: /* ipv6 */ case ApiIPv6Key: /* ipv6 */
m_apiIPv6 = enable; m_apiIPv6 = enable;
break;
case ApiRestrictedKey: /* restricted */ case ApiRestrictedKey: /* restricted */
m_apiRestricted = enable; m_apiRestricted = enable;
break;
case DryRunKey: /* --dry-run */
m_dryRun = enable;
break;
case AutoSaveKey:
m_autoSave = enable;
break;
default: default:
break; break;
@@ -157,44 +274,29 @@ bool xmrig::CommonConfig::parseString(int key, const char *arg)
break; break;
case UserpassKey: /* --userpass */ case UserpassKey: /* --userpass */
if (!m_pools.back().setUserpass(arg)) { return m_pools.setUserpass(arg);
return false;
}
break;
case UrlKey: /* --url */ case UrlKey: /* --url */
if (m_pools.size() > 1 || m_pools[0].isValid()) { return m_pools.setUrl(arg);
Pool pool(arg);
if (pool.isValid()) {
m_pools.push_back(std::move(pool));
}
}
else {
m_pools[0].parse(arg);
}
if (!m_pools.back().isValid()) {
return false;
}
break;
case UserKey: /* --user */ case UserKey: /* --user */
m_pools.back().setUser(arg); m_pools.setUser(arg);
break; break;
case PasswordKey: /* --pass */ case PasswordKey: /* --pass */
m_pools.back().setPassword(arg); m_pools.setPassword(arg);
break; break;
case RigIdKey: /* --rig-id */ case RigIdKey: /* --rig-id */
m_pools.back().setRigId(arg); m_pools.setRigId(arg);
break;
case FingerprintKey: /* --tls-fingerprint */
m_pools.setFingerprint(arg);
break; break;
case VariantKey: /* --variant */ case VariantKey: /* --variant */
m_pools.back().algorithm().parseVariant(arg); m_pools.setVariant(arg);
break; break;
case LogFileKey: /* --log-file */ case LogFileKey: /* --log-file */
@@ -209,6 +311,10 @@ bool xmrig::CommonConfig::parseString(int key, const char *arg)
m_apiWorkerId = arg; m_apiWorkerId = arg;
break; break;
case ApiIdKey: /* --api-id */
m_apiId = arg;
break;
case UserAgentKey: /* --user-agent */ case UserAgentKey: /* --user-agent */
m_userAgent = arg; m_userAgent = arg;
break; break;
@@ -216,14 +322,16 @@ bool xmrig::CommonConfig::parseString(int key, const char *arg)
case RetriesKey: /* --retries */ case RetriesKey: /* --retries */
case RetryPauseKey: /* --retry-pause */ case RetryPauseKey: /* --retry-pause */
case ApiPort: /* --api-port */ case ApiPort: /* --api-port */
case PrintTimeKey: /* --cpu-priority */ case PrintTimeKey: /* --print-time */
return parseUint64(key, strtol(arg, nullptr, 10)); return parseUint64(key, strtol(arg, nullptr, 10));
case BackgroundKey: /* --background */ case BackgroundKey: /* --background */
case SyslogKey: /* --syslog */ case SyslogKey: /* --syslog */
case KeepAliveKey: /* --keepalive */ case KeepAliveKey: /* --keepalive */
case NicehashKey: /* --nicehash */ case NicehashKey: /* --nicehash */
case TlsKey: /* --tls */
case ApiIPv6Key: /* --api-ipv6 */ case ApiIPv6Key: /* --api-ipv6 */
case DryRunKey: /* --dry-run */
return parseBoolean(key, true); return parseBoolean(key, true);
case ColorKey: /* --no-color */ case ColorKey: /* --no-color */
@@ -254,37 +362,12 @@ bool xmrig::CommonConfig::parseUint64(int key, uint64_t arg)
} }
bool xmrig::CommonConfig::save() void xmrig::CommonConfig::parseJSON(const rapidjson::Document &doc)
{ {
if (m_fileName.isNull()) { const rapidjson::Value &pools = doc["pools"];
return false; if (pools.IsArray()) {
m_pools.load(pools);
} }
uv_fs_t req;
const int fd = uv_fs_open(uv_default_loop(), &req, m_fileName.data(), O_WRONLY | O_CREAT | O_TRUNC, 0644, nullptr);
if (fd < 0) {
return false;
}
uv_fs_req_cleanup(&req);
rapidjson::Document doc;
getJSON(doc);
FILE *fp = fdopen(fd, "w");
char buf[4096];
rapidjson::FileWriteStream os(fp, buf, sizeof(buf));
rapidjson::PrettyWriter<rapidjson::FileWriteStream> writer(os);
doc.Accept(writer);
fclose(fp);
uv_fs_close(uv_default_loop(), &req, fd, nullptr);
uv_fs_req_cleanup(&req);
LOG_NOTICE("configuration saved to: \"%s\"", m_fileName.data());
return true;
} }
@@ -298,23 +381,19 @@ bool xmrig::CommonConfig::parseInt(int key, int arg)
{ {
switch (key) { switch (key) {
case RetriesKey: /* --retries */ case RetriesKey: /* --retries */
if (arg > 0 && arg <= 1000) { m_pools.setRetries(arg);
m_retries = arg;
}
break; break;
case RetryPauseKey: /* --retry-pause */ case RetryPauseKey: /* --retry-pause */
if (arg > 0 && arg <= 3600) { m_pools.setRetryPause(arg);
m_retryPause = arg;
}
break; break;
case KeepAliveKey: /* --keepalive */ case KeepAliveKey: /* --keepalive */
m_pools.back().setKeepAlive(arg); m_pools.setKeepAlive(arg);
break; break;
case VariantKey: /* --variant */ case VariantKey: /* --variant */
m_pools.back().algorithm().parseVariant(arg); m_pools.setVariant(arg);
break; break;
case DonateLevelKey: /* --donate-level */ case DonateLevelKey: /* --donate-level */

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,17 +22,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __COMMONCONFIG_H__ #ifndef XMRIG_COMMONCONFIG_H
#define __COMMONCONFIG_H__ #define XMRIG_COMMONCONFIG_H
#include <vector> #include "base/net/Pools.h"
#include "base/tools/String.h"
#include "common/interfaces/IConfig.h"
#include "common/net/Pool.h"
#include "common/utils/c_str.h"
#include "common/xmrig.h" #include "common/xmrig.h"
#include "interfaces/IConfig.h"
namespace xmrig { namespace xmrig {
@@ -41,28 +39,33 @@ class CommonConfig : public IConfig
{ {
public: public:
CommonConfig(); CommonConfig();
~CommonConfig();
inline bool isApiIPv6() const { return m_apiIPv6; } inline bool isApiIPv6() const { return m_apiIPv6; }
inline bool isApiRestricted() const { return m_apiRestricted; } inline bool isApiRestricted() const { return m_apiRestricted; }
inline bool isAutoSave() const { return m_autoSave; }
inline bool isBackground() const { return m_background; } inline bool isBackground() const { return m_background; }
inline bool isColors() const { return m_colors; } inline bool isDryRun() const { return m_dryRun; }
inline bool isSyslog() const { return m_syslog; } inline bool isSyslog() const { return m_syslog; }
inline const Algorithm &algorithm() const { return m_algorithm; } inline const char *apiId() const { return m_apiId.data(); }
inline const char *apiToken() const { return m_apiToken.data(); } inline const char *apiToken() const { return m_apiToken.data(); }
inline const char *apiWorkerId() const { return m_apiWorkerId.data(); } inline const char *apiWorkerId() const { return m_apiWorkerId.data(); }
inline const char *logFile() const { return m_logFile.data(); } inline const char *logFile() const { return m_logFile.data(); }
inline const char *userAgent() const { return m_userAgent.data(); } inline const char *userAgent() const { return m_userAgent.data(); }
inline const std::vector<Pool> &pools() const { return m_activePools; } inline const Pools &pools() const { return m_pools; }
inline int apiPort() const { return m_apiPort; } inline int apiPort() const { return m_apiPort; }
inline int donateLevel() const { return m_donateLevel; } inline int donateLevel() const { return m_donateLevel; }
inline int printTime() const { return m_printTime; } inline int printTime() const { return m_printTime; }
inline int retries() const { return m_retries; }
inline int retryPause() const { return m_retryPause; }
inline void setColors(bool colors) { m_colors = colors; }
inline bool isWatch() const override { return m_watch && !m_fileName.isNull(); } inline bool isWatch() const override { return m_watch && !m_fileName.isNull(); }
inline const char *fileName() const override { return m_fileName.data(); } inline const Algorithm &algorithm() const override { return m_algorithm; }
inline const String &fileName() const override { return m_fileName; }
bool save() override;
bool isColors() const;
void printAPI();
void printPools();
void printVersions();
protected: protected:
enum State { enum State {
@@ -75,30 +78,29 @@ protected:
bool parseBoolean(int key, bool enable) override; bool parseBoolean(int key, bool enable) override;
bool parseString(int key, const char *arg) override; bool parseString(int key, const char *arg) override;
bool parseUint64(int key, uint64_t arg) override; bool parseUint64(int key, uint64_t arg) override;
bool save() override; void parseJSON(const rapidjson::Document &doc) override;
void setFileName(const char *fileName) override; void setFileName(const char *fileName) override;
Algorithm m_algorithm; Algorithm m_algorithm;
bool m_adjusted; bool m_adjusted;
bool m_apiIPv6; bool m_apiIPv6;
bool m_apiRestricted; bool m_apiRestricted;
bool m_autoSave;
bool m_background; bool m_background;
bool m_colors; bool m_dryRun;
bool m_syslog; bool m_syslog;
bool m_watch; bool m_watch;
int m_apiPort; int m_apiPort;
int m_donateLevel; int m_donateLevel;
int m_printTime; int m_printTime;
int m_retries; Pools m_pools;
int m_retryPause;
State m_state; State m_state;
std::vector<Pool> m_activePools; String m_apiId;
std::vector<Pool> m_pools; String m_apiToken;
xmrig::c_str m_apiToken; String m_apiWorkerId;
xmrig::c_str m_apiWorkerId; String m_fileName;
xmrig::c_str m_fileName; String m_logFile;
xmrig::c_str m_logFile; String m_userAgent;
xmrig::c_str m_userAgent;
private: private:
bool parseInt(int key, int arg); bool parseInt(int key, int arg);
@@ -107,4 +109,4 @@ private:
} /* namespace xmrig */ } /* namespace xmrig */
#endif /* __COMMONCONFIG_H__ */ #endif /* XMRIG_COMMONCONFIG_H */

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -22,6 +23,7 @@
*/ */
#include <assert.h>
#include <limits.h> #include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <uv.h> #include <uv.h>
@@ -32,22 +34,28 @@
#endif #endif
#ifndef XMRIG_NO_TLS
# include <openssl/opensslv.h>
#endif
#include "base/io/Json.h"
#include "base/kernel/interfaces/IConfigListener.h"
#include "base/kernel/Process.h"
#include "common/config/ConfigLoader.h" #include "common/config/ConfigLoader.h"
#include "common/config/ConfigWatcher.h" #include "common/config/ConfigWatcher.h"
#include "common/net/Pool.h" #include "common/interfaces/IConfig.h"
#include "common/Platform.h" #include "common/Platform.h"
#include "core/ConfigCreator.h" #include "core/ConfigCreator.h"
#include "core/ConfigLoader_platform.h" #include "core/ConfigLoader_platform.h"
#include "interfaces/IConfig.h"
#include "interfaces/IWatcherListener.h"
#include "rapidjson/document.h" #include "rapidjson/document.h"
#include "rapidjson/error/en.h" #include "rapidjson/error/en.h"
#include "rapidjson/filereadstream.h" #include "rapidjson/fwd.h"
xmrig::ConfigWatcher *xmrig::ConfigLoader::m_watcher = nullptr; xmrig::ConfigWatcher *xmrig::ConfigLoader::m_watcher = nullptr;
xmrig::IConfigCreator *xmrig::ConfigLoader::m_creator = nullptr; xmrig::IConfigCreator *xmrig::ConfigLoader::m_creator = nullptr;
xmrig::IWatcherListener *xmrig::ConfigLoader::m_listener = nullptr; xmrig::IConfigListener *xmrig::ConfigLoader::m_listener = nullptr;
#ifndef ARRAY_SIZE #ifndef ARRAY_SIZE
@@ -70,8 +78,9 @@ bool xmrig::ConfigLoader::loadFromFile(xmrig::IConfig *config, const char *fileN
bool xmrig::ConfigLoader::loadFromJSON(xmrig::IConfig *config, const char *json) bool xmrig::ConfigLoader::loadFromJSON(xmrig::IConfig *config, const char *json)
{ {
rapidjson::Document doc; using namespace rapidjson;
doc.Parse(json); Document doc;
doc.Parse<kParseCommentsFlag | kParseTrailingCommasFlag>(json);
if (doc.HasParseError() || !doc.IsObject()) { if (doc.HasParseError() || !doc.IsObject()) {
return false; return false;
@@ -87,19 +96,6 @@ bool xmrig::ConfigLoader::loadFromJSON(xmrig::IConfig *config, const rapidjson::
parseJSON(config, &config_options[i], doc); parseJSON(config, &config_options[i], doc);
} }
const rapidjson::Value &pools = doc["pools"];
if (pools.IsArray()) {
for (const rapidjson::Value &value : pools.GetArray()) {
if (!value.IsObject()) {
continue;
}
for (size_t i = 0; i < ARRAY_SIZE(pool_options); i++) {
parseJSON(config, &pool_options[i], value);
}
}
}
const rapidjson::Value &api = doc["api"]; const rapidjson::Value &api = doc["api"];
if (api.IsObject()) { if (api.IsObject()) {
for (size_t i = 0; i < ARRAY_SIZE(api_options); i++) { for (size_t i = 0; i < ARRAY_SIZE(api_options); i++) {
@@ -136,16 +132,31 @@ bool xmrig::ConfigLoader::reload(xmrig::IConfig *oldConfig, const char *json)
} }
xmrig::IConfig *xmrig::ConfigLoader::load(int argc, char **argv, IConfigCreator *creator, IWatcherListener *listener) bool xmrig::ConfigLoader::watch(IConfig *config)
{
if (!config->isWatch()) {
return false;
}
assert(m_watcher == nullptr);
m_watcher = new xmrig::ConfigWatcher(config->fileName(), m_creator, m_listener);
return true;
}
xmrig::IConfig *xmrig::ConfigLoader::load(Process *process, IConfigCreator *creator, IConfigListener *listener)
{ {
m_creator = creator; m_creator = creator;
m_listener = listener; m_listener = listener;
xmrig::IConfig *config = m_creator->create(); xmrig::IConfig *config = m_creator->create();
int key; int key;
int argc = process->arguments().argc();
char **argv = process->arguments().argv();
while (1) { while (1) {
key = getopt_long(argc, argv, short_options, options, NULL); key = getopt_long(argc, argv, short_options, options, nullptr);
if (key < 0) { if (key < 0) {
break; break;
} }
@@ -166,19 +177,21 @@ xmrig::IConfig *xmrig::ConfigLoader::load(int argc, char **argv, IConfigCreator
delete config; delete config;
config = m_creator->create(); config = m_creator->create();
loadFromFile(config, Platform::defaultConfigName()); loadFromFile(config, process->location(Process::ExeLocation, "config.json"));
} }
if (!config->finalize()) { if (!config->finalize()) {
fprintf(stderr, "No valid configuration found. Exiting.\n"); if (!config->algorithm().isValid()) {
fprintf(stderr, "No valid algorithm specified. Exiting.\n");
}
else {
fprintf(stderr, "No valid configuration found. Exiting.\n");
}
delete config; delete config;
return nullptr; return nullptr;
} }
if (config->isWatch()) {
m_watcher = new xmrig::ConfigWatcher(config->fileName(), creator, listener);
}
return config; return config;
} }
@@ -195,53 +208,28 @@ void xmrig::ConfigLoader::release()
bool xmrig::ConfigLoader::getJSON(const char *fileName, rapidjson::Document &doc) bool xmrig::ConfigLoader::getJSON(const char *fileName, rapidjson::Document &doc)
{ {
uv_fs_t req; if (Json::get(fileName, doc)) {
const int fd = uv_fs_open(uv_default_loop(), &req, fileName, O_RDONLY, 0644, nullptr); return true;
if (fd < 0) {
fprintf(stderr, "unable to open %s: %s\n", fileName, uv_strerror(fd));
return false;
} }
uv_fs_req_cleanup(&req);
FILE *fp = fdopen(fd, "rb");
char buf[8192];
rapidjson::FileReadStream is(fp, buf, sizeof(buf));
doc.ParseStream(is);
uv_fs_close(uv_default_loop(), &req, fd, nullptr);
uv_fs_req_cleanup(&req);
if (doc.HasParseError()) { if (doc.HasParseError()) {
printf("%s<%d>: %s\n", fileName, (int) doc.GetErrorOffset(), rapidjson::GetParseError_En(doc.GetParseError())); printf("%s<offset:%zu>: \"%s\"\n", fileName, doc.GetErrorOffset(), rapidjson::GetParseError_En(doc.GetParseError()));
return false; }
else {
fprintf(stderr, "unable to open \"%s\".\n", fileName);
} }
return doc.IsObject(); return false;
} }
bool xmrig::ConfigLoader::parseArg(xmrig::IConfig *config, int key, const char *arg) bool xmrig::ConfigLoader::parseArg(xmrig::IConfig *config, int key, const char *arg)
{ {
switch (key) { if (key == xmrig::IConfig::ConfigKey) {
case xmrig::IConfig::VersionKey: /* --version */ return loadFromFile(config, arg);
showVersion();
return false;
case xmrig::IConfig::HelpKey: /* --help */
showUsage();
return false;
case xmrig::IConfig::ConfigKey: /* --config */
loadFromFile(config, arg);
break;
default:
return config->parseString(key, arg);;
} }
return true; return config->parseString(key, arg);
} }
@@ -268,45 +256,3 @@ void xmrig::ConfigLoader::parseJSON(xmrig::IConfig *config, const struct option
config->parseBoolean(option->val, value.IsTrue()); config->parseBoolean(option->val, value.IsTrue());
} }
} }
void xmrig::ConfigLoader::showUsage()
{
printf(usage);
}
void xmrig::ConfigLoader::showVersion()
{
printf(APP_NAME " " APP_VERSION "\n built on " __DATE__
# if defined(__clang__)
" with clang " __clang_version__);
# elif defined(__GNUC__)
" with GCC");
printf(" %d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# elif defined(_MSC_VER)
" with MSVC");
printf(" %d", MSVC_VERSION);
# else
);
# endif
printf("\n features:"
# if defined(__i386__) || defined(_M_IX86)
" 32-bit"
# elif defined(__x86_64__) || defined(_M_AMD64)
" 64-bit"
# endif
# if defined(__AES__) || defined(_MSC_VER)
" AES"
# endif
"\n");
printf("\nlibuv/%s\n", uv_version_string());
# ifndef XMRIG_NO_HTTPD
printf("libmicrohttpd/%s\n", MHD_get_version());
# endif
}

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,8 +22,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __CONFIGLOADER_H__ #ifndef XMRIG_CONFIGLOADER_H
#define __CONFIGLOADER_H__ #define XMRIG_CONFIGLOADER_H
#include <stdint.h> #include <stdint.h>
@@ -39,8 +40,9 @@ namespace xmrig {
class ConfigWatcher; class ConfigWatcher;
class IConfigCreator; class IConfigCreator;
class IWatcherListener; class IConfigListener;
class IConfig; class IConfig;
class Process;
class ConfigLoader class ConfigLoader
@@ -50,22 +52,21 @@ public:
static bool loadFromJSON(IConfig *config, const char *json); static bool loadFromJSON(IConfig *config, const char *json);
static bool loadFromJSON(IConfig *config, const rapidjson::Document &doc); static bool loadFromJSON(IConfig *config, const rapidjson::Document &doc);
static bool reload(IConfig *oldConfig, const char *json); static bool reload(IConfig *oldConfig, const char *json);
static IConfig *load(int argc, char **argv, IConfigCreator *creator, IWatcherListener *listener); static bool watch(IConfig *config);
static IConfig *load(Process *process, IConfigCreator *creator, IConfigListener *listener);
static void release(); static void release();
private: private:
static bool getJSON(const char *fileName, rapidjson::Document &doc); static bool getJSON(const char *fileName, rapidjson::Document &doc);
static bool parseArg(IConfig *config, int key, const char *arg); static bool parseArg(IConfig *config, int key, const char *arg);
static void parseJSON(IConfig *config, const struct option *option, const rapidjson::Value &object); static void parseJSON(IConfig *config, const struct option *option, const rapidjson::Value &object);
static void showUsage();
static void showVersion();
static ConfigWatcher *m_watcher; static ConfigWatcher *m_watcher;
static IConfigCreator *m_creator; static IConfigCreator *m_creator;
static IWatcherListener *m_listener; static IConfigListener *m_listener;
}; };
} /* namespace xmrig */ } /* namespace xmrig */
#endif /* __CONFIGLOADER_H__ */ #endif /* XMRIG_CONFIGLOADER_H */

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -22,66 +23,35 @@
*/ */
#include <stdio.h> #include "base/io/Watcher.h"
#include "base/kernel/interfaces/IConfigListener.h"
#include "common/config/ConfigLoader.h" #include "common/config/ConfigLoader.h"
#include "common/config/ConfigWatcher.h" #include "common/config/ConfigWatcher.h"
#include "common/log/Log.h" #include "common/log/Log.h"
#include "core/ConfigCreator.h" #include "core/ConfigCreator.h"
#include "interfaces/IWatcherListener.h"
xmrig::ConfigWatcher::ConfigWatcher(const char *path, IConfigCreator *creator, IWatcherListener *listener) : xmrig::ConfigWatcher::ConfigWatcher(const String &path, IConfigCreator *creator, IConfigListener *listener) :
m_creator(creator), m_creator(creator),
m_listener(listener), m_listener(listener)
m_path(path)
{ {
uv_fs_event_init(uv_default_loop(), &m_fsEvent); m_watcher = new Watcher(path, this);
uv_timer_init(uv_default_loop(), &m_timer);
m_fsEvent.data = m_timer.data = this;
start();
} }
xmrig::ConfigWatcher::~ConfigWatcher() xmrig::ConfigWatcher::~ConfigWatcher()
{ {
uv_timer_stop(&m_timer); delete m_watcher;
uv_fs_event_stop(&m_fsEvent);
} }
void xmrig::ConfigWatcher::onTimer(uv_timer_t* handle)
void xmrig::ConfigWatcher::onFileChanged(const String &fileName)
{ {
static_cast<xmrig::ConfigWatcher *>(handle->data)->reload(); LOG_WARN("\"%s\" was changed, reloading configuration", fileName.data());
}
void xmrig::ConfigWatcher::onFsEvent(uv_fs_event_t* handle, const char *filename, int events, int status)
{
if (!filename) {
return;
}
static_cast<xmrig::ConfigWatcher *>(handle->data)->queueUpdate();
}
void xmrig::ConfigWatcher::queueUpdate()
{
uv_timer_stop(&m_timer);
uv_timer_start(&m_timer, xmrig::ConfigWatcher::onTimer, kDelay, 0);
}
void xmrig::ConfigWatcher::reload()
{
LOG_WARN("\"%s\" was changed, reloading configuration", m_path.data());
IConfig *config = m_creator->create(); IConfig *config = m_creator->create();
ConfigLoader::loadFromFile(config, m_path.data()); ConfigLoader::loadFromFile(config, fileName);
if (!config->finalize()) { if (!config->finalize()) {
LOG_ERR("reloading failed"); LOG_ERR("reloading failed");
@@ -91,15 +61,4 @@ void xmrig::ConfigWatcher::reload()
} }
m_listener->onNewConfig(config); m_listener->onNewConfig(config);
# ifndef _WIN32
uv_fs_event_stop(&m_fsEvent);
start();
# endif
}
void xmrig::ConfigWatcher::start()
{
uv_fs_event_start(&m_fsEvent, xmrig::ConfigWatcher::onFsEvent, m_path.data(), 0);
} }

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,15 +22,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __CONFIGWATCHER_H__ #ifndef XMRIG_CONFIGWATCHER_H
#define __CONFIGWATCHER_H__ #define XMRIG_CONFIGWATCHER_H
#include <stdint.h> #include "base/kernel/interfaces/IWatcherListener.h"
#include <uv.h> #include "base/tools/String.h"
#include "common/utils/c_str.h"
#include "rapidjson/fwd.h" #include "rapidjson/fwd.h"
@@ -40,29 +38,23 @@ namespace xmrig {
class IConfigCreator; class IConfigCreator;
class IWatcherListener; class IConfigListener;
class Watcher;
class ConfigWatcher class ConfigWatcher : public IWatcherListener
{ {
public: public:
ConfigWatcher(const char *path, IConfigCreator *creator, IWatcherListener *listener); ConfigWatcher(const String &path, IConfigCreator *creator, IConfigListener *listener);
~ConfigWatcher(); ~ConfigWatcher() override;
protected:
void onFileChanged(const String &fileName) override;
private: private:
constexpr static int kDelay = 500;
static void onFsEvent(uv_fs_event_t* handle, const char *filename, int events, int status);
static void onTimer(uv_timer_t* handle);
void queueUpdate();
void reload();
void start();
IConfigCreator *m_creator; IConfigCreator *m_creator;
IWatcherListener *m_listener; IConfigListener *m_listener;
uv_fs_event_t m_fsEvent; Watcher *m_watcher;
uv_timer_t m_timer;
xmrig::c_str m_path;
}; };

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <support@xmrig.com>
* *
* 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
@@ -21,6 +22,9 @@
* 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.h>
#include <thread>
#ifdef _MSC_VER #ifdef _MSC_VER
# include <intrin.h> # include <intrin.h>
@@ -32,14 +36,12 @@
# define bit_AES (1 << 25) # define bit_AES (1 << 25)
#endif #endif
#ifndef bit_BMI2 #ifndef bit_AVX2
# define bit_BMI2 (1 << 8) # define bit_AVX2 (1 << 5)
#endif #endif
#include <string.h>
#include "common/cpu/BasicCpuInfo.h"
#include "Cpu.h"
#define VENDOR_ID (0) #define VENDOR_ID (0)
@@ -74,7 +76,7 @@ static inline void cpuid(int level, int output[4]) {
static inline void cpu_brand_string(char* s) { static inline void cpu_brand_string(char* s) {
int cpu_info[4] = { 0 }; int32_t cpu_info[4] = { 0 };
cpuid(VENDOR_ID, cpu_info); cpuid(VENDOR_ID, cpu_info);
if (cpu_info[EAX_Reg] >= 4) { if (cpu_info[EAX_Reg] >= 4) {
@@ -89,50 +91,56 @@ static inline void cpu_brand_string(char* s) {
static inline bool has_aes_ni() static inline bool has_aes_ni()
{ {
int cpu_info[4] = { 0 }; int32_t cpu_info[4] = { 0 };
cpuid(PROCESSOR_INFO, cpu_info); cpuid(PROCESSOR_INFO, cpu_info);
return (cpu_info[ECX_Reg] & bit_AES) != 0; return (cpu_info[ECX_Reg] & bit_AES) != 0;
} }
static inline bool has_bmi2() { static inline bool has_avx2()
int cpu_info[4] = { 0 }; {
int32_t cpu_info[4] = { 0 };
cpuid(EXTENDED_FEATURES, cpu_info); cpuid(EXTENDED_FEATURES, cpu_info);
return (cpu_info[EBX_Reg] & bit_BMI2) != 0; return (cpu_info[EBX_Reg] & bit_AVX2) != 0;
} }
char Cpu::m_brand[64] = { 0 }; xmrig::BasicCpuInfo::BasicCpuInfo() :
int Cpu::m_flags = 0; m_assembly(ASM_NONE),
int Cpu::m_l2_cache = 0; m_aes(has_aes_ni()),
int Cpu::m_l3_cache = 0; m_avx2(has_avx2()),
int Cpu::m_sockets = 1; m_brand(),
int Cpu::m_totalCores = 0; m_threads(std::thread::hardware_concurrency())
int Cpu::m_totalThreads = 0;
int Cpu::optimalThreadsCount(int algo, bool doubleHash, int maxCpuUsage)
{
int count = m_totalThreads / 2;
return count < 1 ? 1 : count;
}
void Cpu::initCommon()
{ {
cpu_brand_string(m_brand); cpu_brand_string(m_brand);
# if defined(__x86_64__) || defined(_M_AMD64) # ifndef XMRIG_NO_ASM
m_flags |= X86_64; if (hasAES()) {
char vendor[13] = { 0 };
int32_t data[4] = { 0 };
cpuid(0, data);
memcpy(vendor + 0, &data[1], 4);
memcpy(vendor + 4, &data[3], 4);
memcpy(vendor + 8, &data[2], 4);
if (memcmp(vendor, "GenuineIntel", 12) == 0) {
m_assembly = ASM_INTEL;
}
else if (memcmp(vendor, "AuthenticAMD", 12) == 0) {
m_assembly = ASM_RYZEN;
}
}
# endif # endif
}
if (has_aes_ni()) {
m_flags |= AES;
} size_t xmrig::BasicCpuInfo::optimalThreadsCount(size_t memSize, int maxCpuUsage) const
{
if (has_bmi2()) { const size_t count = threads() / 2;
m_flags |= BMI2;
} return count < 1 ? 1 : count;
} }

View File

@@ -0,0 +1,73 @@
/* 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-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 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_BASICCPUINFO_H
#define XMRIG_BASICCPUINFO_H
#include "common/interfaces/ICpuInfo.h"
namespace xmrig {
class BasicCpuInfo : public ICpuInfo
{
public:
BasicCpuInfo();
protected:
size_t optimalThreadsCount(size_t memSize, int maxCpuUsage) const override;
inline Assembly assembly() const override { return m_assembly; }
inline bool hasAES() const override { return m_aes; }
inline bool hasAVX2() const override { return m_avx2; }
inline bool isSupported() const override { return true; }
inline const char *brand() const override { return m_brand; }
inline int32_t cores() const override { return -1; }
inline int32_t L2() const override { return -1; }
inline int32_t L3() const override { return -1; }
inline int32_t nodes() const override { return -1; }
inline int32_t sockets() const override { return 1; }
inline int32_t threads() const override { return m_threads; }
# if defined(__x86_64__) || defined(_M_AMD64) || defined (__arm64__) || defined (__aarch64__)
inline bool isX64() const override { return true; }
# else
inline bool isX64() const override { return false; }
# endif
private:
Assembly m_assembly;
bool m_aes;
bool m_avx2;
char m_brand[64];
int32_t m_threads;
};
} /* namespace xmrig */
#endif /* XMRIG_BASICCPUINFO_H */

View File

@@ -0,0 +1,58 @@
/* 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-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 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 <string.h>
#include <thread>
#if __ARM_FEATURE_CRYPTO
# include <sys/auxv.h>
# include <asm/hwcap.h>
#endif
#include "common/cpu/BasicCpuInfo.h"
xmrig::BasicCpuInfo::BasicCpuInfo() :
m_aes(false),
m_avx2(false),
m_brand(),
m_threads(std::thread::hardware_concurrency())
{
# ifdef XMRIG_ARMv8
memcpy(m_brand, "ARMv8", 5);
# else
memcpy(m_brand, "ARMv7", 5);
# endif
# if __ARM_FEATURE_CRYPTO
m_aes = getauxval(AT_HWCAP) & HWCAP_AES;
# endif
}
size_t xmrig::BasicCpuInfo::optimalThreadsCount(size_t memSize, int maxCpuUsage) const
{
return threads();
}

View File

@@ -22,33 +22,36 @@
*/ */
#ifdef __FreeBSD__ #include <assert.h>
# include <sys/types.h>
# include <sys/param.h>
# include <sys/cpuset.h>
# include <pthread_np.h>
#endif
#include <pthread.h> #include "common/cpu/BasicCpuInfo.h"
#include <sched.h> #include "common/cpu/Cpu.h"
#include <unistd.h>
#include <string.h>
#include "Cpu.h" static xmrig::ICpuInfo *cpuInfo = nullptr;
#ifdef __FreeBSD__ xmrig::ICpuInfo *xmrig::Cpu::info()
typedef cpuset_t cpu_set_t;
#endif
void Cpu::init()
{ {
# ifdef XMRIG_NO_LIBCPUID assert(cpuInfo != nullptr);
m_totalThreads = sysconf(_SC_NPROCESSORS_CONF);
# endif
initCommon(); return cpuInfo;
}
void xmrig::Cpu::init()
{
assert(cpuInfo == nullptr);
cpuInfo = new BasicCpuInfo();
}
void xmrig::Cpu::release()
{
assert(cpuInfo != nullptr);
delete cpuInfo;
cpuInfo = nullptr;
} }

View File

@@ -4,7 +4,7 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@@ -21,20 +21,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef XMRIG_CPU_H
#include <pthread.h> #define XMRIG_CPU_H
#include <sched.h>
#include <unistd.h>
#include "Cpu.h" #include "common/interfaces/ICpuInfo.h"
void Cpu::init() namespace xmrig {
class Cpu
{ {
# ifdef XMRIG_NO_LIBCPUID public:
m_totalThreads = sysconf(_SC_NPROCESSORS_CONF); static ICpuInfo *info();
# endif static void init();
static void release();
};
initCommon();
} } /* namespace xmrig */
#endif /* XMRIG_CPU_H */

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -57,29 +58,62 @@ static AlgoData const algorithms[] = {
{ "cryptonight/0", "cn/0", xmrig::CRYPTONIGHT, xmrig::VARIANT_0 }, { "cryptonight/0", "cn/0", xmrig::CRYPTONIGHT, xmrig::VARIANT_0 },
{ "cryptonight/1", "cn/1", xmrig::CRYPTONIGHT, xmrig::VARIANT_1 }, { "cryptonight/1", "cn/1", xmrig::CRYPTONIGHT, xmrig::VARIANT_1 },
{ "cryptonight/xtl", "cn/xtl", xmrig::CRYPTONIGHT, xmrig::VARIANT_XTL }, { "cryptonight/xtl", "cn/xtl", xmrig::CRYPTONIGHT, xmrig::VARIANT_XTL },
{ "cryptonight/msr", "cn/msr", xmrig::CRYPTONIGHT, xmrig::VARIANT_MSR },
{ "cryptonight/xao", "cn/xao", xmrig::CRYPTONIGHT, xmrig::VARIANT_XAO },
{ "cryptonight/rto", "cn/rto", xmrig::CRYPTONIGHT, xmrig::VARIANT_RTO },
{ "cryptonight/2", "cn/2", xmrig::CRYPTONIGHT, xmrig::VARIANT_2 },
{ "cryptonight/half", "cn/half", xmrig::CRYPTONIGHT, xmrig::VARIANT_HALF },
{ "cryptonight/xtlv9", "cn/xtlv9", xmrig::CRYPTONIGHT, xmrig::VARIANT_HALF },
{ "cryptonight/wow", "cn/wow", xmrig::CRYPTONIGHT, xmrig::VARIANT_WOW },
{ "cryptonight/r", "cn/r", xmrig::CRYPTONIGHT, xmrig::VARIANT_4 },
# ifndef XMRIG_NO_AEON # ifndef XMRIG_NO_AEON
{ "cryptonight-lite", "cn-lite", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_AUTO }, { "cryptonight-lite", "cn-lite", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_AUTO },
{ "cryptonight-light", "cn-light", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_AUTO },
{ "cryptonight-lite/0", "cn-lite/0", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_0 }, { "cryptonight-lite/0", "cn-lite/0", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_0 },
{ "cryptonight-lite/1", "cn-lite/1", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 }, { "cryptonight-lite/1", "cn-lite/1", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 },
{ "cryptonight-lite/ipbc", "cn-lite/ipbc", xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_IPBC },
# endif # endif
# ifndef XMRIG_NO_SUMO # ifndef XMRIG_NO_SUMO
{ "cryptonight-heavy", "cn-heavy", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_0 }, { "cryptonight-heavy", "cn-heavy", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_AUTO },
{ "cryptonight-heavy/0", "cn-heavy/0", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_0 },
{ "cryptonight-heavy/xhv", "cn-heavy/xhv", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_XHV },
{ "cryptonight-heavy/tube", "cn-heavy/tube", xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_TUBE },
# endif
# ifndef XMRIG_NO_CN_PICO
{ "cryptonight-pico/trtl", "cn-pico/trtl", xmrig::CRYPTONIGHT_PICO, xmrig::VARIANT_TRTL },
{ "cryptonight-pico", "cn-pico", xmrig::CRYPTONIGHT_PICO, xmrig::VARIANT_TRTL },
{ "cryptonight-turtle", "cn-trtl", xmrig::CRYPTONIGHT_PICO, xmrig::VARIANT_TRTL },
{ "cryptonight-ultralite", "cn-ultralite", xmrig::CRYPTONIGHT_PICO, xmrig::VARIANT_TRTL },
{ "cryptonight_turtle", "cn_turtle", xmrig::CRYPTONIGHT_PICO, xmrig::VARIANT_TRTL },
# endif
# ifndef XMRIG_NO_CN_GPU
{ "cryptonight/gpu", "cn/gpu", xmrig::CRYPTONIGHT, xmrig::VARIANT_GPU },
# endif # endif
}; };
#ifdef XMRIG_PROXY_PROJECT #ifdef XMRIG_PROXY_PROJECT
static AlgoData const xmrStakAlgorithms[] = { static AlgoData const xmrStakAlgorithms[] = {
{ "cryptonight-monerov7", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_1 }, { "cryptonight-monerov7", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_1 },
{ "cryptonight_v7", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_1 }, { "cryptonight_v7", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_1 },
{ "cryptonight_v7_stellite", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_XTL }, { "cryptonight-monerov8", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_2 },
{ "cryptonight_lite", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_0 }, { "cryptonight_v8", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_2 },
{ "cryptonight-aeonv7", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 }, { "cryptonight_v7_stellite", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_XTL },
{ "cryptonight_lite_v7", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 }, { "cryptonight_lite", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_0 },
{ "cryptonight_lite_v7_xor", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_IPBC }, { "cryptonight-aeonv7", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 },
{ "cryptonight_lite_v7", nullptr, xmrig::CRYPTONIGHT_LITE, xmrig::VARIANT_1 },
{ "cryptonight_heavy", nullptr, xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_0 },
{ "cryptonight_haven", nullptr, xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_XHV },
{ "cryptonight_masari", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_MSR },
{ "cryptonight_masari", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_MSR },
{ "cryptonight-bittube2", nullptr, xmrig::CRYPTONIGHT_HEAVY, xmrig::VARIANT_TUBE }, // bittube-miner
{ "cryptonight_alloy", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_XAO }, // xmr-stak-alloy
{ "cryptonight_turtle", nullptr, xmrig::CRYPTONIGHT_PICO, xmrig::VARIANT_TRTL },
{ "cryptonight_gpu", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_GPU },
{ "cryptonight_r", nullptr, xmrig::CRYPTONIGHT, xmrig::VARIANT_4 },
}; };
#endif #endif
@@ -87,11 +121,24 @@ static AlgoData const xmrStakAlgorithms[] = {
static const char *variants[] = { static const char *variants[] = {
"0", "0",
"1", "1",
"ipbc", "tube",
"xtl" "xtl",
"msr",
"xhv",
"xao",
"rto",
"2",
"half",
"trtl",
"gpu",
"wow",
"r",
}; };
static_assert(xmrig::VARIANT_MAX == ARRAY_SIZE(variants), "variants size mismatch");
bool xmrig::Algorithm::isValid() const bool xmrig::Algorithm::isValid() const
{ {
if (m_algo == INVALID_ALGO) { if (m_algo == INVALID_ALGO) {
@@ -124,10 +171,16 @@ void xmrig::Algorithm::parseAlgorithm(const char *algo)
m_variant = VARIANT_AUTO; m_variant = VARIANT_AUTO;
assert(algo != nullptr); assert(algo != nullptr);
if (algo == nullptr) { if (algo == nullptr || strlen(algo) < 1) {
return; return;
} }
if (*algo == '!') {
m_flags |= Forced;
return parseAlgorithm(algo + 1);
}
for (size_t i = 0; i < ARRAY_SIZE(algorithms); i++) { for (size_t i = 0; i < ARRAY_SIZE(algorithms); i++) {
if ((strcasecmp(algo, algorithms[i].name) == 0) || (strcasecmp(algo, algorithms[i].shortName) == 0)) { if ((strcasecmp(algo, algorithms[i].name) == 0) || (strcasecmp(algo, algorithms[i].shortName) == 0)) {
m_algo = algorithms[i].algo; m_algo = algorithms[i].algo;
@@ -144,29 +197,48 @@ void xmrig::Algorithm::parseAlgorithm(const char *algo)
void xmrig::Algorithm::parseVariant(const char *variant) void xmrig::Algorithm::parseVariant(const char *variant)
{ {
if (m_algo == CRYPTONIGHT_HEAVY) { m_variant = VARIANT_AUTO;
m_variant = VARIANT_0;
if (variant == nullptr || strlen(variant) < 1) {
return; return;
} }
m_variant = VARIANT_AUTO; if (*variant == '!') {
m_flags |= Forced;
return parseVariant(variant + 1);
}
for (size_t i = 0; i < ARRAY_SIZE(variants); i++) { for (size_t i = 0; i < ARRAY_SIZE(variants); i++) {
if (strcasecmp(variant, variants[i]) == 0) { if (strcasecmp(variant, variants[i]) == 0) {
m_variant = static_cast<Variant>(i); m_variant = static_cast<Variant>(i);
break; return;
} }
} }
if (strcasecmp(variant, "xtlv9") == 0) {
m_variant = VARIANT_HALF;
}
} }
void xmrig::Algorithm::parseVariant(int variant) void xmrig::Algorithm::parseVariant(int variant)
{ {
if (variant >= VARIANT_AUTO && variant <= VARIANT_XTL) { assert(variant >= -1 && variant <= 2);
m_variant = static_cast<Variant>(variant);
} switch (variant) {
else { case -1:
assert(false); case 0:
case 1:
m_variant = static_cast<Variant>(variant);
break;
case 2:
m_variant = VARIANT_2;
break;
default:
break;
} }
} }
@@ -175,8 +247,8 @@ void xmrig::Algorithm::setAlgo(Algo algo)
{ {
m_algo = algo; m_algo = algo;
if (m_algo == CRYPTONIGHT_HEAVY) { if (m_algo == CRYPTONIGHT_PICO && m_variant == VARIANT_AUTO) {
m_variant = VARIANT_0; m_variant = xmrig::VARIANT_TRTL;
} }
} }

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -22,8 +23,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ALGORITHM_H__ #ifndef XMRIG_ALGORITHM_H
#define __ALGORITHM_H__ #define XMRIG_ALGORITHM_H
#include <vector> #include <vector>
@@ -38,28 +39,38 @@ namespace xmrig {
class Algorithm class Algorithm
{ {
public: public:
enum Flags {
None = 0,
Forced = 1
};
inline Algorithm() : inline Algorithm() :
m_algo(INVALID_ALGO), m_algo(INVALID_ALGO),
m_flags(0),
m_variant(VARIANT_AUTO) m_variant(VARIANT_AUTO)
{} {}
inline Algorithm(Algo algo, Variant variant) : inline Algorithm(Algo algo, Variant variant) :
m_flags(0),
m_variant(variant) m_variant(variant)
{ {
setAlgo(algo); setAlgo(algo);
} }
inline Algorithm(const char *algo) inline Algorithm(const char *algo) :
m_flags(0)
{ {
parseAlgorithm(algo); parseAlgorithm(algo);
} }
bool isEqual(const Algorithm &other) const { return m_algo == other.m_algo && m_variant == other.m_variant; } inline Algo algo() const { return m_algo; }
inline Algo algo() const { return m_algo; } inline bool isEqual(const Algorithm &other) const { return m_algo == other.m_algo && m_variant == other.m_variant; }
inline const char *name() const { return name(false); } inline bool isForced() const { return m_flags & Forced; }
inline const char *shortName() const { return name(true); } inline const char *name() const { return name(false); }
inline Variant variant() const { return m_variant; } inline const char *shortName() const { return name(true); }
inline void setVariant(Variant variant) { m_variant = variant; } inline int flags() const { return m_flags; }
inline Variant variant() const { return m_variant; }
inline void setVariant(Variant variant) { m_variant = variant; }
inline bool operator!=(const Algorithm &other) const { return !isEqual(other); } inline bool operator!=(const Algorithm &other) const { return !isEqual(other); }
inline bool operator==(const Algorithm &other) const { return isEqual(other); } inline bool operator==(const Algorithm &other) const { return isEqual(other); }
@@ -79,6 +90,7 @@ private:
const char *name(bool shortName) const; const char *name(bool shortName) const;
Algo m_algo; Algo m_algo;
int m_flags;
Variant m_variant; Variant m_variant;
}; };

View File

@@ -23,8 +23,8 @@
*/ */
#ifndef KECCAK_H_ #ifndef XMRIG_KECCAK_H
#define KECCAK_H_ #define XMRIG_KECCAK_H
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@@ -41,9 +41,15 @@ inline void keccak(const uint8_t *in, size_t inlen, uint8_t *md)
keccak(in, static_cast<int>(inlen), md, 200); keccak(in, static_cast<int>(inlen), md, 200);
} }
inline void keccak(const char *in, size_t inlen, uint8_t *md)
{
keccak(reinterpret_cast<const uint8_t *>(in), static_cast<int>(inlen), md, 200);
}
// update the state // update the state
void keccakf(uint64_t st[25], int norounds); void keccakf(uint64_t st[25], int norounds);
} /* namespace xmrig */ } /* namespace xmrig */
#endif /* KECCAK_H_ */ #endif /* XMRIG_KECCAK_H */

View File

@@ -4,8 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.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 * 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
@@ -21,13 +22,16 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ICLIENTLISTENER_H__ #ifndef XMRIG_ICLIENTLISTENER_H
#define __ICLIENTLISTENER_H__ #define XMRIG_ICLIENTLISTENER_H
#include <stdint.h> #include <stdint.h>
namespace xmrig {
class Client; class Client;
class Job; class Job;
class SubmitResult; class SubmitResult;
@@ -36,7 +40,7 @@ class SubmitResult;
class IClientListener class IClientListener
{ {
public: public:
virtual ~IClientListener() {} virtual ~IClientListener() = default;
virtual void onClose(Client *client, int failures) = 0; virtual void onClose(Client *client, int failures) = 0;
virtual void onJobReceived(Client *client, const Job &job) = 0; virtual void onJobReceived(Client *client, const Job &job) = 0;
@@ -45,4 +49,7 @@ public:
}; };
#endif // __ICLIENTLISTENER_H__ } /* namespace xmrig */
#endif // XMRIG_ICLIENTLISTENER_H

View File

@@ -4,7 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2018 XMRig <support@xmrig.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 * 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
@@ -20,16 +22,20 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ICONFIG_H__ #ifndef XMRIG_ICONFIG_H
#define __ICONFIG_H__ #define XMRIG_ICONFIG_H
#include "common/crypto/Algorithm.h"
#include "rapidjson/fwd.h" #include "rapidjson/fwd.h"
namespace xmrig { namespace xmrig {
class String;
class IConfig class IConfig
{ {
public: public:
@@ -41,11 +47,11 @@ public:
ApiPort = 4000, ApiPort = 4000,
ApiRestrictedKey = 4004, ApiRestrictedKey = 4004,
ApiWorkerIdKey = 4002, ApiWorkerIdKey = 4002,
ApiIdKey = 4005,
BackgroundKey = 'B', BackgroundKey = 'B',
ColorKey = 1002, ColorKey = 1002,
ConfigKey = 'c', ConfigKey = 'c',
DonateLevelKey = 1003, DonateLevelKey = 1003,
HelpKey = 'h',
KeepAliveKey = 'k', KeepAliveKey = 'k',
LogFileKey = 'l', LogFileKey = 'l',
PasswordKey = 'p', PasswordKey = 'p',
@@ -59,8 +65,10 @@ public:
UserpassKey = 'O', UserpassKey = 'O',
VariantKey = 1010, VariantKey = 1010,
VerboseKey = 1100, VerboseKey = 1100,
VersionKey = 'V',
WatchKey = 1105, WatchKey = 1105,
TlsKey = 1013,
FingerprintKey = 1014,
AutoSaveKey = 1016,
// xmrig common // xmrig common
CPUPriorityKey = 1021, CPUPriorityKey = 1021,
@@ -76,20 +84,51 @@ public:
SafeKey = 1005, SafeKey = 1005,
ThreadsKey = 't', ThreadsKey = 't',
HardwareAESKey = 1011, HardwareAESKey = 1011,
AssemblyKey = 1015,
// xmrig amd
OclPlatformKey = 1400,
OclAffinityKey = 1401,
OclDevicesKey = 1402,
OclLaunchKey = 1403,
OclCacheKey = 1404,
OclPrintKey = 1405,
OclLoaderKey = 1406,
OclSridedIndexKey = 1407,
OclMemChunkKey = 1408,
OclUnrollKey = 1409,
OclCompModeKey = 1410,
// xmrig-proxy // xmrig-proxy
AccessLogFileKey = 'A', AccessLogFileKey = 'A',
BindKey = 'b', BindKey = 'b',
CoinKey = 1104, CoinKey = 1104,
CustomDiffKey = 1102, CustomDiffKey = 1102,
DebugKey = 1101, DebugKey = 1101,
ModeKey = 'm', ModeKey = 'm',
PoolCoinKey = 'C', PoolCoinKey = 'C',
ReuseTimeoutKey = 1106, ReuseTimeoutKey = 1106,
WorkersKey = 1103, WorkersKey = 1103,
WorkersAdvKey = 1107,
TlsBindKey = 1108,
TlsCertKey = 1109,
TlsCertKeyKey = 1110,
TlsDHparamKey = 1111,
TlsCiphersKey = 1112,
TlsCipherSuitesKey = 1113,
TlsProtocolsKey = 1114,
// xmrig nvidia
CudaMaxThreadsKey = 1200,
CudaBFactorKey = 1201,
CudaBSleepKey = 1202,
CudaDevicesKey = 1203,
CudaLaunchKey = 1204,
CudaAffinityKey = 1205,
CudaMaxUsageKey = 1206,
}; };
virtual ~IConfig() {} virtual ~IConfig() = default;
virtual bool finalize() = 0; virtual bool finalize() = 0;
virtual bool isWatch() const = 0; virtual bool isWatch() const = 0;
@@ -97,7 +136,8 @@ public:
virtual bool parseString(int key, const char *arg) = 0; virtual bool parseString(int key, const char *arg) = 0;
virtual bool parseUint64(int key, uint64_t arg) = 0; virtual bool parseUint64(int key, uint64_t arg) = 0;
virtual bool save() = 0; virtual bool save() = 0;
virtual const char *fileName() const = 0; virtual const Algorithm &algorithm() const = 0;
virtual const String &fileName() const = 0;
virtual void getJSON(rapidjson::Document &doc) const = 0; virtual void getJSON(rapidjson::Document &doc) const = 0;
virtual void parseJSON(const rapidjson::Document &doc) = 0; virtual void parseJSON(const rapidjson::Document &doc) = 0;
virtual void setFileName(const char *fileName) = 0; virtual void setFileName(const char *fileName) = 0;
@@ -107,4 +147,4 @@ public:
} /* namespace xmrig */ } /* namespace xmrig */
#endif // __ICONFIG_H__ #endif // XMRIG_ICONFIG_H

View File

@@ -4,7 +4,9 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2018 XMRig <support@xmrig.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 * 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
@@ -20,8 +22,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ICONFIGCREATOR_H__ #ifndef XMRIG_ICONFIGCREATOR_H
#define __ICONFIGCREATOR_H__ #define XMRIG_ICONFIGCREATOR_H
namespace xmrig { namespace xmrig {
@@ -33,7 +35,7 @@ class IConfig;
class IConfigCreator class IConfigCreator
{ {
public: public:
virtual ~IConfigCreator() {} virtual ~IConfigCreator() = default;
virtual IConfig *create() const = 0; virtual IConfig *create() const = 0;
}; };
@@ -42,4 +44,4 @@ public:
} /* namespace xmrig */ } /* namespace xmrig */
#endif // __ICONFIGCREATOR_H__ #endif // XMRIG_ICONFIGCREATOR_H

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,8 +22,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ICONTROLLERLISTENER_H__ #ifndef XMRIG_ICONTROLLERLISTENER_H
#define __ICONTROLLERLISTENER_H__ #define XMRIG_ICONTROLLERLISTENER_H
namespace xmrig { namespace xmrig {
@@ -34,7 +35,7 @@ class Config;
class IControllerListener class IControllerListener
{ {
public: public:
virtual ~IControllerListener() {} virtual ~IControllerListener() = default;
virtual void onConfigChanged(Config *config, Config *previousConfig) = 0; virtual void onConfigChanged(Config *config, Config *previousConfig) = 0;
}; };
@@ -43,4 +44,4 @@ public:
} /* namespace xmrig */ } /* namespace xmrig */
#endif // __ICONTROLLERLISTENER_H__ #endif // XMRIG_ICONTROLLERLISTENER_H

View File

@@ -0,0 +1,63 @@
/* 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-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 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_CPUINFO_H
#define XMRIG_CPUINFO_H
#include <stddef.h>
#include <stdint.h>
#include "common/xmrig.h"
namespace xmrig {
class ICpuInfo
{
public:
virtual ~ICpuInfo() {}
virtual bool hasAES() const = 0;
virtual bool hasAVX2() const = 0;
virtual bool isSupported() const = 0;
virtual bool isX64() const = 0;
virtual const char *brand() const = 0;
virtual int32_t cores() const = 0;
virtual int32_t L2() const = 0;
virtual int32_t L3() const = 0;
virtual int32_t nodes() const = 0;
virtual int32_t sockets() const = 0;
virtual int32_t threads() const = 0;
virtual size_t optimalThreadsCount(size_t memSize, int maxCpuUsage) const = 0;
virtual xmrig::Assembly assembly() const = 0;
};
} /* namespace xmrig */
#endif // XMRIG_CPUINFO_H

View File

@@ -4,8 +4,8 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* 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
@@ -26,15 +26,30 @@
#include <stdarg.h> #include <stdarg.h>
#include <stddef.h>
class ILogBackend class ILogBackend
{ {
public: public:
enum Level {
ERR,
WARNING,
NOTICE,
INFO,
DEBUG
};
# ifdef APP_DEBUG
constexpr static const size_t kBufferSize = 1024;
# else
constexpr static const size_t kBufferSize = 512;
# endif
virtual ~ILogBackend() {} virtual ~ILogBackend() {}
virtual void message(int level, const char* fmt, va_list args) = 0; virtual void message(Level level, const char* fmt, va_list args) = 0;
virtual void text(const char* fmt, va_list args) = 0; virtual void text(const char* fmt, va_list args) = 0;
}; };

View File

@@ -0,0 +1,59 @@
/* 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_ISTRATEGY_H
#define XMRIG_ISTRATEGY_H
#include <stdint.h>
class JobResult;
namespace xmrig {
class Algorithm;
class IStrategy
{
public:
virtual ~IStrategy() = default;
virtual bool isActive() const = 0;
virtual int64_t submit(const JobResult &result) = 0;
virtual void connect() = 0;
virtual void resume() = 0;
virtual void setAlgo(const Algorithm &algo) = 0;
virtual void stop() = 0;
virtual void tick(uint64_t now) = 0;
};
} /* namespace xmrig */
#endif // XMRIG_ISTRATEGY_H

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,13 +22,16 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ISTRATEGYLISTENER_H__ #ifndef XMRIG_ISTRATEGYLISTENER_H
#define __ISTRATEGYLISTENER_H__ #define XMRIG_ISTRATEGYLISTENER_H
#include <stdint.h> #include <stdint.h>
namespace xmrig {
class Client; class Client;
class IStrategy; class IStrategy;
class Job; class Job;
@@ -37,7 +41,7 @@ class SubmitResult;
class IStrategyListener class IStrategyListener
{ {
public: public:
virtual ~IStrategyListener() {} virtual ~IStrategyListener() = default;
virtual void onActive(IStrategy *strategy, Client *client) = 0; virtual void onActive(IStrategy *strategy, Client *client) = 0;
virtual void onJob(IStrategy *strategy, Client *client, const Job &job) = 0; virtual void onJob(IStrategy *strategy, Client *client, const Job &job) = 0;
@@ -46,4 +50,7 @@ public:
}; };
#endif // __ISTRATEGYLISTENER_H__ } /* namespace xmrig */
#endif // XMRIG_ISTRATEGYLISTENER_H

View File

@@ -0,0 +1,89 @@
/* 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 2016-2018 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 <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifdef WIN32
# include <winsock2.h>
# include <windows.h>
#endif
#include "common/log/BasicLog.h"
#include "common/log/Log.h"
BasicLog::BasicLog()
{
}
void BasicLog::message(Level level, const char* fmt, va_list args)
{
time_t now = time(nullptr);
tm stime;
# ifdef _WIN32
localtime_s(&stime, &now);
# else
localtime_r(&now, &stime);
# endif
snprintf(m_fmt, sizeof(m_fmt) - 1, "[%d-%02d-%02d %02d:%02d:%02d]%s %s%s",
stime.tm_year + 1900,
stime.tm_mon + 1,
stime.tm_mday,
stime.tm_hour,
stime.tm_min,
stime.tm_sec,
Log::colorByLevel(level, false),
fmt,
Log::endl(false)
);
print(args);
}
void BasicLog::text(const char* fmt, va_list args)
{
snprintf(m_fmt, sizeof(m_fmt) - 1, "%s%s", fmt, Log::endl(false));
print(args);
}
void BasicLog::print(va_list args)
{
if (vsnprintf(m_buf, sizeof(m_buf) - 1, m_fmt, args) <= 0) {
return;
}
fputs(m_buf, stdout);
fflush(stdout);
}

View File

@@ -21,28 +21,35 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ISTRATEGY_H__ #ifndef __BASICLOG_H__
#define __ISTRATEGY_H__ #define __BASICLOG_H__
#include <stdint.h> #include <uv.h>
class JobResult; #include "common/interfaces/ILogBackend.h"
class IStrategy namespace xmrig {
class Controller;
}
class BasicLog : public ILogBackend
{ {
public: public:
virtual ~IStrategy() {} BasicLog();
virtual bool isActive() const = 0; void message(Level level, const char *fmt, va_list args) override;
virtual int64_t submit(const JobResult &result) = 0; void text(const char *fmt, va_list args) override;
virtual void connect() = 0;
virtual void resume() = 0; private:
virtual void stop() = 0; bool isWritable() const;
virtual void tick(uint64_t now) = 0; void print(va_list args);
char m_buf[kBufferSize];
char m_fmt[256];
}; };
#endif /* __BASICLOG_H__ */
#endif // __ISTRATEGY_H__

View File

@@ -45,7 +45,7 @@ ConsoleLog::ConsoleLog(xmrig::Controller *controller) :
m_controller(controller) m_controller(controller)
{ {
if (uv_tty_init(uv_default_loop(), &m_tty, 1, 0) < 0) { if (uv_tty_init(uv_default_loop(), &m_tty, 1, 0) < 0) {
controller->config()->setColors(false); Log::colors = false;
return; return;
} }
@@ -66,7 +66,7 @@ ConsoleLog::ConsoleLog(xmrig::Controller *controller) :
} }
void ConsoleLog::message(int level, const char* fmt, va_list args) void ConsoleLog::message(Level level, const char* fmt, va_list args)
{ {
time_t now = time(nullptr); time_t now = time(nullptr);
tm stime; tm stime;
@@ -77,43 +77,18 @@ void ConsoleLog::message(int level, const char* fmt, va_list args)
localtime_r(&now, &stime); localtime_r(&now, &stime);
# endif # endif
const char* color = nullptr; const bool isColors = m_controller->config()->isColors();
const bool colors = m_controller->config()->isColors();
if (colors) { snprintf(m_fmt, sizeof(m_fmt) - 1, "[%d-%02d-%02d %02d:%02d:%02d]%s %s%s",
switch (level) {
case Log::ERR:
color = Log::kCL_RED;
break;
case Log::WARNING:
color = Log::kCL_YELLOW;
break;
case Log::NOTICE:
color = Log::kCL_WHITE;
break;
case Log::DEBUG:
color = Log::kCL_GRAY;
break;
default:
color = "";
break;
}
}
snprintf(m_fmt, sizeof(m_fmt) - 1, "[%d-%02d-%02d %02d:%02d:%02d]%s %s%s\n",
stime.tm_year + 1900, stime.tm_year + 1900,
stime.tm_mon + 1, stime.tm_mon + 1,
stime.tm_mday, stime.tm_mday,
stime.tm_hour, stime.tm_hour,
stime.tm_min, stime.tm_min,
stime.tm_sec, stime.tm_sec,
colors ? color : "", Log::colorByLevel(level, isColors),
fmt, fmt,
colors ? Log::kCL_N : "" Log::endl(isColors)
); );
print(args); print(args);
@@ -122,7 +97,7 @@ void ConsoleLog::message(int level, const char* fmt, va_list args)
void ConsoleLog::text(const char* fmt, va_list args) void ConsoleLog::text(const char* fmt, va_list args)
{ {
snprintf(m_fmt, sizeof(m_fmt) - 1, "%s%s\n", fmt, m_controller->config()->isColors() ? Log::kCL_N : ""); snprintf(m_fmt, sizeof(m_fmt) - 1, "%s%s", fmt, Log::endl(m_controller->config()->isColors()));
print(args); print(args);
} }

View File

@@ -28,7 +28,7 @@
#include <uv.h> #include <uv.h>
#include "interfaces/ILogBackend.h" #include "common/interfaces/ILogBackend.h"
namespace xmrig { namespace xmrig {
@@ -41,14 +41,14 @@ class ConsoleLog : public ILogBackend
public: public:
ConsoleLog(xmrig::Controller *controller); ConsoleLog(xmrig::Controller *controller);
void message(int level, const char *fmt, va_list args) override; void message(Level level, const char *fmt, va_list args) override;
void text(const char *fmt, va_list args) override; void text(const char *fmt, va_list args) override;
private: private:
bool isWritable() const; bool isWritable() const;
void print(va_list args); void print(va_list args);
char m_buf[512]; char m_buf[kBufferSize];
char m_fmt[256]; char m_fmt[256];
uv_buf_t m_uvBuf; uv_buf_t m_uvBuf;
uv_stream_t *m_stream; uv_stream_t *m_stream;

View File

@@ -4,8 +4,8 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* 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
@@ -30,9 +30,13 @@
#include "common/log/FileLog.h" #include "common/log/FileLog.h"
#include "common/log/Log.h"
#include "core/Config.h"
#include "core/Controller.h"
FileLog::FileLog(const char *fileName) FileLog::FileLog(xmrig::Controller *controller, const char *fileName) :
m_controller(controller)
{ {
uv_fs_t req; uv_fs_t req;
m_file = uv_fs_open(uv_default_loop(), &req, fileName, O_CREAT | O_APPEND | O_WRONLY, 0644, nullptr); m_file = uv_fs_open(uv_default_loop(), &req, fileName, O_CREAT | O_APPEND | O_WRONLY, 0644, nullptr);
@@ -40,7 +44,7 @@ FileLog::FileLog(const char *fileName)
} }
void FileLog::message(int level, const char* fmt, va_list args) void FileLog::message(Level level, const char* fmt, va_list args)
{ {
if (m_file < 0) { if (m_file < 0) {
return; return;
@@ -55,29 +59,33 @@ void FileLog::message(int level, const char* fmt, va_list args)
localtime_r(&now, &stime); localtime_r(&now, &stime);
# endif # endif
char *buf = new char[512]; const bool isColors = m_controller->config()->isColors();
int size = snprintf(buf, 23, "[%d-%02d-%02d %02d:%02d:%02d] ",
stime.tm_year + 1900,
stime.tm_mon + 1,
stime.tm_mday,
stime.tm_hour,
stime.tm_min,
stime.tm_sec);
size = vsnprintf(buf + size, 512 - size - 1, fmt, args) + size; snprintf(m_fmt, sizeof(m_fmt) - 1, "[%d-%02d-%02d %02d:%02d:%02d]%s %s%s",
buf[size] = '\n'; stime.tm_year + 1900,
stime.tm_mon + 1,
stime.tm_mday,
stime.tm_hour,
stime.tm_min,
stime.tm_sec,
Log::colorByLevel(level, isColors),
fmt,
Log::endl(isColors)
);
write(buf, size + 1); char *buf = new char[kBufferSize];
const int size = vsnprintf(buf, kBufferSize - 1, m_fmt, args);
write(buf, size);
} }
void FileLog::text(const char* fmt, va_list args) void FileLog::text(const char* fmt, va_list args)
{ {
message(0, fmt, args); message(INFO, fmt, args);
} }
void FileLog::onWrite(uv_fs_t *req) void FileLog::onWrite(uv_fs_t *req)
{ {
delete [] static_cast<char *>(req->data); delete [] static_cast<char *>(req->data);
@@ -93,5 +101,5 @@ void FileLog::write(char *data, size_t size)
uv_fs_t *req = new uv_fs_t; uv_fs_t *req = new uv_fs_t;
req->data = buf.base; req->data = buf.base;
uv_fs_write(uv_default_loop(), req, m_file, &buf, 1, 0, FileLog::onWrite); uv_fs_write(uv_default_loop(), req, m_file, &buf, 1, -1, FileLog::onWrite);
} }

View File

@@ -4,8 +4,8 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* 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
@@ -28,15 +28,20 @@
#include <uv.h> #include <uv.h>
#include "interfaces/ILogBackend.h" #include "common/interfaces/ILogBackend.h"
namespace xmrig {
class Controller;
}
class FileLog : public ILogBackend class FileLog : public ILogBackend
{ {
public: public:
FileLog(const char *fileName); FileLog(xmrig::Controller *controller, const char *fileName);
void message(int level, const char* fmt, va_list args) override; void message(Level level, const char* fmt, va_list args) override;
void text(const char* fmt, va_list args) override; void text(const char* fmt, va_list args) override;
private: private:
@@ -44,7 +49,9 @@ private:
void write(char *data, size_t size); void write(char *data, size_t size);
char m_fmt[256];
int m_file; int m_file;
xmrig::Controller *m_controller;
}; };
#endif /* __FILELOG_H__ */ #endif /* __FILELOG_H__ */

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -29,14 +30,29 @@
#include <time.h> #include <time.h>
#include "common/interfaces/ILogBackend.h"
#include "common/log/BasicLog.h"
#include "common/log/Log.h" #include "common/log/Log.h"
#include "interfaces/ILogBackend.h"
Log *Log::m_self = nullptr; Log *Log::m_self = nullptr;
bool Log::colors = true;
void Log::message(Log::Level level, const char* fmt, ...) static const char *color[5] = {
"\x1B[0;31m", /* ERR */
"\x1B[0;33m", /* WARNING */
"\x1B[1;37m", /* NOTICE */
"", /* INFO */
# ifdef WIN32
"\x1B[1;30m" /* DEBUG */
# else
"\x1B[90m" /* DEBUG */
# endif
};
void Log::message(ILogBackend::Level level, const char* fmt, ...)
{ {
uv_mutex_lock(&m_mutex); uv_mutex_lock(&m_mutex);
@@ -76,6 +92,34 @@ void Log::text(const char* fmt, ...)
} }
const char *Log::colorByLevel(ILogBackend::Level level, bool isColors)
{
if (!isColors) {
return "";
}
return color[level];
}
const char *Log::endl(bool isColors)
{
# ifdef _WIN32
return isColors ? "\x1B[0m\r\n" : "\r\n";
# else
return isColors ? "\x1B[0m\n" : "\n";
# endif
}
void Log::defaultInit()
{
m_self = new Log();
add(new BasicLog());
}
Log::~Log() Log::~Log()
{ {
for (auto backend : m_backends) { for (auto backend : m_backends) {

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,8 +22,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __LOG_H__ #ifndef XMRIG_LOG_H
#define __LOG_H__ #define XMRIG_LOG_H
#include <assert.h> #include <assert.h>
@@ -30,39 +31,26 @@
#include <vector> #include <vector>
class ILogBackend; #include "common/interfaces/ILogBackend.h"
class Log class Log
{ {
public: public:
enum Level { static inline Log* i() { if (!m_self) { defaultInit(); } return m_self; }
ERR,
WARNING,
NOTICE,
INFO,
DEBUG
};
constexpr static const char* kCL_N = "\x1B[0m";
constexpr static const char* kCL_RED = "\x1B[31m";
constexpr static const char* kCL_YELLOW = "\x1B[33m";
constexpr static const char* kCL_WHITE = "\x1B[01;37m";
# ifdef WIN32
constexpr static const char* kCL_GRAY = "\x1B[01;30m";
# else
constexpr static const char* kCL_GRAY = "\x1B[90m";
# endif
static inline Log* i() { assert(m_self != nullptr); return m_self; }
static inline void add(ILogBackend *backend) { i()->m_backends.push_back(backend); } static inline void add(ILogBackend *backend) { i()->m_backends.push_back(backend); }
static inline void init() { if (!m_self) { new Log(); } } static inline void init() { if (!m_self) { new Log(); } }
static inline void release() { assert(m_self != nullptr); delete m_self; } static inline void release() { delete m_self; }
void message(Level level, const char* fmt, ...); void message(ILogBackend::Level level, const char* fmt, ...);
void text(const char* fmt, ...); void text(const char* fmt, ...);
static const char *colorByLevel(ILogBackend::Level level, bool isColors = true);
static const char *endl(bool isColors = true);
static void defaultInit();
static bool colors;
private: private:
inline Log() { inline Log() {
assert(m_self == nullptr); assert(m_self == nullptr);
@@ -84,31 +72,34 @@ private:
#define RED(x) "\x1B[0;31m" x "\x1B[0m" #define RED(x) "\x1B[0;31m" x "\x1B[0m"
#define GREEN_BOLD(x) "\x1B[1;32m" x "\x1B[0m" #define GREEN_BOLD(x) "\x1B[1;32m" x "\x1B[0m"
#define GREEN(x) "\x1B[0;32m" x "\x1B[0m" #define GREEN(x) "\x1B[0;32m" x "\x1B[0m"
#define YELLOW(x) "\x1B[0;33m" x "\x1B[0m"
#define YELLOW_BOLD(x) "\x1B[1;33m" x "\x1B[0m"
#define MAGENTA_BOLD(x) "\x1B[1;35m" x "\x1B[0m" #define MAGENTA_BOLD(x) "\x1B[1;35m" x "\x1B[0m"
#define MAGENTA(x) "\x1B[0;35m" x "\x1B[0m" #define MAGENTA(x) "\x1B[0;35m" x "\x1B[0m"
#define CYAN_BOLD(x) "\x1B[1;36m" x "\x1B[0m" #define CYAN_BOLD(x) "\x1B[1;36m" x "\x1B[0m"
#define CYAN(x) "\x1B[0;36m" x "\x1B[0m" #define CYAN(x) "\x1B[0;36m" x "\x1B[0m"
#define WHITE_BOLD(x) "\x1B[1;37m" x "\x1B[0m" #define WHITE_BOLD(x) "\x1B[1;37m" x "\x1B[0m"
#define WHITE(x) "\x1B[0;37m" x "\x1B[0m" #define WHITE(x) "\x1B[0;37m" x "\x1B[0m"
#define GRAY(x) "\x1B[1;30m" x "\x1B[0m"
#define LOG_ERR(x, ...) Log::i()->message(Log::ERR, x, ##__VA_ARGS__) #define LOG_ERR(x, ...) Log::i()->message(ILogBackend::ERR, x, ##__VA_ARGS__)
#define LOG_WARN(x, ...) Log::i()->message(Log::WARNING, x, ##__VA_ARGS__) #define LOG_WARN(x, ...) Log::i()->message(ILogBackend::WARNING, x, ##__VA_ARGS__)
#define LOG_NOTICE(x, ...) Log::i()->message(Log::NOTICE, x, ##__VA_ARGS__) #define LOG_NOTICE(x, ...) Log::i()->message(ILogBackend::NOTICE, x, ##__VA_ARGS__)
#define LOG_INFO(x, ...) Log::i()->message(Log::INFO, x, ##__VA_ARGS__) #define LOG_INFO(x, ...) Log::i()->message(ILogBackend::INFO, x, ##__VA_ARGS__)
#ifdef APP_DEBUG #ifdef APP_DEBUG
# define LOG_DEBUG(x, ...) Log::i()->message(Log::DEBUG, x, ##__VA_ARGS__) # define LOG_DEBUG(x, ...) Log::i()->message(ILogBackend::DEBUG, x, ##__VA_ARGS__)
#else #else
# define LOG_DEBUG(x, ...) # define LOG_DEBUG(x, ...)
#endif #endif
#if defined(APP_DEBUG) || defined(APP_DEVEL) #if defined(APP_DEBUG) || defined(APP_DEVEL)
# define LOG_DEBUG_ERR(x, ...) Log::i()->message(Log::ERR, x, ##__VA_ARGS__) # define LOG_DEBUG_ERR(x, ...) Log::i()->message(ILogBackend::ERR, x, ##__VA_ARGS__)
# define LOG_DEBUG_WARN(x, ...) Log::i()->message(Log::WARNING, x, ##__VA_ARGS__) # define LOG_DEBUG_WARN(x, ...) Log::i()->message(ILogBackend::WARNING, x, ##__VA_ARGS__)
#else #else
# define LOG_DEBUG_ERR(x, ...) # define LOG_DEBUG_ERR(x, ...)
# define LOG_DEBUG_WARN(x, ...) # define LOG_DEBUG_WARN(x, ...)
#endif #endif
#endif /* __LOG_H__ */ #endif /* XMRIG_LOG_H */

View File

@@ -4,8 +4,8 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* 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
@@ -35,13 +35,13 @@ SysLog::SysLog()
} }
void SysLog::message(int level, const char *fmt, va_list args) void SysLog::message(Level level, const char *fmt, va_list args)
{ {
vsyslog(level, fmt, args); vsyslog(static_cast<int>(level), fmt, args);
} }
void SysLog::text(const char *fmt, va_list args) void SysLog::text(const char *fmt, va_list args)
{ {
message(LOG_INFO, fmt, args); vsyslog(LOG_INFO, fmt, args);
} }

View File

@@ -4,8 +4,8 @@
* Copyright 2014 Lucas Jones <https://github.com/lucasjones> * Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2016-2017 XMRig <support@xmrig.com> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* * Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* 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
@@ -25,7 +25,7 @@
#define __SYSLOG_H__ #define __SYSLOG_H__
#include "interfaces/ILogBackend.h" #include "common/interfaces/ILogBackend.h"
class SysLog : public ILogBackend class SysLog : public ILogBackend
@@ -33,7 +33,7 @@ class SysLog : public ILogBackend
public: public:
SysLog(); SysLog();
void message(int level, const char *fmt, va_list args) override; void message(Level level, const char *fmt, va_list args) override;
void text(const char *fmt, va_list args) override; void text(const char *fmt, va_list args) override;
}; };

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -29,9 +30,16 @@
#include <utility> #include <utility>
#ifndef XMRIG_NO_TLS
# include <openssl/ssl.h>
# include <openssl/err.h>
# include "common/net/Tls.h"
#endif
#include "common/interfaces/IClientListener.h"
#include "common/log/Log.h" #include "common/log/Log.h"
#include "common/net/Client.h" #include "common/net/Client.h"
#include "interfaces/IClientListener.h"
#include "net/JobResult.h" #include "net/JobResult.h"
#include "rapidjson/document.h" #include "rapidjson/document.h"
#include "rapidjson/error/en.h" #include "rapidjson/error/en.h"
@@ -44,11 +52,26 @@
#endif #endif
namespace xmrig {
int64_t Client::m_sequence = 1; int64_t Client::m_sequence = 1;
xmrig::Storage<Client> Client::m_storage; Storage<Client> Client::m_storage;
} /* namespace xmrig */
Client::Client(int id, const char *agent, IClientListener *listener) : #ifdef APP_DEBUG
static const char *states[] = {
"unconnected",
"host-lookup",
"connecting",
"connected",
"closing"
};
#endif
xmrig::Client::Client(int id, const char *agent, IClientListener *listener) :
m_ipv6(false), m_ipv6(false),
m_nicehash(false), m_nicehash(false),
m_quiet(false), m_quiet(false),
@@ -61,6 +84,7 @@ Client::Client(int id, const char *agent, IClientListener *listener) :
m_failures(0), m_failures(0),
m_recvBufPos(0), m_recvBufPos(0),
m_state(UnconnectedState), m_state(UnconnectedState),
m_tls(nullptr),
m_expire(0), m_expire(0),
m_jobs(0), m_jobs(0),
m_keepAlive(0), m_keepAlive(0),
@@ -84,14 +108,20 @@ Client::Client(int id, const char *agent, IClientListener *listener) :
} }
Client::~Client() xmrig::Client::~Client()
{ {
delete m_socket; delete m_socket;
} }
void Client::connect() void xmrig::Client::connect()
{ {
# ifndef XMRIG_NO_TLS
if (m_pool.isTLS()) {
m_tls = new Tls(this);
}
# endif
resolve(m_pool.host()); resolve(m_pool.host());
} }
@@ -101,14 +131,14 @@ void Client::connect()
* *
* @param url * @param url
*/ */
void Client::connect(const Pool &url) void xmrig::Client::connect(const Pool &url)
{ {
setPool(url); setPool(url);
connect(); connect();
} }
void Client::deleteLater() void xmrig::Client::deleteLater()
{ {
if (!m_listener) { if (!m_listener) {
return; return;
@@ -122,7 +152,8 @@ void Client::deleteLater()
} }
void Client::setPool(const Pool &pool)
void xmrig::Client::setPool(const Pool &pool)
{ {
if (!pool.isValid()) { if (!pool.isValid()) {
return; return;
@@ -132,7 +163,7 @@ void Client::setPool(const Pool &pool)
} }
void Client::tick(uint64_t now) void xmrig::Client::tick(uint64_t now)
{ {
if (m_state == ConnectedState) { if (m_state == ConnectedState) {
if (m_expire && now > m_expire) { if (m_expire && now > m_expire) {
@@ -150,7 +181,7 @@ void Client::tick(uint64_t now)
} }
bool Client::disconnect() bool xmrig::Client::disconnect()
{ {
m_keepAlive = 0; m_keepAlive = 0;
m_expire = 0; m_expire = 0;
@@ -160,8 +191,38 @@ bool Client::disconnect()
} }
int64_t Client::submit(const JobResult &result) const char *xmrig::Client::tlsFingerprint() const
{ {
# ifndef XMRIG_NO_TLS
if (isTLS() && m_pool.fingerprint() == nullptr) {
return m_tls->fingerprint();
}
# endif
return nullptr;
}
const char *xmrig::Client::tlsVersion() const
{
# ifndef XMRIG_NO_TLS
if (isTLS()) {
return m_tls->version();
}
# endif
return nullptr;
}
int64_t xmrig::Client::submit(const JobResult &result)
{
# ifndef XMRIG_PROXY_PROJECT
if (result.clientId != m_rpcId) {
return -1;
}
# endif
using namespace rapidjson; using namespace rapidjson;
# ifdef XMRIG_PROXY_PROJECT # ifdef XMRIG_PROXY_PROJECT
@@ -207,9 +268,13 @@ int64_t Client::submit(const JobResult &result)
} }
bool Client::close() bool xmrig::Client::close()
{ {
if (m_state == UnconnectedState || m_state == ClosingState || !m_socket) { if (m_state == ClosingState) {
return m_socket != nullptr;
}
if (m_state == UnconnectedState || m_socket == nullptr) {
return false; return false;
} }
@@ -223,7 +288,7 @@ bool Client::close()
} }
bool Client::isCriticalError(const char *message) bool xmrig::Client::isCriticalError(const char *message)
{ {
if (!message) { if (!message) {
return false; return false;
@@ -245,7 +310,17 @@ bool Client::isCriticalError(const char *message)
} }
bool Client::parseJob(const rapidjson::Value &params, int *code) bool xmrig::Client::isTLS() const
{
# ifndef XMRIG_NO_TLS
return m_pool.isTLS() && m_tls;
# else
return false;
# endif
}
bool xmrig::Client::parseJob(const rapidjson::Value &params, int *code)
{ {
if (!params.IsObject()) { if (!params.IsObject()) {
*code = 2; *code = 2;
@@ -270,17 +345,25 @@ bool Client::parseJob(const rapidjson::Value &params, int *code)
} }
if (params.HasMember("algo")) { if (params.HasMember("algo")) {
job.algorithm().parseAlgorithm(params["algo"].GetString()); job.setAlgorithm(params["algo"].GetString());
} }
if (params.HasMember("variant")) { if (params.HasMember("variant")) {
const rapidjson::Value &variant = params["variant"]; const rapidjson::Value &variant = params["variant"];
if (variant.IsInt()) { if (variant.IsInt()) {
job.algorithm().parseVariant(variant.GetInt()); job.setVariant(variant.GetInt());
} }
else if (variant.IsString()){ else if (variant.IsString()){
job.algorithm().parseVariant(variant.GetString()); job.setVariant(variant.GetString());
}
}
if (params.HasMember("height")) {
const rapidjson::Value &variant = params["height"];
if (variant.IsUint64()) {
job.setHeight(variant.GetUint64());
} }
} }
@@ -291,6 +374,8 @@ bool Client::parseJob(const rapidjson::Value &params, int *code)
return false; return false;
} }
m_job.setClientId(m_rpcId);
if (m_job != job) { if (m_job != job) {
m_jobs++; m_jobs++;
m_job = std::move(job); m_job = std::move(job);
@@ -310,7 +395,7 @@ bool Client::parseJob(const rapidjson::Value &params, int *code)
} }
bool Client::parseLogin(const rapidjson::Value &result, int *code) bool xmrig::Client::parseLogin(const rapidjson::Value &result, int *code)
{ {
if (!m_rpcId.setId(result["id"].GetString())) { if (!m_rpcId.setId(result["id"].GetString())) {
*code = 1; *code = 1;
@@ -330,8 +415,47 @@ bool Client::parseLogin(const rapidjson::Value &result, int *code)
} }
bool Client::verifyAlgorithm(const xmrig::Algorithm &algorithm) const bool xmrig::Client::send(BIO *bio)
{ {
# ifndef XMRIG_NO_TLS
uv_buf_t buf;
buf.len = BIO_get_mem_data(bio, &buf.base);
if (buf.len == 0) {
return true;
}
LOG_DEBUG("[%s] TLS send (%d bytes)", m_pool.url(), static_cast<int>(buf.len));
bool result = false;
if (state() == ConnectedState && uv_is_writable(m_stream)) {
result = uv_try_write(m_stream, &buf, 1) > 0;
if (!result) {
close();
}
}
else {
LOG_DEBUG_ERR("[%s] send failed, invalid state: %d", m_pool.url(), m_state);
}
(void) BIO_reset(bio);
return result;
# else
return false;
# endif
}
bool xmrig::Client::verifyAlgorithm(const Algorithm &algorithm) const
{
# ifdef XMRIG_PROXY_PROJECT
if (m_pool.algorithm().variant() == VARIANT_AUTO || m_id == -1) {
return true;
}
# endif
if (m_pool.isCompatible(algorithm)) { if (m_pool.isCompatible(algorithm)) {
return true; return true;
} }
@@ -351,7 +475,7 @@ bool Client::verifyAlgorithm(const xmrig::Algorithm &algorithm) const
} }
int Client::resolve(const char *host) int xmrig::Client::resolve(const char *host)
{ {
setState(HostLookupState); setState(HostLookupState);
@@ -374,7 +498,7 @@ int Client::resolve(const char *host)
} }
int64_t Client::send(const rapidjson::Document &doc) int64_t xmrig::Client::send(const rapidjson::Document &doc)
{ {
using namespace rapidjson; using namespace rapidjson;
@@ -383,7 +507,9 @@ int64_t Client::send(const rapidjson::Document &doc)
doc.Accept(writer); doc.Accept(writer);
const size_t size = buffer.GetSize(); const size_t size = buffer.GetSize();
if (size > (sizeof(m_buf) - 2)) { if (size > (sizeof(m_sendBuf) - 2)) {
LOG_ERR("[%s] send failed: \"send buffer overflow: %zu > %zu\"", m_pool.url(), size, (sizeof(m_sendBuf) - 2));
close();
return -1; return -1;
} }
@@ -395,19 +521,30 @@ int64_t Client::send(const rapidjson::Document &doc)
} }
int64_t Client::send(size_t size) int64_t xmrig::Client::send(size_t size)
{ {
LOG_DEBUG("[%s] send (%d bytes): \"%s\"", m_pool.url(), size, m_sendBuf); LOG_DEBUG("[%s] send (%d bytes): \"%s\"", m_pool.url(), size, m_sendBuf);
if (state() != ConnectedState || !uv_is_writable(m_stream)) {
LOG_DEBUG_ERR("[%s] send failed, invalid state: %d", m_pool.url(), m_state); # ifndef XMRIG_NO_TLS
return -1; if (isTLS()) {
if (!m_tls->send(m_sendBuf, size)) {
return -1;
}
} }
else
# endif
{
if (state() != ConnectedState || !uv_is_writable(m_stream)) {
LOG_DEBUG_ERR("[%s] send failed, invalid state: %d", m_pool.url(), m_state);
return -1;
}
uv_buf_t buf = uv_buf_init(m_sendBuf, (unsigned int) size); uv_buf_t buf = uv_buf_init(m_sendBuf, (unsigned int) size);
if (uv_try_write(m_stream, &buf, 1) < 0) { if (uv_try_write(m_stream, &buf, 1) < 0) {
close(); close();
return -1; return -1;
}
} }
m_expire = uv_now(uv_default_loop()) + kResponseTimeout; m_expire = uv_now(uv_default_loop()) + kResponseTimeout;
@@ -415,7 +552,7 @@ int64_t Client::send(size_t size)
} }
void Client::connect(const std::vector<addrinfo*> &ipv4, const std::vector<addrinfo*> &ipv6) void xmrig::Client::connect(const std::vector<addrinfo*> &ipv4, const std::vector<addrinfo*> &ipv6)
{ {
addrinfo *addr = nullptr; addrinfo *addr = nullptr;
m_ipv6 = ipv4.empty() && !ipv6.empty(); m_ipv6 = ipv4.empty() && !ipv6.empty();
@@ -433,12 +570,11 @@ void Client::connect(const std::vector<addrinfo*> &ipv4, const std::vector<addri
} }
void Client::connect(sockaddr *addr) void xmrig::Client::connect(sockaddr *addr)
{ {
setState(ConnectingState); setState(ConnectingState);
reinterpret_cast<sockaddr_in*>(addr)->sin_port = htons(m_pool.port()); reinterpret_cast<sockaddr_in*>(addr)->sin_port = htons(m_pool.port());
delete m_socket;
uv_connect_t *req = new uv_connect_t; uv_connect_t *req = new uv_connect_t;
req->data = m_storage.ptr(m_key); req->data = m_storage.ptr(m_key);
@@ -457,7 +593,23 @@ void Client::connect(sockaddr *addr)
} }
void Client::login() void xmrig::Client::handshake()
{
# ifndef XMRIG_NO_TLS
if (isTLS()) {
m_expire = uv_now(uv_default_loop()) + kResponseTimeout;
m_tls->handshake();
}
else
# endif
{
login();
}
}
void xmrig::Client::login()
{ {
using namespace rapidjson; using namespace rapidjson;
m_results.clear(); m_results.clear();
@@ -478,20 +630,26 @@ void Client::login()
params.AddMember("rigid", StringRef(m_pool.rigId()), allocator); params.AddMember("rigid", StringRef(m_pool.rigId()), allocator);
} }
Value algo(kArrayType); # ifdef XMRIG_PROXY_PROJECT
if (m_pool.algorithm().variant() != xmrig::VARIANT_AUTO)
# endif
{
Value algo(kArrayType);
for (const auto &a : m_pool.algorithms()) { for (const auto &a : m_pool.algorithms()) {
algo.PushBack(StringRef(a.shortName()), allocator); algo.PushBack(StringRef(a.shortName()), allocator);
}
params.AddMember("algo", algo, allocator);
} }
params.AddMember("algo", algo, allocator);
doc.AddMember("params", params, allocator); doc.AddMember("params", params, allocator);
send(doc); send(doc);
} }
void Client::onClose() void xmrig::Client::onClose()
{ {
delete m_socket; delete m_socket;
@@ -499,11 +657,18 @@ void Client::onClose()
m_socket = nullptr; m_socket = nullptr;
setState(UnconnectedState); setState(UnconnectedState);
# ifndef XMRIG_NO_TLS
if (m_tls) {
delete m_tls;
m_tls = nullptr;
}
# endif
reconnect(); reconnect();
} }
void Client::parse(char *line, size_t len) void xmrig::Client::parse(char *line, size_t len)
{ {
startTimeout(); startTimeout();
@@ -542,7 +707,7 @@ void Client::parse(char *line, size_t len)
} }
void Client::parseExtensions(const rapidjson::Value &value) void xmrig::Client::parseExtensions(const rapidjson::Value &value)
{ {
m_extensions = 0; m_extensions = 0;
@@ -569,7 +734,7 @@ void Client::parseExtensions(const rapidjson::Value &value)
} }
void Client::parseNotification(const char *method, const rapidjson::Value &params, const rapidjson::Value &error) void xmrig::Client::parseNotification(const char *method, const rapidjson::Value &params, const rapidjson::Value &error)
{ {
if (error.IsObject()) { if (error.IsObject()) {
if (!isQuiet()) { if (!isQuiet()) {
@@ -595,7 +760,7 @@ void Client::parseNotification(const char *method, const rapidjson::Value &param
} }
void Client::parseResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error) void xmrig::Client::parseResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error)
{ {
if (error.IsObject()) { if (error.IsObject()) {
const char *message = error["message"].GetString(); const char *message = error["message"].GetString();
@@ -647,13 +812,42 @@ void Client::parseResponse(int64_t id, const rapidjson::Value &result, const rap
} }
void Client::ping() void xmrig::Client::ping()
{ {
send(snprintf(m_sendBuf, sizeof(m_sendBuf), "{\"id\":%" PRId64 ",\"jsonrpc\":\"2.0\",\"method\":\"keepalived\",\"params\":{\"id\":\"%s\"}}\n", m_sequence, m_rpcId.data())); send(snprintf(m_sendBuf, sizeof(m_sendBuf), "{\"id\":%" PRId64 ",\"jsonrpc\":\"2.0\",\"method\":\"keepalived\",\"params\":{\"id\":\"%s\"}}\n", m_sequence, m_rpcId.data()));
} }
void Client::reconnect() void xmrig::Client::read()
{
char* end;
char* start = m_recvBuf.base;
size_t remaining = m_recvBufPos;
while ((end = static_cast<char*>(memchr(start, '\n', remaining))) != nullptr) {
end++;
size_t len = end - start;
parse(start, len);
remaining -= len;
start = end;
}
if (remaining == 0) {
m_recvBufPos = 0;
return;
}
if (start == m_recvBuf.base) {
return;
}
memcpy(m_recvBuf.base, start, remaining);
m_recvBufPos = remaining;
}
void xmrig::Client::reconnect()
{ {
if (!m_listener) { if (!m_listener) {
m_storage.remove(m_key); m_storage.remove(m_key);
@@ -661,13 +855,14 @@ void Client::reconnect()
return; return;
} }
setState(ConnectingState);
m_keepAlive = 0; m_keepAlive = 0;
if (m_failures == -1) { if (m_failures == -1) {
return m_listener->onClose(this, -1); return m_listener->onClose(this, -1);
} }
setState(ConnectingState);
m_failures++; m_failures++;
m_listener->onClose(this, (int) m_failures); m_listener->onClose(this, (int) m_failures);
@@ -675,9 +870,9 @@ void Client::reconnect()
} }
void Client::setState(SocketState state) void xmrig::Client::setState(SocketState state)
{ {
LOG_DEBUG("[%s] state: %d", m_pool.url(), state); LOG_DEBUG("[%s] state: \"%s\"", m_pool.url(), states[state]);
if (m_state == state) { if (m_state == state) {
return; return;
@@ -687,7 +882,7 @@ void Client::setState(SocketState state)
} }
void Client::startTimeout() void xmrig::Client::startTimeout()
{ {
m_expire = 0; m_expire = 0;
@@ -697,7 +892,7 @@ void Client::startTimeout()
} }
void Client::onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) void xmrig::Client::onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
{ {
auto client = getClient(handle->data); auto client = getClient(handle->data);
if (!client) { if (!client) {
@@ -709,7 +904,7 @@ void Client::onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t
} }
void Client::onClose(uv_handle_t *handle) void xmrig::Client::onClose(uv_handle_t *handle)
{ {
auto client = getClient(handle->data); auto client = getClient(handle->data);
if (!client) { if (!client) {
@@ -720,7 +915,7 @@ void Client::onClose(uv_handle_t *handle)
} }
void Client::onConnect(uv_connect_t *req, int status) void xmrig::Client::onConnect(uv_connect_t *req, int status)
{ {
auto client = getClient(req->data); auto client = getClient(req->data);
if (!client) { if (!client) {
@@ -745,11 +940,11 @@ void Client::onConnect(uv_connect_t *req, int status)
uv_read_start(client->m_stream, Client::onAllocBuffer, Client::onRead); uv_read_start(client->m_stream, Client::onAllocBuffer, Client::onRead);
delete req; delete req;
client->login(); client->handshake();
} }
void Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) void xmrig::Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
{ {
auto client = getClient(stream->data); auto client = getClient(stream->data);
if (!client) { if (!client) {
@@ -757,7 +952,7 @@ void Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
} }
if (nread < 0) { if (nread < 0) {
if (nread != UV_EOF && !client->isQuiet()) { if (!client->isQuiet()) {
LOG_ERR("[%s] read error: \"%s\"", client->m_pool.url(), uv_strerror((int) nread)); LOG_ERR("[%s] read error: \"%s\"", client->m_pool.url(), uv_strerror((int) nread));
} }
@@ -777,34 +972,22 @@ void Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
client->m_recvBufPos += nread; client->m_recvBufPos += nread;
char* end; # ifndef XMRIG_NO_TLS
char* start = client->m_recvBuf.base; if (client->isTLS()) {
size_t remaining = client->m_recvBufPos; LOG_DEBUG("[%s] TLS received (%d bytes)", client->m_pool.url(), static_cast<int>(nread));
while ((end = static_cast<char*>(memchr(start, '\n', remaining))) != nullptr) { client->m_tls->read(client->m_recvBuf.base, client->m_recvBufPos);
end++;
size_t len = end - start;
client->parse(start, len);
remaining -= len;
start = end;
}
if (remaining == 0) {
client->m_recvBufPos = 0; client->m_recvBufPos = 0;
return;
} }
else
if (start == client->m_recvBuf.base) { # endif
return; {
client->read();
} }
memcpy(client->m_recvBuf.base, start, remaining);
client->m_recvBufPos = remaining;
} }
void Client::onResolved(uv_getaddrinfo_t *req, int status, struct addrinfo *res) void xmrig::Client::onResolved(uv_getaddrinfo_t *req, int status, struct addrinfo *res)
{ {
auto client = getClient(req->data); auto client = getClient(req->data);
if (!client) { if (!client) {

View File

@@ -5,7 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * 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 * 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
@@ -21,8 +22,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __CLIENT_H__ #ifndef XMRIG_CLIENT_H
#define __CLIENT_H__ #define XMRIG_CLIENT_H
#include <map> #include <map>
@@ -30,14 +31,21 @@
#include <vector> #include <vector>
#include "base/net/Pool.h"
#include "common/crypto/Algorithm.h"
#include "common/net/Id.h" #include "common/net/Id.h"
#include "common/net/Job.h" #include "common/net/Job.h"
#include "common/net/Pool.h"
#include "common/net/Storage.h" #include "common/net/Storage.h"
#include "common/net/SubmitResult.h" #include "common/net/SubmitResult.h"
#include "rapidjson/fwd.h" #include "rapidjson/fwd.h"
typedef struct bio_st BIO;
namespace xmrig {
class IClientListener; class IClientListener;
class JobResult; class JobResult;
@@ -53,12 +61,20 @@ public:
ClosingState ClosingState
}; };
constexpr static int kResponseTimeout = 20 * 1000; constexpr static int kResponseTimeout = 20 * 1000;
# ifndef XMRIG_NO_TLS
constexpr static int kInputBufferSize = 1024 * 16;
# else
constexpr static int kInputBufferSize = 1024 * 2;
# endif
Client(int id, const char *agent, IClientListener *listener); Client(int id, const char *agent, IClientListener *listener);
~Client(); ~Client();
bool disconnect(); bool disconnect();
const char *tlsFingerprint() const;
const char *tlsVersion() const;
int64_t submit(const JobResult &result); int64_t submit(const JobResult &result);
void connect(); void connect();
void connect(const Pool &pool); void connect(const Pool &pool);
@@ -66,18 +82,22 @@ public:
void setPool(const Pool &pool); void setPool(const Pool &pool);
void tick(uint64_t now); void tick(uint64_t now);
inline bool isReady() const { return m_state == ConnectedState && m_failures == 0; } inline bool isReady() const { return m_state == ConnectedState && m_failures == 0; }
inline const char *host() const { return m_pool.host(); } inline const char *host() const { return m_pool.host(); }
inline const char *ip() const { return m_ip; } inline const char *ip() const { return m_ip; }
inline const Job &job() const { return m_job; } inline const Job &job() const { return m_job; }
inline int id() const { return m_id; } inline int id() const { return m_id; }
inline SocketState state() const { return m_state; } inline SocketState state() const { return m_state; }
inline uint16_t port() const { return m_pool.port(); } inline uint16_t port() const { return m_pool.port(); }
inline void setQuiet(bool quiet) { m_quiet = quiet; } inline void setAlgo(const Algorithm &algo) { m_pool.setAlgo(algo); }
inline void setRetries(int retries) { m_retries = retries; } inline void setQuiet(bool quiet) { m_quiet = quiet; }
inline void setRetryPause(int ms) { m_retryPause = ms; } inline void setRetries(int retries) { m_retries = retries; }
inline void setRetryPause(int ms) { m_retryPause = ms; }
private: private:
class Tls;
enum Extensions { enum Extensions {
NicehashExt = 1, NicehashExt = 1,
AlgoExt = 2 AlgoExt = 2
@@ -85,14 +105,17 @@ private:
bool close(); bool close();
bool isCriticalError(const char *message); bool isCriticalError(const char *message);
bool isTLS() const;
bool parseJob(const rapidjson::Value &params, int *code); bool parseJob(const rapidjson::Value &params, int *code);
bool parseLogin(const rapidjson::Value &result, int *code); bool parseLogin(const rapidjson::Value &result, int *code);
bool verifyAlgorithm(const xmrig::Algorithm &algorithm) const; bool send(BIO *bio);
bool verifyAlgorithm(const Algorithm &algorithm) const;
int resolve(const char *host); int resolve(const char *host);
int64_t send(const rapidjson::Document &doc); int64_t send(const rapidjson::Document &doc);
int64_t send(size_t size); int64_t send(size_t size);
void connect(const std::vector<addrinfo*> &ipv4, const std::vector<addrinfo*> &ipv6); void connect(const std::vector<addrinfo*> &ipv4, const std::vector<addrinfo*> &ipv6);
void connect(sockaddr *addr); void connect(sockaddr *addr);
void handshake();
void login(); void login();
void onClose(); void onClose();
void parse(char *line, size_t len); void parse(char *line, size_t len);
@@ -100,6 +123,7 @@ private:
void parseNotification(const char *method, const rapidjson::Value &params, const rapidjson::Value &error); void parseNotification(const char *method, const rapidjson::Value &params, const rapidjson::Value &error);
void parseResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error); void parseResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error);
void ping(); void ping();
void read();
void reconnect(); void reconnect();
void setState(SocketState state); void setState(SocketState state);
void startTimeout(); void startTimeout();
@@ -118,9 +142,9 @@ private:
bool m_ipv6; bool m_ipv6;
bool m_nicehash; bool m_nicehash;
bool m_quiet; bool m_quiet;
char m_buf[2048]; char m_buf[kInputBufferSize];
char m_ip[46]; char m_ip[46];
char m_sendBuf[768]; char m_sendBuf[2048];
const char *m_agent; const char *m_agent;
IClientListener *m_listener; IClientListener *m_listener;
int m_extensions; int m_extensions;
@@ -133,6 +157,7 @@ private:
size_t m_recvBufPos; size_t m_recvBufPos;
SocketState m_state; SocketState m_state;
std::map<int64_t, SubmitResult> m_results; std::map<int64_t, SubmitResult> m_results;
Tls *m_tls;
uint64_t m_expire; uint64_t m_expire;
uint64_t m_jobs; uint64_t m_jobs;
uint64_t m_keepAlive; uint64_t m_keepAlive;
@@ -141,11 +166,14 @@ private:
uv_getaddrinfo_t m_resolver; uv_getaddrinfo_t m_resolver;
uv_stream_t *m_stream; uv_stream_t *m_stream;
uv_tcp_t *m_socket; uv_tcp_t *m_socket;
xmrig::Id m_rpcId; Id m_rpcId;
static int64_t m_sequence; static int64_t m_sequence;
static xmrig::Storage<Client> m_storage; static Storage<Client> m_storage;
}; };
#endif /* __CLIENT_H__ */ } /* namespace xmrig */
#endif /* XMRIG_CLIENT_H */

View File

@@ -5,7 +5,7 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* 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
@@ -21,8 +21,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __ID_H__ #ifndef XMRIG_ID_H
#define __ID_H__ #define XMRIG_ID_H
#include <string.h> #include <string.h>
@@ -95,4 +95,4 @@ private:
} /* namespace xmrig */ } /* namespace xmrig */
#endif /* __ID_H__ */ #endif /* XMRIG_ID_H */

View File

@@ -6,7 +6,8 @@
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd> * Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2018 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 * 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
@@ -30,7 +31,7 @@
#include "common/net/Job.h" #include "common/net/Job.h"
static inline unsigned char hf_hex2bin(char c, bool &err) unsigned char hf_hex2bin(char c, bool &err)
{ {
if (c >= '0' && c <= '9') { if (c >= '0' && c <= '9') {
return c - '0'; return c - '0';
@@ -47,7 +48,7 @@ static inline unsigned char hf_hex2bin(char c, bool &err)
} }
static inline char hf_bin2hex(unsigned char c) char hf_bin2hex(unsigned char c)
{ {
if (c <= 0x9) { if (c <= 0x9) {
return '0' + c; return '0' + c;
@@ -57,19 +58,22 @@ static inline char hf_bin2hex(unsigned char c)
} }
Job::Job() : xmrig::Job::Job() :
m_autoVariant(false),
m_nicehash(false), m_nicehash(false),
m_poolId(-2), m_poolId(-2),
m_threadId(-1), m_threadId(-1),
m_size(0), m_size(0),
m_diff(0), m_diff(0),
m_target(0), m_target(0),
m_blob() m_blob(),
m_height(0)
{ {
} }
Job::Job(int poolId, bool nicehash, xmrig::Algorithm algorithm, const xmrig::Id &clientId) : xmrig::Job::Job(int poolId, bool nicehash, const Algorithm &algorithm, const Id &clientId) :
m_autoVariant(algorithm.variant() == VARIANT_AUTO),
m_nicehash(nicehash), m_nicehash(nicehash),
m_poolId(poolId), m_poolId(poolId),
m_threadId(-1), m_threadId(-1),
@@ -77,18 +81,25 @@ Job::Job(int poolId, bool nicehash, xmrig::Algorithm algorithm, const xmrig::Id
m_diff(0), m_diff(0),
m_target(0), m_target(0),
m_blob(), m_blob(),
m_height(0),
m_algorithm(algorithm), m_algorithm(algorithm),
m_clientId(clientId) m_clientId(clientId)
{ {
} }
Job::~Job() xmrig::Job::~Job()
{ {
} }
bool Job::setBlob(const char *blob) bool xmrig::Job::isEqual(const Job &other) const
{
return m_id == other.m_id && m_clientId == other.m_clientId && memcmp(m_blob, other.m_blob, sizeof(m_blob)) == 0;
}
bool xmrig::Job::setBlob(const char *blob)
{ {
if (!blob) { if (!blob) {
return false; return false;
@@ -112,6 +123,22 @@ bool Job::setBlob(const char *blob)
m_nicehash = true; m_nicehash = true;
} }
if (m_autoVariant) {
m_algorithm.setVariant(variant());
}
if (!m_algorithm.isForced()) {
if (m_algorithm.variant() == VARIANT_XTL && m_blob[0] >= 9) {
m_algorithm.setVariant(VARIANT_HALF);
}
else if (m_algorithm.variant() == VARIANT_MSR && m_blob[0] >= 8) {
m_algorithm.setVariant(VARIANT_HALF);
}
else if (m_algorithm.variant() == VARIANT_WOW && m_blob[0] < 11) {
m_algorithm.setVariant(VARIANT_2);
}
}
# ifdef XMRIG_PROXY_PROJECT # ifdef XMRIG_PROXY_PROJECT
memset(m_rawBlob, 0, sizeof(m_rawBlob)); memset(m_rawBlob, 0, sizeof(m_rawBlob));
memcpy(m_rawBlob, blob, m_size * 2); memcpy(m_rawBlob, blob, m_size * 2);
@@ -121,7 +148,7 @@ bool Job::setBlob(const char *blob)
} }
bool Job::setTarget(const char *target) bool xmrig::Job::setTarget(const char *target)
{ {
if (!target) { if (!target) {
return false; return false;
@@ -163,29 +190,23 @@ bool Job::setTarget(const char *target)
} }
xmrig::Variant Job::variant() const void xmrig::Job::setAlgorithm(const char *algo)
{ {
if (m_algorithm.algo() == xmrig::CRYPTONIGHT_HEAVY) { m_algorithm.parseAlgorithm(algo);
return xmrig::VARIANT_0;
}
if (m_algorithm.variant() == xmrig::VARIANT_XTL && m_blob[0] < 4) {
return xmrig::VARIANT_1;
}
if (m_algorithm.variant() == xmrig::VARIANT_AUTO) { if (m_algorithm.variant() == xmrig::VARIANT_AUTO) {
if (m_algorithm.algo() == xmrig::CRYPTONIGHT) { m_algorithm.setVariant(variant());
return xmrig::VARIANT_1;
}
return (m_blob[0] > 6 ? xmrig::VARIANT_1 : xmrig::VARIANT_0);
} }
return m_algorithm.variant();
} }
bool Job::fromHex(const char* in, unsigned int len, unsigned char* out) void xmrig::Job::setHeight(uint64_t height)
{
m_height = height;
}
bool xmrig::Job::fromHex(const char* in, unsigned int len, unsigned char* out)
{ {
bool error = false; bool error = false;
for (unsigned int i = 0; i < len; i += 2) { for (unsigned int i = 0; i < len; i += 2) {
@@ -199,7 +220,7 @@ bool Job::fromHex(const char* in, unsigned int len, unsigned char* out)
} }
void Job::toHex(const unsigned char* in, unsigned int len, char* out) void xmrig::Job::toHex(const unsigned char* in, unsigned int len, char* out)
{ {
for (unsigned int i = 0; i < len; i++) { for (unsigned int i = 0; i < len; i++) {
out[i * 2] = hf_bin2hex((in[i] & 0xF0) >> 4); out[i * 2] = hf_bin2hex((in[i] & 0xF0) >> 4);
@@ -209,7 +230,7 @@ void Job::toHex(const unsigned char* in, unsigned int len, char* out)
#ifdef APP_DEBUG #ifdef APP_DEBUG
char *Job::toHex(const unsigned char* in, unsigned int len) char *xmrig::Job::toHex(const unsigned char* in, unsigned int len)
{ {
char *out = new char[len * 2 + 1](); char *out = new char[len * 2 + 1]();
toHex(in, len, out); toHex(in, len, out);
@@ -219,13 +240,21 @@ char *Job::toHex(const unsigned char* in, unsigned int len)
#endif #endif
bool Job::operator==(const Job &other) const xmrig::Variant xmrig::Job::variant() const
{ {
return m_id == other.m_id && memcmp(m_blob, other.m_blob, sizeof(m_blob)) == 0; switch (m_algorithm.algo()) {
} case CRYPTONIGHT:
return (m_blob[0] >= 10) ? VARIANT_4 : ((m_blob[0] >= 8) ? VARIANT_2 : VARIANT_1);
case CRYPTONIGHT_LITE:
return VARIANT_1;
bool Job::operator!=(const Job &other) const case CRYPTONIGHT_HEAVY:
{ return VARIANT_0;
return m_id != other.m_id || memcmp(m_blob, other.m_blob, sizeof(m_blob)) != 0;
default:
break;
}
return m_algorithm.variant();
} }

Some files were not shown because too many files have changed in this diff Show More