Loading lfs/CMakeLists.txt +2 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ find_package(Boost 1.58 REQUIRED COMPONENTS system filesystem serialization) include_directories(${FUSE3_INCLUDE_DIR} include/) set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/configure.h src/classes/metadata.h src/classes/metadata.cpp src/classes/fs_data.h src/classes/fs_data.cpp src/classes/dentry.h src/classes/dentry.cpp src/adafs_ops/metadata_ops.h src/adafs_ops/dentry_ops.h src/adafs_ops/access.h src/util.cpp Loading lfs/src/adafs_ops/dentry_ops.cpp +38 −1 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ #include <boost/archive/binary_iarchive.hpp> #include "dentry_ops.h" #include "../classes/dentry.h" using namespace std; /** Loading Loading @@ -82,6 +84,41 @@ int read_dentries(const uint64_t p_inode, const unsigned long inode) { return 0; } /** * Reads all directory entries in a directory for the given inode. Returns 0 if successful. The dentries vector is not * cleared before it is used. * @param dentries assumed to be empty * @param dir_inode * @return */ int get_dentries(vector<Dentry>& dentries, const uint64_t dir_inode) { ADAFS_DATA->spdlogger()->debug("get_dentries: inode {}", dir_inode); auto d_path = bfs::path(ADAFS_DATA->dentry_path()); d_path /= to_string(dir_inode); // shortcut if path is empty = no files in directory if (bfs::is_empty(d_path)) return 0; auto dir_it = bfs::directory_iterator(d_path); for (const auto& it : dir_it) { auto dentry = make_shared<Dentry>(it.path().filename().string()); // retrieve inode number and mode in dentry uint64_t inode; mode_t mode; d_path /= it.path().filename(); bfs::ifstream ifs{d_path}; boost::archive::binary_iarchive ba(ifs); ba >> inode; ba >> mode; dentry->inode(inode); dentry->mode(mode); // append dentry to dentries vector dentries.push_back(*dentry); d_path.remove_filename(); } return 0; } /** * Gets the inode of a directory entry * @param req Loading @@ -106,7 +143,7 @@ uint64_t do_lookup(fuse_req_t& req, const uint64_t p_inode, const string& name) //read inode from disk boost::archive::binary_iarchive ba(ifs); ba >> inode; ADAFS_DATA->spdlogger()->debug("the inode that was gotten from do_lookup: {}", inode); ADAFS_DATA->spdlogger()->debug("do_lookup: p_inode {} name {} resolved_inode {}", p_inode, name, inode); return inode; } Loading lfs/src/adafs_ops/dentry_ops.h +4 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ #define FS_DENTRY_OPS_H #include "../main.h" #include "../classes/dentry.h" bool init_dentry_dir(const uint64_t inode); Loading @@ -15,6 +17,8 @@ bool verify_dentry(const uint64_t inode); int read_dentries(const uint64_t p_inode, const unsigned long inode); int get_dentries(std::vector<Dentry>& dentries, const uint64_t dir_inode); uint64_t do_lookup(fuse_req_t& req, const uint64_t p_inode, const std::string& name); int create_dentry(const uint64_t p_inode, const uint64_t inode, const std::string& name, mode_t mode); Loading lfs/src/classes/dentry.cpp 0 → 100644 +35 −0 Original line number Diff line number Diff line // // Created by evie on 5/9/17. // #include "dentry.h" Dentry::Dentry() {} Dentry::Dentry(const std::string& name_) : name_(name_) {} Dentry::Dentry(const std::string& name_, uint64_t inode_, mode_t mode_) : name_(name_), inode_(inode_), mode_(mode_) {} const std::string& Dentry::name() const { return name_; } void Dentry::name(const std::string& name_) { Dentry::name_ = name_; } uint64_t Dentry::inode() const { return inode_; } void Dentry::inode(uint64_t inode_) { Dentry::inode_ = inode_; } mode_t Dentry::mode() const { return mode_; } void Dentry::mode(mode_t mode_) { Dentry::mode_ = mode_; } lfs/src/classes/dentry.h 0 → 100644 +40 −0 Original line number Diff line number Diff line // // Created by evie on 5/9/17. // #ifndef LFS_DEnTRY_H #define LFS_DEnTRY_H #include "../main.h" class Dentry { private: std::string name_; uint64_t inode_; mode_t mode_; // file type code (6 bits) + permission bits (9 bits rwx(user)rwx(group)rwx(others) public: Dentry(); Dentry(const std::string& name_); Dentry(const std::string& name_, uint64_t inode_, mode_t mode_); const std::string& name() const; void name(const std::string& name_); uint64_t inode() const; void inode(uint64_t inode_); mode_t mode() const; void mode(mode_t mode_); }; #endif //LFS_DEnTRY_H Loading
lfs/CMakeLists.txt +2 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ find_package(Boost 1.58 REQUIRED COMPONENTS system filesystem serialization) include_directories(${FUSE3_INCLUDE_DIR} include/) set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/configure.h src/classes/metadata.h src/classes/metadata.cpp src/classes/fs_data.h src/classes/fs_data.cpp src/classes/dentry.h src/classes/dentry.cpp src/adafs_ops/metadata_ops.h src/adafs_ops/dentry_ops.h src/adafs_ops/access.h src/util.cpp Loading
lfs/src/adafs_ops/dentry_ops.cpp +38 −1 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ #include <boost/archive/binary_iarchive.hpp> #include "dentry_ops.h" #include "../classes/dentry.h" using namespace std; /** Loading Loading @@ -82,6 +84,41 @@ int read_dentries(const uint64_t p_inode, const unsigned long inode) { return 0; } /** * Reads all directory entries in a directory for the given inode. Returns 0 if successful. The dentries vector is not * cleared before it is used. * @param dentries assumed to be empty * @param dir_inode * @return */ int get_dentries(vector<Dentry>& dentries, const uint64_t dir_inode) { ADAFS_DATA->spdlogger()->debug("get_dentries: inode {}", dir_inode); auto d_path = bfs::path(ADAFS_DATA->dentry_path()); d_path /= to_string(dir_inode); // shortcut if path is empty = no files in directory if (bfs::is_empty(d_path)) return 0; auto dir_it = bfs::directory_iterator(d_path); for (const auto& it : dir_it) { auto dentry = make_shared<Dentry>(it.path().filename().string()); // retrieve inode number and mode in dentry uint64_t inode; mode_t mode; d_path /= it.path().filename(); bfs::ifstream ifs{d_path}; boost::archive::binary_iarchive ba(ifs); ba >> inode; ba >> mode; dentry->inode(inode); dentry->mode(mode); // append dentry to dentries vector dentries.push_back(*dentry); d_path.remove_filename(); } return 0; } /** * Gets the inode of a directory entry * @param req Loading @@ -106,7 +143,7 @@ uint64_t do_lookup(fuse_req_t& req, const uint64_t p_inode, const string& name) //read inode from disk boost::archive::binary_iarchive ba(ifs); ba >> inode; ADAFS_DATA->spdlogger()->debug("the inode that was gotten from do_lookup: {}", inode); ADAFS_DATA->spdlogger()->debug("do_lookup: p_inode {} name {} resolved_inode {}", p_inode, name, inode); return inode; } Loading
lfs/src/adafs_ops/dentry_ops.h +4 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ #define FS_DENTRY_OPS_H #include "../main.h" #include "../classes/dentry.h" bool init_dentry_dir(const uint64_t inode); Loading @@ -15,6 +17,8 @@ bool verify_dentry(const uint64_t inode); int read_dentries(const uint64_t p_inode, const unsigned long inode); int get_dentries(std::vector<Dentry>& dentries, const uint64_t dir_inode); uint64_t do_lookup(fuse_req_t& req, const uint64_t p_inode, const std::string& name); int create_dentry(const uint64_t p_inode, const uint64_t inode, const std::string& name, mode_t mode); Loading
lfs/src/classes/dentry.cpp 0 → 100644 +35 −0 Original line number Diff line number Diff line // // Created by evie on 5/9/17. // #include "dentry.h" Dentry::Dentry() {} Dentry::Dentry(const std::string& name_) : name_(name_) {} Dentry::Dentry(const std::string& name_, uint64_t inode_, mode_t mode_) : name_(name_), inode_(inode_), mode_(mode_) {} const std::string& Dentry::name() const { return name_; } void Dentry::name(const std::string& name_) { Dentry::name_ = name_; } uint64_t Dentry::inode() const { return inode_; } void Dentry::inode(uint64_t inode_) { Dentry::inode_ = inode_; } mode_t Dentry::mode() const { return mode_; } void Dentry::mode(mode_t mode_) { Dentry::mode_ = mode_; }
lfs/src/classes/dentry.h 0 → 100644 +40 −0 Original line number Diff line number Diff line // // Created by evie on 5/9/17. // #ifndef LFS_DEnTRY_H #define LFS_DEnTRY_H #include "../main.h" class Dentry { private: std::string name_; uint64_t inode_; mode_t mode_; // file type code (6 bits) + permission bits (9 bits rwx(user)rwx(group)rwx(others) public: Dentry(); Dentry(const std::string& name_); Dentry(const std::string& name_, uint64_t inode_, mode_t mode_); const std::string& name() const; void name(const std::string& name_); uint64_t inode() const; void inode(uint64_t inode_); mode_t mode() const; void mode(mode_t mode_); }; #endif //LFS_DEnTRY_H