Bitcoin
system.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2019 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 
10 #ifndef BITCOIN_UTIL_SYSTEM_H
11 #define BITCOIN_UTIL_SYSTEM_H
12 
13 #if defined(HAVE_CONFIG_H)
14 #include <config/bitcoin-config.h>
15 #endif
16 
17 #include <attributes.h>
18 #include <compat.h>
19 #include <compat/assumptions.h>
20 #include <fs.h>
21 #include <logging.h>
22 #include <sync.h>
23 #include <tinyformat.h>
24 #include <util/memory.h>
25 #include <util/threadnames.h>
26 #include <util/time.h>
27 
28 #include <exception>
29 #include <map>
30 #include <set>
31 #include <stdint.h>
32 #include <string>
33 #include <utility>
34 #include <vector>
35 
36 #include <boost/thread/condition_variable.hpp> // for boost::thread_interrupted
37 
38 // Application startup time (used for uptime calculation)
40 
41 extern const char * const BITCOIN_CONF_FILENAME;
42 
44 const extern std::function<std::string(const char*)> G_TRANSLATION_FUN;
45 
50 inline std::string _(const char* psz)
51 {
52  return G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(psz) : psz;
53 }
54 
55 void SetupEnvironment();
56 bool SetupNetworking();
57 
58 template<typename... Args>
59 bool error(const char* fmt, const Args&... args)
60 {
61  LogPrintf("ERROR: %s\n", tfm::format(fmt, args...));
62  return false;
63 }
64 
65 void PrintExceptionContinue(const std::exception *pex, const char* pszThread);
66 bool FileCommit(FILE *file);
67 bool TruncateFile(FILE *file, unsigned int length);
68 int RaiseFileDescriptorLimit(int nMinFD);
69 void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length);
70 bool RenameOver(fs::path src, fs::path dest);
71 bool LockDirectory(const fs::path& directory, const std::string lockfile_name, bool probe_only=false);
72 void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name);
73 bool DirIsWritable(const fs::path& directory);
74 bool CheckDiskSpace(const fs::path& dir, uint64_t additional_bytes = 0);
75 
80 
81 bool TryCreateDirectories(const fs::path& p);
82 fs::path GetDefaultDataDir();
83 // The blocks directory is always net specific.
84 const fs::path &GetBlocksDir();
85 const fs::path &GetDataDir(bool fNetSpecific = true);
87 void ClearDatadirCache();
88 fs::path GetConfigFile(const std::string& confPath);
89 #ifdef WIN32
90 fs::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
91 #endif
92 #if HAVE_SYSTEM
93 void runCommand(const std::string& strCommand);
94 #endif
95 
104 fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific = true);
105 
106 inline bool IsSwitchChar(char c)
107 {
108 #ifdef WIN32
109  return c == '-' || c == '/';
110 #else
111  return c == '-';
112 #endif
113 }
114 
115 enum class OptionsCategory {
116  OPTIONS,
117  CONNECTION,
118  WALLET,
120  ZMQ,
121  DEBUG_TEST,
122  CHAINPARAMS,
123  NODE_RELAY,
125  RPC,
126  GUI,
127  COMMANDS,
129 
130  HIDDEN // Always the last option to avoid printing these in the help
131 };
132 
134 {
135  std::string m_name;
136  std::string m_file;
137  int m_line;
138 };
139 
141 {
142 protected:
143  friend class ArgsManagerHelper;
144 
145  struct Arg
146  {
147  std::string m_help_param;
148  std::string m_help_text;
150 
151  Arg(const std::string& help_param, const std::string& help_text, bool debug_only) : m_help_param(help_param), m_help_text(help_text), m_debug_only(debug_only) {};
152  };
153 
155  std::map<std::string, std::vector<std::string>> m_override_args GUARDED_BY(cs_args);
156  std::map<std::string, std::vector<std::string>> m_config_args GUARDED_BY(cs_args);
157  std::string m_network GUARDED_BY(cs_args);
158  std::set<std::string> m_network_only_args GUARDED_BY(cs_args);
159  std::map<OptionsCategory, std::map<std::string, Arg>> m_available_args GUARDED_BY(cs_args);
160  std::list<SectionInfo> m_config_sections GUARDED_BY(cs_args);
161 
162  NODISCARD bool ReadConfigStream(std::istream& stream, const std::string& filepath, std::string& error, bool ignore_invalid_keys = false);
163 
164 public:
165  ArgsManager();
166 
170  void SelectConfigNetwork(const std::string& network);
171 
172  NODISCARD bool ParseParameters(int argc, const char* const argv[], std::string& error);
173  NODISCARD bool ReadConfigFiles(std::string& error, bool ignore_invalid_keys = false);
174 
181  const std::set<std::string> GetUnsuitableSectionOnlyArgs() const;
182 
186  const std::list<SectionInfo> GetUnrecognizedSections() const;
187 
194  std::vector<std::string> GetArgs(const std::string& strArg) const;
195 
202  bool IsArgSet(const std::string& strArg) const;
203 
211  bool IsArgNegated(const std::string& strArg) const;
212 
220  std::string GetArg(const std::string& strArg, const std::string& strDefault) const;
221 
229  int64_t GetArg(const std::string& strArg, int64_t nDefault) const;
230 
238  bool GetBoolArg(const std::string& strArg, bool fDefault) const;
239 
247  bool SoftSetArg(const std::string& strArg, const std::string& strValue);
248 
256  bool SoftSetBoolArg(const std::string& strArg, bool fValue);
257 
258  // Forces an arg setting. Called by SoftSetArg() if the arg hasn't already
259  // been set. Also called directly in testing.
260  void ForceSetArg(const std::string& strArg, const std::string& strValue);
261 
266  std::string GetChainName() const;
267 
271  void AddArg(const std::string& name, const std::string& help, const bool debug_only, const OptionsCategory& cat);
272 
276  void AddHiddenArgs(const std::vector<std::string>& args);
277 
281  void ClearArgs() {
282  LOCK(cs_args);
283  m_available_args.clear();
284  }
285 
289  std::string GetHelpMessage() const;
290 
294  bool IsArgKnown(const std::string& key) const;
295 };
296 
297 extern ArgsManager gArgs;
298 
302 bool HelpRequested(const ArgsManager& args);
303 
306 
313 std::string HelpMessageGroup(const std::string& message);
314 
322 std::string HelpMessageOpt(const std::string& option, const std::string& message);
323 
328 int GetNumCores();
329 
333 template <typename Callable> void TraceThread(const char* name, Callable func)
334 {
336  try
337  {
338  LogPrintf("%s thread start\n", name);
339  func();
340  LogPrintf("%s thread exit\n", name);
341  }
342  catch (const boost::thread_interrupted&)
343  {
344  LogPrintf("%s thread interrupt\n", name);
345  throw;
346  }
347  catch (const std::exception& e) {
349  throw;
350  }
351  catch (...) {
352  PrintExceptionContinue(nullptr, name);
353  throw;
354  }
355 }
356 
357 std::string CopyrightHolders(const std::string& strPrefix);
358 
367 
368 namespace util {
369 
371 template <typename Tdst, typename Tsrc>
372 inline void insert(Tdst& dst, const Tsrc& src) {
373  dst.insert(dst.begin(), src.begin(), src.end());
374 }
375 template <typename TsetT, typename Tsrc>
376 inline void insert(std::set<TsetT>& dst, const Tsrc& src) {
377  dst.insert(src.begin(), src.end());
378 }
379 
380 #ifdef WIN32
381 class WinCmdLineArgs
382 {
383 public:
384  WinCmdLineArgs();
385  ~WinCmdLineArgs();
386  std::pair<int, char**> get();
387 
388 private:
389  int argc;
390  char** argv;
391  std::vector<std::string> args;
392 };
393 #endif
394 
395 } // namespace util
396 
397 #endif // BITCOIN_UTIL_SYSTEM_H
fs::path AbsPathForConfigVal(const fs::path &path, bool net_specific=true)
Definition: system.cpp:1203
const std::function< std::string(const char *)> G_TRANSLATION_FUN
Definition: bitcoin-cli.cpp:29
bool TruncateFile(FILE *file, unsigned int length)
Definition: system.cpp:1022
Definition: system.cpp:1222
void SetupEnvironment()
Definition: system.cpp:1131
void ClearArgs()
Definition: system.h:281
ArgsManager()
Definition: system.cpp:309
fs::path GetConfigFile(const std::string &confPath)
Definition: system.cpp:773
Definition: system.h:145
void SelectConfigNetwork(const std::string &network)
Definition: system.cpp:373
void ThreadRename(std::string &&)
Definition: threadnames.cpp:58
bool IsArgNegated(const std::string &strArg) const
Definition: system.cpp:476
Definition: system.cpp:165
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Definition: system.cpp:494
static void LogPrintf(const char *fmt, const Args &... args)
Definition: logging.h:144
void insert(Tdst &dst, const Tsrc &src)
Simplification of std insertion.
Definition: system.h:372
bool RenameOver(fs::path src, fs::path dest)
Definition: system.cpp:959
const fs::path & GetBlocksDir()
Definition: system.cpp:710
void SetupHelpOptions(ArgsManager &args)
Definition: system.cpp:635
void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length)
Definition: system.cpp:1057
CCriticalSection cs_args
Definition: system.h:154
void PrintExceptionContinue(const std::exception *pex, const char *pszThread)
Definition: system.cpp:672
bool DirIsWritable(const fs::path &directory)
Definition: system.cpp:119
std::vector< std::string > GetArgs(const std::string &strArg) const
Definition: system.cpp:451
int RaiseFileDescriptorLimit(int nMinFD)
Definition: system.cpp:1034
const fs::path & GetDataDir(bool fNetSpecific=true)
Definition: system.cpp:735
std::string GetChainName() const
Definition: system.cpp:944
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Definition: system.cpp:510
int64_t GetStartupTime()
Definition: system.cpp:1198
args
Definition: filter-lcov.py:10
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Definition: system.cpp:518
void AddArg(const std::string &name, const std::string &help, const bool debug_only, const OptionsCategory &cat)
Definition: system.cpp:540
std::string m_help_param
Definition: system.h:147
const std::list< SectionInfo > GetUnrecognizedSections() const
Definition: system.cpp:358
void ForceSetArg(const std::string &strArg, const std::string &strValue)
Definition: system.cpp:534
const char *const BITCOIN_CONF_FILENAME
Definition: system.cpp:70
bool FileCommit(FILE *file)
Definition: system.cpp:989
NODISCARD bool ReadConfigStream(std::istream &stream, const std::string &filepath, std::string &error, bool ignore_invalid_keys=false)
Definition: system.cpp:833
bool CheckDiskSpace(const fs::path &dir, uint64_t additional_bytes=0)
Definition: system.cpp:132
#define NODISCARD
Definition: attributes.h:18
#define LOCK(cs)
Definition: sync.h:182
const char * name
Definition: rest.cpp:39
unsigned long long uint64_t
Definition: stdint.h:22
void format(std::ostream &out, const char *fmt, const Args &... args)
Format list of arguments to the stream according to given format string.
Definition: tinyformat.h:967
bool HelpRequested(const ArgsManager &args)
Definition: system.cpp:630
bool IsArgSet(const std::string &strArg) const
Definition: system.cpp:470
std::string m_file
Definition: system.h:136
bool IsArgKnown(const std::string &key) const
Definition: system.cpp:434
int m_line
Definition: system.h:137
Definition: system.h:133
UniValue help(const JSONRPCRequest &jsonRequest)
Definition: server.cpp:132
void TraceThread(const char *name, Callable func)
Definition: system.h:333
std::string HelpMessageGroup(const std::string &message)
Definition: system.cpp:645
std::string _(const char *psz)
Definition: system.h:50
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Definition: system.cpp:526
file
Definition: linearize-hashes.py:138
std::string m_help_text
Definition: system.h:148
fs::path GetDefaultDataDir()
Definition: system.cpp:679
void ClearDatadirCache()
Definition: system.cpp:764
std::string GetHelpMessage() const
Definition: system.cpp:561
void UnlockDirectory(const fs::path &directory, const std::string &lockfile_name)
Definition: system.cpp:107
std::map< std::string, std::vector< std::string > > m_override_args GUARDED_BY(cs_args)
int ScheduleBatchPriority()
Definition: system.cpp:1208
signed long long int64_t
Definition: stdint.h:18
bool m_debug_only
Definition: system.h:149
bool TryCreateDirectories(const fs::path &p)
Definition: system.cpp:975
bool IsSwitchChar(char c)
Definition: system.h:106
OptionsCategory
Definition: system.h:115
void AddHiddenArgs(const std::vector< std::string > &args)
Definition: system.cpp:554
std::string CopyrightHolders(const std::string &strPrefix)
Definition: system.cpp:1185
NODISCARD bool ParseParameters(int argc, const char *const argv[], std::string &error)
Definition: system.cpp:379
Arg(const std::string &help_param, const std::string &help_text, bool debug_only)
Definition: system.h:151
std::string HelpMessageOpt(const std::string &option, const std::string &message)
Definition: system.cpp:649
NODISCARD bool ReadConfigFiles(std::string &error, bool ignore_invalid_keys=false)
Definition: system.cpp:863
bool LockDirectory(const fs::path &directory, const std::string lockfile_name, bool probe_only=false)
Definition: system.cpp:83
ArgsManager gArgs
Definition: system.cpp:72
bool error(const char *fmt, const Args &... args)
Definition: system.h:59
void ReleaseDirectoryLocks()
Definition: system.cpp:113
const std::set< std::string > GetUnsuitableSectionOnlyArgs() const
Definition: system.cpp:325
int GetNumCores()
Definition: system.cpp:1180
bool SetupNetworking()
Definition: system.cpp:1168
key
Definition: extract_strings_qt.py:80
Definition: system.h:140
std::string m_name
Definition: system.h:135