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

Directory structure for fuse operations. Added directory operations defintions.

parent fd1f61fd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -16,6 +16,6 @@ find_package(FUSE3 REQUIRED)
find_package(Boost 1.56.0 COMPONENTS system filesystem serialization)

include_directories(${FUSE3_INCLUDE_DIR} include/)
set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/util.cpp src/metadata.h src/metadata.cpp src/metadata_ops.h src/metadata_ops.cpp src/dentry_ops.cpp src/dentry_ops.h src/configure.h)
set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/util.cpp src/metadata.h src/metadata.cpp src/metadata_ops.h src/metadata_ops.cpp src/dentry_ops.cpp src/dentry_ops.h src/configure.h src/fuse_ops/file.cpp src/fuse_ops/directory.cpp)
add_executable(adafs ${SOURCE_FILES} src/main.cpp)
target_link_libraries(adafs ${FUSE3_LIBRARIES} -lpthread -lboost_system -lboost_filesystem -lboost_serialization)
 No newline at end of file
+14 −2
Original line number Diff line number Diff line
@@ -5,7 +5,19 @@
#ifndef FS_FUSE_OPS_H
#define FS_FUSE_OPS_H

int adafs_getattr(const char *path, struct stat *attr);
void *adafs_init(struct fuse_conn_info *conn);
#include "main.h"

// file
int adafs_getattr(const char*, struct stat*, struct fuse_file_info*);

// directory
int adafs_opendir(const char*, struct fuse_file_info*);

int adafs_readdir(const char*, void*, fuse_fill_dir_t, off_t, struct fuse_file_info*, enum fuse_readdir_flags);

int adafs_releasedir(const char*, struct fuse_file_info*);

void* adafs_init(struct fuse_conn_info*, struct fuse_config*);
void adafs_destroy(void *);

#endif //FS_FUSE_OPS_H
+18 −0
Original line number Diff line number Diff line
//
// Created by evie on 3/17/17.
//

#include "../main.h"
#include "../fuse_ops.h"

int adafs_opendir(const char*, struct fuse_file_info*) {
    return 0;
}

int adafs_readdir(const char*, void*, fuse_fill_dir_t, off_t, struct fuse_file_info*, enum fuse_readdir_flags) {
    return 0;
}

int adafs_releasedir(const char*, struct fuse_file_info*) {
    return 0;
}
 No newline at end of file
+49 −0
Original line number Diff line number Diff line
//
// Created by evie on 3/17/17.
//

#include "../main.h"
#include "../fuse_ops.h"
#include "../metadata.h"
#include "../metadata_ops.h"

using namespace std;

int adafs_getattr(const char* p, struct stat* attr, struct fuse_file_info* fi) {

    auto path = bfs::path(p);
    auto md = make_shared<Metadata>();

    if (get_metadata(*md, path) != -ENOENT) {
        attr->st_ino = md->inode_no();
        attr->st_mode = md->mode();
        attr->st_nlink = md->link_count();
        attr->st_uid = md->uid();
        attr->st_gid = md->gid();
        attr->st_size = md->size();
        attr->st_blksize = ADAFS_DATA->blocksize;
        attr->st_blocks = md->blocks();
        attr->st_atim.tv_sec = md->atime();
        attr->st_mtim.tv_sec = md->mtime();
        attr->st_ctim.tv_sec = md->ctime();
        return 0;
    }

// XXX Testing stuff below. Tobe removed later when files can be created n stuff
//    if (strcmp(p, "/file") == 0) {
//        attr->st_mode = S_IFDIR | 0755;
//        return 0;
//    }
//    if (strcmp(p, "/file/file2") == 0) {
//        auto p_dir = make_shared<struct stat>();
//        lstat("/", p_dir.get());
//        ADAFS_DATA->logger->info(p_dir->st_ino);
//        ADAFS_DATA->logger->flush();
//
//        attr->st_mode = S_IFREG | 0755;
//        attr->st_nlink = 1;
//        attr->st_size = strlen("blubb");
//        return 0;
//    }
    return -ENOENT;
}
 No newline at end of file
