Use VersionCountingBlockStore

This commit is contained in:
Sebastian Messmer 2016-06-21 16:29:56 -07:00
parent 13411c4e59
commit a5391a854d
5 changed files with 72 additions and 3 deletions

View File

@ -32,6 +32,7 @@ set(SOURCES
assert/backtrace.cpp
assert/AssertFailed.cpp
system/get_total_memory.cpp
system/homedir.cpp
)
add_library(${PROJECT_NAME} STATIC ${SOURCES})

View File

@ -0,0 +1,25 @@
#include "homedir.h"
#include <sys/types.h>
#include <pwd.h>
namespace bf = boost::filesystem;
using std::string;
namespace cpputils {
namespace system {
bf::path home_directory() {
struct passwd* pwd = getpwuid(getuid());
string homedir;
if (pwd) {
homedir = pwd->pw_dir;
} else {
// try the $HOME environment variable
homedir = getenv("HOME");
}
if (homedir == "") {
throw std::runtime_error("Couldn't determine home directory for user");
}
return homedir;
}
}
}

View File

@ -0,0 +1,15 @@
#pragma once
#ifndef MESSMER_CPPUTILS_SYSTEM_GETTOTALMEMORY_H
#define MESSMER_CPPUTILS_SYSTEM_GETTOTALMEMORY_H
#include <boost/filesystem/path.hpp>
namespace cpputils {
namespace system {
boost::filesystem::path home_directory();
}
}
#endif

View File

@ -11,9 +11,11 @@
#include <blobstore/implementations/onblocks/BlobStoreOnBlocks.h>
#include <blobstore/implementations/onblocks/BlobOnBlocks.h>
#include <blockstore/implementations/encrypted/EncryptedBlockStore.h>
#include <blockstore/implementations/versioncounting/VersionCountingBlockStore.h>
#include "parallelaccessfsblobstore/ParallelAccessFsBlobStore.h"
#include "cachingfsblobstore/CachingFsBlobStore.h"
#include "../config/CryCipher.h"
#include <cpp-utils/system/homedir.h>
using std::string;
@ -27,6 +29,7 @@ using blockstore::encrypted::EncryptedBlockStore;
using blobstore::onblocks::BlobStoreOnBlocks;
using blobstore::onblocks::BlobOnBlocks;
using blockstore::caching::CachingBlockStore;
using blockstore::versioncounting::VersionCountingBlockStore;
using cpputils::unique_ref;
using cpputils::make_unique_ref;
using cpputils::dynamic_pointer_move;
@ -52,8 +55,14 @@ CryDevice::CryDevice(CryConfigFile configFile, unique_ref<BlockStore> blockStore
make_unique_ref<FsBlobStore>(
make_unique_ref<BlobStoreOnBlocks>(
make_unique_ref<CachingBlockStore>(
CreateEncryptedBlockStore(*configFile.config(), std::move(blockStore))
), configFile.config()->BlocksizeBytes())))
make_unique_ref<VersionCountingBlockStore>(
CreateEncryptedBlockStore(*configFile.config(), std::move(blockStore)),
_integrityFilePath(configFile.config()->FilesystemId())
)
)
, configFile.config()->BlocksizeBytes())
)
)
)
),
_rootKey(GetOrCreateRootKey(&configFile)),
@ -66,6 +75,22 @@ Key CryDevice::CreateRootBlobAndReturnKey() {
return rootBlob->key();
}
bf::path CryDevice::_integrityFilePath(const CryConfig::FilesystemID &filesystemId) {
bf::path app_dir = cpputils::system::home_directory() / ".cryfs";
_createDirIfNotExists(app_dir);
bf::path filesystems_dir = app_dir / "filesystems";
_createDirIfNotExists(filesystems_dir);
bf::path this_filesystem_dir = filesystems_dir / filesystemId.ToString();
_createDirIfNotExists(this_filesystem_dir);
return this_filesystem_dir / "integritydata.knownblockversions";
}
void CryDevice::_createDirIfNotExists(const bf::path &path) {
if (!bf::exists(path)) {
bf::create_directory(path);
}
}
optional<unique_ref<fspp::Node>> CryDevice::Load(const bf::path &path) {
// TODO Split into smaller functions
ASSERT(path.is_absolute(), "Non absolute path given");

View File

@ -47,6 +47,9 @@ private:
blockstore::Key _rootKey;
std::vector<std::function<void()>> _onFsAction;
static boost::filesystem::path _integrityFilePath(const CryConfig::FilesystemID &filesystemId);
static void _createDirIfNotExists(const boost::filesystem::path &path);
blockstore::Key GetOrCreateRootKey(CryConfigFile *config);
blockstore::Key CreateRootBlobAndReturnKey();
static cpputils::unique_ref<blockstore::BlockStore> CreateEncryptedBlockStore(const CryConfig &config, cpputils::unique_ref<blockstore::BlockStore> baseBlockStore);