From 37be21c1e49d756db4aee08f856bfeca4b30a9cc Mon Sep 17 00:00:00 2001 From: vd Date: Sun, 12 Nov 2017 15:22:15 +0000 Subject: net-p2p/monero-cli: Implement missing miner functions --- net-p2p/monero-cli/Makefile | 1 + .../files/patch-src_cryptonote_basic_miner.cpp | 194 +++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 net-p2p/monero-cli/files/patch-src_cryptonote_basic_miner.cpp (limited to 'net-p2p') diff --git a/net-p2p/monero-cli/Makefile b/net-p2p/monero-cli/Makefile index 7767b038f59d..4d006e432f01 100644 --- a/net-p2p/monero-cli/Makefile +++ b/net-p2p/monero-cli/Makefile @@ -4,6 +4,7 @@ PORTNAME= monero-cli PORTVERSION= 0.11.1.0 DISTVERSIONPREFIX= v +PORTREVISION= 1 CATEGORIES= net-p2p finance MAINTAINER= vd@FreeBSD.org diff --git a/net-p2p/monero-cli/files/patch-src_cryptonote_basic_miner.cpp b/net-p2p/monero-cli/files/patch-src_cryptonote_basic_miner.cpp new file mode 100644 index 000000000000..925954f679d3 --- /dev/null +++ b/net-p2p/monero-cli/files/patch-src_cryptonote_basic_miner.cpp @@ -0,0 +1,194 @@ + +https://github.com/monero-project/monero/pull/2792 + +--- src/cryptonote_basic/miner.cpp.orig ++++ src/cryptonote_basic/miner.cpp +@@ -50,12 +50,25 @@ + #include + #include + #include + #include + #endif + ++#ifdef __FreeBSD__ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ + #undef MONERO_DEFAULT_LOG_CATEGORY + #define MONERO_DEFAULT_LOG_CATEGORY "miner" + + using namespace epee; + + #include "miner.h" +@@ -732,14 +745,12 @@ namespace cryptonote + + return true; + } + + #elif defined(__linux__) + +- const std::string STR_CPU("cpu"); +- const std::size_t STR_CPU_LEN = STR_CPU.size(); + const std::string STAT_FILE_PATH = "/proc/stat"; + + if( !epee::file_io_utils::is_file_exist(STAT_FILE_PATH) ) + { + LOG_ERROR("'" << STAT_FILE_PATH << "' file does not exist"); + return false; +@@ -782,15 +793,42 @@ namespace cryptonote + + idle_time = stats.cpu_ticks[CPU_STATE_IDLE]; + total_time = idle_time + stats.cpu_ticks[CPU_STATE_USER] + stats.cpu_ticks[CPU_STATE_SYSTEM]; + + return true; + ++ #elif defined(__FreeBSD__) ++ ++ struct statinfo s; ++ size_t n = sizeof(s.cp_time); ++ if( sysctlbyname("kern.cp_time", s.cp_time, &n, NULL, 0) == -1 ) ++ { ++ LOG_ERROR("sysctlbyname(\"kern.cp_time\"): " << strerror(errno)); ++ return false; ++ } ++ if( n != sizeof(s.cp_time) ) ++ { ++ LOG_ERROR("sysctlbyname(\"kern.cp_time\") output is unexpectedly " ++ << n << " bytes instead of the expected " << sizeof(s.cp_time) ++ << " bytes."); ++ return false; ++ } ++ ++ idle_time = s.cp_time[CP_IDLE]; ++ total_time = ++ s.cp_time[CP_USER] + ++ s.cp_time[CP_NICE] + ++ s.cp_time[CP_SYS] + ++ s.cp_time[CP_INTR] + ++ s.cp_time[CP_IDLE]; ++ ++ return true; ++ + #endif + +- return false; // unsupported systemm.. ++ return false; // unsupported system + } + //----------------------------------------------------------------------------------------------------- + bool miner::get_process_time(uint64_t& total_time) + { + #ifdef _WIN32 + +@@ -804,24 +842,24 @@ namespace cryptonote + ( (((uint64_t)(kernelTime.dwHighDateTime)) << 32) | ((uint64_t)kernelTime.dwLowDateTime) ) + + ( (((uint64_t)(userTime.dwHighDateTime)) << 32) | ((uint64_t)userTime.dwLowDateTime) ); + + return true; + } + +- #elif (defined(__linux__) && defined(_SC_CLK_TCK)) || defined(__APPLE__) ++ #elif (defined(__linux__) && defined(_SC_CLK_TCK)) || defined(__APPLE__) || defined(__FreeBSD__) + + struct tms tms; + if ( times(&tms) != (clock_t)-1 ) + { + total_time = tms.tms_utime + tms.tms_stime; + return true; + } + + #endif + +- return false; // unsupported system.. ++ return false; // unsupported system + } + //----------------------------------------------------------------------------------------------------- + uint8_t miner::get_percent_of_total(uint64_t other, uint64_t total) + { + return (uint8_t)( ceil( (other * 1.f / total * 1.f) * 100) ); + } +@@ -926,12 +964,76 @@ namespace cryptonote + if (boost::logic::indeterminate(on_battery)) + { + LOG_ERROR("couldn't query power status from " << power_supply_class_path); + } + return on_battery; + ++ #elif defined(__FreeBSD__) ++ int ac; ++ size_t n = sizeof(ac); ++ if( sysctlbyname("hw.acpi.acline", &ac, &n, NULL, 0) == -1 ) ++ { ++ if( errno != ENOENT ) ++ { ++ LOG_ERROR("Cannot query battery status: " ++ << "sysctlbyname(\"hw.acpi.acline\"): " << strerror(errno)); ++ return boost::logic::tribool(boost::logic::indeterminate); ++ } ++ ++ // If sysctl fails with ENOENT, then try querying /dev/apm. ++ ++ static const char* dev_apm = "/dev/apm"; ++ const int fd = open(dev_apm, O_RDONLY); ++ if( fd == -1 ) { ++ LOG_ERROR("Cannot query battery status: " ++ << "open(): " << dev_apm << ": " << strerror(errno)); ++ return boost::logic::tribool(boost::logic::indeterminate); ++ } ++ ++ apm_info info; ++ if( ioctl(fd, APMIO_GETINFO, &info) == -1 ) { ++ close(fd); ++ LOG_ERROR("Cannot query battery status: " ++ << "ioctl(" << dev_apm << ", APMIO_GETINFO): " << strerror(errno)); ++ return boost::logic::tribool(boost::logic::indeterminate); ++ } ++ ++ close(fd); ++ ++ // See apm(8). ++ switch( info.ai_acline ) ++ { ++ case 0: // off-line ++ case 2: // backup power ++ return boost::logic::tribool(true); ++ case 1: // on-line ++ return boost::logic::tribool(false); ++ } ++ switch( info.ai_batt_stat ) ++ { ++ case 0: // high ++ case 1: // low ++ case 2: // critical ++ return boost::logic::tribool(true); ++ case 3: // charging ++ return boost::logic::tribool(false); ++ } ++ ++ LOG_ERROR("Cannot query battery status: " ++ << "sysctl hw.acpi.acline is not available and /dev/apm returns " ++ << "unexpected ac-line status (" << info.ai_acline << ") and " ++ << "battery status (" << info.ai_batt_stat << ")."); ++ return boost::logic::tribool(boost::logic::indeterminate); ++ } ++ if( n != sizeof(ac) ) ++ { ++ LOG_ERROR("sysctlbyname(\"hw.acpi.acline\") output is unexpectedly " ++ << n << " bytes instead of the expected " << sizeof(ac) << " bytes."); ++ return boost::logic::tribool(boost::logic::indeterminate); ++ } ++ return boost::logic::tribool(ac == 0); + #endif + + LOG_ERROR("couldn't query power status"); + return boost::logic::tribool(boost::logic::indeterminate); + } + } -- cgit