Dash Core  0.12.2.1
P2P Digital Currency
util.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2015 The Bitcoin Core developers
3 // Copyright (c) 2014-2017 The Dash Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
11 #ifndef BITCOIN_UTIL_H
12 #define BITCOIN_UTIL_H
13 
14 #if defined(HAVE_CONFIG_H)
15 #include "config/dash-config.h"
16 #endif
17 
18 #include "compat.h"
19 #include "tinyformat.h"
20 #include "utiltime.h"
21 #include "amount.h"
22 
23 #include <exception>
24 #include <map>
25 #include <stdint.h>
26 #include <string>
27 #include <vector>
28 
29 #include <boost/filesystem/path.hpp>
30 #include <boost/signals2/signal.hpp>
31 #include <boost/thread/exceptions.hpp>
32 
33 // Debugging macros
34 
35 // Uncomment the following line to enable debugging messages
36 // or enable on a per file basis prior to inclusion of util.h
37 //#define ENABLE_DASH_DEBUG
38 #ifdef ENABLE_DASH_DEBUG
39 #define DBG( x ) x
40 #else
41 #define DBG( x )
42 #endif
43 
44 //Dash only features
45 
46 extern bool fMasterNode;
47 extern bool fLiteMode;
48 extern int nWalletBackups;
49 
50 static const bool DEFAULT_LOGTIMEMICROS = false;
51 static const bool DEFAULT_LOGIPS = false;
52 static const bool DEFAULT_LOGTIMESTAMPS = true;
53 static const bool DEFAULT_LOGTHREADNAMES = false;
54 
57 {
58 public:
60  boost::signals2::signal<std::string (const char* psz)> Translate;
61 };
62 
63 extern std::map<std::string, std::string> mapArgs;
64 extern std::map<std::string, std::vector<std::string> > mapMultiArgs;
65 extern bool fDebug;
66 extern bool fPrintToConsole;
67 extern bool fPrintToDebugLog;
68 extern bool fServer;
69 extern std::string strMiscWarning;
70 extern bool fLogTimestamps;
71 extern bool fLogTimeMicros;
72 extern bool fLogThreadNames;
73 extern bool fLogIPs;
74 extern volatile bool fReopenDebugLog;
76 
77 extern const char * const BITCOIN_CONF_FILENAME;
78 extern const char * const BITCOIN_PID_FILENAME;
79 
84 inline std::string _(const char* psz)
85 {
86  boost::optional<std::string> rv = translationInterface.Translate(psz);
87  return rv ? (*rv) : psz;
88 }
89 
90 void SetupEnvironment();
91 bool SetupNetworking();
92 
94 bool LogAcceptCategory(const char* category);
96 int LogPrintStr(const std::string &str);
97 
98 #define LogPrintf(...) LogPrint(NULL, __VA_ARGS__)
99 
104 #define MAKE_ERROR_AND_LOG_FUNC(n) \
105  \
106  template<TINYFORMAT_ARGTYPES(n)> \
107  static inline int LogPrint(const char* category, const char* format, TINYFORMAT_VARARGS(n)) \
108  { \
109  if(!LogAcceptCategory(category)) return 0; \
110  return LogPrintStr(tfm::format(format, TINYFORMAT_PASSARGS(n))); \
111  } \
112  \
113  template<TINYFORMAT_ARGTYPES(n)> \
114  static inline bool error(const char* format, TINYFORMAT_VARARGS(n)) \
115  { \
116  LogPrintStr("ERROR: " + tfm::format(format, TINYFORMAT_PASSARGS(n)) + "\n"); \
117  return false; \
118  }
119 
121 
122 
126 static inline int LogPrint(const char* category, const char* format)
127 {
128  if(!LogAcceptCategory(category)) return 0;
129  return LogPrintStr(format);
130 }
131 static inline bool error(const char* format)
132 {
133  LogPrintStr(std::string("ERROR: ") + format + "\n");
134  return false;
135 }
136 
137 void PrintExceptionContinue(const std::exception *pex, const char* pszThread);
138 void ParseParameters(int argc, const char*const argv[]);
139 void FileCommit(FILE *fileout);
140 bool TruncateFile(FILE *file, unsigned int length);
141 int RaiseFileDescriptorLimit(int nMinFD);
142 void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length);
143 bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest);
144 bool TryCreateDirectory(const boost::filesystem::path& p);
145 boost::filesystem::path GetDefaultDataDir();
146 const boost::filesystem::path &GetDataDir(bool fNetSpecific = true);
147 const boost::filesystem::path &GetBackupsDir();
148 void ClearDatadirCache();
149 boost::filesystem::path GetConfigFile();
150 boost::filesystem::path GetMasternodeConfigFile();
151 #ifndef WIN32
152 boost::filesystem::path GetPidFile();
153 void CreatePidFile(const boost::filesystem::path &path, pid_t pid);
154 #endif
155 void ReadConfigFile(std::map<std::string, std::string>& mapSettingsRet, std::map<std::string, std::vector<std::string> >& mapMultiSettingsRet);
156 #ifdef WIN32
157 boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
158 #endif
159 boost::filesystem::path GetTempPath();
160 void OpenDebugLog();
161 void ShrinkDebugFile();
162 void runCommand(const std::string& strCommand);
163 
164 inline bool IsSwitchChar(char c)
165 {
166 #ifdef WIN32
167  return c == '-' || c == '/';
168 #else
169  return c == '-';
170 #endif
171 }
172 
180 std::string GetArg(const std::string& strArg, const std::string& strDefault);
181 
189 int64_t GetArg(const std::string& strArg, int64_t nDefault);
190 
198 bool GetBoolArg(const std::string& strArg, bool fDefault);
199 
207 bool SoftSetArg(const std::string& strArg, const std::string& strValue);
208 
216 bool SoftSetBoolArg(const std::string& strArg, bool fValue);
217 
224 std::string HelpMessageGroup(const std::string& message);
225 
233 std::string HelpMessageOpt(const std::string& option, const std::string& message);
234 
240 int GetNumCores();
241 
242 void SetThreadPriority(int nPriority);
243 void RenameThread(const char* name);
244 std::string GetThreadName();
245 
249 template <typename Callable> void TraceThread(const char* name, Callable func)
250 {
251  std::string s = strprintf("dash-%s", name);
252  RenameThread(s.c_str());
253  try
254  {
255  LogPrintf("%s thread start\n", name);
256  func();
257  LogPrintf("%s thread exit\n", name);
258  }
259  catch (const boost::thread_interrupted&)
260  {
261  LogPrintf("%s thread interrupt\n", name);
262  throw;
263  }
264  catch (const std::exception& e) {
266  throw;
267  }
268  catch (...) {
270  throw;
271  }
272 }
273 
274 
281 uint32_t StringVersionToInt(const std::string& strVersion);
282 
283 
290 std::string IntVersionToString(uint32_t nVersion);
291 
292 
300 std::string SafeIntVersionToString(uint32_t nVersion);
301 
302 
303 #endif // BITCOIN_UTIL_H
const boost::filesystem::path & GetBackupsDir()
Definition: util.cpp:580
boost::filesystem::path GetMasternodeConfigFile()
Definition: util.cpp:620
void ShrinkDebugFile()
Definition: util.cpp:799
#define strprintf
Definition: tinyformat.h:1011
bool fPrintToConsole
Definition: util.cpp:125
static FILE * fileout
Definition: util.cpp:210
std::string GetThreadName()
Definition: util.cpp:889
bool fMasterNode
Definition: util.cpp:108
std::string SafeIntVersionToString(uint32_t nVersion)
Copy of the IntVersionToString, that returns "Invalid version" string instead of throwing std::bad_ca...
Definition: util.cpp:994
bool fLogThreadNames
Definition: util.cpp:132
bool SetupNetworking()
Definition: util.cpp:923
int nWalletBackups
Definition: util.cpp:117
void RenameThread(const char *name)
Definition: util.cpp:873
void ReadConfigFile(std::map< std::string, std::string > &mapSettingsRet, std::map< std::string, std::vector< std::string > > &mapMultiSettingsRet)
std::map< std::string, std::vector< std::string > > mapMultiArgs
Definition: util.cpp:123
std::string HelpMessageGroup(const std::string &message)
Definition: util.cpp:482
static const bool DEFAULT_LOGTIMEMICROS
Definition: util.h:50
boost::signals2::signal< std::string(const char *psz)> Translate
Definition: util.h:60
void CreatePidFile(const boost::filesystem::path &path, pid_t pid)
Definition: util.cpp:664
uint32_t StringVersionToInt(const std::string &strVersion)
Converts version strings to 4-byte unsigned integer.
Definition: util.cpp:958
static const bool DEFAULT_LOGTIMESTAMPS
Definition: util.h:52
void SetupEnvironment()
Definition: util.cpp:904
std::map< std::string, std::string > mapArgs
Definition: util.cpp:122
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Definition: util.cpp:462
bool fLiteMode
Definition: util.cpp:109
const char *const BITCOIN_PID_FILENAME
Definition: util.cpp:120
static const bool DEFAULT_LOGIPS
Definition: util.h:51
#define LogPrintf(...)
Definition: util.h:98
const boost::filesystem::path & GetDataDir(bool fNetSpecific=true)
Definition: util.cpp:547
static int LogPrint(const char *category, const char *format)
Definition: util.h:126
void OpenDebugLog()
Definition: util.cpp:226
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Definition: util.cpp:470
const char * name
Definition: rest.cpp:37
void TraceThread(const char *name, Callable func)
Definition: util.h:249
static bool error(const char *format)
Definition: util.h:131
void ParseParameters(int argc, const char *const argv[])
Definition: util.cpp:406
int GetNumCores()
Definition: util.cpp:948
bool fServer
Definition: util.cpp:128
static const bool DEFAULT_LOGTHREADNAMES
Definition: util.h:53
bool fLogIPs
Definition: util.cpp:133
void runCommand(const std::string &strCommand)
Definition: util.cpp:866
#define MAKE_ERROR_AND_LOG_FUNC(n)
Definition: util.h:104
void SetThreadPriority(int nPriority)
Definition: util.cpp:935
void ClearDatadirCache()
Definition: util.cpp:605
const char *const BITCOIN_CONF_FILENAME
Definition: util.cpp:119
std::string strMiscWarning
Definition: util.cpp:129
bool IsSwitchChar(char c)
Definition: util.h:164
bool TryCreateDirectory(const boost::filesystem::path &p)
Definition: util.cpp:691
void PrintExceptionContinue(const std::exception *pex, const char *pszThread)
Definition: util.cpp:509
bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest)
Definition: util.cpp:675
void FileCommit(FILE *fileout)
Definition: util.cpp:705
bool fDebug
Definition: util.cpp:124
boost::filesystem::path GetConfigFile()
Definition: util.cpp:611
bool fLogTimeMicros
Definition: util.cpp:131
std::string IntVersionToString(uint32_t nVersion)
Converts version as 4-byte unsigned integer to string.
Definition: util.cpp:978
boost::filesystem::path GetTempPath()
Definition: util.cpp:844
std::string GetArg(const std::string &strArg, const std::string &strDefault)
Definition: util.cpp:441
bool LogAcceptCategory(const char *category)
Definition: util.cpp:247
int RaiseFileDescriptorLimit(int nMinFD)
Definition: util.cpp:734
boost::filesystem::path GetPidFile()
Definition: util.cpp:657
void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length)
Definition: util.cpp:757
CTranslationInterface translationInterface
Definition: util.cpp:135
bool TruncateFile(FILE *file, unsigned int length)
Definition: util.cpp:722
bool GetBoolArg(const std::string &strArg, bool fDefault)
Definition: util.cpp:455
int LogPrintStr(const std::string &str)
Definition: util.cpp:342
volatile bool fReopenDebugLog
Definition: util.cpp:134
#define TINYFORMAT_FOREACH_ARGNUM(m)
Definition: tinyformat.h:430
bool fLogTimestamps
Definition: util.cpp:130
boost::filesystem::path GetDefaultDataDir()
Definition: util.cpp:516
std::string HelpMessageOpt(const std::string &option, const std::string &message)
Definition: util.cpp:486
std::string _(const char *psz)
Definition: util.h:84
bool fPrintToDebugLog
Definition: util.cpp:126