Started implementing reading/writing files

This commit is contained in:
Sebastian Messmer 2015-03-08 03:51:19 +01:00
parent e4a0084ea3
commit 43c4f29927
9 changed files with 45 additions and 11 deletions

View File

@ -71,7 +71,7 @@ unique_ptr<fspp::Node> CryDevice::Load(const bf::path &path) {
if (DirBlob::IsDir(*currentBlob)) {
return make_unique<CryDir>(this, std::move(make_unique<DirBlob>(std::move(currentBlob))));
} else if (FileBlob::IsFile(*currentBlob)) {
return make_unique<CryFile>(std::move(make_unique<FileBlob>(std::move(currentBlob))));
return make_unique<CryFile>(this, std::move(make_unique<FileBlob>(std::move(currentBlob))));
} else {
throw FuseErrnoException(EIO);
}
@ -85,4 +85,8 @@ unique_ptr<blobstore::Blob> CryDevice::CreateBlob() {
return _blobStore->create();
}
unique_ptr<blobstore::Blob> CryDevice::LoadBlob(const blockstore::Key &key) {
return _blobStore->load(key);
}
}

View File

@ -25,6 +25,7 @@ public:
void statfs(const boost::filesystem::path &path, struct ::statvfs *fsstat) override;
std::unique_ptr<blobstore::Blob> CreateBlob();
std::unique_ptr<blobstore::Blob> LoadBlob(const blockstore::Key &key);
private:
blockstore::Key GetOrCreateRootKey(CryConfig *config);

View File

@ -41,7 +41,7 @@ unique_ptr<fspp::File> CryDir::createFile(const string &name, mode_t mode) {
//TODO Do we need a return value in createDir for fspp? If not, change fspp!
auto fileblob = make_unique<FileBlob>(std::move(child));
fileblob->InitializeEmptyFile();
return make_unique<CryFile>(std::move(fileblob));
return make_unique<CryFile>(_device, std::move(fileblob));
}
unique_ptr<fspp::Dir> CryDir::createDir(const string &name, mode_t mode) {

View File

@ -15,15 +15,17 @@ using std::make_unique;
namespace cryfs {
CryFile::CryFile(unique_ptr<FileBlob> blob)
: _blob(std::move(blob)) {
CryFile::CryFile(CryDevice *device, unique_ptr<FileBlob> blob)
: _device(device),
_blob(std::move(blob)) {
}
CryFile::~CryFile() {
}
unique_ptr<fspp::OpenFile> CryFile::open(int flags) const {
throw FuseErrnoException(ENOTSUP);
//TODO This is a performance issue because we open the blob twice on the "open" syscall
return make_unique<CryOpenFile>(make_unique<FileBlob>(_device->LoadBlob(_blob->key())));
}
void CryFile::stat(struct ::stat *result) const {

View File

@ -11,7 +11,7 @@ namespace cryfs {
class CryFile: public fspp::File, CryNode {
public:
CryFile(std::unique_ptr<FileBlob> blob);
CryFile(CryDevice *device, std::unique_ptr<FileBlob> blob);
virtual ~CryFile();
void stat(struct ::stat *result) const override;
@ -20,6 +20,7 @@ public:
void unlink() override;
private:
CryDevice *_device;
std::unique_ptr<FileBlob> _blob;
DISALLOW_COPY_AND_ASSIGN(CryFile);

View File

@ -5,17 +5,21 @@
#include "CryDevice.h"
#include "messmer/fspp/fuse/FuseErrnoException.h"
#include "impl/FileBlob.h"
namespace bf = boost::filesystem;
using std::unique_ptr;
using blobstore::Blob;
//TODO Get rid of this in favor of a exception hierarchy
using fspp::fuse::CHECK_RETVAL;
using fspp::fuse::FuseErrnoException;
namespace cryfs {
CryOpenFile::CryOpenFile() {
throw FuseErrnoException(ENOTSUP);
CryOpenFile::CryOpenFile(unique_ptr<FileBlob> fileBlob)
: _fileBlob(std::move(fileBlob)) {
}
CryOpenFile::~CryOpenFile() {
@ -35,11 +39,13 @@ void CryOpenFile::truncate(off_t size) const {
}
int CryOpenFile::read(void *buf, size_t count, off_t offset) {
throw FuseErrnoException(ENOTSUP);
//TODO Return number of read bytes
_fileBlob->read(buf, offset, count);
return count;
}
void CryOpenFile::write(const void *buf, size_t count, off_t offset) {
throw FuseErrnoException(ENOTSUP);
_fileBlob->write(buf, offset, count);
}
void CryOpenFile::fsync() {

View File

@ -7,10 +7,11 @@
namespace cryfs {
class CryDevice;
class FileBlob;
class CryOpenFile: public fspp::OpenFile {
public:
CryOpenFile();
CryOpenFile(std::unique_ptr<FileBlob> fileBlob);
virtual ~CryOpenFile();
void stat(struct ::stat *result) const override;
@ -22,6 +23,7 @@ public:
void fdatasync() override;
private:
std::unique_ptr<FileBlob> _fileBlob;
DISALLOW_COPY_AND_ASSIGN(CryOpenFile);
};

View File

@ -1,6 +1,7 @@
#include "FileBlob.h"
#include "MagicNumbers.h"
#include <messmer/blockstore/utils/Key.h>
using std::unique_ptr;
using blobstore::Blob;
@ -34,4 +35,16 @@ bool FileBlob::IsFile(const Blob &blob) {
return magicNumber(blob) == MagicNumbers::FILE;
}
void FileBlob::read(void *target, uint64_t offset, uint64_t count) const {
_blob->read(target, offset + 1, count);
}
void FileBlob::write(const void *source, uint64_t offset, uint64_t count) {
_blob->write(source, offset + 1, count);
}
blockstore::Key FileBlob::key() const {
return _blob->key();
}
}

View File

@ -16,6 +16,11 @@ public:
void InitializeEmptyFile();
void read(void *target, uint64_t offset, uint64_t count) const;
void write(const void *source, uint64_t offset, uint64_t count);
blockstore::Key key() const;
private:
std::unique_ptr<blobstore::Blob> _blob;