Browse Source

Merge #9902: Lightweight abstraction of boost::filesystem

f110272 Remove `namespace fs=fs` (Wladimir J. van der Laan)
75594bd torcontrol: Use fs::path instead of std::string for private key path (Wladimir J. van der Laan)
2a5f574 Use fsbridge for fopen and freopen (Wladimir J. van der Laan)
bac5c9c Replace uses of boost::filesystem with fs (Wladimir J. van der Laan)
7d5172d Replace includes of boost/filesystem.h with fs.h (Wladimir J. van der Laan)
19e36bb Add fs.cpp/h (Wladimir J. van der Laan)

Tree-SHA512: 2c34f059dfa6850b9323f3389e9090a6b5f839a457a2960d182c2ecfafd9883c956f5928bb796613402d3aad68ebc78259796a7a313f4a6cfa98aaf507a66842
0.15
Wladimir J. van der Laan 8 years ago
parent
commit
8c28670e92
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 2
      src/Makefile.am
  2. 18
      src/addrdb.cpp
  3. 6
      src/addrdb.h
  4. 4
      src/bitcoin-cli.cpp
  5. 4
      src/bitcoind.cpp
  6. 5
      src/dbwrapper.cpp
  7. 5
      src/dbwrapper.h
  8. 17
      src/fs.cpp
  9. 24
      src/fs.h
  10. 46
      src/init.cpp
  11. 2
      src/net.h
  12. 4
      src/qt/bitcoin.cpp
  13. 36
      src/qt/guiutil.cpp
  14. 7
      src/qt/guiutil.h
  15. 5
      src/qt/intro.cpp
  16. 5
      src/qt/test/rpcnestedtests.cpp
  17. 12
      src/rpc/protocol.cpp
  18. 5
      src/rpc/protocol.h
  19. 2
      src/rpc/server.cpp
  20. 18
      src/test/dbwrapper_tests.cpp
  21. 6
      src/test/test_bitcoin.cpp
  22. 4
      src/test/test_bitcoin.h
  23. 6
      src/test/testutil.cpp
  24. 4
      src/test/testutil.h
  25. 20
      src/torcontrol.cpp
  26. 67
      src/util.cpp
  27. 18
      src/util.h
  28. 23
      src/validation.cpp
  29. 4
      src/validation.h
  30. 28
      src/wallet/db.cpp
  31. 11
      src/wallet/db.h
  32. 12
      src/wallet/wallet.cpp
  33. 6
      src/wallet/walletdb.cpp
  34. 4
      src/wallet/walletdb.h

2
src/Makefile.am

@ -98,6 +98,7 @@ BITCOIN_CORE_H = \
core_io.h \ core_io.h \
core_memusage.h \ core_memusage.h \
cuckoocache.h \ cuckoocache.h \
fs.h \
httprpc.h \ httprpc.h \
httpserver.h \ httpserver.h \
indirectmap.h \ indirectmap.h \
@ -326,6 +327,7 @@ libbitcoin_util_a_SOURCES = \
compat/glibc_sanity.cpp \ compat/glibc_sanity.cpp \
compat/glibcxx_sanity.cpp \ compat/glibcxx_sanity.cpp \
compat/strnlen.cpp \ compat/strnlen.cpp \
fs.cpp \
random.cpp \ random.cpp \
rpc/protocol.cpp \ rpc/protocol.cpp \
support/cleanse.cpp \ support/cleanse.cpp \

18
src/addrdb.cpp

