X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Futil.cpp;h=8cc62eb672d5d0ed60229d8687845e209fdbd821;hb=3814af1ef1a10f25e7a76929edfd3abdb0ab791d;hp=583d5e579a82537fb31ea404d9191ff98fbcac85;hpb=77a43545b4491b9703d803765da9059d2bdd5aaa;p=novacoin.git diff --git a/src/util.cpp b/src/util.cpp index 583d5e5..8cc62eb 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -5,10 +5,11 @@ #include "util.h" #include "sync.h" -#include "strlcpy.h" #include "version.h" #include "ui_interface.h" #include +#include // for to_lower() +#include // for startswith() and endswith() // Work around clang compilation problem in Boost 1.46: // /usr/include/boost/program_options/detail/config_file.hpp:163:17: error: call to function 'to_internal' that is neither visible in the template definition nor found by argument-dependent lookup @@ -56,7 +57,7 @@ namespace boost { # include #endif -#ifndef WIN32 +#if !defined(WIN32) && !defined(ANDROID) #include #endif @@ -181,7 +182,7 @@ void RandAddSeedPerfmon() if (ret == ERROR_SUCCESS) { RAND_add(pdata, nSize, nSize/100.0); - memset(pdata, 0, nSize); + OPENSSL_cleanse(pdata, nSize); printf("RandAddSeed() %lu bytes\n", nSize); } #endif @@ -204,7 +205,7 @@ uint64_t GetRand(uint64_t nMax) int GetRandInt(int nMax) { - return GetRand(nMax); + return static_cast(GetRand(nMax)); } uint256 GetRandHash() @@ -534,24 +535,24 @@ void ParseParameters(int argc, const char* const argv[]) mapMultiArgs.clear(); for (int i = 1; i < argc; i++) { - char psz[10000]; - strlcpy(psz, argv[i], sizeof(psz)); - char* pszValue = (char*)""; - if (strchr(psz, '=')) + std::string str(argv[i]); + std::string strValue; + size_t is_index = str.find('='); + if (is_index != std::string::npos) { - pszValue = strchr(psz, '='); - *pszValue++ = '\0'; + strValue = str.substr(is_index+1); + str = str.substr(0, is_index); } - #ifdef WIN32 - _strlwr(psz); - if (psz[0] == '/') - psz[0] = '-'; - #endif - if (psz[0] != '-') +#ifdef WIN32 + boost::to_lower(str); + if (boost::algorithm::starts_with(str, "/")) + str = "-" + str.substr(1); +#endif + if (str[0] != '-') break; - mapArgs[psz] = pszValue; - mapMultiArgs[psz].push_back(pszValue); + mapArgs[str] = strValue; + mapMultiArgs[str].push_back(strValue); } // New 0.6 features: @@ -600,9 +601,11 @@ bool GetBoolArg(const std::string& strArg, bool fDefault) bool SoftSetArg(const std::string& strArg, const std::string& strValue) { - if (mapArgs.count(strArg)) + if (mapArgs.count(strArg) || mapMultiArgs.count(strArg)) return false; mapArgs[strArg] = strValue; + mapMultiArgs[strArg].push_back(strValue); + return true; } @@ -1059,7 +1062,7 @@ void LogStackTrace() { printf("\n\n******* exception encountered *******\n"); if (fileout) { -#ifndef WIN32 +#if !defined(WIN32) && !defined(ANDROID) void* pszBuffer[32]; size_t size; size = backtrace(pszBuffer, 32); @@ -1140,6 +1143,39 @@ const boost::filesystem::path &GetDataDir(bool fNetSpecific) return path; } +string randomStrGen(int length) { + static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + string result; + result.resize(length); + for (int32_t i = 0; i < length; i++) + result[i] = charset[rand() % charset.length()]; + + return result; +} + +void createConf() +{ + srand(time(NULL)); + + ofstream pConf; +#if BOOST_FILESYSTEM_VERSION >= 3 + pConf.open(GetConfigFile().generic_string().c_str()); +#else + pConf.open(GetConfigFile().string().c_str()); +#endif + pConf << "rpcuser=user\nrpcpassword=" + + randomStrGen(15) + + "\nrpcport=8344" + + "\nport=7777" + + "\n#(0=off, 1=on) daemon - run in the background as a daemon and accept commands" + + "\ndaemon=0" + + "\n#(0=off, 1=on) server - accept command line and JSON-RPC commands" + + "\nserver=0" + + "\nrpcallowip=127.0.0.1" + + "\ntestnet=0"; + pConf.close(); +} + boost::filesystem::path GetConfigFile() { boost::filesystem::path pathConfigFile(GetArg("-conf", "novacoin.conf")); @@ -1152,7 +1188,12 @@ void ReadConfigFile(map& mapSettingsRet, { boost::filesystem::ifstream streamConfig(GetConfigFile()); if (!streamConfig.good()) - return; // No bitcoin.conf file is OK + { + createConf(); + new(&streamConfig) boost::filesystem::ifstream(GetConfigFile()); + if(!streamConfig.good()) + return; + } set setOptions; setOptions.insert("*"); @@ -1230,7 +1271,7 @@ void ShrinkDebugFile() { // Restart the file with some of the end char pch[200000]; - fseek(file, -sizeof(pch), SEEK_END); + fseek(file, (long long)-sizeof(pch), SEEK_END); int nBytes = fread(pch, 1, sizeof(pch), file); fclose(file); @@ -1424,3 +1465,13 @@ bool NewThread(void(*pfn)(void*), void* parg) } return true; } + +std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) +{ + // std::locale takes ownership of the pointer + std::locale loc(std::locale::classic(), new boost::posix_time::time_facet(pszFormat)); + std::stringstream ss; + ss.imbue(loc); + ss << boost::posix_time::from_time_t(nTime); + return ss.str(); +} \ No newline at end of file