Dir::children() returns not only the entry name, but also whether it is a file or a directory entry

This commit is contained in:
Sebastian Messmer 2015-03-10 21:51:12 +01:00
parent dc32db6a34
commit 40c690d03b
9 changed files with 32 additions and 12 deletions

View File

@ -14,11 +14,24 @@ class Dir: public virtual Node {
public:
virtual ~Dir() {}
enum class EntryType {
DIR = 0,
FILE = 1
};
struct Entry {
Entry(EntryType type_, const std::string &name_): type(type_), name(name_) {}
EntryType type;
std::string name;
};
virtual std::unique_ptr<File> createFile(const std::string &name, mode_t mode) = 0;
virtual std::unique_ptr<Dir> createDir(const std::string &name, mode_t mode) = 0;
virtual void rmdir() = 0;
virtual std::unique_ptr<std::vector<std::string>> children() const = 0;
//TODO Allow alternative implementation returning only children names without more information
//virtual std::unique_ptr<std::vector<std::string>> children() const = 0;
virtual std::unique_ptr<std::vector<Entry>> children() const = 0;
};
} /* namespace fspp */

View File

@ -6,6 +6,7 @@
#include <memory>
#include <sys/stat.h>
#include <sys/statvfs.h>
#include "../fs_interface/Dir.h"
namespace fspp {
namespace fuse {
@ -32,7 +33,8 @@ public:
virtual void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) = 0;
virtual void utimens(const boost::filesystem::path &path, const timespec times[2]) = 0;
virtual void statfs(const boost::filesystem::path &path, struct statvfs *fsstat) = 0;
virtual std::unique_ptr<std::vector<std::string>> readDir(const boost::filesystem::path &path) = 0;
//TODO We shouldn't use Dir::Entry here, that's in another layer
virtual std::unique_ptr<std::vector<Dir::Entry>> readDir(const boost::filesystem::path &path) = 0;
};
}

View File

@ -472,7 +472,7 @@ int Fuse::readdir(const bf::path &path, void *buf, fuse_fill_dir_t filler, off_t
//We could pass file metadata to filler() in its third parameter,
//but it doesn't help performance since fuse seems to ignore it.
//It does getattr() calls on all entries nevertheless.
if (filler(buf, entry.c_str(), nullptr, 0) != 0) {
if (filler(buf, entry.name.c_str(), nullptr, 0) != 0) {
return -ENOMEM;
}
}

View File

@ -127,7 +127,7 @@ void FilesystemImpl::rename(const bf::path &from, const bf::path &to) {
node->rename(to);
}
unique_ptr<vector<string>> FilesystemImpl::readDir(const bf::path &path) {
unique_ptr<vector<Dir::Entry>> FilesystemImpl::readDir(const bf::path &path) {
auto dir = LoadDir(path);
return dir->children();
}

View File

@ -11,7 +11,6 @@ namespace fspp {
class Node;
class File;
class OpenFile;
class Dir;
class FilesystemImpl: public fuse::Filesystem {
public:
@ -35,7 +34,7 @@ public:
void rmdir(const boost::filesystem::path &path) override;
void unlink(const boost::filesystem::path &path) override;
void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) override;
std::unique_ptr<std::vector<std::string>> readDir(const boost::filesystem::path &path) override;
std::unique_ptr<std::vector<Dir::Entry>> readDir(const boost::filesystem::path &path) override;
void utimens(const boost::filesystem::path &path, const timespec times[2]) override;
void statfs(const boost::filesystem::path &path, struct statvfs *fsstat) override;

View File

@ -14,6 +14,7 @@ using std::vector;
using std::string;
using namespace fspp::fuse;
using fspp::Dir;
unique_ptr<vector<string>> LARGE_DIR(int num_entries) {
auto result = make_unique<vector<string>>();

View File

@ -79,7 +79,10 @@ void FuseReadDirTest::closeDir(DIR *dir) {
EXPECT_EQ(0, retval) << "Closing dir failed";
}
Action<vector<string>*(const char*)> FuseReadDirTest::ReturnDirEntries(vector<string> entries) {
vector<string> *direntries = new vector<string>(entries);
Action<vector<fspp::Dir::Entry>*(const char*)> FuseReadDirTest::ReturnDirEntries(vector<std::string> entries) {
vector<fspp::Dir::Entry> *direntries = new vector<fspp::Dir::Entry>(entries.size(), fspp::Dir::Entry(fspp::Dir::EntryType::FILE, ""));
for(unsigned int i = 0; i < entries.size(); ++i) {
(*direntries)[i].name = entries[i];
}
return Return(direntries);
}

View File

@ -4,6 +4,7 @@
#include "../../../testutils/FuseTest.h"
#include <dirent.h>
#include "../../../../fs_interface/Dir.h"
class FuseReadDirTest: public FuseTest {
public:
@ -12,7 +13,7 @@ public:
std::unique_ptr<std::vector<std::string>> ReadDir(const char *dirname);
int ReadDirReturnError(const char *dirname);
static ::testing::Action<std::vector<std::string>*(const char*)> ReturnDirEntries(std::vector<std::string> entries);
static ::testing::Action<std::vector<fspp::Dir::Entry>*(const char*)> ReturnDirEntries(std::vector<std::string> entries);
private:
DIR *openDir(TempTestFS *fs, const char *dirname);

View File

@ -8,6 +8,7 @@
#include "../../fuse/Filesystem.h"
#include "../../fuse/FuseErrnoException.h"
#include "../../fuse/Fuse.h"
#include "../../fs_interface/Dir.h"
#include <boost/filesystem.hpp>
@ -57,10 +58,10 @@ public:
return rename(from.c_str(), to.c_str());
}
MOCK_METHOD2(rename, void(const char*, const char*));
std::unique_ptr<std::vector<std::string>> readDir(const boost::filesystem::path &path) {
return std::unique_ptr<std::vector<std::string>>(readDir(path.c_str()));
std::unique_ptr<std::vector<fspp::Dir::Entry>> readDir(const boost::filesystem::path &path) {
return std::unique_ptr<std::vector<fspp::Dir::Entry>>(readDir(path.c_str()));
}
MOCK_METHOD1(readDir, std::vector<std::string>*(const char*));
MOCK_METHOD1(readDir, std::vector<fspp::Dir::Entry>*(const char*));
void utimens(const boost::filesystem::path &path, const timespec ts[2]) override {
return utimens(path.c_str(), ts);
}