@ -8,13 +8,13 @@
#include "addrman.h" #include "addrman.h"
#include "chainparams.h" #include "chainparams.h"
#include "clientversion.h" #include "clientversion.h"
#include "fs.h"
#include "hash.h" #include "hash.h"
#include "random.h" #include "random.h"
#include "streams.h" #include "streams.h"
#include "tinyformat.h" #include "tinyformat.h"
#include "util.h" #include "util.h"
#include <boost/filesystem.hpp>
CBanDB::CBanDB() CBanDB::CBanDB()
{ {
@ -36,8 +36,8 @@ bool CBanDB::Write(const banmap_t& banSet)
ssBanlist << hash; ssBanlist << hash;
// open temp output file, and associate with CAutoFile // open temp output file, and associate with CAutoFile
boost::filesystem::path pathTmp = GetDataDir() / tmpfn; fs::path pathTmp = GetDataDir() / tmpfn;
FILE *file = fopen(pathTmp.string().c_str(), "wb"); FILE *file = fsbridge::fopen(pathTmp, "wb");
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION); CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
if (fileout.IsNull()) if (fileout.IsNull())
return error("%s: Failed to open file %s", __func__, pathTmp.string()); return error("%s: Failed to open file %s", __func__, pathTmp.string());
@ -62,13 +62,13 @@ bool CBanDB::Write(const banmap_t& banSet)
bool CBanDB::Read(banmap_t& banSet) bool CBanDB::Read(banmap_t& banSet)
{ {
// open input file, and associate with CAutoFile // open input file, and associate with CAutoFile
FILE *file = fopen(pathBanlist.string().c_str(), "rb"); FILE *file = fsbridge::fopen(pathBanlist, "rb");
CAutoFile filein(file, SER_DISK, CLIENT_VERSION); CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
if (filein.IsNull()) if (filein.IsNull())
return error("%s: Failed to open file %s", __func__, pathBanlist.string()); return error("%s: Failed to open file %s", __func__, pathBanlist.string());
// use file size to size memory buffer // use file size to size memory buffer
uint64_t fileSize = boost::filesystem::file_size(pathBanlist); uint64_t fileSize = fs::file_size(pathBanlist);
uint64_t dataSize = 0; uint64_t dataSize = 0;
// Don't try to resize to a negative number if file is small // Don't try to resize to a negative number if file is small
if (fileSize >= sizeof(uint256)) if (fileSize >= sizeof(uint256))
@ -133,8 +133,8 @@ bool CAddrDB::Write(const CAddrMan& addr)
ssPeers << hash; ssPeers << hash;
// open temp output file, and associate with CAutoFile // open temp output file, and associate with CAutoFile
boost::filesystem::path pathTmp = GetDataDir() / tmpfn; fs::path pathTmp = GetDataDir() / tmpfn;
FILE *file = fopen(pathTmp.string().c_str(), "wb"); FILE *file = fsbridge::fopen(pathTmp, "wb");
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION); CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
if (fileout.IsNull()) if (fileout.IsNull())
return error("%s: Failed to open file %s", __func__, pathTmp.string()); return error("%s: Failed to open file %s", __func__, pathTmp.string());
@ -159,13 +159,13 @@ bool CAddrDB::Write(const CAddrMan& addr)
bool CAddrDB::Read(CAddrMan& addr) bool CAddrDB::Read(CAddrMan& addr)
{ {
// open input file, and associate with CAutoFile // open input file, and associate with CAutoFile
FILE *file = fopen(pathAddr.string().c_str(), "rb"); FILE *file = fsbridge::fopen(pathAddr, "rb");
CAutoFile filein(file, SER_DISK, CLIENT_VERSION); CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
if (filein.IsNull()) if (filein.IsNull())
return error("%s: Failed to open file %s", __func__, pathAddr.string()); return error("%s: Failed to open file %s", __func__, pathAddr.string());
// use file size to size memory buffer // use file size to size memory buffer
uint64_t fileSize = boost::filesystem::file_size(pathAddr); uint64_t fileSize = fs::file_size(pathAddr);
uint64_t dataSize = 0; uint64_t dataSize = 0;
// Don't try to resize to a negative number if file is small // Don't try to resize to a negative number if file is small
if (fileSize >= sizeof(uint256)) if (fileSize >= sizeof(uint256))

6
src/addrdb.h

@ -6,11 +6,11 @@
#ifndef BITCOIN_ADDRDB_H #ifndef BITCOIN_ADDRDB_H
#define BITCOIN_ADDRDB_H #define BITCOIN_ADDRDB_H
#include "fs.h"
#include "serialize.h" #include "serialize.h"
#include <string> #include <string>
#include <map> #include <map>
#include <boost/filesystem/path.hpp>
class CSubNet; class CSubNet;
class CAddrMan; class CAddrMan;
@ -80,7 +80,7 @@ typedef std::map<CSubNet, CBanEntry> banmap_t;
class CAddrDB class CAddrDB
{ {
private: private:
boost::filesystem::path pathAddr; fs::path pathAddr;
public: public:
CAddrDB(); CAddrDB();
bool Write(const CAddrMan& addr); bool Write(const CAddrMan& addr);
@ -92,7 +92,7 @@ public:
class CBanDB class CBanDB
{ {
private: private:
boost::filesystem::path pathBanlist; fs::path pathBanlist;
public: public:
CBanDB(); CBanDB();
bool Write(const banmap_t& banSet); bool Write(const banmap_t& banSet);

4
src/bitcoin-cli.cpp

@ -9,12 +9,12 @@
#include "chainparamsbase.h" #include "chainparamsbase.h"
#include "clientversion.h" #include "clientversion.h"
#include "fs.h"
#include "rpc/client.h" #include "rpc/client.h"
#include "rpc/protocol.h" #include "rpc/protocol.h"
#include "util.h" #include "util.h"
#include "utilstrencodings.h" #include "utilstrencodings.h"
#include <boost/filesystem/operations.hpp>
#include <stdio.h> #include <stdio.h>
#include <event2/buffer.h> #include <event2/buffer.h>
@ -96,7 +96,7 @@ static int AppInitRPC(int argc, char* argv[])
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
if (!boost::filesystem::is_directory(GetDataDir(false))) { if (!fs::is_directory(GetDataDir(false))) {
fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", GetArg("-datadir", "").c_str()); fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", GetArg("-datadir", "").c_str());
return EXIT_FAILURE; return EXIT_FAILURE;
} }

4
src/bitcoind.cpp

@ -10,6 +10,7 @@
#include "chainparams.h" #include "chainparams.h"
#include "clientversion.h" #include "clientversion.h"
#include "compat.h" #include "compat.h"
#include "fs.h"
#include "rpc/server.h" #include "rpc/server.h"
#include "init.h" #include "init.h"
#include "noui.h" #include "noui.h"
@ -20,7 +21,6 @@
#include "utilstrencodings.h" #include "utilstrencodings.h"
#include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/predicate.hpp>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <stdio.h> #include <stdio.h>
@ -97,7 +97,7 @@ bool AppInit(int argc, char* argv[])
try try
{ {
if (!boost::filesystem::is_directory(GetDataDir(false))) if (!fs::is_directory(GetDataDir(false)))
{ {
fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", GetArg("-datadir", "").c_str()); fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", GetArg("-datadir", "").c_str());
return false; return false;

5
src/dbwrapper.cpp

@ -4,11 +4,10 @@
#include "dbwrapper.h" #include "dbwrapper.h"
#include "fs.h"
#include "util.h" #include "util.h"
#include "random.h" #include "random.h"
#include <boost/filesystem.hpp>
#include <leveldb/cache.h> #include <leveldb/cache.h>
#include <leveldb/env.h> #include <leveldb/env.h>
#include <leveldb/filter_policy.h> #include <leveldb/filter_policy.h>
@ -91,7 +90,7 @@ static leveldb::Options GetOptions(size_t nCacheSize)
return options; return options;
} }
CDBWrapper::CDBWrapper(const boost::filesystem::path& path, size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate) CDBWrapper::CDBWrapper(const fs::path& path, size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate)
{ {
penv = NULL; penv = NULL;
readoptions.verify_checksums = true; readoptions.verify_checksums = true;

5
src/dbwrapper.h

@ -6,14 +6,13 @@
#define BITCOIN_DBWRAPPER_H #define BITCOIN_DBWRAPPER_H
#include "clientversion.h" #include "clientversion.h"
#include "fs.h"
#include "serialize.h" #include "serialize.h"
#include "streams.h" #include "streams.h"
#include "util.h" #include "util.h"
#include "utilstrencodings.h" #include "utilstrencodings.h"
#include "version.h" #include "version.h"
#include <boost/filesystem/path.hpp>
#include <leveldb/db.h> #include <leveldb/db.h>
#include <leveldb/write_batch.h> #include <leveldb/write_batch.h>
@ -195,7 +194,7 @@ public:
* @param[in] obfuscate If true, store data obfuscated via simple XOR. If false, XOR * @param[in] obfuscate If true, store data obfuscated via simple XOR. If false, XOR
* with a zero'd byte array. * with a zero'd byte array.
*/ */
CDBWrapper(const boost::filesystem::path& path, size_t nCacheSize, bool fMemory = false, bool fWipe = false, bool obfuscate = false); CDBWrapper(const fs::path& path, size_t nCacheSize, bool fMemory = false, bool fWipe = false, bool obfuscate = false);
~CDBWrapper(); ~CDBWrapper();
template <typename K, typename V> template <typename K, typename V>

17
src/fs.cpp

@ -0,0 +1,17 @@
#include "fs.h"
#include <boost/filesystem.hpp>
namespace fsbridge {
FILE *fopen(const fs::path& p, const char *mode)
{
return ::fopen(p.string().c_str(), mode);
}
FILE *freopen(const fs::path& p, const char *mode, FILE *stream)
{
return ::freopen(p.string().c_str(), mode, stream);
}
} // fsbridge

24
src/fs.h

@ -0,0 +1,24 @@
// Copyright (c) 2017 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_FS_H
#define BITCOIN_FS_H
#include <stdio.h>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/filesystem/detail/utf8_codecvt_facet.hpp>
/** Filesystem operations and types */
namespace fs = boost::filesystem;
/** Bridge operations to C stdio */
namespace fsbridge {
FILE *fopen(const fs::path& p, const char *mode);
FILE *freopen(const fs::path& p, const char *mode, FILE *stream);
};
#endif

46
src/init.cpp

@ -16,6 +16,7 @@
#include "checkpoints.h" #include "checkpoints.h"
#include "compat/sanity.h" #include "compat/sanity.h"
#include "consensus/validation.h" #include "consensus/validation.h"
#include "fs.h"
#include "httpserver.h" #include "httpserver.h"
#include "httprpc.h" #include "httprpc.h"
#include "key.h" #include "key.h"
@ -56,7 +57,6 @@
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem.hpp>
#include <boost/function.hpp> #include <boost/function.hpp>
#include <boost/interprocess/sync/file_lock.hpp> #include <boost/interprocess/sync/file_lock.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
@ -212,8 +212,8 @@ void Shutdown()
if (fFeeEstimatesInitialized) if (fFeeEstimatesInitialized)
{ {
boost::filesystem::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME; fs::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME;
CAutoFile est_fileout(fopen(est_path.string().c_str(), "wb"), SER_DISK, CLIENT_VERSION); CAutoFile est_fileout(fsbridge::fopen(est_path, "wb"), SER_DISK, CLIENT_VERSION);
if (!est_fileout.IsNull()) if (!est_fileout.IsNull())
mempool.WriteFeeEstimates(est_fileout); mempool.WriteFeeEstimates(est_fileout);
else else
@ -250,8 +250,8 @@ void Shutdown()
#ifndef WIN32 #ifndef WIN32
try { try {
boost::filesystem::remove(GetPidFile()); fs::remove(GetPidFile());
} catch (const boost::filesystem::filesystem_error& e) { } catch (const fs::filesystem_error& e) {
LogPrintf("%s: Unable to remove pidfile: %s\n", __func__, e.what()); LogPrintf("%s: Unable to remove pidfile: %s\n", __func__, e.what());
} }
#endif #endif
@ -577,14 +577,14 @@ struct CImportingNow
// works correctly. // works correctly.
void CleanupBlockRevFiles() void CleanupBlockRevFiles()
{ {
std::map<std::string, boost::filesystem::path> mapBlockFiles; std::map<std::string, fs::path> mapBlockFiles;
// Glob all blk?????.dat and rev?????.dat files from the blocks directory. // Glob all blk?????.dat and rev?????.dat files from the blocks directory.
// Remove the rev files immediately and insert the blk file paths into an // Remove the rev files immediately and insert the blk file paths into an
// ordered map keyed by block file index. // ordered map keyed by block file index.
LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n"); LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n");
boost::filesystem::path blocksdir = GetDataDir() / "blocks"; fs::path blocksdir = GetDataDir() / "blocks";
for (boost::filesystem::directory_iterator it(blocksdir); it != boost::filesystem::directory_iterator(); it++) { for (fs::directory_iterator it(blocksdir); it != fs::directory_iterator(); it++) {
if (is_regular_file(*it) && if (is_regular_file(*it) &&
it->path().filename().string().length() == 12 && it->path().filename().string().length() == 12 &&
it->path().filename().string().substr(8,4) == ".dat") it->path().filename().string().substr(8,4) == ".dat")
@ -601,7 +601,7 @@ void CleanupBlockRevFiles()
// keeping a separate counter. Once we hit a gap (or if 0 doesn't exist) // keeping a separate counter. Once we hit a gap (or if 0 doesn't exist)
// start removing block files. // start removing block files.
int nContigCounter = 0; int nContigCounter = 0;
BOOST_FOREACH(const PAIRTYPE(std::string, boost::filesystem::path)& item, mapBlockFiles) { BOOST_FOREACH(const PAIRTYPE(std::string, fs::path)& item, mapBlockFiles) {
if (atoi(item.first) == nContigCounter) { if (atoi(item.first) == nContigCounter) {
nContigCounter++; nContigCounter++;
continue; continue;
@ -610,7 +610,7 @@ void CleanupBlockRevFiles()
} }
} }
void ThreadImport(std::vector<boost::filesystem::path> vImportFiles) void ThreadImport(std::vector<fs::path> vImportFiles)
{ {
const CChainParams& chainparams = Params(); const CChainParams& chainparams = Params();
RenameThread("bitcoin-loadblk"); RenameThread("bitcoin-loadblk");
@ -623,7 +623,7 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
int nFile = 0; int nFile = 0;
while (true) { while (true) {
CDiskBlockPos pos(nFile, 0); CDiskBlockPos pos(nFile, 0);
if (!boost::filesystem::exists(GetBlockPosFilename(pos, "blk"))) if (!fs::exists(GetBlockPosFilename(pos, "blk")))
break; // No block files left to reindex break; // No block files left to reindex
FILE *file = OpenBlockFile(pos, true); FILE *file = OpenBlockFile(pos, true);
if (!file) if (!file)
@ -640,11 +640,11 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
} }
// hardcoded $DATADIR/bootstrap.dat // hardcoded $DATADIR/bootstrap.dat
boost::filesystem::path pathBootstrap = GetDataDir() / "bootstrap.dat"; fs::path pathBootstrap = GetDataDir() / "bootstrap.dat";
if (boost::filesystem::exists(pathBootstrap)) { if (fs::exists(pathBootstrap)) {
FILE *file = fopen(pathBootstrap.string().c_str(), "rb"); FILE *file = fsbridge::fopen(pathBootstrap, "rb");
if (file) { if (file) {
boost::filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old"; fs::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old";
LogPrintf("Importing bootstrap.dat...\n"); LogPrintf("Importing bootstrap.dat...\n");
LoadExternalBlockFile(chainparams, file); LoadExternalBlockFile(chainparams, file);
RenameOver(pathBootstrap, pathBootstrapOld); RenameOver(pathBootstrap, pathBootstrapOld);
@ -654,8 +654,8 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
} }
// -loadblock= // -loadblock=
BOOST_FOREACH(const boost::filesystem::path& path, vImportFiles) { BOOST_FOREACH(const fs::path& path, vImportFiles) {
FILE *file = fopen(path.string().c_str(), "rb"); FILE *file = fsbridge::fopen(path, "rb");
if (file) { if (file) {
LogPrintf("Importing blocks file %s...\n", path.string()); LogPrintf("Importing blocks file %s...\n", path.string());
LoadExternalBlockFile(chainparams, file); LoadExternalBlockFile(chainparams, file);
@ -1135,8 +1135,8 @@ static bool LockDataDirectory(bool probeOnly)
std::string strDataDir = GetDataDir().string(); std::string strDataDir = GetDataDir().string();
// Make sure only a single Bitcoin process is using the data directory. // Make sure only a single Bitcoin process is using the data directory.
boost::filesystem::path pathLockFile = GetDataDir() / ".lock"; fs::path pathLockFile = GetDataDir() / ".lock";
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist. FILE* file = fsbridge::fopen(pathLockFile, "a"); // empty lock file; created if it doesn't exist.
if (file) fclose(file); if (file) fclose(file);
try { try {
@ -1400,7 +1400,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
fReindex = GetBoolArg("-reindex", false); fReindex = GetBoolArg("-reindex", false);
bool fReindexChainState = GetBoolArg("-reindex-chainstate", false); bool fReindexChainState = GetBoolArg("-reindex-chainstate", false);
boost::filesystem::create_directories(GetDataDir() / "blocks"); fs::create_directories(GetDataDir() / "blocks");
// cache size calculations // cache size calculations
int64_t nTotalCache = (GetArg("-dbcache", nDefaultDbCache) << 20); int64_t nTotalCache = (GetArg("-dbcache", nDefaultDbCache) << 20);
@ -1546,8 +1546,8 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
} }
LogPrintf(" block index %15dms\n", GetTimeMillis() - nStart); LogPrintf(" block index %15dms\n", GetTimeMillis() - nStart);
boost::filesystem::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME; fs::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME;
CAutoFile est_filein(fopen(est_path.string().c_str(), "rb"), SER_DISK, CLIENT_VERSION); CAutoFile est_filein(fsbridge::fopen(est_path, "rb"), SER_DISK, CLIENT_VERSION);
// Allowed to fail as this file IS missing on first startup. // Allowed to fail as this file IS missing on first startup.
if (!est_filein.IsNull()) if (!est_filein.IsNull())
mempool.ReadFeeEstimates(est_filein); mempool.ReadFeeEstimates(est_filein);
@ -1602,7 +1602,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
if (IsArgSet("-blocknotify")) if (IsArgSet("-blocknotify"))
uiInterface.NotifyBlockTip.connect(BlockNotifyCallback); uiInterface.NotifyBlockTip.connect(BlockNotifyCallback);
std::vector<boost::filesystem::path> vImportFiles; std::vector<fs::path> vImportFiles;
if (mapMultiArgs.count("-loadblock")) if (mapMultiArgs.count("-loadblock"))
{ {
BOOST_FOREACH(const std::string& strFile, mapMultiArgs.at("-loadblock")) BOOST_FOREACH(const std::string& strFile, mapMultiArgs.at("-loadblock"))

2
src/net.h

@ -11,6 +11,7 @@
#include "amount.h" #include "amount.h"
#include "bloom.h" #include "bloom.h"
#include "compat.h" #include "compat.h"
#include "fs.h"
#include "hash.h" #include "hash.h"
#include "limitedmap.h" #include "limitedmap.h"
#include "netaddress.h" #include "netaddress.h"
@ -32,7 +33,6 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#endif #endif
#include <boost/filesystem/path.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/signals2/signal.hpp> #include <boost/signals2/signal.hpp>

4
src/qt/bitcoin.cpp

@ -10,6 +10,7 @@
#include "chainparams.h" #include "chainparams.h"
#include "clientmodel.h" #include "clientmodel.h"
#include "fs.h"
#include "guiconstants.h" #include "guiconstants.h"
#include "guiutil.h" #include "guiutil.h"
#include "intro.h" #include "intro.h"
@ -38,7 +39,6 @@
#include <stdint.h> #include <stdint.h>
#include <boost/filesystem/operations.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <QApplication> #include <QApplication>
@ -608,7 +608,7 @@ int main(int argc, char *argv[])
/// 6. Determine availability of data directory and parse bitcoin.conf /// 6. Determine availability of data directory and parse bitcoin.conf
/// - Do not call GetDataDir(true) before this step finishes /// - Do not call GetDataDir(true) before this step finishes
if (!boost::filesystem::is_directory(GetDataDir(false))) if (!fs::is_directory(GetDataDir(false)))
{ {
QMessageBox::critical(0, QObject::tr(PACKAGE_NAME), QMessageBox::critical(0, QObject::tr(PACKAGE_NAME),
QObject::tr("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(GetArg("-datadir", "")))); QObject::tr("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(GetArg("-datadir", ""))));

36
src/qt/guiutil.cpp

@ -9,6 +9,7 @@
#include "qvalidatedlineedit.h" #include "qvalidatedlineedit.h"
#include "walletmodel.h" #include "walletmodel.h"
#include "fs.h"
#include "primitives/transaction.h" #include "primitives/transaction.h"
#include "init.h" #include "init.h"
#include "policy/policy.h" #include "policy/policy.h"
@ -35,9 +36,6 @@
#include "shlwapi.h" #include "shlwapi.h"
#endif #endif
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/filesystem/detail/utf8_codecvt_facet.hpp>
#include <boost/scoped_array.hpp> #include <boost/scoped_array.hpp>
#include <QAbstractItemView> #include <QAbstractItemView>
@ -65,7 +63,7 @@
#include <QFontDatabase> #include <QFontDatabase>
#endif #endif
static boost::filesystem::detail::utf8_codecvt_facet utf8; static fs::detail::utf8_codecvt_facet utf8;
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)
extern double NSAppKitVersionNumber; extern double NSAppKitVersionNumber;
@ -410,10 +408,10 @@ bool isObscured(QWidget *w)
void openDebugLogfile() void openDebugLogfile()
{ {
boost::filesystem::path pathDebug = GetDataDir() / "debug.log"; fs::path pathDebug = GetDataDir() / "debug.log";
/* Open debug.log with the associated application */ /* Open debug.log with the associated application */
if (boost::filesystem::exists(pathDebug)) if (fs::exists(pathDebug))
QDesktopServices::openUrl(QUrl::fromLocalFile(boostPathToQString(pathDebug))); QDesktopServices::openUrl(QUrl::fromLocalFile(boostPathToQString(pathDebug)));
} }
@ -597,7 +595,7 @@ TableViewLastColumnResizingFixer::TableViewLastColumnResizingFixer(QTableView* t
} }
#ifdef WIN32 #ifdef WIN32
boost::filesystem::path static StartupShortcutPath() fs::path static StartupShortcutPath()
{ {
std::string chain = ChainNameFromCommandLine(); std::string chain = ChainNameFromCommandLine();
if (chain == CBaseChainParams::MAIN) if (chain == CBaseChainParams::MAIN)
@ -610,13 +608,13 @@ boost::filesystem::path static StartupShortcutPath()
bool GetStartOnSystemStartup() bool GetStartOnSystemStartup()
{ {
// check for Bitcoin*.lnk // check for Bitcoin*.lnk
return boost::filesystem::exists(StartupShortcutPath()); return fs::exists(StartupShortcutPath());
} }
bool SetStartOnSystemStartup(bool fAutoStart) bool SetStartOnSystemStartup(bool fAutoStart)
{ {
// If the shortcut exists already, remove it for updating // If the shortcut exists already, remove it for updating
boost::filesystem::remove(StartupShortcutPath()); fs::remove(StartupShortcutPath());
if (fAutoStart) if (fAutoStart)
{ {
@ -686,10 +684,8 @@ bool SetStartOnSystemStartup(bool fAutoStart)
// Follow the Desktop Application Autostart Spec: // Follow the Desktop Application Autostart Spec:
// http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html // http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
boost::filesystem::path static GetAutostartDir() fs::path static GetAutostartDir()
{ {
namespace fs = boost::filesystem;
char* pszConfigHome = getenv("XDG_CONFIG_HOME"); char* pszConfigHome = getenv("XDG_CONFIG_HOME");
if (pszConfigHome) return fs::path(pszConfigHome) / "autostart"; if (pszConfigHome) return fs::path(pszConfigHome) / "autostart";
char* pszHome = getenv("HOME"); char* pszHome = getenv("HOME");
@ -697,7 +693,7 @@ boost::filesystem::path static GetAutostartDir()
return fs::path(); return fs::path();
} }
boost::filesystem::path static GetAutostartFilePath() fs::path static GetAutostartFilePath()
{ {
std::string chain = ChainNameFromCommandLine(); std::string chain = ChainNameFromCommandLine();
if (chain == CBaseChainParams::MAIN) if (chain == CBaseChainParams::MAIN)
@ -707,7 +703,7 @@ boost::filesystem::path static GetAutostartFilePath()
bool GetStartOnSystemStartup() bool GetStartOnSystemStartup()
{ {
boost::filesystem::ifstream optionFile(GetAutostartFilePath()); fs::ifstream optionFile(GetAutostartFilePath());
if (!optionFile.good()) if (!optionFile.good())
return false; return false;
// Scan through file for "Hidden=true": // Scan through file for "Hidden=true":
@ -727,7 +723,7 @@ bool GetStartOnSystemStartup()
bool SetStartOnSystemStartup(bool fAutoStart) bool SetStartOnSystemStartup(bool fAutoStart)
{ {
if (!fAutoStart) if (!fAutoStart)
boost::filesystem::remove(GetAutostartFilePath()); fs::remove(GetAutostartFilePath());
else else
{ {
char pszExePath[MAX_PATH+1]; char pszExePath[MAX_PATH+1];
@ -735,9 +731,9 @@ bool SetStartOnSystemStartup(bool fAutoStart)
if (readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1) == -1) if (readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1) == -1)
return false; return false;
boost::filesystem::create_directories(GetAutostartDir()); fs::create_directories(GetAutostartDir());
boost::filesystem::ofstream optionFile(GetAutostartFilePath(), std::ios_base::out|std::ios_base::trunc); fs::ofstream optionFile(GetAutostartFilePath(), std::ios_base::out|std::ios_base::trunc);
if (!optionFile.good()) if (!optionFile.good())
return false; return false;
std::string chain = ChainNameFromCommandLine(); std::string chain = ChainNameFromCommandLine();
@ -859,12 +855,12 @@ void setClipboard(const QString& str)
QApplication::clipboard()->setText(str, QClipboard::Selection); QApplication::clipboard()->setText(str, QClipboard::Selection);
} }
boost::filesystem::path qstringToBoostPath(const QString &path) fs::path qstringToBoostPath(const QString &path)
{ {
return boost::filesystem::path(path.toStdString(), utf8); return fs::path(path.toStdString(), utf8);
} }
QString boostPathToQString(const boost::filesystem::path &path) QString boostPathToQString(const fs::path &path)
{ {
return QString::fromStdString(path.string(utf8)); return QString::fromStdString(path.string(utf8));
} }

7
src/qt/guiutil.h

@ -6,6 +6,7 @@
#define BITCOIN_QT_GUIUTIL_H #define BITCOIN_QT_GUIUTIL_H
#include "amount.h" #include "amount.h"
#include "fs.h"
#include <QEvent> #include <QEvent>
#include <QHeaderView> #include <QHeaderView>
@ -16,8 +17,6 @@
#include <QTableView> #include <QTableView>
#include <QLabel> #include <QLabel>
#include <boost/filesystem.hpp>
class QValidatedLineEdit; class QValidatedLineEdit;
class SendCoinsRecipient; class SendCoinsRecipient;
@ -183,10 +182,10 @@ namespace GUIUtil
void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent); void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent);
/* Convert QString to OS specific boost path through UTF-8 */ /* Convert QString to OS specific boost path through UTF-8 */
boost::filesystem::path qstringToBoostPath(const QString &path); fs::path qstringToBoostPath(const QString &path);
/* Convert OS specific boost path to QString through UTF-8 */ /* Convert OS specific boost path to QString through UTF-8 */
QString boostPathToQString(const boost::filesystem::path &path); QString boostPathToQString(const fs::path &path);
/* Convert seconds into a QString with days, hours, mins, secs */ /* Convert seconds into a QString with days, hours, mins, secs */
QString formatDurationStr(int secs); QString formatDurationStr(int secs);

5
src/qt/intro.cpp

@ -6,6 +6,7 @@
#include "config/bitcoin-config.h" #include "config/bitcoin-config.h"
#endif #endif
#include "fs.h"
#include "intro.h" #include "intro.h"
#include "ui_intro.h" #include "ui_intro.h"
@ -13,8 +14,6 @@
#include "util.h" #include "util.h"
#include <boost/filesystem.hpp>
#include <QFileDialog> #include <QFileDialog>
#include <QSettings> #include <QSettings>
#include <QMessageBox> #include <QMessageBox>
@ -70,7 +69,6 @@ FreespaceChecker::FreespaceChecker(Intro *_intro)
void FreespaceChecker::check() void FreespaceChecker::check()
{ {
namespace fs = boost::filesystem;
QString dataDirStr = intro->getPathToCheck(); QString dataDirStr = intro->getPathToCheck();
fs::path dataDir = GUIUtil::qstringToBoostPath(dataDirStr); fs::path dataDir = GUIUtil::qstringToBoostPath(dataDirStr);
uint64_t freeBytesAvailable = 0; uint64_t freeBytesAvailable = 0;
@ -190,7 +188,6 @@ QString Intro::getDefaultDataDirectory()
bool Intro::pickDataDirectory() bool Intro::pickDataDirectory()
{ {
namespace fs = boost::filesystem;
QSettings settings; QSettings settings;
/* If data directory provided on command line, no need to look at settings /* If data directory provided on command line, no need to look at settings
or show a picking dialog */ or show a picking dialog */

5
src/qt/test/rpcnestedtests.cpp

@ -6,6 +6,7 @@
#include "chainparams.h" #include "chainparams.h"
#include "consensus/validation.h" #include "consensus/validation.h"
#include "fs.h"
#include "validation.h" #include "validation.h"
#include "rpc/register.h" #include "rpc/register.h"
#include "rpc/server.h" #include "rpc/server.h"
@ -17,8 +18,6 @@
#include <QDir> #include <QDir>
#include <QtGlobal> #include <QtGlobal>
#include <boost/filesystem.hpp>
static UniValue rpcNestedTest_rpc(const JSONRPCRequest& request) static UniValue rpcNestedTest_rpc(const JSONRPCRequest& request)
{ {
if (request.fHelp) { if (request.fHelp) {
@ -156,5 +155,5 @@ void RPCNestedTests::rpcNestedTests()
delete pblocktree; delete pblocktree;
pblocktree = nullptr; pblocktree = nullptr;
boost::filesystem::remove_all(boost::filesystem::path(path)); fs::remove_all(fs::path(path));
} }

12
src/rpc/protocol.cpp

@ -66,9 +66,9 @@ static const std::string COOKIEAUTH_USER = "__cookie__";
/** Default name for auth cookie file */ /** Default name for auth cookie file */
static const std::string COOKIEAUTH_FILE = ".cookie"; static const std::string COOKIEAUTH_FILE = ".cookie";
boost::filesystem::path GetAuthCookieFile() fs::path GetAuthCookieFile()
{ {
boost::filesystem::path path(GetArg("-rpccookiefile", COOKIEAUTH_FILE)); fs::path path(GetArg("-rpccookiefile", COOKIEAUTH_FILE));
if (!path.is_complete()) path = GetDataDir() / path; if (!path.is_complete()) path = GetDataDir() / path;
return path; return path;
} }
@ -84,7 +84,7 @@ bool GenerateAuthCookie(std::string *cookie_out)
* these are set to 077 in init.cpp unless overridden with -sysperms. * these are set to 077 in init.cpp unless overridden with -sysperms.
*/ */
std::ofstream file; std::ofstream file;
boost::filesystem::path filepath = GetAuthCookieFile(); fs::path filepath = GetAuthCookieFile();
file.open(filepath.string().c_str()); file.open(filepath.string().c_str());
if (!file.is_open()) { if (!file.is_open()) {
LogPrintf("Unable to open cookie authentication file %s for writing\n", filepath.string()); LogPrintf("Unable to open cookie authentication file %s for writing\n", filepath.string());
@ -103,7 +103,7 @@ bool GetAuthCookie(std::string *cookie_out)
{ {
std::ifstream file; std::ifstream file;
std::string cookie; std::string cookie;
boost::filesystem::path filepath = GetAuthCookieFile(); fs::path filepath = GetAuthCookieFile();
file.open(filepath.string().c_str()); file.open(filepath.string().c_str());
if (!file.is_open()) if (!file.is_open())
return false; return false;
@ -118,8 +118,8 @@ bool GetAuthCookie(std::string *cookie_out)
void DeleteAuthCookie() void DeleteAuthCookie()
{ {
try { try {
boost::filesystem::remove(GetAuthCookieFile()); fs::remove(GetAuthCookieFile());
} catch (const boost::filesystem::filesystem_error& e) { } catch (const fs::filesystem_error& e) {
LogPrintf("%s: Unable to remove random auth cookie file: %s\n", __func__, e.what()); LogPrintf("%s: Unable to remove random auth cookie file: %s\n", __func__, e.what());
} }
} }

5
src/rpc/protocol.h

@ -6,11 +6,12 @@
#ifndef BITCOIN_RPCPROTOCOL_H #ifndef BITCOIN_RPCPROTOCOL_H
#define BITCOIN_RPCPROTOCOL_H #define BITCOIN_RPCPROTOCOL_H
#include "fs.h"
#include <list> #include <list>
#include <map> #include <map>
#include <stdint.h> #include <stdint.h>
#include <string> #include <string>
#include <boost/filesystem.hpp>
#include <univalue.h> #include <univalue.h>
@ -89,7 +90,7 @@ std::string JSONRPCReply(const UniValue& result, const UniValue& error, const Un
UniValue JSONRPCError(int code, const std::string& message); UniValue JSONRPCError(int code, const std::string& message);
/** Get name of RPC authentication cookie file */ /** Get name of RPC authentication cookie file */
boost::filesystem::path GetAuthCookieFile(); fs::path GetAuthCookieFile();
/** Generate a new RPC authentication cookie and write it to disk */ /** Generate a new RPC authentication cookie and write it to disk */
bool GenerateAuthCookie(std::string *cookie_out); bool GenerateAuthCookie(std::string *cookie_out);
/** Read the RPC authentication cookie from disk */ /** Read the RPC authentication cookie from disk */

2
src/rpc/server.cpp

@ -6,6 +6,7 @@
#include "rpc/server.h" #include "rpc/server.h"
#include "base58.h" #include "base58.h"
#include "fs.h"
#include "init.h" #include "init.h"
#include "random.h" #include "random.h"
#include "sync.h" #include "sync.h"
@ -16,7 +17,6 @@
#include <univalue.h> #include <univalue.h>
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/signals2/signal.hpp> #include <boost/signals2/signal.hpp>

18
src/test/dbwrapper_tests.cpp

@ -28,7 +28,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper)
// Perform tests both obfuscated and non-obfuscated. // Perform tests both obfuscated and non-obfuscated.
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
bool obfuscate = (bool)i; bool obfuscate = (bool)i;
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate); CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
char key = 'k'; char key = 'k';
uint256 in = GetRandHash(); uint256 in = GetRandHash();
@ -49,7 +49,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_batch)
// Perform tests both obfuscated and non-obfuscated. // Perform tests both obfuscated and non-obfuscated.
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
bool obfuscate = (bool)i; bool obfuscate = (bool)i;
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate); CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
char key = 'i'; char key = 'i';
@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
// Perform tests both obfuscated and non-obfuscated. // Perform tests both obfuscated and non-obfuscated.
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
bool obfuscate = (bool)i; bool obfuscate = (bool)i;
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate); CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
// The two keys are intentionally chosen for ordering // The two keys are intentionally chosen for ordering
@ -125,8 +125,8 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
// Test that we do not obfuscation if there is existing data. // Test that we do not obfuscation if there is existing data.
BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate) BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
{ {
// We're going to share this boost::filesystem::path between two wrappers // We're going to share this fs::path between two wrappers
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
create_directories(ph); create_directories(ph);
// Set up a non-obfuscated wrapper to write some initial data. // Set up a non-obfuscated wrapper to write some initial data.
@ -167,8 +167,8 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
// Ensure that we start obfuscating during a reindex. // Ensure that we start obfuscating during a reindex.
BOOST_AUTO_TEST_CASE(existing_data_reindex) BOOST_AUTO_TEST_CASE(existing_data_reindex)
{ {
// We're going to share this boost::filesystem::path between two wrappers // We're going to share this fs::path between two wrappers
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
create_directories(ph); create_directories(ph);
// Set up a non-obfuscated wrapper to write some initial data. // Set up a non-obfuscated wrapper to write some initial data.
@ -204,7 +204,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
BOOST_AUTO_TEST_CASE(iterator_ordering) BOOST_AUTO_TEST_CASE(iterator_ordering)
{ {
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
CDBWrapper dbw(ph, (1 << 20), true, false, false); CDBWrapper dbw(ph, (1 << 20), true, false, false);
for (int x=0x00; x<256; ++x) { for (int x=0x00; x<256; ++x) {
uint8_t key = x; uint8_t key = x;
@ -275,7 +275,7 @@ BOOST_AUTO_TEST_CASE(iterator_string_ordering)
{ {
char buf[10]; char buf[10];
boost::filesystem::path ph = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); fs::path ph = fs::temp_directory_path() / fs::unique_path();
CDBWrapper dbw(ph, (1 << 20), true, false, false); CDBWrapper dbw(ph, (1 << 20), true, false, false);
for (int x=0x00; x<10; ++x) { for (int x=0x00; x<10; ++x) {
for (int y = 0; y < 10; y++) { for (int y = 0; y < 10; y++) {

6
src/test/test_bitcoin.cpp

@ -7,6 +7,7 @@
#include "chainparams.h" #include "chainparams.h"
#include "consensus/consensus.h" #include "consensus/consensus.h"
#include "consensus/validation.h" #include "consensus/validation.h"
#include "fs.h"
#include "key.h" #include "key.h"
#include "validation.h" #include "validation.h"
#include "miner.h" #include "miner.h"
@ -24,7 +25,6 @@
#include <memory> #include <memory>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
FastRandomContext insecure_rand_ctx(true); FastRandomContext insecure_rand_ctx(true);
@ -59,7 +59,7 @@ TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(cha
RegisterAllCoreRPCCommands(tableRPC); RegisterAllCoreRPCCommands(tableRPC);
ClearDatadirCache(); ClearDatadirCache();
pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(GetRand(100000))); pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(GetRand(100000)));
boost::filesystem::create_directories(pathTemp); fs::create_directories(pathTemp);
ForceSetArg("-datadir", pathTemp.string()); ForceSetArg("-datadir", pathTemp.string());
mempool.setSanityCheck(1.0); mempool.setSanityCheck(1.0);
pblocktree = new CBlockTreeDB(1 << 20, true); pblocktree = new CBlockTreeDB(1 << 20, true);
@ -91,7 +91,7 @@ TestingSetup::~TestingSetup()
delete pcoinsTip; delete pcoinsTip;
delete pcoinsdbview; delete pcoinsdbview;
delete pblocktree; delete pblocktree;
boost::filesystem::remove_all(pathTemp); fs::remove_all(pathTemp);
} }
TestChain100Setup::TestChain100Setup() : TestingSetup(CBaseChainParams::REGTEST) TestChain100Setup::TestChain100Setup() : TestingSetup(CBaseChainParams::REGTEST)

4
src/test/test_bitcoin.h

@ -6,12 +6,12 @@
#define BITCOIN_TEST_TEST_BITCOIN_H #define BITCOIN_TEST_TEST_BITCOIN_H
#include "chainparamsbase.h" #include "chainparamsbase.h"
#include "fs.h"
#include "key.h" #include "key.h"
#include "pubkey.h" #include "pubkey.h"
#include "txdb.h" #include "txdb.h"
#include "txmempool.h" #include "txmempool.h"
#include <boost/filesystem.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
/** Basic testing setup. /** Basic testing setup.
@ -30,7 +30,7 @@ struct BasicTestingSetup {
class CConnman; class CConnman;
struct TestingSetup: public BasicTestingSetup { struct TestingSetup: public BasicTestingSetup {
CCoinsViewDB *pcoinsdbview; CCoinsViewDB *pcoinsdbview;
boost::filesystem::path pathTemp; fs::path pathTemp;
boost::thread_group threadGroup; boost::thread_group threadGroup;
CConnman* connman; CConnman* connman;

6
src/test/testutil.cpp

@ -8,8 +8,8 @@
#include <shlobj.h> #include <shlobj.h>
#endif #endif
#include <boost/filesystem.hpp> #include "fs.h"
boost::filesystem::path GetTempPath() { fs::path GetTempPath() {
return boost::filesystem::temp_directory_path(); return fs::temp_directory_path();
} }

4
src/test/testutil.h

@ -8,8 +8,8 @@
#ifndef BITCOIN_TEST_TESTUTIL_H #ifndef BITCOIN_TEST_TESTUTIL_H
#define BITCOIN_TEST_TESTUTIL_H #define BITCOIN_TEST_TESTUTIL_H
#include <boost/filesystem/path.hpp> #include "fs.h"
boost::filesystem::path GetTempPath(); fs::path GetTempPath();
#endif // BITCOIN_TEST_TESTUTIL_H #endif // BITCOIN_TEST_TESTUTIL_H

20
src/torcontrol.cpp

@ -314,9 +314,9 @@ static std::map<std::string,std::string> ParseTorReplyMapping(const std::string
* @param maxsize Puts a maximum size limit on the file that is read. If the file is larger than this, truncated data * @param maxsize Puts a maximum size limit on the file that is read. If the file is larger than this, truncated data
* (with len > maxsize) will be returned. * (with len > maxsize) will be returned.
*/ */
static std::pair<bool,std::string> ReadBinaryFile(const std::string &filename, size_t maxsize=std::numeric_limits<size_t>::max()) static std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxsize=std::numeric_limits<size_t>::max())
{ {
FILE *f = fopen(filename.c_str(), "rb"); FILE *f = fsbridge::fopen(filename, "rb");
if (f == NULL) if (f == NULL)
return std::make_pair(false,""); return std::make_pair(false,"");
std::string retval; std::string retval;
@ -334,9 +334,9 @@ static std::pair<bool,std::string> ReadBinaryFile(const std::string &filename, s
/** Write contents of std::string to a file. /** Write contents of std::string to a file.
* @return true on success. * @return true on success.
*/ */
static bool WriteBinaryFile(const std::string &filename, const std::string &data) static bool WriteBinaryFile(const fs::path &filename, const std::string &data)
{ {
FILE *f = fopen(filename.c_str(), "wb"); FILE *f = fsbridge::fopen(filename, "wb");
if (f == NULL) if (f == NULL)
return false; return false;
if (fwrite(data.data(), 1, data.size(), f) != data.size()) { if (fwrite(data.data(), 1, data.size(), f) != data.size()) {
@ -359,7 +359,7 @@ public:
~TorController(); ~TorController();
/** Get name fo file to store private key in */ /** Get name fo file to store private key in */
std::string GetPrivateKeyFile(); fs::path GetPrivateKeyFile();
/** Reconnect, after getting disconnected */ /** Reconnect, after getting disconnected */
void Reconnect(); void Reconnect();
@ -411,7 +411,7 @@ TorController::TorController(struct event_base* _base, const std::string& _targe
// Read service private key if cached // Read service private key if cached
std::pair<bool,std::string> pkf = ReadBinaryFile(GetPrivateKeyFile()); std::pair<bool,std::string> pkf = ReadBinaryFile(GetPrivateKeyFile());
if (pkf.first) { if (pkf.first) {
LogPrint(BCLog::TOR, "tor: Reading cached private key from %s\n", GetPrivateKeyFile()); LogPrint(BCLog::TOR, "tor: Reading cached private key from %s\n", GetPrivateKeyFile().string());
private_key = pkf.second; private_key = pkf.second;
} }
} }
@ -442,9 +442,9 @@ void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlRe
service = LookupNumeric(std::string(service_id+".onion").c_str(), GetListenPort()); service = LookupNumeric(std::string(service_id+".onion").c_str(), GetListenPort());
LogPrintf("tor: Got service ID %s, advertising service %s\n", service_id, service.ToString()); LogPrintf("tor: Got service ID %s, advertising service %s\n", service_id, service.ToString());
if (WriteBinaryFile(GetPrivateKeyFile(), private_key)) { if (WriteBinaryFile(GetPrivateKeyFile(), private_key)) {
LogPrint(BCLog::TOR, "tor: Cached service private key to %s\n", GetPrivateKeyFile()); LogPrint(BCLog::TOR, "tor: Cached service private key to %s\n", GetPrivateKeyFile().string());
} else { } else {
LogPrintf("tor: Error writing service private key to %s\n", GetPrivateKeyFile()); LogPrintf("tor: Error writing service private key to %s\n", GetPrivateKeyFile().string());
} }
AddLocal(service, LOCAL_MANUAL); AddLocal(service, LOCAL_MANUAL);
// ... onion requested - keep connection open // ... onion requested - keep connection open
@ -651,9 +651,9 @@ void TorController::Reconnect()
} }
} }
std::string TorController::GetPrivateKeyFile() fs::path TorController::GetPrivateKeyFile()
{ {
return (GetDataDir() / "onion_private_key").string(); return GetDataDir() / "onion_private_key";
} }
void TorController::reconnect_cb(evutil_socket_t fd, short what, void *arg) void TorController::reconnect_cb(evutil_socket_t fd, short what, void *arg)

67
src/util.cpp

@ -10,6 +10,7 @@
#include "util.h" #include "util.h"
#include "chainparamsbase.h" #include "chainparamsbase.h"
#include "fs.h"
#include "random.h" #include "random.h"
#include "serialize.h" #include "serialize.h"
#include "sync.h" #include "sync.h"
@ -79,8 +80,6 @@
#include <boost/algorithm/string/case_conv.hpp> // for to_lower() #include <boost/algorithm/string/case_conv.hpp> // for to_lower()
#include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/predicate.hpp> // for startswith() and endswith() #include <boost/algorithm/string/predicate.hpp> // for startswith() and endswith()
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/program_options/detail/config_file.hpp> #include <boost/program_options/detail/config_file.hpp>
#include <boost/program_options/parsers.hpp> #include <boost/program_options/parsers.hpp>
@ -215,8 +214,8 @@ void OpenDebugLog()
assert(fileout == NULL); assert(fileout == NULL);
assert(vMsgsBeforeOpenLog); assert(vMsgsBeforeOpenLog);
boost::filesystem::path pathDebug = GetDataDir() / "debug.log"; fs::path pathDebug = GetDataDir() / "debug.log";
fileout = fopen(pathDebug.string().c_str(), "a"); fileout = fsbridge::fopen(pathDebug, "a");
if (fileout) { if (fileout) {
setbuf(fileout, NULL); // unbuffered setbuf(fileout, NULL); // unbuffered
// dump buffered messages from before we opened the log // dump buffered messages from before we opened the log
@ -354,8 +353,8 @@ int LogPrintStr(const std::string &str)
// reopen the log file, if requested // reopen the log file, if requested
if (fReopenDebugLog) { if (fReopenDebugLog) {
fReopenDebugLog = false; fReopenDebugLog = false;
boost::filesystem::path pathDebug = GetDataDir() / "debug.log"; fs::path pathDebug = GetDataDir() / "debug.log";
if (freopen(pathDebug.string().c_str(),"a",fileout) != NULL) if (fsbridge::freopen(pathDebug,"a",fileout) != NULL)
setbuf(fileout, NULL); // unbuffered setbuf(fileout, NULL); // unbuffered
} }
@ -512,9 +511,8 @@ void PrintExceptionContinue(const std::exception* pex, const char* pszThread)
fprintf(stderr, "\n\n************************\n%s\n", message.c_str()); fprintf(stderr, "\n\n************************\n%s\n", message.c_str());
} }
boost::filesystem::path GetDefaultDataDir() fs::path GetDefaultDataDir()
{ {
namespace fs = boost::filesystem;
// Windows < Vista: C:\Documents and Settings\Username\Application Data\Bitcoin // Windows < Vista: C:\Documents and Settings\Username\Application Data\Bitcoin
// Windows >= Vista: C:\Users\Username\AppData\Roaming\Bitcoin // Windows >= Vista: C:\Users\Username\AppData\Roaming\Bitcoin
// Mac: ~/Library/Application Support/Bitcoin // Mac: ~/Library/Application Support/Bitcoin
@ -539,13 +537,12 @@ boost::filesystem::path GetDefaultDataDir()
#endif #endif
} }
static boost::filesystem::path pathCached; static fs::path pathCached;
static boost::filesystem::path pathCachedNetSpecific; static fs::path pathCachedNetSpecific;
static CCriticalSection csPathCached; static CCriticalSection csPathCached;
const boost::filesystem::path &GetDataDir(bool fNetSpecific) const fs::path &GetDataDir(bool fNetSpecific)
{ {
namespace fs = boost::filesystem;
LOCK(csPathCached); LOCK(csPathCached);
@ -577,13 +574,13 @@ void ClearDatadirCache()
{ {
LOCK(csPathCached); LOCK(csPathCached);
pathCached = boost::filesystem::path(); pathCached = fs::path();
pathCachedNetSpecific = boost::filesystem::path(); pathCachedNetSpecific = fs::path();
} }
boost::filesystem::path GetConfigFile(const std::string& confPath) fs::path GetConfigFile(const std::string& confPath)
{ {
boost::filesystem::path pathConfigFile(confPath); fs::path pathConfigFile(confPath);
if (!pathConfigFile.is_complete()) if (!pathConfigFile.is_complete())
pathConfigFile = GetDataDir(false) / pathConfigFile; pathConfigFile = GetDataDir(false) / pathConfigFile;
@ -592,7 +589,7 @@ boost::filesystem::path GetConfigFile(const std::string& confPath)
void ReadConfigFile(const std::string& confPath) void ReadConfigFile(const std::string& confPath)
{ {
boost::filesystem::ifstream streamConfig(GetConfigFile(confPath)); fs::ifstream streamConfig(GetConfigFile(confPath));
if (!streamConfig.good()) if (!streamConfig.good())
return; // No bitcoin.conf file is OK return; // No bitcoin.conf file is OK
@ -617,16 +614,16 @@ void ReadConfigFile(const std::string& confPath)
} }
#ifndef WIN32 #ifndef WIN32
boost::filesystem::path GetPidFile() fs::path GetPidFile()
{ {
boost::filesystem::path pathPidFile(GetArg("-pid", BITCOIN_PID_FILENAME)); fs::path pathPidFile(GetArg("-pid", BITCOIN_PID_FILENAME));
if (!pathPidFile.is_complete()) pathPidFile = GetDataDir() / pathPidFile; if (!pathPidFile.is_complete()) pathPidFile = GetDataDir() / pathPidFile;
return pathPidFile; return pathPidFile;
} }
void CreatePidFile(const boost::filesystem::path &path, pid_t pid) void CreatePidFile(const fs::path &path, pid_t pid)
{ {
FILE* file = fopen(path.string().c_str(), "w"); FILE* file = fsbridge::fopen(path, "w");
if (file) if (file)
{ {
fprintf(file, "%d\n", pid); fprintf(file, "%d\n", pid);
@ -635,7 +632,7 @@ void CreatePidFile(const boost::filesystem::path &path, pid_t pid)
} }
#endif #endif
bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest) bool RenameOver(fs::path src, fs::path dest)
{ {
#ifdef WIN32 #ifdef WIN32
return MoveFileExA(src.string().c_str(), dest.string().c_str(), return MoveFileExA(src.string().c_str(), dest.string().c_str(),
@ -651,13 +648,13 @@ bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest)
* Specifically handles case where path p exists, but it wasn't possible for the user to * Specifically handles case where path p exists, but it wasn't possible for the user to
* write to the parent directory. * write to the parent directory.
*/ */
bool TryCreateDirectory(const boost::filesystem::path& p) bool TryCreateDirectory(const fs::path& p)
{ {
try try
{ {
return boost::filesystem::create_directory(p); return fs::create_directory(p);
} catch (const boost::filesystem::filesystem_error&) { } catch (const fs::filesystem_error&) {
if (!boost::filesystem::exists(p) || !boost::filesystem::is_directory(p)) if (!fs::exists(p) || !fs::is_directory(p))
throw; throw;
} }
@ -764,11 +761,11 @@ void ShrinkDebugFile()
// Amount of debug.log to save at end when shrinking (must fit in memory) // Amount of debug.log to save at end when shrinking (must fit in memory)
constexpr size_t RECENT_DEBUG_HISTORY_SIZE = 10 * 1000000; constexpr size_t RECENT_DEBUG_HISTORY_SIZE = 10 * 1000000;
// Scroll debug.log if it's getting too big // Scroll debug.log if it's getting too big
boost::filesystem::path pathLog = GetDataDir() / "debug.log"; fs::path pathLog = GetDataDir() / "debug.log";
FILE* file = fopen(pathLog.string().c_str(), "r"); FILE* file = fsbridge::fopen(pathLog, "r");
// If debug.log file is more than 10% bigger the RECENT_DEBUG_HISTORY_SIZE // If debug.log file is more than 10% bigger the RECENT_DEBUG_HISTORY_SIZE
// trim it down by saving only the last RECENT_DEBUG_HISTORY_SIZE bytes // trim it down by saving only the last RECENT_DEBUG_HISTORY_SIZE bytes
if (file && boost::filesystem::file_size(pathLog) > 11 * (RECENT_DEBUG_HISTORY_SIZE / 10)) if (file && fs::file_size(pathLog) > 11 * (RECENT_DEBUG_HISTORY_SIZE / 10))
{ {
// Restart the file with some of the end // Restart the file with some of the end
std::vector<char> vch(RECENT_DEBUG_HISTORY_SIZE, 0); std::vector<char> vch(RECENT_DEBUG_HISTORY_SIZE, 0);
@ -776,7 +773,7 @@ void ShrinkDebugFile()
int nBytes = fread(vch.data(), 1, vch.size(), file); int nBytes = fread(vch.data(), 1, vch.size(), file);
fclose(file); fclose(file);
file = fopen(pathLog.string().c_str(), "w"); file = fsbridge::fopen(pathLog, "w");
if (file) if (file)
{ {
fwrite(vch.data(), 1, nBytes, file); fwrite(vch.data(), 1, nBytes, file);
@ -788,10 +785,8 @@ void ShrinkDebugFile()
} }
#ifdef WIN32 #ifdef WIN32
boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate) fs::path GetSpecialFolderPath(int nFolder, bool fCreate)
{ {
namespace fs = boost::filesystem;
char pszPath[MAX_PATH] = ""; char pszPath[MAX_PATH] = "";
if(SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate)) if(SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate))
@ -851,9 +846,9 @@ void SetupEnvironment()
// The path locale is lazy initialized and to avoid deinitialization errors // The path locale is lazy initialized and to avoid deinitialization errors
// in multithreading environments, it is set explicitly by the main thread. // in multithreading environments, it is set explicitly by the main thread.
// A dummy locale is used to extract the internal default locale, used by // A dummy locale is used to extract the internal default locale, used by
// boost::filesystem::path, which is then used to explicitly imbue the path. // fs::path, which is then used to explicitly imbue the path.
std::locale loc = boost::filesystem::path::imbue(std::locale::classic()); std::locale loc = fs::path::imbue(std::locale::classic());
boost::filesystem::path::imbue(loc); fs::path::imbue(loc);
} }
bool SetupNetworking() bool SetupNetworking()

18
src/util.h

@ -15,6 +15,7 @@
#endif #endif
#include "compat.h" #include "compat.h"
#include "fs.h"
#include "tinyformat.h" #include "tinyformat.h"
#include "utiltime.h" #include "utiltime.h"
@ -25,7 +26,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <boost/filesystem/path.hpp>
#include <boost/signals2/signal.hpp> #include <boost/signals2/signal.hpp>
#include <boost/thread/exceptions.hpp> #include <boost/thread/exceptions.hpp>
@ -144,19 +144,19 @@ void FileCommit(FILE *file);
bool TruncateFile(FILE *file, unsigned int length); bool TruncateFile(FILE *file, unsigned int length);
int RaiseFileDescriptorLimit(int nMinFD); int RaiseFileDescriptorLimit(int nMinFD);
void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length); void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length);
bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest); bool RenameOver(fs::path src, fs::path dest);
bool TryCreateDirectory(const boost::filesystem::path& p); bool TryCreateDirectory(const fs::path& p);
boost::filesystem::path GetDefaultDataDir(); fs::path GetDefaultDataDir();
const boost::filesystem::path &GetDataDir(bool fNetSpecific = true); const fs::path &GetDataDir(bool fNetSpecific = true);
void ClearDatadirCache(); void ClearDatadirCache();
boost::filesystem::path GetConfigFile(const std::string& confPath); fs::path GetConfigFile(const std::string& confPath);
#ifndef WIN32 #ifndef WIN32
boost::filesystem::path GetPidFile(); fs::path GetPidFile();
void CreatePidFile(const boost::filesystem::path &path, pid_t pid); void CreatePidFile(const fs::path &path, pid_t pid);
#endif #endif
void ReadConfigFile(const std::string& confPath); void ReadConfigFile(const std::string& confPath);
#ifdef WIN32 #ifdef WIN32
boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true); fs::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
#endif #endif
void OpenDebugLog(); void OpenDebugLog();
void ShrinkDebugFile(); void ShrinkDebugFile();

23
src/validation.cpp

@ -12,6 +12,7 @@
#include "consensus/consensus.h" #include "consensus/consensus.h"
#include "consensus/merkle.h" #include "consensus/merkle.h"
#include "consensus/validation.h" #include "consensus/validation.h"
#include "fs.h"
#include "hash.h" #include "hash.h"
#include "init.h" #include "init.h"
#include "policy/fees.h" #include "policy/fees.h"
@ -41,8 +42,6 @@
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/join.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/math/distributions/poisson.hpp> #include <boost/math/distributions/poisson.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
@ -3318,8 +3317,8 @@ void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune)
{ {
for (std::set<int>::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) { for (std::set<int>::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) {
CDiskBlockPos pos(*it, 0); CDiskBlockPos pos(*it, 0);
boost::filesystem::remove(GetBlockPosFilename(pos, "blk")); fs::remove(GetBlockPosFilename(pos, "blk"));
boost::filesystem::remove(GetBlockPosFilename(pos, "rev")); fs::remove(GetBlockPosFilename(pos, "rev"));
LogPrintf("Prune: %s deleted blk/rev (%05u)\n", __func__, *it); LogPrintf("Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
} }
} }
@ -3403,7 +3402,7 @@ void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight
bool CheckDiskSpace(uint64_t nAdditionalBytes) bool CheckDiskSpace(uint64_t nAdditionalBytes)
{ {
uint64_t nFreeBytesAvailable = boost::filesystem::space(GetDataDir()).available; uint64_t nFreeBytesAvailable = fs::space(GetDataDir()).available;
// Check for nMinDiskSpace bytes (currently 50MB) // Check for nMinDiskSpace bytes (currently 50MB)
if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes) if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes)
@ -3416,11 +3415,11 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly)
{ {
if (pos.IsNull()) if (pos.IsNull())
return NULL; return NULL;
boost::filesystem::path path = GetBlockPosFilename(pos, prefix); fs::path path = GetBlockPosFilename(pos, prefix);
boost::filesystem::create_directories(path.parent_path()); fs::create_directories(path.parent_path());
FILE* file = fopen(path.string().c_str(), "rb+"); FILE* file = fsbridge::fopen(path, "rb+");
if (!file && !fReadOnly) if (!file && !fReadOnly)
file = fopen(path.string().c_str(), "wb+"); file = fsbridge::fopen(path, "wb+");
if (!file) { if (!file) {
LogPrintf("Unable to open file %s\n", path.string()); LogPrintf("Unable to open file %s\n", path.string());
return NULL; return NULL;
@ -3443,7 +3442,7 @@ FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) {
return OpenDiskFile(pos, "rev", fReadOnly); return OpenDiskFile(pos, "rev", fReadOnly);
} }
boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix) fs::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix)
{ {
return GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile); return GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile);
} }
@ -4168,7 +4167,7 @@ static const uint64_t MEMPOOL_DUMP_VERSION = 1;
bool LoadMempool(void) bool LoadMempool(void)
{ {
int64_t nExpiryTimeout = GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60; int64_t nExpiryTimeout = GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60;
FILE* filestr = fopen((GetDataDir() / "mempool.dat").string().c_str(), "rb"); FILE* filestr = fsbridge::fopen(GetDataDir() / "mempool.dat", "rb");
CAutoFile file(filestr, SER_DISK, CLIENT_VERSION); CAutoFile file(filestr, SER_DISK, CLIENT_VERSION);
if (file.IsNull()) { if (file.IsNull()) {
LogPrintf("Failed to open mempool file from disk. Continuing anyway.\n"); LogPrintf("Failed to open mempool file from disk. Continuing anyway.\n");
@ -4248,7 +4247,7 @@ void DumpMempool(void)
int64_t mid = GetTimeMicros(); int64_t mid = GetTimeMicros();
try { try {
FILE* filestr = fopen((GetDataDir() / "mempool.dat.new").string().c_str(), "wb"); FILE* filestr = fsbridge::fopen(GetDataDir() / "mempool.dat.new", "wb");
if (!filestr) { if (!filestr) {
return; return;
} }

4
src/validation.h

@ -13,6 +13,7 @@
#include "amount.h" #include "amount.h"
#include "chain.h" #include "chain.h"
#include "coins.h" #include "coins.h"
#include "fs.h"
#include "protocol.h" // For CMessageHeader::MessageStartChars #include "protocol.h" // For CMessageHeader::MessageStartChars
#include "script/script_error.h" #include "script/script_error.h"
#include "sync.h" #include "sync.h"
@ -30,7 +31,6 @@
#include <atomic> #include <atomic>
#include <boost/unordered_map.hpp> #include <boost/unordered_map.hpp>
#include <boost/filesystem/path.hpp>
class CBlockIndex; class CBlockIndex;
class CBlockTreeDB; class CBlockTreeDB;
@ -250,7 +250,7 @@ FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly = false);
/** Open an undo file (rev?????.dat) */ /** Open an undo file (rev?????.dat) */
FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false); FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false);
/** Translation to a filesystem path */ /** Translation to a filesystem path */
boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix); fs::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix);
/** Import blocks from an external file */ /** Import blocks from an external file */
bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskBlockPos *dbp = NULL); bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskBlockPos *dbp = NULL);
/** Initialize a new block tree database + block data on disk */ /** Initialize a new block tree database + block data on disk */

28
src/wallet/db.cpp

@ -6,6 +6,7 @@
#include "db.h" #include "db.h"
#include "addrman.h" #include "addrman.h"
#include "fs.h"
#include "hash.h" #include "hash.h"
#include "protocol.h" #include "protocol.h"
#include "util.h" #include "util.h"
@ -17,7 +18,6 @@
#include <sys/stat.h> #include <sys/stat.h>
#endif #endif
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <boost/version.hpp> #include <boost/version.hpp>
@ -66,7 +66,7 @@ void CDBEnv::Close()
EnvShutdown(); EnvShutdown();
} }
bool CDBEnv::Open(const boost::filesystem::path& pathIn) bool CDBEnv::Open(const fs::path& pathIn)
{ {
if (fDbEnvInit) if (fDbEnvInit)
return true; return true;
@ -74,9 +74,9 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn)
boost::this_thread::interruption_point(); boost::this_thread::interruption_point();
strPath = pathIn.string(); strPath = pathIn.string();
boost::filesystem::path pathLogDir = pathIn / "database"; fs::path pathLogDir = pathIn / "database";
TryCreateDirectory(pathLogDir); TryCreateDirectory(pathLogDir);
boost::filesystem::path pathErrorFile = pathIn / "db.log"; fs::path pathErrorFile = pathIn / "db.log";
LogPrintf("CDBEnv::Open: LogDir=%s ErrorFile=%s\n", pathLogDir.string(), pathErrorFile.string()); LogPrintf("CDBEnv::Open: LogDir=%s ErrorFile=%s\n", pathLogDir.string(), pathErrorFile.string());
unsigned int nEnvFlags = 0; unsigned int nEnvFlags = 0;
@ -89,7 +89,7 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn)
dbenv->set_lg_max(1048576); dbenv->set_lg_max(1048576);
dbenv->set_lk_max_locks(40000); dbenv->set_lk_max_locks(40000);
dbenv->set_lk_max_objects(40000); dbenv->set_lk_max_objects(40000);
dbenv->set_errfile(fopen(pathErrorFile.string().c_str(), "a")); /// debug dbenv->set_errfile(fsbridge::fopen(pathErrorFile, "a")); /// debug
dbenv->set_flags(DB_AUTO_COMMIT, 1); dbenv->set_flags(DB_AUTO_COMMIT, 1);
dbenv->set_flags(DB_TXN_WRITE_NOSYNC, 1); dbenv->set_flags(DB_TXN_WRITE_NOSYNC, 1);
dbenv->log_set_config(DB_LOG_AUTO_REMOVE, 1); dbenv->log_set_config(DB_LOG_AUTO_REMOVE, 1);
@ -227,13 +227,13 @@ bool CDB::Recover(const std::string& filename, void *callbackDataIn, bool (*reco
return fSuccess; return fSuccess;
} }
bool CDB::VerifyEnvironment(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& errorStr) bool CDB::VerifyEnvironment(const std::string& walletFile, const fs::path& dataDir, std::string& errorStr)
{ {
LogPrintf("Using BerkeleyDB version %s\n", DbEnv::version(0, 0, 0)); LogPrintf("Using BerkeleyDB version %s\n", DbEnv::version(0, 0, 0));
LogPrintf("Using wallet %s\n", walletFile); LogPrintf("Using wallet %s\n", walletFile);
// Wallet file must be a plain filename without a directory // Wallet file must be a plain filename without a directory
if (walletFile != boost::filesystem::basename(walletFile) + boost::filesystem::extension(walletFile)) if (walletFile != fs::basename(walletFile) + fs::extension(walletFile))
{ {
errorStr = strprintf(_("Wallet %s resides outside data directory %s"), walletFile, dataDir.string()); errorStr = strprintf(_("Wallet %s resides outside data directory %s"), walletFile, dataDir.string());
return false; return false;
@ -242,12 +242,12 @@ bool CDB::VerifyEnvironment(const std::string& walletFile, const boost::filesyst
if (!bitdb.Open(dataDir)) if (!bitdb.Open(dataDir))
{ {
// try moving the database env out of the way // try moving the database env out of the way
boost::filesystem::path pathDatabase = dataDir / "database"; fs::path pathDatabase = dataDir / "database";
boost::filesystem::path pathDatabaseBak = dataDir / strprintf("database.%d.bak", GetTime()); fs::path pathDatabaseBak = dataDir / strprintf("database.%d.bak", GetTime());
try { try {
boost::filesystem::rename(pathDatabase, pathDatabaseBak); fs::rename(pathDatabase, pathDatabaseBak);
LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string(), pathDatabaseBak.string()); LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string(), pathDatabaseBak.string());
} catch (const boost::filesystem::filesystem_error&) { } catch (const fs::filesystem_error&) {
// failure is ok (well, not really, but it's not worse than what we started with) // failure is ok (well, not really, but it's not worse than what we started with)
} }
@ -261,9 +261,9 @@ bool CDB::VerifyEnvironment(const std::string& walletFile, const boost::filesyst
return true; return true;
} }
bool CDB::VerifyDatabaseFile(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& warningStr, std::string& errorStr, bool (*recoverFunc)(const std::string& strFile)) bool CDB::VerifyDatabaseFile(const std::string& walletFile, const fs::path& dataDir, std::string& warningStr, std::string& errorStr, bool (*recoverFunc)(const std::string& strFile))
{ {
if (boost::filesystem::exists(dataDir / walletFile)) if (fs::exists(dataDir / walletFile))
{ {
CDBEnv::VerifyResult r = bitdb.Verify(walletFile, recoverFunc); CDBEnv::VerifyResult r = bitdb.Verify(walletFile, recoverFunc);
if (r == CDBEnv::RECOVER_OK) if (r == CDBEnv::RECOVER_OK)
@ -590,7 +590,7 @@ void CDBEnv::Flush(bool fShutdown)
dbenv->log_archive(&listp, DB_ARCH_REMOVE); dbenv->log_archive(&listp, DB_ARCH_REMOVE);
Close(); Close();
if (!fMockDb) if (!fMockDb)
boost::filesystem::remove_all(boost::filesystem::path(strPath) / "database"); fs::remove_all(fs::path(strPath) / "database");
} }
} }
} }

11
src/wallet/db.h

@ -7,6 +7,7 @@
#define BITCOIN_WALLET_DB_H #define BITCOIN_WALLET_DB_H
#include "clientversion.h" #include "clientversion.h"
#include "fs.h"
#include "serialize.h" #include "serialize.h"
#include "streams.h" #include "streams.h"
#include "sync.h" #include "sync.h"
@ -16,8 +17,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <boost/filesystem/path.hpp>
#include <db_cxx.h> #include <db_cxx.h>
static const unsigned int DEFAULT_WALLET_DBLOGSIZE = 100; static const unsigned int DEFAULT_WALLET_DBLOGSIZE = 100;
@ -28,7 +27,7 @@ class CDBEnv
private: private:
bool fDbEnvInit; bool fDbEnvInit;
bool fMockDb; bool fMockDb;
// Don't change into boost::filesystem::path, as that can result in // Don't change into fs::path, as that can result in
// shutdown problems/crashes caused by a static initialized internal pointer. // shutdown problems/crashes caused by a static initialized internal pointer.
std::string strPath; std::string strPath;
@ -67,7 +66,7 @@ public:
typedef std::pair<std::vector<unsigned char>, std::vector<unsigned char> > KeyValPair; typedef std::pair<std::vector<unsigned char>, std::vector<unsigned char> > KeyValPair;
bool Salvage(const std::string& strFile, bool fAggressive, std::vector<KeyValPair>& vResult); bool Salvage(const std::string& strFile, bool fAggressive, std::vector<KeyValPair>& vResult);
bool Open(const boost::filesystem::path& path); bool Open(const fs::path& path);
void Close(); void Close();
void Flush(bool fShutdown); void Flush(bool fShutdown);
void CheckpointLSN(const std::string& strFile); void CheckpointLSN(const std::string& strFile);
@ -110,9 +109,9 @@ public:
ideal to be called periodically */ ideal to be called periodically */
static bool PeriodicFlush(std::string strFile); static bool PeriodicFlush(std::string strFile);
/* verifies the database environment */ /* verifies the database environment */
static bool VerifyEnvironment(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& errorStr); static bool VerifyEnvironment(const std::string& walletFile, const fs::path& dataDir, std::string& errorStr);
/* verifies the database file */ /* verifies the database file */
static bool VerifyDatabaseFile(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& warningStr, std::string& errorStr, bool (*recoverFunc)(const std::string& strFile)); static bool VerifyDatabaseFile(const std::string& walletFile, const fs::path& dataDir, std::string& warningStr, std::string& errorStr, bool (*recoverFunc)(const std::string& strFile));
private: private:
CDB(const CDB&); CDB(const CDB&);

12
src/wallet/wallet.cpp

@ -11,6 +11,7 @@
#include "wallet/coincontrol.h" #include "wallet/coincontrol.h"
#include "consensus/consensus.h" #include "consensus/consensus.h"
#include "consensus/validation.h" #include "consensus/validation.h"
#include "fs.h"
#include "key.h" #include "key.h"
#include "keystore.h" #include "keystore.h"
#include "validation.h" #include "validation.h"
@ -30,7 +31,6 @@
#include <assert.h> #include <assert.h>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
CWallet* pwalletMain = NULL; CWallet* pwalletMain = NULL;
@ -3945,16 +3945,16 @@ bool CWallet::BackupWallet(const std::string& strDest)
bitdb.mapFileUseCount.erase(strWalletFile); bitdb.mapFileUseCount.erase(strWalletFile);
// Copy wallet file // Copy wallet file
boost::filesystem::path pathSrc = GetDataDir() / strWalletFile; fs::path pathSrc = GetDataDir() / strWalletFile;
boost::filesystem::path pathDest(strDest); fs::path pathDest(strDest);
if (boost::filesystem::is_directory(pathDest)) if (fs::is_directory(pathDest))
pathDest /= strWalletFile; pathDest /= strWalletFile;
try { try {
boost::filesystem::copy_file(pathSrc, pathDest, boost::filesystem::copy_option::overwrite_if_exists); fs::copy_file(pathSrc, pathDest, fs::copy_option::overwrite_if_exists);
LogPrintf("copied %s to %s\n", strWalletFile, pathDest.string()); LogPrintf("copied %s to %s\n", strWalletFile, pathDest.string());
return true; return true;
} catch (const boost::filesystem::filesystem_error& e) { } catch (const fs::filesystem_error& e) {
LogPrintf("error copying %s to %s - %s\n", strWalletFile, pathDest.string(), e.what()); LogPrintf("error copying %s to %s - %s\n", strWalletFile, pathDest.string(), e.what());
return false; return false;
} }

6
src/wallet/walletdb.cpp

@ -7,6 +7,7 @@
#include "base58.h" #include "base58.h"
#include "consensus/validation.h" #include "consensus/validation.h"
#include "fs.h"
#include "validation.h" // For CheckTransaction #include "validation.h" // For CheckTransaction
#include "protocol.h" #include "protocol.h"
#include "serialize.h" #include "serialize.h"
@ -18,7 +19,6 @@
#include <atomic> #include <atomic>
#include <boost/version.hpp> #include <boost/version.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
@ -842,12 +842,12 @@ bool CWalletDB::RecoverKeysOnlyFilter(void *callbackData, CDataStream ssKey, CDa
return true; return true;
} }
bool CWalletDB::VerifyEnvironment(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& errorStr) bool CWalletDB::VerifyEnvironment(const std::string& walletFile, const fs::path& dataDir, std::string& errorStr)
{ {
return CDB::VerifyEnvironment(walletFile, dataDir, errorStr); return CDB::VerifyEnvironment(walletFile, dataDir, errorStr);
} }
bool CWalletDB::VerifyDatabaseFile(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& warningStr, std::string& errorStr) bool CWalletDB::VerifyDatabaseFile(const std::string& walletFile, const fs::path& dataDir, std::string& warningStr, std::string& errorStr)
{ {
return CDB::VerifyDatabaseFile(walletFile, dataDir, errorStr, warningStr, CWalletDB::Recover); return CDB::VerifyDatabaseFile(walletFile, dataDir, errorStr, warningStr, CWalletDB::Recover);
} }

4
src/wallet/walletdb.h

@ -185,9 +185,9 @@ public:
/* Function to determine if a certain KV/key-type is a key (cryptographical key) type */ /* Function to determine if a certain KV/key-type is a key (cryptographical key) type */
static bool IsKeyType(const std::string& strType); static bool IsKeyType(const std::string& strType);
/* verifies the database environment */ /* verifies the database environment */
static bool VerifyEnvironment(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& errorStr); static bool VerifyEnvironment(const std::string& walletFile, const fs::path& dataDir, std::string& errorStr);
/* verifies the database file */ /* verifies the database file */
static bool VerifyDatabaseFile(const std::string& walletFile, const boost::filesystem::path& dataDir, std::string& warningStr, std::string& errorStr); static bool VerifyDatabaseFile(const std::string& walletFile, const fs::path& dataDir, std::string& warningStr, std::string& errorStr);
//! write the hdchain model (external chain child index counter) //! write the hdchain model (external chain child index counter)
bool WriteHDChain(const CHDChain& chain); bool WriteHDChain(const CHDChain& chain);

Loading…
Cancel
Save