Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto 2 : : // Copyright (c) 2009-present The Bitcoin Core developers 3 : : // Distributed under the MIT software license, see the accompanying 4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 5 : : 6 : : #include <common/system.h> 7 : : 8 : : #include <logging.h> 9 : : #include <util/string.h> 10 : : #include <util/time.h> 11 : : 12 : : #ifndef WIN32 13 : : #include <sys/stat.h> 14 : : #else 15 : : #include <compat/compat.h> 16 : : #include <codecvt> 17 : : #endif 18 : : 19 : : #ifdef HAVE_MALLOPT_ARENA_MAX 20 : : #include <malloc.h> 21 : : #endif 22 : : 23 : : #include <cstdlib> 24 : : #include <locale> 25 : : #include <stdexcept> 26 : : #include <string> 27 : : #include <thread> 28 : : 29 : : // Application startup time (used for uptime calculation) 30 : 2 : const int64_t nStartupTime = GetTime(); 31 : : 32 : : #ifndef WIN32 33 : 0 : std::string ShellEscape(const std::string& arg) 34 : : { 35 : 0 : std::string escaped = arg; 36 [ # # ][ # # ]: 0 : ReplaceAll(escaped, "'", "'\"'\"'"); [ # # ] 37 [ # # ][ # # ]: 0 : return "'" + escaped + "'"; 38 : 0 : } 39 : : #endif 40 : : 41 : : #if HAVE_SYSTEM 42 : 0 : void runCommand(const std::string& strCommand) 43 : : { 44 [ # # ]: 0 : if (strCommand.empty()) return; 45 : : #ifndef WIN32 46 : 0 : int nErr = ::system(strCommand.c_str()); 47 : : #else 48 : : int nErr = ::_wsystem(std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t>().from_bytes(strCommand).c_str()); 49 : : #endif 50 [ # # ]: 0 : if (nErr) 51 [ # # ][ # # ]: 0 : LogPrintf("runCommand error: system(%s) returned %d\n", strCommand, nErr); [ # # ] 52 : 0 : } 53 : : #endif 54 : : 55 : 0 : void SetupEnvironment() 56 : : { 57 : : #ifdef HAVE_MALLOPT_ARENA_MAX 58 : : // glibc-specific: On 32-bit systems set the number of arenas to 1. 59 : : // By default, since glibc 2.10, the C library will create up to two heap 60 : : // arenas per core. This is known to cause excessive virtual address space 61 : : // usage in our usage. Work around it by setting the maximum number of 62 : : // arenas to 1. 63 : : if (sizeof(void*) == 4) { 64 : : mallopt(M_ARENA_MAX, 1); 65 : : } 66 : : #endif 67 : : // On most POSIX systems (e.g. Linux, but not BSD) the environment's locale 68 : : // may be invalid, in which case the "C.UTF-8" locale is used as fallback. 69 : : #if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) 70 : : try { 71 [ # # ]: 0 : std::locale(""); // Raises a runtime error if current locale is invalid 72 [ # # ]: 0 : } catch (const std::runtime_error&) { 73 : 0 : setenv("LC_ALL", "C.UTF-8", 1); 74 : 0 : } 75 : : #elif defined(WIN32) 76 : : // Set the default input/output charset is utf-8 77 : : SetConsoleCP(CP_UTF8); 78 : : SetConsoleOutputCP(CP_UTF8); 79 : : #endif 80 : : 81 : : #ifndef WIN32 82 : 0 : constexpr mode_t private_umask = 0077; 83 : 0 : umask(private_umask); 84 : : #endif 85 : 0 : } 86 : : 87 : 2 : bool SetupNetworking() 88 : : { 89 : : #ifdef WIN32 90 : : // Initialize Windows Sockets 91 : : WSADATA wsadata; 92 : : int ret = WSAStartup(MAKEWORD(2,2), &wsadata); 93 : : if (ret != NO_ERROR || LOBYTE(wsadata.wVersion ) != 2 || HIBYTE(wsadata.wVersion) != 2) 94 : : return false; 95 : : #endif 96 : 2 : return true; 97 : : } 98 : : 99 : 0 : int GetNumCores() 100 : : { 101 : 0 : return std::thread::hardware_concurrency(); 102 : : } 103 : : 104 : : // Obtain the application startup time (used for uptime calculation) 105 : 0 : int64_t GetStartupTime() 106 : : { 107 : 0 : return nStartupTime; 108 : : }