beegfs/meta/source/storage/PosixACL.h
2025-08-10 01:34:16 +02:00

58 lines
1.3 KiB
C++

#pragma once
#include <common/toolkit/serialization/Serialization.h>
#include <common/Common.h>
#include <common/storage/StorageErrors.h>
#include <stdint.h>
#include <vector>
struct ACLEntry
{
// Definitions to match linux/posix_acl.h and linux/posix_acl_xattr.h
static const int32_t POSIX_ACL_XATTR_VERSION = 0x0002;
enum Tag {
ACL_USER_OBJ = 0x01,
ACL_USER = 0x02,
ACL_GROUP_OBJ = 0x04,
ACL_GROUP = 0x08,
ACL_MASK = 0x10,
ACL_OTHER = 0x20
};
int16_t tag;
uint16_t perm;
uint32_t id; // uid or gid depending on the tag
template<typename This, typename Ctx>
static void serialize(This obj, Ctx& ctx)
{
ctx
% obj->tag
% obj->perm
% obj->id;
}
};
typedef std::vector<ACLEntry> ACLEntryVec;
typedef ACLEntryVec::const_iterator ACLEntryVecCIter;
typedef ACLEntryVec::iterator ACLEntryVecIter;
class PosixACL
{
public:
bool deserializeXAttr(const CharVector& xattr);
void serializeXAttr(CharVector& xattr) const;
std::string toString();
FhgfsOpsErr modifyModeBits(int& outMode, bool& outNeedsACL);
bool empty() { return entries.empty(); }
static const std::string defaultACLXAttrName;
static const std::string accessACLXAttrName;
private:
ACLEntryVec entries;
};