diff --git a/src/cpp-utils/value_type/ValueType.h b/src/cpp-utils/value_type/ValueType.h index 640ea05e..86b604f8 100644 --- a/src/cpp-utils/value_type/ValueType.h +++ b/src/cpp-utils/value_type/ValueType.h @@ -80,9 +80,6 @@ protected: static_assert(std::is_base_of, ConcreteType>::value, "CRTP violated. First template parameter of this class must be the concrete class."); } - constexpr underlying_type& underlying_value() const noexcept { - return value_; - } friend struct std::hash; diff --git a/src/cryfs/filesystem/CryDir.cpp b/src/cryfs/filesystem/CryDir.cpp index 9c1243c0..64b63116 100644 --- a/src/cryfs/filesystem/CryDir.cpp +++ b/src/cryfs/filesystem/CryDir.cpp @@ -36,7 +36,7 @@ CryDir::CryDir(CryDevice *device, optional> parent, optio CryDir::~CryDir() { } -unique_ref CryDir::createAndOpenFile(const string &name, mode_t mode, uid_t uid, gid_t gid) { +unique_ref CryDir::createAndOpenFile(const string &name, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid) { device()->callFsActionCallbacks(); if (!isRootDir()) { //TODO Instead of doing nothing when we're the root directory, handle timestamps in the root dir correctly (and delete isRootDir() function) @@ -49,7 +49,7 @@ unique_ref CryDir::createAndOpenFile(const string &name, mode_t return make_unique_ref(device(), std::move(dirBlob), std::move(child)); } -void CryDir::createDir(const string &name, mode_t mode, uid_t uid, gid_t gid) { +void CryDir::createDir(const string &name, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid) { device()->callFsActionCallbacks(); if (!isRootDir()) { //TODO Instead of doing nothing when we're the root directory, handle timestamps in the root dir correctly (and delete isRootDir() function) @@ -87,7 +87,7 @@ fspp::Dir::EntryType CryDir::getType() const { return fspp::Dir::EntryType::DIR; } -void CryDir::createSymlink(const string &name, const bf::path &target, uid_t uid, gid_t gid) { +void CryDir::createSymlink(const string &name, const bf::path &target, fspp::uid_t uid, fspp::gid_t gid) { device()->callFsActionCallbacks(); if (!isRootDir()) { //TODO Instead of doing nothing when we're the root directory, handle timestamps in the root dir correctly (and delete isRootDir() function) diff --git a/src/cryfs/filesystem/CryDir.h b/src/cryfs/filesystem/CryDir.h index 6380cd8a..a94696f6 100644 --- a/src/cryfs/filesystem/CryDir.h +++ b/src/cryfs/filesystem/CryDir.h @@ -14,9 +14,9 @@ public: ~CryDir(); //TODO return type variance to CryFile/CryDir? - cpputils::unique_ref createAndOpenFile(const std::string &name, mode_t mode, uid_t uid, gid_t gid) override; - void createDir(const std::string &name, mode_t mode, uid_t uid, gid_t gid) override; - void createSymlink(const std::string &name, const boost::filesystem::path &target, uid_t uid, gid_t gid) override; + cpputils::unique_ref createAndOpenFile(const std::string &name, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid) override; + void createDir(const std::string &name, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid) override; + void createSymlink(const std::string &name, const boost::filesystem::path &target, fspp::uid_t uid, fspp::gid_t gid) override; //TODO Make Entry a public class instead of hidden in DirBlob (which is not publicly visible) cpputils::unique_ref> children() override; diff --git a/src/cryfs/filesystem/CryNode.cpp b/src/cryfs/filesystem/CryNode.cpp index db2830ce..e4e25ab4 100644 --- a/src/cryfs/filesystem/CryNode.cpp +++ b/src/cryfs/filesystem/CryNode.cpp @@ -163,9 +163,9 @@ CryNode::stat_info CryNode::stat() const { stat_info result; //We are the root directory. //TODO What should we do? - result.uid = getuid(); - result.gid = getgid(); - result.mode = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR; + result.uid = fspp::uid_t(getuid()); + result.gid = fspp::gid_t(getgid()); + result.mode = fspp::mode_t().addDirFlag().addUserReadFlag().addUserWriteFlag().addUserExecFlag(); result.size = fsblobstore::DirBlob::DIR_LSTAT_SIZE; //TODO If possible without performance loss, then for a directory, st_nlink should return number of dir entries (including "." and "..") result.nlink = 1; @@ -179,7 +179,7 @@ CryNode::stat_info CryNode::stat() const { } } -void CryNode::chmod(mode_t mode) { +void CryNode::chmod(fspp::mode_t mode) { device()->callFsActionCallbacks(); if (_parent == none) { //We are the root direcory. @@ -189,7 +189,7 @@ void CryNode::chmod(mode_t mode) { (*_parent)->chmodChild(_blockId, mode); } -void CryNode::chown(uid_t uid, gid_t gid) { +void CryNode::chown(fspp::uid_t uid, fspp::gid_t gid) { device()->callFsActionCallbacks(); if (_parent == none) { //We are the root direcory. diff --git a/src/cryfs/filesystem/CryNode.h b/src/cryfs/filesystem/CryNode.h index bb11040f..9beb25f9 100644 --- a/src/cryfs/filesystem/CryNode.h +++ b/src/cryfs/filesystem/CryNode.h @@ -18,8 +18,8 @@ public: CryNode(CryDevice *device, boost::optional> parent, boost::optional> grandparent, const blockstore::BlockId &blockId); void access(int mask) const override; stat_info stat() const override; - void chmod(mode_t mode) override; - void chown(uid_t uid, gid_t gid) override; + void chmod(fspp::mode_t mode) override; + void chown(fspp::uid_t uid, fspp::gid_t gid) override; void rename(const boost::filesystem::path &to) override; void utimens(timespec lastAccessTime, timespec lastModificationTime) override; diff --git a/src/cryfs/filesystem/cachingfsblobstore/DirBlobRef.h b/src/cryfs/filesystem/cachingfsblobstore/DirBlobRef.h index b50510cb..f96dcbd8 100644 --- a/src/cryfs/filesystem/cachingfsblobstore/DirBlobRef.h +++ b/src/cryfs/filesystem/cachingfsblobstore/DirBlobRef.h @@ -45,7 +45,7 @@ public: } void AddOrOverwriteChild(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType type, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, std::function onOverwritten) { return _base->AddOrOverwriteChild(name, blobId, type, mode, uid, gid, lastAccessTime, lastModificationTime, onOverwritten); } @@ -70,11 +70,11 @@ public: return _base->updateModificationTimestampForChild(blockId); } - void chmodChild(const blockstore::BlockId &blockId, mode_t mode) { + void chmodChild(const blockstore::BlockId &blockId, fspp::mode_t mode) { return _base->chmodChild(blockId, mode); } - void chownChild(const blockstore::BlockId &blockId, uid_t uid, gid_t gid) { + void chownChild(const blockstore::BlockId &blockId, fspp::uid_t uid, fspp::gid_t gid) { return _base->chownChild(blockId, uid, gid); } @@ -82,15 +82,15 @@ public: return _base->utimensChild(blockId, lastAccessTime, lastModificationTime); } - void AddChildDir(const std::string &name, const blockstore::BlockId &blobId, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + void AddChildDir(const std::string &name, const blockstore::BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { return _base->AddChildDir(name, blobId, mode, uid, gid, lastAccessTime, lastModificationTime); } - void AddChildFile(const std::string &name, const blockstore::BlockId &blobId, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + void AddChildFile(const std::string &name, const blockstore::BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { return _base->AddChildFile(name, blobId, mode, uid, gid, lastAccessTime, lastModificationTime); } - void AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + void AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { return _base->AddChildSymlink(name, blobId, uid, gid, lastAccessTime, lastModificationTime); } diff --git a/src/cryfs/filesystem/fsblobstore/DirBlob.cpp b/src/cryfs/filesystem/fsblobstore/DirBlob.cpp index 046792f9..2514fee4 100644 --- a/src/cryfs/filesystem/fsblobstore/DirBlob.cpp +++ b/src/cryfs/filesystem/fsblobstore/DirBlob.cpp @@ -63,29 +63,33 @@ void DirBlob::_readEntriesFromBlob() { _entries.deserializeFrom(static_cast(data.data()), data.size()); } -void DirBlob::AddChildDir(const std::string &name, const BlockId &blobId, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { +void DirBlob::AddChildDir(const std::string &name, const BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { std::unique_lock lock(_mutex); _addChild(name, blobId, fspp::Dir::EntryType::DIR, mode, uid, gid, lastAccessTime, lastModificationTime); } -void DirBlob::AddChildFile(const std::string &name, const BlockId &blobId, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { +void DirBlob::AddChildFile(const std::string &name, const BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { std::unique_lock lock(_mutex); _addChild(name, blobId, fspp::Dir::EntryType::FILE, mode, uid, gid, lastAccessTime, lastModificationTime); } -void DirBlob::AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { +void DirBlob::AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { std::unique_lock lock(_mutex); - _addChild(name, blobId, fspp::Dir::EntryType::SYMLINK, S_IFLNK | S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH, uid, gid, lastAccessTime, lastModificationTime); + auto mode = fspp::mode_t().addSymlinkFlag() + .addUserReadFlag().addUserWriteFlag().addUserExecFlag() + .addGroupReadFlag().addGroupWriteFlag().addGroupExecFlag() + .addOtherReadFlag().addOtherWriteFlag().addOtherExecFlag(); + _addChild(name, blobId, fspp::Dir::EntryType::SYMLINK, mode, uid, gid, lastAccessTime, lastModificationTime); } void DirBlob::_addChild(const std::string &name, const BlockId &blobId, - fspp::Dir::EntryType entryType, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + fspp::Dir::EntryType entryType, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { _entries.add(name, blobId, entryType, mode, uid, gid, lastAccessTime, lastModificationTime); _changed = true; } void DirBlob::AddOrOverwriteChild(const std::string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, std::function onOverwritten) { std::unique_lock lock(_mutex); _entries.addOrOverwrite(name, blobId, entryType, mode, uid, gid, lastAccessTime, lastModificationTime, onOverwritten); @@ -171,13 +175,13 @@ void DirBlob::updateModificationTimestampForChild(const BlockId &blockId) { _changed = true; } -void DirBlob::chmodChild(const BlockId &blockId, mode_t mode) { +void DirBlob::chmodChild(const BlockId &blockId, fspp::mode_t mode) { std::unique_lock lock(_mutex); _entries.setMode(blockId, mode); _changed = true; } -void DirBlob::chownChild(const BlockId &blockId, uid_t uid, gid_t gid) { +void DirBlob::chownChild(const BlockId &blockId, fspp::uid_t uid, fspp::gid_t gid) { std::unique_lock lock(_mutex); if(_entries.setUidGid(blockId, uid, gid)) { _changed = true; diff --git a/src/cryfs/filesystem/fsblobstore/DirBlob.h b/src/cryfs/filesystem/fsblobstore/DirBlob.h index 1dcb2e84..93b55f5d 100644 --- a/src/cryfs/filesystem/fsblobstore/DirBlob.h +++ b/src/cryfs/filesystem/fsblobstore/DirBlob.h @@ -37,16 +37,16 @@ namespace cryfs { boost::optional GetChild(const blockstore::BlockId &blobId) const; - void AddChildDir(const std::string &name, const blockstore::BlockId &blobId, mode_t mode, uid_t uid, - gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + void AddChildDir(const std::string &name, const blockstore::BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, + fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); - void AddChildFile(const std::string &name, const blockstore::BlockId &blobId, mode_t mode, uid_t uid, - gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + void AddChildFile(const std::string &name, const blockstore::BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, + fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); - void AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + void AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); void AddOrOverwriteChild(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType type, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, std::function onOverwritten); void RenameChild(const blockstore::BlockId &blockId, const std::string &newName, std::function onOverwritten); @@ -65,9 +65,9 @@ namespace cryfs { void updateModificationTimestampForChild(const blockstore::BlockId &blockId); - void chmodChild(const blockstore::BlockId &blockId, mode_t mode); + void chmodChild(const blockstore::BlockId &blockId, fspp::mode_t mode); - void chownChild(const blockstore::BlockId &blockId, uid_t uid, gid_t gid); + void chownChild(const blockstore::BlockId &blockId, fspp::uid_t uid, fspp::gid_t gid); void utimensChild(const blockstore::BlockId &blockId, timespec lastAccessTime, timespec lastModificationTime); @@ -76,7 +76,7 @@ namespace cryfs { private: void _addChild(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType type, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); void _readEntriesFromBlob(); void _writeEntriesToBlob(); diff --git a/src/cryfs/filesystem/fsblobstore/utils/DirEntry.cpp b/src/cryfs/filesystem/fsblobstore/utils/DirEntry.cpp index 84a2925f..941148db 100644 --- a/src/cryfs/filesystem/fsblobstore/utils/DirEntry.cpp +++ b/src/cryfs/filesystem/fsblobstore/utils/DirEntry.cpp @@ -68,17 +68,17 @@ namespace cryfs { void DirEntry::serialize(uint8_t *dest) const { ASSERT( - ((_type == fspp::Dir::EntryType::FILE) && S_ISREG(_mode) && !S_ISDIR(_mode) && !S_ISLNK(_mode)) || - ((_type == fspp::Dir::EntryType::DIR) && !S_ISREG(_mode) && S_ISDIR(_mode) && !S_ISLNK(_mode)) || - ((_type == fspp::Dir::EntryType::SYMLINK) && !S_ISREG(_mode) && !S_ISDIR(_mode) && S_ISLNK(_mode)) - , "Wrong mode bit set for this type: " + std::to_string(_mode & S_IFREG) + ", " + std::to_string( - _mode & S_IFDIR) + ", " + std::to_string(_mode & S_IFLNK) + ", " + std::to_string(static_cast(_type)) + ((_type == fspp::Dir::EntryType::FILE) && _mode.hasFileFlag() && !_mode.hasDirFlag() && !_mode.hasSymlinkFlag()) || + ((_type == fspp::Dir::EntryType::DIR) && !_mode.hasFileFlag() && _mode.hasDirFlag() && !_mode.hasSymlinkFlag()) || + ((_type == fspp::Dir::EntryType::SYMLINK) && !_mode.hasFileFlag() && !_mode.hasDirFlag() && _mode.hasSymlinkFlag()) + , "Wrong mode bit set for this type: " + std::to_string(_mode.hasFileFlag()) + ", " + std::to_string( + _mode.hasDirFlag()) + ", " + std::to_string(_mode.hasSymlinkFlag()) + ", " + std::to_string(static_cast(_type)) ); unsigned int offset = 0; offset += _serialize(dest + offset, static_cast(_type)); - offset += _serialize(dest + offset, _mode); - offset += _serialize(dest + offset, _uid); - offset += _serialize(dest + offset, _gid); + offset += _serialize(dest + offset, _mode.value()); + offset += _serialize(dest + offset, _uid.value()); + offset += _serialize(dest + offset, _gid.value()); offset += _serializeTimeValue(dest + offset, _lastAccessTime); offset += _serializeTimeValue(dest + offset, _lastModificationTime); offset += _serializeTimeValue(dest + offset, _lastMetadataChangeTime); @@ -89,9 +89,9 @@ namespace cryfs { const char *DirEntry::deserializeAndAddToVector(const char *pos, vector *result) { fspp::Dir::EntryType type = static_cast(_deserialize(&pos)); - mode_t mode = _deserialize(&pos); - uid_t uid = _deserialize(&pos); - gid_t gid = _deserialize(&pos); + fspp::mode_t mode = fspp::mode_t(_deserialize(&pos)); + fspp::uid_t uid = fspp::uid_t(_deserialize(&pos)); + fspp::gid_t gid = fspp::gid_t(_deserialize(&pos)); timespec lastAccessTime = _deserializeTimeValue(&pos); timespec lastModificationTime = _deserializeTimeValue(&pos); timespec lastMetadataChangeTime = _deserializeTimeValue(&pos); diff --git a/src/cryfs/filesystem/fsblobstore/utils/DirEntry.h b/src/cryfs/filesystem/fsblobstore/utils/DirEntry.h index 6a60277e..7486f89f 100644 --- a/src/cryfs/filesystem/fsblobstore/utils/DirEntry.h +++ b/src/cryfs/filesystem/fsblobstore/utils/DirEntry.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -12,8 +13,8 @@ namespace cryfs { class DirEntry final { public: - DirEntry(fspp::Dir::EntryType type, const std::string &name, const blockstore::BlockId &blockId, mode_t mode, - uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + DirEntry(fspp::Dir::EntryType type, const std::string &name, const blockstore::BlockId &blockId, fspp::mode_t mode, + fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, timespec lastMetadataChangeTime); void serialize(uint8_t* dest) const; @@ -28,14 +29,14 @@ namespace cryfs { const blockstore::BlockId &blockId() const; - mode_t mode() const; - void setMode(mode_t value); + fspp::mode_t mode() const; + void setMode(fspp::mode_t value); - uid_t uid() const; - void setUid(uid_t value); + fspp::uid_t uid() const; + void setUid(fspp::uid_t value); - gid_t gid() const; - void setGid(gid_t value); + fspp::gid_t gid() const; + void setGid(fspp::gid_t value); timespec lastAccessTime() const; void setLastAccessTime(timespec value); @@ -52,33 +53,33 @@ namespace cryfs { fspp::Dir::EntryType _type; std::string _name; blockstore::BlockId _blockId; - mode_t _mode; - uid_t _uid; - gid_t _gid; + fspp::mode_t _mode; + fspp::uid_t _uid; + fspp::gid_t _gid; timespec _lastAccessTime; timespec _lastModificationTime; timespec _lastMetadataChangeTime; }; - inline DirEntry::DirEntry(fspp::Dir::EntryType type, const std::string &name, const blockstore::BlockId &blockId, mode_t mode, - uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + inline DirEntry::DirEntry(fspp::Dir::EntryType type, const std::string &name, const blockstore::BlockId &blockId, fspp::mode_t mode, + fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, timespec lastMetadataChangeTime) : _type(type), _name(name), _blockId(blockId), _mode(mode), _uid(uid), _gid(gid), _lastAccessTime(lastAccessTime), _lastModificationTime(lastModificationTime), _lastMetadataChangeTime(lastMetadataChangeTime) { switch (_type) { case fspp::Dir::EntryType::FILE: - _mode |= S_IFREG; + _mode.addFileFlag(); break; case fspp::Dir::EntryType::DIR: - _mode |= S_IFDIR; + _mode.addDirFlag(); break; case fspp::Dir::EntryType::SYMLINK: - _mode |= S_IFLNK; + _mode.addSymlinkFlag(); break; } - ASSERT((S_ISREG(_mode) && _type == fspp::Dir::EntryType::FILE) || - (S_ISDIR(_mode) && _type == fspp::Dir::EntryType::DIR) || - (S_ISLNK(_mode) && _type == fspp::Dir::EntryType::SYMLINK), "Unknown mode in entry"); + ASSERT((_mode.hasFileFlag() && _type == fspp::Dir::EntryType::FILE) || + (_mode.hasDirFlag() && _type == fspp::Dir::EntryType::DIR) || + (_mode.hasSymlinkFlag() && _type == fspp::Dir::EntryType::SYMLINK), "Unknown mode in entry"); } inline fspp::Dir::EntryType DirEntry::type() const { @@ -93,15 +94,15 @@ namespace cryfs { return _blockId; } - inline mode_t DirEntry::mode() const { + inline fspp::mode_t DirEntry::mode() const { return _mode; } - inline uid_t DirEntry::uid() const { + inline fspp::uid_t DirEntry::uid() const { return _uid; } - inline gid_t DirEntry::gid() const { + inline fspp::gid_t DirEntry::gid() const { return _gid; } @@ -127,17 +128,17 @@ namespace cryfs { _updateLastMetadataChangeTime(); } - inline void DirEntry::setMode(mode_t value) { + inline void DirEntry::setMode(fspp::mode_t value) { _mode = value; _updateLastMetadataChangeTime(); } - inline void DirEntry::setUid(uid_t value) { + inline void DirEntry::setUid(fspp::uid_t value) { _uid = value; _updateLastMetadataChangeTime(); } - inline void DirEntry::setGid(gid_t value) { + inline void DirEntry::setGid(fspp::gid_t value) { _gid = value; _updateLastMetadataChangeTime(); } diff --git a/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.cpp b/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.cpp index 6a84785c..f27c5783 100644 --- a/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.cpp +++ b/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.cpp @@ -48,22 +48,22 @@ bool DirEntryList::_hasChild(const string &name) const { return _entries.end() != _findByName(name); } -void DirEntryList::add(const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, mode_t mode, - uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { +void DirEntryList::add(const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, fspp::mode_t mode, + fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { if (_hasChild(name)) { throw fspp::fuse::FuseErrnoException(EEXIST); } _add(name, blobId, entryType, mode, uid, gid, lastAccessTime, lastModificationTime); } -void DirEntryList::_add(const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, mode_t mode, - uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { +void DirEntryList::_add(const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, fspp::mode_t mode, + fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { auto insert_pos = _findUpperBound(blobId); _entries.emplace(insert_pos, entryType, name, blobId, mode, uid, gid, lastAccessTime, lastModificationTime, cpputils::time::now()); } -void DirEntryList::addOrOverwrite(const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, mode_t mode, - uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, +void DirEntryList::addOrOverwrite(const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, fspp::mode_t mode, + fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, std::function onOverwritten) { auto found = _findByName(name); if (found != _entries.end()) { @@ -98,8 +98,8 @@ void DirEntryList::_checkAllowedOverwrite(fspp::Dir::EntryType oldType, fspp::Di } } -void DirEntryList::_overwrite(vector::iterator entry, const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, mode_t mode, - uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { +void DirEntryList::_overwrite(vector::iterator entry, const string &name, const BlockId &blobId, fspp::Dir::EntryType entryType, fspp::mode_t mode, + fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { _checkAllowedOverwrite(entry->type(), entryType); // The new entry has possibly a different blockId, so it has to be in a different list position (list is ordered by blockIds). // That's why we remove-and-add instead of just modifying the existing entry. @@ -202,20 +202,20 @@ DirEntryList::const_iterator DirEntryList::end() const { return _entries.end(); } -void DirEntryList::setMode(const BlockId &blockId, mode_t mode) { +void DirEntryList::setMode(const BlockId &blockId, fspp::mode_t mode) { auto found = _findById(blockId); - ASSERT ((S_ISREG(mode) && S_ISREG(found->mode())) || (S_ISDIR(mode) && S_ISDIR(found->mode())) || (S_ISLNK(mode)), "Unknown mode in entry"); + ASSERT ((mode.hasFileFlag() && found->mode().hasFileFlag()) || (mode.hasDirFlag() && found->mode().hasDirFlag()) || (mode.hasSymlinkFlag()), "Unknown mode in entry"); found->setMode(mode); } -bool DirEntryList::setUidGid(const BlockId &blockId, uid_t uid, gid_t gid) { +bool DirEntryList::setUidGid(const BlockId &blockId, fspp::uid_t uid, fspp::gid_t gid) { auto found = _findById(blockId); bool changed = false; - if (uid != static_cast(-1)) { + if (uid != fspp::uid_t(-1)) { found->setUid(uid); changed = true; } - if (gid != static_cast(-1)) { + if (gid != fspp::gid_t(-1)) { found->setGid(gid); changed = true; } diff --git a/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.h b/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.h index 8c5b7a91..13e52cc0 100644 --- a/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.h +++ b/src/cryfs/filesystem/fsblobstore/utils/DirEntryList.h @@ -23,9 +23,9 @@ namespace cryfs { void deserializeFrom(const void *data, uint64_t size); void add(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType entryType, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); void addOrOverwrite(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType entryType, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, std::function onOverwritten); void rename(const blockstore::BlockId &blockId, const std::string &name, std::function onOverwritten); boost::optional get(const std::string &name) const; @@ -37,8 +37,8 @@ namespace cryfs { const_iterator begin() const; const_iterator end() const; - void setMode(const blockstore::BlockId &blockId, mode_t mode); - bool setUidGid(const blockstore::BlockId &blockId, uid_t uid, gid_t gid); + void setMode(const blockstore::BlockId &blockId, fspp::mode_t mode); + bool setUidGid(const blockstore::BlockId &blockId, fspp::uid_t uid, fspp::gid_t gid); void setAccessTimes(const blockstore::BlockId &blockId, timespec lastAccessTime, timespec lastModificationTime); bool updateAccessTimestampForChild(const blockstore::BlockId &blockId, TimestampUpdateBehavior timestampUpdateBehavior); void updateModificationTimestampForChild(const blockstore::BlockId &blockId); @@ -54,9 +54,9 @@ namespace cryfs { std::vector::iterator _findLowerBound(const blockstore::BlockId &blockId); std::vector::iterator _findFirst(const blockstore::BlockId &hint, std::function pred); void _add(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType entryType, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); void _overwrite(std::vector::iterator entry, const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType entryType, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime); + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime); static void _checkAllowedOverwrite(fspp::Dir::EntryType oldType, fspp::Dir::EntryType newType); std::vector _entries; diff --git a/src/cryfs/filesystem/parallelaccessfsblobstore/DirBlobRef.h b/src/cryfs/filesystem/parallelaccessfsblobstore/DirBlobRef.h index cd83700f..b7e7dfc4 100644 --- a/src/cryfs/filesystem/parallelaccessfsblobstore/DirBlobRef.h +++ b/src/cryfs/filesystem/parallelaccessfsblobstore/DirBlobRef.h @@ -41,7 +41,7 @@ public: } void AddOrOverwriteChild(const std::string &name, const blockstore::BlockId &blobId, fspp::Dir::EntryType type, - mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime, + fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime, std::function onOverwritten) { return _base->AddOrOverwriteChild(name, blobId, type, mode, uid, gid, lastAccessTime, lastModificationTime, onOverwritten); } @@ -66,11 +66,11 @@ public: return _base->updateModificationTimestampForChild(blockId); } - void chmodChild(const blockstore::BlockId &blockId, mode_t mode) { + void chmodChild(const blockstore::BlockId &blockId, fspp::mode_t mode) { return _base->chmodChild(blockId, mode); } - void chownChild(const blockstore::BlockId &blockId, uid_t uid, gid_t gid) { + void chownChild(const blockstore::BlockId &blockId, fspp::uid_t uid, fspp::gid_t gid) { return _base->chownChild(blockId, uid, gid); } @@ -78,15 +78,15 @@ public: return _base->utimensChild(blockId, lastAccessTime, lastModificationTime); } - void AddChildDir(const std::string &name, const blockstore::BlockId &blobId, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + void AddChildDir(const std::string &name, const blockstore::BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { return _base->AddChildDir(name, blobId, mode, uid, gid, lastAccessTime, lastModificationTime); } - void AddChildFile(const std::string &name, const blockstore::BlockId &blobId, mode_t mode, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + void AddChildFile(const std::string &name, const blockstore::BlockId &blobId, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { return _base->AddChildFile(name, blobId, mode, uid, gid, lastAccessTime, lastModificationTime); } - void AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, uid_t uid, gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { + void AddChildSymlink(const std::string &name, const blockstore::BlockId &blobId, fspp::uid_t uid, fspp::gid_t gid, timespec lastAccessTime, timespec lastModificationTime) { return _base->AddChildSymlink(name, blobId, uid, gid, lastAccessTime, lastModificationTime); } diff --git a/src/fspp/fs_interface/Dir.h b/src/fspp/fs_interface/Dir.h index 2706f257..159809d9 100644 --- a/src/fspp/fs_interface/Dir.h +++ b/src/fspp/fs_interface/Dir.h @@ -3,9 +3,9 @@ #define MESSMER_FSPP_FSINTERFACE_DIR_H_ #include -#include #include #include +#include "Types.h" namespace fspp { class Device; @@ -27,9 +27,9 @@ public: std::string name; }; - virtual cpputils::unique_ref 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, uid_t uid, gid_t gid) = 0; - virtual void createSymlink(const std::string &name, const boost::filesystem::path &target, uid_t uid, gid_t gid) = 0; + virtual cpputils::unique_ref createAndOpenFile(const std::string &name, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid) = 0; + virtual void createDir(const std::string &name, fspp::mode_t mode, fspp::uid_t uid, fspp::gid_t gid) = 0; + virtual void createSymlink(const std::string &name, const boost::filesystem::path &target, fspp::uid_t uid, fspp::gid_t gid) = 0; //TODO Allow alternative implementation returning only children names without more information //virtual std::unique_ptr> children() const = 0; diff --git a/src/fspp/fs_interface/Node.h b/src/fspp/fs_interface/Node.h index a635e241..8efb0ec2 100644 --- a/src/fspp/fs_interface/Node.h +++ b/src/fspp/fs_interface/Node.h @@ -14,8 +14,8 @@ public: using stat_info = fspp::stat_info; virtual stat_info stat() const = 0; - virtual void chmod(mode_t mode) = 0; - virtual void chown(uid_t uid, gid_t gid) = 0; + virtual void chmod(fspp::mode_t mode) = 0; + virtual void chown(fspp::uid_t uid, fspp::gid_t gid) = 0; virtual void access(int mask) const = 0; virtual void rename(const boost::filesystem::path &to) = 0; // 'to' will always be an absolute path (but on Windows without the device specifier, i.e. starting with '/') virtual void utimens(const timespec lastAccessTime, const timespec lastModificationTime) = 0; diff --git a/src/fspp/fs_interface/Types.h b/src/fspp/fs_interface/Types.h index e4caf0fc..21c7eb8a 100644 --- a/src/fspp/fs_interface/Types.h +++ b/src/fspp/fs_interface/Types.h @@ -4,14 +4,120 @@ #include #include +#include namespace fspp { +struct uid_t final : cpputils::value_type::IdValueType { + // TODO Remove default constructor + constexpr uid_t() noexcept: IdValueType(0) {} + + constexpr explicit uid_t(uint32_t id) noexcept: IdValueType(id) {} + + constexpr uint32_t value() const noexcept { + return value_; + } +}; + +struct gid_t final : cpputils::value_type::IdValueType { + // TODO Remove default constructor + constexpr gid_t() noexcept: IdValueType(0) {} + + constexpr explicit gid_t(uint32_t id) noexcept: IdValueType(id) {} + + constexpr uint32_t value() const noexcept { + return value_; + } +}; + +struct mode_t final : cpputils::value_type::FlagsValueType { + // TODO Remove default constructor + constexpr mode_t() noexcept: FlagsValueType(0) {} + + constexpr explicit mode_t(uint32_t id) noexcept: FlagsValueType(id) {} + + constexpr uint32_t value() const noexcept { + return value_; + } + + constexpr mode_t& addFileFlag() noexcept { + value_ |= S_IFREG; + return *this; + } + + constexpr mode_t& addDirFlag() noexcept { + value_ |= S_IFDIR; + return *this; + } + + constexpr mode_t& addSymlinkFlag() noexcept { + value_ |= S_IFLNK; + return *this; + } + + constexpr mode_t& addUserReadFlag() noexcept { + value_ |= S_IRUSR; + return *this; + } + + constexpr mode_t& addUserWriteFlag() noexcept { + value_ |= S_IWUSR; + return *this; + } + + constexpr mode_t& addUserExecFlag() noexcept { + value_ |= S_IXUSR; + return *this; + } + + constexpr mode_t& addGroupReadFlag() noexcept { + value_ |= S_IRGRP; + return *this; + } + + constexpr mode_t& addGroupWriteFlag() noexcept { + value_ |= S_IWGRP; + return *this; + } + + constexpr mode_t& addGroupExecFlag() noexcept { + value_ |= S_IXGRP; + return *this; + } + + constexpr mode_t& addOtherReadFlag() noexcept { + value_ |= S_IROTH; + return *this; + } + + constexpr mode_t& addOtherWriteFlag() noexcept { + value_ |= S_IWOTH; + return *this; + } + + constexpr mode_t& addOtherExecFlag() noexcept { + value_ |= S_IXOTH; + return *this; + } + + constexpr bool hasFileFlag() const noexcept { + return S_ISREG(value_); + } + + constexpr bool hasDirFlag() const noexcept { + return S_ISDIR(value_); + } + + constexpr bool hasSymlinkFlag() const noexcept { + return S_ISLNK(value_); + } +}; + struct stat_info final { uint32_t nlink; - uint32_t mode; - uint32_t uid; - uint32_t gid; + fspp::mode_t mode; + fspp::uid_t uid; + fspp::gid_t gid; uint64_t size; uint64_t blocks; struct timespec atime; diff --git a/src/fspp/fstest/FsppDeviceTest.h b/src/fspp/fstest/FsppDeviceTest.h index 65386a09..11282e19 100644 --- a/src/fspp/fstest/FsppDeviceTest.h +++ b/src/fspp/fstest/FsppDeviceTest.h @@ -8,17 +8,17 @@ template class FsppDeviceTest: public FileSystemTest { public: void InitDirStructure() { - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/")->createSymlink("mysymlink", "/symlink/target", 0, 0); - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createAndOpenFile("myfile2", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createSymlink("mysymlink", "/symlink/target", 0, 0); - this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir/mysubdir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir/mysubdir")->createSymlink("mysymlink", "/symlink/target", 0, 0); - this->LoadDir("/mydir/mysubdir")->createDir("mysubsubdir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/")->createSymlink("mysymlink", "/symlink/target", fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createAndOpenFile("myfile2", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createSymlink("mysymlink", "/symlink/target", fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir/mysubdir")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir/mysubdir")->createSymlink("mysymlink", "/symlink/target", fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir/mysubdir")->createDir("mysubsubdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); } }; diff --git a/src/fspp/fstest/FsppDirTest.h b/src/fspp/fstest/FsppDirTest.h index e3a7ca07..390d1725 100644 --- a/src/fspp/fstest/FsppDirTest.h +++ b/src/fspp/fstest/FsppDirTest.h @@ -6,14 +6,14 @@ template class FsppDirTest: public FileSystemTest { public: void InitDirStructure() { - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createAndOpenFile("myfile2", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir/mysubdir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir/mysubdir")->createDir("mysubsubdir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createAndOpenFile("myfile2", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir/mysubdir")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir/mysubdir")->createDir("mysubsubdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); } void EXPECT_CHILDREN_ARE(const boost::filesystem::path &path, const std::initializer_list expected) { @@ -62,14 +62,14 @@ TYPED_TEST_P(FsppDirTest, Children_RootDir_Empty) { TYPED_TEST_P(FsppDirTest, Children_RootDir_OneFile_Directly) { auto rootdir = this->LoadDir("/"); - rootdir->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + rootdir->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE(rootdir.get(), { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_RootDir_OneFile_AfterReloadingDir) { - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile") }); @@ -77,14 +77,14 @@ TYPED_TEST_P(FsppDirTest, Children_RootDir_OneFile_AfterReloadingDir) { TYPED_TEST_P(FsppDirTest, Children_RootDir_OneDir_Directly) { auto rootdir = this->LoadDir("/"); - rootdir->createDir("mydir", this->MODE_PUBLIC, 0, 0); + rootdir->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE(rootdir.get(), { DirEntry("mydir") }); } TYPED_TEST_P(FsppDirTest, Children_RootDir_OneDir_AfterReloadingDir) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/", { DirEntry("mydir") }); @@ -100,39 +100,39 @@ TYPED_TEST_P(FsppDirTest, Children_RootDir_LargerStructure) { } TYPED_TEST_P(FsppDirTest, Children_Nested_Empty) { - this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/myemptydir", {}); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneFile_Directly) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); auto dir = this->LoadDir("/mydir"); - dir->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + dir->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE(dir.get(), { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneFile_AfterReloadingDir) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneDir_Directly) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); auto dir = this->LoadDir("/mydir"); - dir->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); + dir->createDir("mysubdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE(dir.get(), { DirEntry("mysubdir") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneDir_AfterReloadingDir) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/mydir", { DirEntry("mysubdir") }); @@ -161,14 +161,14 @@ TYPED_TEST_P(FsppDirTest, Children_Nested2_LargerStructure) { } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InEmptyRoot) { - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->LoadFile("/myfile"); this->Load("/myfile"); // Test that we can also load the file node } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InNonemptyRoot) { this->InitDirStructure(); - this->LoadDir("/")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile"), DirEntry("mydir"), @@ -179,7 +179,7 @@ TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InNonemptyRoot) { TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InEmptyNestedDir) { this->InitDirStructure(); - this->LoadDir("/myemptydir")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/myemptydir")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/myemptydir", { FileEntry("mynewfile") }); @@ -187,7 +187,7 @@ TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InEmptyNestedDir) { TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InNonemptyNestedDir) { this->InitDirStructure(); - this->LoadDir("/mydir")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/mydir")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile"), FileEntry("myfile2"), @@ -197,22 +197,22 @@ TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InNonemptyNestedDir) { } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_AlreadyExisting) { - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); //TODO Change, once we know which way of error reporting we want for such errors EXPECT_ANY_THROW( - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); ); } TYPED_TEST_P(FsppDirTest, CreateDir_InEmptyRoot) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->LoadDir("/mydir"); this->Load("/mydir"); // Test we can also load the dir node } TYPED_TEST_P(FsppDirTest, CreateDir_InNonemptyRoot) { this->InitDirStructure(); - this->LoadDir("/")->createDir("mynewdir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mynewdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile"), DirEntry("mydir"), @@ -223,7 +223,7 @@ TYPED_TEST_P(FsppDirTest, CreateDir_InNonemptyRoot) { TYPED_TEST_P(FsppDirTest, CreateDir_InEmptyNestedDir) { this->InitDirStructure(); - this->LoadDir("/myemptydir")->createDir("mynewdir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/myemptydir")->createDir("mynewdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/myemptydir", { DirEntry("mynewdir") }); @@ -231,7 +231,7 @@ TYPED_TEST_P(FsppDirTest, CreateDir_InEmptyNestedDir) { TYPED_TEST_P(FsppDirTest, CreateDir_InNonemptyNestedDir) { this->InitDirStructure(); - this->LoadDir("/mydir")->createDir("mynewdir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/mydir")->createDir("mynewdir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile"), FileEntry("myfile2"), @@ -241,10 +241,10 @@ TYPED_TEST_P(FsppDirTest, CreateDir_InNonemptyNestedDir) { } TYPED_TEST_P(FsppDirTest, CreateDir_AlreadyExisting) { - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); //TODO Change, once we know which way of error reporting we want for such errors EXPECT_ANY_THROW( - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); ); } diff --git a/src/fspp/fstest/FsppDirTest_Timestamps.h b/src/fspp/fstest/FsppDirTest_Timestamps.h index 95cb3645..629ab341 100644 --- a/src/fspp/fstest/FsppDirTest_Timestamps.h +++ b/src/fspp/fstest/FsppDirTest_Timestamps.h @@ -13,7 +13,7 @@ TYPED_TEST_CASE_P(FsppDirTest_Timestamps); TYPED_TEST_P(FsppDirTest_Timestamps, createAndOpenFile) { auto dir = this->CreateDir("/mydir"); auto operation = [&dir] () { - dir->createAndOpenFile("childname", S_IFREG, 1000, 1000); + dir->createAndOpenFile("childname", fspp::mode_t().addFileFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); }; this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS("/mydir", operation, {this->ExpectDoesntUpdateAccessTimestamp, this->ExpectUpdatesModificationTimestamp, this->ExpectUpdatesMetadataTimestamp}); } @@ -22,7 +22,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createAndOpenFile) { TYPED_TEST_P(FsppDirTest_Timestamps, createAndOpenFile_inRootDir) { auto dir = this->LoadDir("/"); auto operation = [&dir] () { - dir->createAndOpenFile("childname", S_IFREG, 1000, 1000); + dir->createAndOpenFile("childname", fspp::mode_t().addFileFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); }; this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS("/", operation, {this->ExpectDoesntUpdateAccessTimestamp, this->ExpectUpdatesModificationTimestamp, this->ExpectUpdatesMetadataTimestamp}); }*/ @@ -30,7 +30,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createAndOpenFile_inRootDir) { TYPED_TEST_P(FsppDirTest_Timestamps, createAndOpenFile_TimestampsOfCreatedFile) { auto dir = this->CreateDir("/mydir"); timespec lowerBound = now(); - dir->createAndOpenFile("childname", S_IFREG, 1000, 1000); + dir->createAndOpenFile("childname", fspp::mode_t().addFileFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); timespec upperBound = now(); auto child = this->Load("/mydir/childname"); this->EXPECT_ACCESS_TIMESTAMP_BETWEEN (lowerBound, upperBound, *child); @@ -41,7 +41,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createAndOpenFile_TimestampsOfCreatedFile) TYPED_TEST_P(FsppDirTest_Timestamps, createDir) { auto dir = this->CreateDir("/mydir"); auto operation = [&dir] () { - dir->createDir("childname", S_IFDIR, 1000, 1000); + dir->createDir("childname", fspp::mode_t().addDirFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); }; this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS("/mydir", operation, {this->ExpectDoesntUpdateAccessTimestamp, this->ExpectUpdatesModificationTimestamp, this->ExpectUpdatesMetadataTimestamp}); } @@ -50,7 +50,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createDir) { TYPED_TEST_P(FsppDirTest_Timestamps, createDir_inRootDir) { auto dir = this->LoadDir("/"); auto operation = [&dir] () { - dir->createDir("childname", S_IFDIR, 1000, 1000); + dir->createDir("childname", fspp::mode_t().addDirFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); }; this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS("/", operation, {this->ExpectDoesntUpdateAccessTimestamp, this->ExpectUpdatesModificationTimestamp, this->ExpectUpdatesMetadataTimestamp}); }*/ @@ -58,7 +58,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createDir_inRootDir) { TYPED_TEST_P(FsppDirTest_Timestamps, createDir_TimestampsOfCreatedDir) { auto dir = this->CreateDir("/mydir"); timespec lowerBound = now(); - dir->createDir("childname", S_IFDIR, 1000, 1000); + dir->createDir("childname", fspp::mode_t().addDirFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); timespec upperBound = now(); auto child = this->Load("/mydir/childname"); this->EXPECT_ACCESS_TIMESTAMP_BETWEEN (lowerBound, upperBound, *child); @@ -69,7 +69,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createDir_TimestampsOfCreatedDir) { TYPED_TEST_P(FsppDirTest_Timestamps, createSymlink) { auto dir = this->CreateDir("/mydir"); auto operation = [&dir] () { - dir->createSymlink("childname", "/target", 1000, 1000); + dir->createSymlink("childname", "/target", fspp::uid_t(1000), fspp::gid_t(1000)); }; this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS("/mydir", operation, {this->ExpectDoesntUpdateAccessTimestamp, this->ExpectUpdatesModificationTimestamp, this->ExpectUpdatesMetadataTimestamp}); } @@ -78,7 +78,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createSymlink) { TYPED_TEST_P(FsppDirTest_Timestamps, createSymlink_inRootDir) { auto dir = this->LoadDir("/"); auto operation = [&dir] () { - dir->createSymlink("childname", "/target", 1000, 1000); + dir->createSymlink("childname", "/target", fspp::uid_t(1000), fspp::gid_t(1000)); }; this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS("/", operation, {this->ExpectDoesntUpdateAccessTimestamp, this->ExpectUpdatesModificationTimestamp, this->ExpectUpdatesMetadataTimestamp}); }*/ @@ -86,7 +86,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, createSymlink_inRootDir) { TYPED_TEST_P(FsppDirTest_Timestamps, createSymlink_TimestampsOfCreatedSymlink) { auto dir = this->CreateDir("/mydir"); timespec lowerBound = now(); - dir->createSymlink("childname", "/target", 1000, 1000); + dir->createSymlink("childname", "/target", fspp::uid_t(1000), fspp::gid_t(1000)); timespec upperBound = now(); auto child = this->Load("/mydir/childname"); this->EXPECT_ACCESS_TIMESTAMP_BETWEEN (lowerBound, upperBound, *child); @@ -114,7 +114,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, children_empty_inRootDir) { TYPED_TEST_P(FsppDirTest_Timestamps, children_nonempty) { auto dir = this->CreateDir("/mydir"); - dir->createAndOpenFile("filename", S_IFREG, 1000, 1000); + dir->createAndOpenFile("filename", fspp::mode_t().addFileFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); auto operation = [&dir] () { dir->children(); }; @@ -124,7 +124,7 @@ TYPED_TEST_P(FsppDirTest_Timestamps, children_nonempty) { /* TODO Re-enable this test once the root dir handles timestamps correctly TYPED_TEST_P(FsppDirTest_Timestamps, children_nonempty_inRootDir) { auto dir = this->LoadDir("/"); - dir->createAndOpenFile("filename", S_IFREG, 1000, 1000); + dir->createAndOpenFile("filename", fspp::mode_t().addFileFlag(), fspp::uid_t(1000), fspp::gid_t(1000)); auto operation = [&dir] () { dir->children(); }; diff --git a/src/fspp/fstest/FsppFileTest.h b/src/fspp/fstest/FsppFileTest.h index e5ab1364..2b33b9c9 100644 --- a/src/fspp/fstest/FsppFileTest.h +++ b/src/fspp/fstest/FsppFileTest.h @@ -57,23 +57,24 @@ public: } void Test_Chown_Uid(fspp::File *file, fspp::Node *node) { - node->chown(100, 200); + node->chown(fspp::uid_t(100), fspp::gid_t(200)); this->IN_STAT(file, node, [] (const fspp::Node::stat_info& st){ - EXPECT_EQ(100u, st.uid); + EXPECT_EQ(fspp::uid_t(100u), st.uid); }); } void Test_Chown_Gid(fspp::File *file, fspp::Node *node) { - node->chown(100, 200); + node->chown(fspp::uid_t(100), fspp::gid_t(200)); this->IN_STAT(file, node, [] (const fspp::Node::stat_info& st){ - EXPECT_EQ(200u, st.gid); + EXPECT_EQ(fspp::gid_t(200u), st.gid); }); } void Test_Chmod(fspp::File *file, fspp::Node *node) { - node->chmod(S_IFREG | S_IRUSR | S_IWOTH); - this->IN_STAT(file, node, [] (const fspp::Node::stat_info& st){ - EXPECT_EQ(static_cast(S_IFREG | S_IRUSR | S_IWOTH), st.mode); + constexpr auto mode = fspp::mode_t().addFileFlag().addUserReadFlag().addOtherWriteFlag(); + node->chmod(mode); + this->IN_STAT(file, node, [mode] (const fspp::Node::stat_info& st){ + EXPECT_EQ(mode, st.mode); }); } diff --git a/src/fspp/fstest/FsppNodeTest_Stat.h b/src/fspp/fstest/FsppNodeTest_Stat.h index 41c4d00f..52974012 100644 --- a/src/fspp/fstest/FsppNodeTest_Stat.h +++ b/src/fspp/fstest/FsppNodeTest_Stat.h @@ -33,7 +33,7 @@ TYPED_TEST_P(FsppNodeTest_Stat_FileOnly, FileIsFile) { this->CreateFile("/myfile"); auto node = this->Load("/myfile"); this->IN_STAT(node.get(), [] (const fspp::Node::stat_info& st) { - EXPECT_TRUE(S_ISREG(st.mode)); + EXPECT_TRUE(st.mode.hasFileFlag()); }); } @@ -47,7 +47,7 @@ TYPED_TEST_P(FsppNodeTest_Stat_DirOnly, DirIsDir) { this->CreateDir("/mydir"); auto node = this->Load("/mydir"); this->IN_STAT(node.get(), [] (const fspp::Node::stat_info& st) { - EXPECT_TRUE(S_ISDIR(st.mode)); + EXPECT_TRUE(st.mode.hasDirFlag()); }); } @@ -61,7 +61,7 @@ TYPED_TEST_P(FsppNodeTest_Stat_SymlinkOnly, SymlinkIsSymlink) { this->CreateSymlink("/mysymlink"); auto node = this->Load("/mysymlink"); this->IN_STAT(node.get(), [] (const fspp::Node::stat_info& st) { - EXPECT_TRUE(S_ISLNK(st.mode)); + EXPECT_TRUE(st.mode.hasSymlinkFlag()); }); } diff --git a/src/fspp/fstest/FsppNodeTest_Timestamps.h b/src/fspp/fstest/FsppNodeTest_Timestamps.h index 34a0baf7..f61cbdb6 100644 --- a/src/fspp/fstest/FsppNodeTest_Timestamps.h +++ b/src/fspp/fstest/FsppNodeTest_Timestamps.h @@ -35,7 +35,7 @@ public: void Test_Chmod() { auto node = this->CreateNode("/mynode"); - mode_t mode = this->stat(*node).mode; + fspp::mode_t mode = this->stat(*node).mode; auto operation = [&node, mode] () { node->chmod(mode); }; @@ -48,8 +48,8 @@ public: void Test_Chown() { auto node = this->CreateNode("/mynode"); - uid_t uid = this->stat(*node).uid; - gid_t gid = this->stat(*node).gid; + fspp::uid_t uid = this->stat(*node).uid; + fspp::gid_t gid = this->stat(*node).gid; auto operation = [&node, uid, gid] () { node->chown(uid, gid); }; diff --git a/src/fspp/fstest/FsppOpenFileTest.h b/src/fspp/fstest/FsppOpenFileTest.h index 260c8358..9a808947 100644 --- a/src/fspp/fstest/FsppOpenFileTest.h +++ b/src/fspp/fstest/FsppOpenFileTest.h @@ -41,7 +41,7 @@ TYPED_TEST_P(FsppOpenFileTest, FileIsFile) { auto file = this->CreateFile("/myfile"); auto openFile = this->LoadFile("/myfile")->open(O_RDONLY); this->IN_STAT(openFile.get(), [] (const fspp::OpenFile::stat_info& st) { - EXPECT_TRUE(S_ISREG(st.mode)); + EXPECT_TRUE(st.mode.hasFileFlag()); }); } diff --git a/src/fspp/fstest/testutils/FileSystemTest.h b/src/fspp/fstest/testutils/FileSystemTest.h index 864f4120..35090266 100644 --- a/src/fspp/fstest/testutils/FileSystemTest.h +++ b/src/fspp/fstest/testutils/FileSystemTest.h @@ -35,7 +35,10 @@ public: ConcreteFileSystemTestFixture fixture; cpputils::unique_ref device; - static constexpr mode_t MODE_PUBLIC = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH; + static constexpr fspp::mode_t MODE_PUBLIC = fspp::mode_t() + .addUserReadFlag().addUserWriteFlag().addUserExecFlag() + .addGroupReadFlag().addGroupWriteFlag().addGroupExecFlag() + .addOtherReadFlag().addOtherWriteFlag().addOtherExecFlag(); cpputils::unique_ref Load(const boost::filesystem::path &path) { auto loaded = device->Load(path); @@ -62,17 +65,17 @@ public: } cpputils::unique_ref CreateDir(const boost::filesystem::path &path) { - this->LoadDir(path.parent_path())->createDir(path.filename().string(), this->MODE_PUBLIC, 0, 0); + this->LoadDir(path.parent_path())->createDir(path.filename().string(), this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); return this->LoadDir(path); } cpputils::unique_ref CreateFile(const boost::filesystem::path &path) { - this->LoadDir(path.parent_path())->createAndOpenFile(path.filename().string(), this->MODE_PUBLIC, 0, 0); + this->LoadDir(path.parent_path())->createAndOpenFile(path.filename().string(), this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); return this->LoadFile(path); } cpputils::unique_ref CreateSymlink(const boost::filesystem::path &path, const boost::filesystem::path &target = "/my/symlink/target") { - this->LoadDir(path.parent_path())->createSymlink(path.filename().string(), target, 0, 0); + this->LoadDir(path.parent_path())->createSymlink(path.filename().string(), target, fspp::uid_t(0), fspp::gid_t(0)); return this->LoadSymlink(path); } @@ -98,6 +101,7 @@ public: ); } }; +template constexpr fspp::mode_t FileSystemTest::MODE_PUBLIC; #endif diff --git a/src/fspp/fstest/testutils/FileTest.h b/src/fspp/fstest/testutils/FileTest.h index 317124f6..d4b035da 100644 --- a/src/fspp/fstest/testutils/FileTest.h +++ b/src/fspp/fstest/testutils/FileTest.h @@ -11,16 +11,16 @@ template class FileTest: public FileSystemTest { public: FileTest(): file_root(), file_nested() { - this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); file_root = this->LoadFile("/myfile"); file_root_node = this->Load("/myfile"); - this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); - this->LoadDir("/mydir")->createAndOpenFile("mynestedfile", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); + this->LoadDir("/mydir")->createAndOpenFile("mynestedfile", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); file_nested = this->LoadFile("/mydir/mynestedfile"); file_nested_node = this->Load("/mydir/mynestedfile"); - this->LoadDir("/")->createDir("mydir2", this->MODE_PUBLIC, 0, 0); + this->LoadDir("/")->createDir("mydir2", this->MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); } std::unique_ptr file_root; std::unique_ptr file_nested; diff --git a/src/fspp/fuse/Filesystem.h b/src/fspp/fuse/Filesystem.h index 2527e343..39aa4bb6 100644 --- a/src/fspp/fuse/Filesystem.h +++ b/src/fspp/fuse/Filesystem.h @@ -15,16 +15,16 @@ public: virtual ~Filesystem() {} //TODO Test uid/gid parameters of createAndOpenFile - virtual int createAndOpenFile(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) = 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 void flush(int descriptor) = 0; virtual void closeFile(int descriptor) = 0; virtual void lstat(const boost::filesystem::path &path, struct ::stat *stbuf) = 0; virtual void fstat(int descriptor, struct ::stat *stbuf) = 0; //TODO Test chmod - virtual void chmod(const boost::filesystem::path &path, mode_t mode) = 0; + virtual void chmod(const boost::filesystem::path &path, ::mode_t mode) = 0; //TODO Test chown - virtual void chown(const boost::filesystem::path &path, uid_t uid, gid_t gid) = 0; + virtual void chown(const boost::filesystem::path &path, ::uid_t uid, ::gid_t gid) = 0; virtual void truncate(const boost::filesystem::path &path, off_t size) = 0; virtual void ftruncate(int descriptor, off_t size) = 0; virtual size_t read(int descriptor, void *buf, size_t count, off_t offset) = 0; @@ -33,7 +33,7 @@ public: virtual void fdatasync(int descriptor) = 0; virtual void access(const boost::filesystem::path &path, int mask) = 0; //TODO Test uid/gid parameters of mkdir - virtual void mkdir(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) = 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 unlink(const boost::filesystem::path &path) = 0; virtual void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) = 0; @@ -42,7 +42,7 @@ public: //TODO We shouldn't use Dir::Entry here, that's in another layer virtual cpputils::unique_ref> readDir(const boost::filesystem::path &path) = 0; //TODO Test createSymlink - virtual void createSymlink(const boost::filesystem::path &to, const boost::filesystem::path &from, uid_t uid, gid_t gid) = 0; + virtual void createSymlink(const boost::filesystem::path &to, const boost::filesystem::path &from, ::uid_t uid, ::gid_t gid) = 0; //TODO Test readSymlink virtual void readSymlink(const boost::filesystem::path &path, char *buf, size_t size) = 0; }; diff --git a/src/fspp/fuse/Fuse.cpp b/src/fspp/fuse/Fuse.cpp index 07851b0b..cd731d18 100644 --- a/src/fspp/fuse/Fuse.cpp +++ b/src/fspp/fuse/Fuse.cpp @@ -44,11 +44,11 @@ int fusepp_readlink(const char *path, char *buf, size_t size) { return FUSE_OBJ->readlink(bf::path(path), buf, size); } -int fusepp_mknod(const char *path, mode_t mode, dev_t rdev) { +int fusepp_mknod(const char *path, ::mode_t mode, dev_t rdev) { return FUSE_OBJ->mknod(bf::path(path), mode, rdev); } -int fusepp_mkdir(const char *path, mode_t mode) { +int fusepp_mkdir(const char *path, ::mode_t mode) { return FUSE_OBJ->mkdir(bf::path(path), mode); } @@ -72,11 +72,11 @@ int fusepp_link(const char *from, const char *to) { return FUSE_OBJ->link(bf::path(from), bf::path(to)); } -int fusepp_chmod(const char *path, mode_t mode) { +int fusepp_chmod(const char *path, ::mode_t mode) { return FUSE_OBJ->chmod(bf::path(path), mode); } -int fusepp_chown(const char *path, uid_t uid, gid_t gid) { +int fusepp_chown(const char *path, ::uid_t uid, ::gid_t gid) { return FUSE_OBJ->chown(bf::path(path), uid, gid); } @@ -158,7 +158,7 @@ int fusepp_access(const char *path, int mask) { return FUSE_OBJ->access(bf::path(path), mask); } -int fusepp_create(const char *path, mode_t mode, fuse_file_info *fileinfo) { +int fusepp_create(const char *path, ::mode_t mode, fuse_file_info *fileinfo) { return FUSE_OBJ->create(bf::path(path), mode, fileinfo); } @@ -385,7 +385,7 @@ int Fuse::readlink(const bf::path &path, char *buf, size_t size) { } } -int Fuse::mknod(const bf::path &path, mode_t mode, dev_t rdev) { +int Fuse::mknod(const bf::path &path, ::mode_t mode, dev_t rdev) { UNUSED(rdev); UNUSED(mode); UNUSED(path); @@ -393,7 +393,7 @@ int Fuse::mknod(const bf::path &path, mode_t mode, dev_t rdev) { return ENOSYS; } -int Fuse::mkdir(const bf::path &path, mode_t mode) { +int Fuse::mkdir(const bf::path &path, ::mode_t mode) { #ifdef FSPP_LOG LOG(DEBUG, "mkdir({}, {})", path, mode); #endif @@ -516,7 +516,7 @@ int Fuse::link(const bf::path &from, const bf::path &to) { return ENOSYS; } -int Fuse::chmod(const bf::path &path, mode_t mode) { +int Fuse::chmod(const bf::path &path, ::mode_t mode) { #ifdef FSPP_LOG LOG(DEBUG, "chmod({}, {})", path, mode); #endif @@ -538,7 +538,7 @@ int Fuse::chmod(const bf::path &path, mode_t mode) { } } -int Fuse::chown(const bf::path &path, uid_t uid, gid_t gid) { +int Fuse::chown(const bf::path &path, ::uid_t uid, ::gid_t gid) { #ifdef FSPP_LOG LOG(DEBUG, "chown({}, {}, {})", path, uid, gid); #endif @@ -714,7 +714,7 @@ int Fuse::write(const bf::path &path, const char *buf, size_t size, off_t offset } //TODO -int Fuse::statfs(const bf::path &path, struct statvfs *fsstat) { +int Fuse::statfs(const bf::path &path, struct ::statvfs *fsstat) { #ifdef FSPP_LOG LOG(DEBUG, "statfs({}, _)", path); #endif @@ -890,7 +890,7 @@ 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) { #ifdef FSPP_LOG LOG(DEBUG, "create({}, {}, _)", path, mode); #endif diff --git a/src/fspp/fuse/Fuse.h b/src/fspp/fuse/Fuse.h index 84d904df..9862c678 100644 --- a/src/fspp/fuse/Fuse.h +++ b/src/fspp/fuse/Fuse.h @@ -30,15 +30,15 @@ public: int getattr(const boost::filesystem::path &path, struct stat *stbuf); int fgetattr(const boost::filesystem::path &path, struct stat *stbuf, fuse_file_info *fileinfo); int readlink(const boost::filesystem::path &path, char *buf, size_t size); - int mknod(const boost::filesystem::path &path, mode_t mode, dev_t rdev); - int mkdir(const boost::filesystem::path &path, mode_t mode); + int mknod(const boost::filesystem::path &path, ::mode_t mode, dev_t rdev); + int mkdir(const boost::filesystem::path &path, ::mode_t mode); int unlink(const boost::filesystem::path &path); int rmdir(const boost::filesystem::path &path); int symlink(const boost::filesystem::path &from, const boost::filesystem::path &to); int rename(const boost::filesystem::path &from, const boost::filesystem::path &to); int link(const boost::filesystem::path &from, const boost::filesystem::path &to); - int chmod(const boost::filesystem::path &path, mode_t mode); - int chown(const boost::filesystem::path &path, uid_t uid, gid_t gid); + int chmod(const boost::filesystem::path &path, ::mode_t mode); + int chown(const boost::filesystem::path &path, ::uid_t uid, ::gid_t gid); int truncate(const boost::filesystem::path &path, off_t size); int ftruncate(const boost::filesystem::path &path, off_t size, fuse_file_info *fileinfo); int utimens(const boost::filesystem::path &path, const timespec times[2]); @@ -46,7 +46,7 @@ public: int release(const boost::filesystem::path &path, fuse_file_info *fileinfo); int read(const boost::filesystem::path &path, char *buf, size_t size, off_t offset, fuse_file_info *fileinfo); int write(const boost::filesystem::path &path, const char *buf, size_t size, off_t offset, fuse_file_info *fileinfo); - int statfs(const boost::filesystem::path &path, struct statvfs *fsstat); + int statfs(const boost::filesystem::path &path, struct ::statvfs *fsstat); int flush(const boost::filesystem::path &path, fuse_file_info *fileinfo); int fsync(const boost::filesystem::path &path, int flags, fuse_file_info *fileinfo); int opendir(const boost::filesystem::path &path, fuse_file_info *fileinfo); @@ -56,7 +56,7 @@ public: void init(fuse_conn_info *conn); void destroy(); int access(const boost::filesystem::path &path, int mask); - int create(const boost::filesystem::path &path, mode_t mode, fuse_file_info *fileinfo); + int create(const boost::filesystem::path &path, ::mode_t mode, fuse_file_info *fileinfo); private: static void _logException(const std::exception &e); diff --git a/src/fspp/impl/FilesystemImpl.cpp b/src/fspp/impl/FilesystemImpl.cpp index 2228aa3d..9530f4d0 100644 --- a/src/fspp/impl/FilesystemImpl.cpp +++ b/src/fspp/impl/FilesystemImpl.cpp @@ -141,9 +141,9 @@ void FilesystemImpl::closeFile(int descriptor) { namespace { void convert_stat_info_(const fspp::Node::stat_info& input, struct ::stat *output) { output->st_nlink = input.nlink; - output->st_mode = input.mode; - output->st_uid = input.uid; - output->st_gid = input.gid; + output->st_mode = input.mode.value(); + output->st_uid = input.uid.value(); + output->st_gid = input.gid.value(); output->st_size = input.size; output->st_blocks = input.blocks; output->st_atim = input.atime; @@ -169,23 +169,23 @@ void FilesystemImpl::fstat(int descriptor, struct ::stat *stbuf) { convert_stat_info_(stat_info, stbuf); } -void FilesystemImpl::chmod(const boost::filesystem::path &path, mode_t mode) { +void FilesystemImpl::chmod(const boost::filesystem::path &path, ::mode_t mode) { PROFILE(_chmodNanosec); auto node = _device->Load(path); if(node == none) { throw fuse::FuseErrnoException(ENOENT); } else { - (*node)->chmod(mode); + (*node)->chmod(fspp::mode_t(mode)); } } -void FilesystemImpl::chown(const boost::filesystem::path &path, uid_t uid, gid_t gid) { +void FilesystemImpl::chown(const boost::filesystem::path &path, ::uid_t uid, ::gid_t gid) { PROFILE(_chownNanosec); auto node = _device->Load(path); if(node == none) { throw fuse::FuseErrnoException(ENOENT); } else { - (*node)->chown(uid, gid); + (*node)->chown(fspp::uid_t(uid), fspp::gid_t(gid)); } } @@ -229,19 +229,19 @@ void FilesystemImpl::access(const bf::path &path, int mask) { } } -int FilesystemImpl::createAndOpenFile(const bf::path &path, mode_t mode, uid_t uid, gid_t gid) { +int FilesystemImpl::createAndOpenFile(const bf::path &path, ::mode_t mode, ::uid_t uid, ::gid_t gid) { PROFILE(_createAndOpenFileNanosec); auto dir = LoadDir(path.parent_path()); PROFILE(_createAndOpenFileNanosec_withoutLoading); - auto file = dir->createAndOpenFile(path.filename().string(), mode, uid, gid); + auto file = dir->createAndOpenFile(path.filename().string(), fspp::mode_t(mode), fspp::uid_t(uid), fspp::gid_t(gid)); return _open_files.open(std::move(file)); } -void FilesystemImpl::mkdir(const bf::path &path, mode_t mode, uid_t uid, gid_t gid) { +void FilesystemImpl::mkdir(const bf::path &path, ::mode_t mode, ::uid_t uid, ::gid_t gid) { PROFILE(_mkdirNanosec); auto dir = LoadDir(path.parent_path()); PROFILE(_mkdirNanosec_withoutLoading); - dir->createDir(path.filename().string(), mode, uid, gid); + dir->createDir(path.filename().string(), fspp::mode_t(mode), fspp::uid_t(uid), fspp::gid_t(gid)); } void FilesystemImpl::rmdir(const bf::path &path) { @@ -310,11 +310,11 @@ void FilesystemImpl::statfs(const bf::path &path, struct ::statvfs *fsstat) { fsstat->f_frsize = fsstat->f_bsize; // even though this is supposed to be ignored, osxfuse needs it. } -void FilesystemImpl::createSymlink(const bf::path &to, const bf::path &from, uid_t uid, gid_t gid) { +void FilesystemImpl::createSymlink(const bf::path &to, const bf::path &from, ::uid_t uid, ::gid_t gid) { PROFILE(_createSymlinkNanosec); auto parent = LoadDir(from.parent_path()); PROFILE(_createSymlinkNanosec_withoutLoading); - parent->createSymlink(from.filename().string(), to, uid, gid); + parent->createSymlink(from.filename().string(), to, fspp::uid_t(uid), fspp::gid_t(gid)); } void FilesystemImpl::readSymlink(const bf::path &path, char *buf, size_t size) { diff --git a/src/fspp/impl/FilesystemImpl.h b/src/fspp/impl/FilesystemImpl.h index e6756ffd..541f4829 100644 --- a/src/fspp/impl/FilesystemImpl.h +++ b/src/fspp/impl/FilesystemImpl.h @@ -29,8 +29,8 @@ public: void closeFile(int descriptor) override; void lstat(const boost::filesystem::path &path, struct ::stat *stbuf) override; void fstat(int descriptor, struct ::stat *stbuf) override; - void chmod(const boost::filesystem::path &path, mode_t mode) override; - void chown(const boost::filesystem::path &path, uid_t uid, gid_t gid) override; + void chmod(const boost::filesystem::path &path, ::mode_t mode) override; + void chown(const boost::filesystem::path &path, ::uid_t uid, ::gid_t gid) override; void truncate(const boost::filesystem::path &path, off_t size) override; void ftruncate(int descriptor, off_t size) override; size_t read(int descriptor, void *buf, size_t count, off_t offset) override; @@ -38,15 +38,15 @@ public: void fsync(int descriptor) override; void fdatasync(int descriptor) override; void access(const boost::filesystem::path &path, int mask) 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, uid_t uid, gid_t gid) 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, ::uid_t uid, ::gid_t gid) override; 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; cpputils::unique_ref> readDir(const boost::filesystem::path &path) override; void utimens(const boost::filesystem::path &path, timespec lastAccessTime, timespec lastModificationTime) override; void statfs(const boost::filesystem::path &path, struct ::statvfs *fsstat) override; - void createSymlink(const boost::filesystem::path &to, const boost::filesystem::path &from, uid_t uid, gid_t gid) override; + void createSymlink(const boost::filesystem::path &to, const boost::filesystem::path &from, ::uid_t uid, ::gid_t gid) override; void readSymlink(const boost::filesystem::path &path, char *buf, size_t size) override; private: diff --git a/test/cryfs/filesystem/CryNodeTest.cpp b/test/cryfs/filesystem/CryNodeTest.cpp index 404a6af8..4fc87515 100644 --- a/test/cryfs/filesystem/CryNodeTest.cpp +++ b/test/cryfs/filesystem/CryNodeTest.cpp @@ -14,11 +14,14 @@ namespace bf = boost::filesystem; class CryNodeTest : public ::testing::Test, public CryTestBase { public: - static constexpr mode_t MODE_PUBLIC = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH; + static constexpr fspp::mode_t MODE_PUBLIC = fspp::mode_t() + .addUserReadFlag().addUserWriteFlag().addUserExecFlag() + .addGroupReadFlag().addGroupWriteFlag().addGroupExecFlag() + .addOtherReadFlag().addOtherWriteFlag().addOtherExecFlag(); unique_ref CreateFile(const bf::path &path) { auto parentDir = device().LoadDir(path.parent_path()).value(); - parentDir->createAndOpenFile(path.filename().string(), MODE_PUBLIC, 0, 0); + parentDir->createAndOpenFile(path.filename().string(), MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); auto file = device().Load(path).value(); return dynamic_pointer_move(file).value(); } @@ -26,7 +29,7 @@ public: unique_ref CreateDir(const bf::path &path) { auto _parentDir = device().Load(path.parent_path()).value(); auto parentDir = dynamic_pointer_move(_parentDir).value(); - parentDir->createDir(path.filename().string(), MODE_PUBLIC, 0, 0); + parentDir->createDir(path.filename().string(), MODE_PUBLIC, fspp::uid_t(0), fspp::gid_t(0)); auto createdDir = device().Load(path).value(); return dynamic_pointer_move(createdDir).value(); } @@ -34,11 +37,12 @@ public: unique_ref CreateSymlink(const bf::path &path) { auto _parentDir = device().Load(path.parent_path()).value(); auto parentDir = dynamic_pointer_move(_parentDir).value(); - parentDir->createSymlink(path.filename().string(), "/target", 0, 0); + parentDir->createSymlink(path.filename().string(), "/target", fspp::uid_t(0), fspp::gid_t(0)); auto createdSymlink = device().Load(path).value(); return dynamic_pointer_move(createdSymlink).value(); } }; +constexpr fspp::mode_t CryNodeTest::MODE_PUBLIC; TEST_F(CryNodeTest, Rename_DoesntLeaveBlocksOver) { auto node = CreateFile("/oldname");