From 728d97e9e8662f4f577db70943a48256712141a7 Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Tue, 4 Nov 2014 21:03:04 +0100 Subject: [PATCH] CryDevice stores root path to which we work relatively --- src/cryfs_lib/CryDevice.cpp | 6 ++---- src/cryfs_lib/CryDevice.h | 13 ++++++++++++- src/cryfs_lib/CryFuse.cpp | 10 ++++++++-- src/cryfs_lib/CryFuse.h | 9 +++++++++ src/cryfs_lib/utils/macros.h | 10 ++++++++++ src/main.cpp | 3 ++- 6 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/cryfs_lib/utils/macros.h diff --git a/src/cryfs_lib/CryDevice.cpp b/src/cryfs_lib/CryDevice.cpp index a1a59c66..a91135be 100644 --- a/src/cryfs_lib/CryDevice.cpp +++ b/src/cryfs_lib/CryDevice.cpp @@ -4,11 +4,9 @@ using namespace cryfs; -CryDevice::CryDevice() { - std::cout << "Created CryDevice\n"; - +CryDevice::CryDevice(const fusepp::path &rootdir) + :_rootdir(rootdir) { } CryDevice::~CryDevice() { } - diff --git a/src/cryfs_lib/CryDevice.h b/src/cryfs_lib/CryDevice.h index d8f8c410..02fab583 100644 --- a/src/cryfs_lib/CryDevice.h +++ b/src/cryfs_lib/CryDevice.h @@ -3,15 +3,26 @@ #define CRYFS_LIB_CRYDEVICE_H_ #include "fusepp/Fuse.h" +#include "utils/macros.h" namespace cryfs { class CryDevice { public: - CryDevice(); + CryDevice(const fusepp::path &rootdir); virtual ~CryDevice(); + + const fusepp::path &RootDir() const; +private: + const fusepp::path _rootdir; + + DISALLOW_COPY_AND_ASSIGN(CryDevice); }; +inline const fusepp::path &CryDevice::RootDir() const { + return _rootdir; +} + } #endif /* CRYFS_LIB_CRYDEVICE_H_ */ diff --git a/src/cryfs_lib/CryFuse.cpp b/src/cryfs_lib/CryFuse.cpp index b33480d1..0f08e40e 100644 --- a/src/cryfs_lib/CryFuse.cpp +++ b/src/cryfs_lib/CryFuse.cpp @@ -10,9 +10,14 @@ using fusepp::path; namespace cryfs { +CryFuse::CryFuse(CryDevice *device) + :_device(device) { +} + int CryFuse::getattr(const path &path, struct stat *stbuf) { UNUSED(stbuf); - int retstat = lstat(path.c_str(), stbuf); + auto real_path = _device->RootDir() / path; + int retstat = lstat(real_path.c_str(), stbuf); if (retstat != 0) { retstat = -errno; } @@ -140,7 +145,8 @@ int CryFuse::fsync(const path &path, int flags, fuse_file_info *fileinfo) { } int CryFuse::opendir(const path &path, fuse_file_info *fileinfo) { - DIR *dp = ::opendir(path.c_str()); + auto real_path = _device->RootDir() / path; + DIR *dp = ::opendir(real_path.c_str()); int retstat = 0; if (dp == nullptr) { retstat = -errno; diff --git a/src/cryfs_lib/CryFuse.h b/src/cryfs_lib/CryFuse.h index 7b9438f0..f40037cb 100644 --- a/src/cryfs_lib/CryFuse.h +++ b/src/cryfs_lib/CryFuse.h @@ -3,11 +3,15 @@ #define CRYFS_LIB_CRYFUSE_H_ #include "fusepp/Fuse.h" +#include "CryDevice.h" +#include "utils/macros.h" namespace cryfs { class CryFuse: public fusepp::Fuse { public: + CryFuse(CryDevice *device); + int getattr(const fusepp::path &path, struct stat *stbuf) override; int fgetattr(const fusepp::path &path, struct stat *stbuf, fuse_file_info *fileinfo) override; int readlink(const fusepp::path &path, char *buf, size_t size) override; @@ -38,6 +42,11 @@ public: void destroy() override; int access(const fusepp::path &path, int mask) override; int create(const fusepp::path &path, mode_t mode, fuse_file_info *fileinfo) override; + +private: + CryDevice *_device; + + DISALLOW_COPY_AND_ASSIGN(CryFuse); }; } /* namespace cryfs */ diff --git a/src/cryfs_lib/utils/macros.h b/src/cryfs_lib/utils/macros.h new file mode 100644 index 00000000..e0dca2f5 --- /dev/null +++ b/src/cryfs_lib/utils/macros.h @@ -0,0 +1,10 @@ +#pragma once +#ifndef CRYFS_LIB_UTILS_MACROS_H_ +#define CRYFS_LIB_UTILS_MACROS_H_ + +#define DISALLOW_COPY_AND_ASSIGN(Class) \ + Class(const Class &rhs) = delete; \ + Class &operator=(const Class &rhs) = delete; + + +#endif /* CRYFS_LIB_UTILS_MACROS_H_ */ diff --git a/src/main.cpp b/src/main.cpp index a811d066..3b7a07ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,7 +9,8 @@ int main (int argc, char *argv[]) { printf("Version: %d\n", buildconfig::VERSION::MAJOR); - cryfs::CryFuse fuse; + cryfs::CryDevice device(fusepp::path("/")); + cryfs::CryFuse fuse(&device); fuse.run(argc, argv); return 0; }