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