On file/dir creation, the owner is passed in

This commit is contained in:
Sebastian Messmer 2015-04-22 14:31:15 +02:00
parent 8165ca39bc
commit f41939f443
5 changed files with 14 additions and 12 deletions

View File

@ -25,8 +25,8 @@ public:
std::string name; std::string name;
}; };
virtual std::unique_ptr<OpenFile> createAndOpenFile(const std::string &name, mode_t mode) = 0; virtual std::unique_ptr<OpenFile> createAndOpenFile(const std::string &name, mode_t mode, uid_t uid, gid_t gid) = 0;
virtual void createDir(const std::string &name, mode_t mode) = 0; virtual void createDir(const std::string &name, mode_t mode, uid_t uid, gid_t gid) = 0;
//TODO Allow alternative implementation returning only children names without more information //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<std::string>> children() const = 0;

View File

@ -14,7 +14,7 @@ class Filesystem {
public: public:
virtual ~Filesystem() {} virtual ~Filesystem() {}
virtual int createAndOpenFile(const boost::filesystem::path &path, mode_t mode) = 0; virtual int createAndOpenFile(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) = 0;
virtual int openFile(const boost::filesystem::path &path, int flags) = 0; virtual int openFile(const boost::filesystem::path &path, int flags) = 0;
virtual void flush(int descriptor) = 0; virtual void flush(int descriptor) = 0;
virtual void closeFile(int descriptor) = 0; virtual void closeFile(int descriptor) = 0;
@ -29,7 +29,7 @@ public:
virtual void fsync(int descriptor) = 0; virtual void fsync(int descriptor) = 0;
virtual void fdatasync(int descriptor) = 0; virtual void fdatasync(int descriptor) = 0;
virtual void access(const boost::filesystem::path &path, int mask) = 0; virtual void access(const boost::filesystem::path &path, int mask) = 0;
virtual void mkdir(const boost::filesystem::path &path, mode_t mode) = 0; virtual void mkdir(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) = 0;
virtual void rmdir(const boost::filesystem::path &path) = 0; virtual void rmdir(const boost::filesystem::path &path) = 0;
virtual void unlink(const boost::filesystem::path &path) = 0; virtual void unlink(const boost::filesystem::path &path) = 0;
virtual void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) = 0; virtual void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) = 0;

View File

@ -268,7 +268,8 @@ int Fuse::mknod(const bf::path &path, mode_t mode, dev_t rdev) {
int Fuse::mkdir(const bf::path &path, mode_t mode) { int Fuse::mkdir(const bf::path &path, mode_t mode) {
//printf("mkdir(%s, %d)\n", path.c_str(), mode); //printf("mkdir(%s, %d)\n", path.c_str(), mode);
try { try {
_fs->mkdir(path, mode); auto context = fuse_get_context();
_fs->mkdir(path, mode, context->uid, context->gid);
return 0; return 0;
} catch(fspp::fuse::FuseErrnoException &e) { } catch(fspp::fuse::FuseErrnoException &e) {
return -e.getErrno(); return -e.getErrno();
@ -530,7 +531,8 @@ int Fuse::access(const bf::path &path, int mask) {
int Fuse::create(const bf::path &path, mode_t mode, fuse_file_info *fileinfo) { int Fuse::create(const bf::path &path, mode_t mode, fuse_file_info *fileinfo) {
//printf("create(%s, %d, _)\n", path.c_str(), mode); //printf("create(%s, %d, _)\n", path.c_str(), mode);
try { try {
fileinfo->fh = _fs->createAndOpenFile(path, mode); auto context = fuse_get_context();
fileinfo->fh = _fs->createAndOpenFile(path, mode, context->uid, context->gid);
return 0; return 0;
} catch (FuseErrnoException &e) { } catch (FuseErrnoException &e) {
return -e.getErrno(); return -e.getErrno();

View File

@ -107,17 +107,17 @@ void FilesystemImpl::access(const bf::path &path, int mask) {
_device->Load(path)->access(mask); _device->Load(path)->access(mask);
} }
int FilesystemImpl::createAndOpenFile(const bf::path &path, mode_t mode) { int FilesystemImpl::createAndOpenFile(const bf::path &path, mode_t mode, uid_t uid, gid_t gid) {
//TODO Creating the file opens and closes it. We then reopen it afterwards. //TODO Creating the file opens and closes it. We then reopen it afterwards.
// This is slow. Improve! // This is slow. Improve!
auto dir = LoadDir(path.parent_path()); auto dir = LoadDir(path.parent_path());
auto file = dir->createAndOpenFile(path.filename().native(), mode); auto file = dir->createAndOpenFile(path.filename().native(), mode, uid, gid);
return _open_files.open(std::move(file)); return _open_files.open(std::move(file));
} }
void FilesystemImpl::mkdir(const bf::path &path, mode_t mode) { void FilesystemImpl::mkdir(const bf::path &path, mode_t mode, uid_t uid, gid_t gid) {
auto dir = LoadDir(path.parent_path()); auto dir = LoadDir(path.parent_path());
dir->createDir(path.filename().native(), mode); dir->createDir(path.filename().native(), mode, uid, gid);
} }
void FilesystemImpl::rmdir(const bf::path &path) { void FilesystemImpl::rmdir(const bf::path &path) {

View File

@ -31,8 +31,8 @@ public:
void fsync(int descriptor) override; void fsync(int descriptor) override;
void fdatasync(int descriptor) override; void fdatasync(int descriptor) override;
void access(const boost::filesystem::path &path, int mask) override; void access(const boost::filesystem::path &path, int mask) override;
int createAndOpenFile(const boost::filesystem::path &path, mode_t mode) override; int createAndOpenFile(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) override;
void mkdir(const boost::filesystem::path &path, mode_t mode) override; void mkdir(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) override;
void rmdir(const boost::filesystem::path &path) override; void rmdir(const boost::filesystem::path &path) override;
void unlink(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; void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) override;