+11 −53
Original line number Diff line number Diff line
#include "main.h"
#include <fuse3/fuse.h>
#include "metadata.h"
#include "metadata_ops.h"
#include "dentry_ops.h"
@@ -8,56 +9,6 @@ static struct fuse_operations adafs_ops;

using namespace std;


int adafs_getattr(const char *p, struct stat *attr, struct fuse_file_info *fi){


    // call lookup for *path, return int (use errorcodes), put pointer to Metadata object in parameter
    // if exist (i.e. == 0) use Metadata object, else return ENOENT
//    auto path_s = bfs::path(path);
//    ADAFS_DATA->logger->info(path_s);
//    ADAFS_DATA->logger->flush();
//    md->mode(S_IFDIR | 0755);
//    md->inode_no(1);
//    get_metadata(*md, path_s);
//    read_all_metadata(*md, 1, fpath);

    auto path = bfs::path(p);
    auto md = make_shared<Metadata>();

    if (get_metadata(*md, path) != -ENOENT) {
        attr->st_ino = md->inode_no();
        attr->st_mode = md->mode();
        attr->st_nlink = md->link_count();
        attr->st_uid = md->uid();
        attr->st_gid = md->gid();
        attr->st_size = md->size();
        attr->st_blksize = ADAFS_DATA->blocksize;
        attr->st_blocks = md->blocks();
        attr->st_atim.tv_sec = md->atime();
        attr->st_mtim.tv_sec = md->mtime();
        attr->st_ctim.tv_sec = md->ctime();
        return 0;
    }

    if (strcmp(p, "/file") == 0) {
        attr->st_mode = S_IFDIR | 0755;
        return 0;
    }
    if (strcmp(p, "/file/file2") == 0) {
        auto p_dir = make_shared<struct stat>();
        lstat("/", p_dir.get());
        ADAFS_DATA->logger->info(p_dir->st_ino);
        ADAFS_DATA->logger->flush();

        attr->st_mode = S_IFREG | 0755;
        attr->st_nlink = 1;
        attr->st_size = strlen("blubb");
        return 0;
    }
    return -ENOENT;
}

void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) {
    ADAFS_DATA->logger->info("Fuse init() enter"s);
    // Make sure directory structure exists
@@ -84,7 +35,7 @@ void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) {

    auto md = make_shared<Metadata>();

    // Check that root metadata exists. If not intiialize it
    // Check that root metadata exists. If not initialize it
    if (get_metadata(*md, "/"s) == -ENOENT) {
        ADAFS_DATA->logger->info("Root metadata not found. Initializing..."s);
        md->init_ACM_time();
@@ -99,6 +50,10 @@ void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) {
        init_dentry(ADAFS_DATA->hashf("/"s));
        ADAFS_DATA->logger->info("Creating Metadata object"s);
    }
#ifdef LOG_INFO
    else
        ADAFS_DATA->logger->info("Metadata object exists"s);
#endif


    return ADAFS_DATA;
@@ -111,7 +66,12 @@ void adafs_destroy(void *adafs_data) {


static void init_adafs_ops(fuse_operations *ops) {
    // file
    ops->getattr = adafs_getattr;
    // directory
    ops->opendir = adafs_opendir;
    ops->readdir = adafs_readdir;
    ops->releasedir = adafs_releasedir;

    ops->init = adafs_init;
    ops->destroy = adafs_destroy;
@@ -133,8 +93,6 @@ int main(int argc, char *argv[]) {
#else
    spdlog::set_level(spdlog::level::off);
#endif


    //extract the rootdir from argv and put it into rootdir of adafs_data
    a_data->rootdir = string(realpath(argv[argc-2], NULL));
    argv[argc-2] = argv[argc-1];