Commit ee066bb0 authored by Marc Vef's avatar Marc Vef
Browse files

Finalized: readdir(). Limited & won't return all dentries in large dirs

parent aa8ed36e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+38 −1
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
#include <boost/archive/binary_iarchive.hpp>
#include "dentry_ops.h"

#include "../classes/dentry.h"

using namespace std;

/**
@@ -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
@@ -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;
}
+4 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
#define FS_DENTRY_OPS_H

#include "../main.h"
#include "../classes/dentry.h"


bool init_dentry_dir(const uint64_t inode);

@@ -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);
+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_;
}
+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