mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 01:37:36 +00:00
LibCore: Implement the 'X' modifier into FilePermissionMask
This commit is contained in:
parent
8598fbb008
commit
130f04c493
3 changed files with 48 additions and 8 deletions
|
@ -7,6 +7,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/Error.h>
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/String.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
|
@ -28,13 +29,30 @@ public:
|
|||
FilePermissionsMask& add_permissions(mode_t mode);
|
||||
FilePermissionsMask& remove_permissions(mode_t mode);
|
||||
|
||||
mode_t apply(mode_t mode) const { return m_write_mask | (mode & ~m_clear_mask); }
|
||||
mode_t apply(mode_t mode) const
|
||||
{
|
||||
if (m_directory_or_executable_mask && (S_ISDIR(mode) || (mode & 0111) != 0))
|
||||
mode = m_directory_or_executable_mask->apply(mode);
|
||||
|
||||
return m_write_mask | (mode & ~m_clear_mask);
|
||||
}
|
||||
mode_t clear_mask() const { return m_clear_mask; }
|
||||
mode_t write_mask() const { return m_write_mask; }
|
||||
|
||||
FilePermissionsMask& directory_or_executable_mask()
|
||||
{
|
||||
if (!m_directory_or_executable_mask)
|
||||
m_directory_or_executable_mask = make<FilePermissionsMask>();
|
||||
|
||||
return *m_directory_or_executable_mask;
|
||||
}
|
||||
|
||||
private:
|
||||
mode_t m_clear_mask; // the bits that will be cleared
|
||||
mode_t m_write_mask; // the bits that will be set
|
||||
|
||||
// A separate mask, only for files that already have some executable bit set or directories.
|
||||
OwnPtr<FilePermissionsMask> m_directory_or_executable_mask;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue