X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=include%2Fext4_xattr.h;h=3cd1bcd4b66c5af1e85c33ca1c3d166cb933b3d1;hb=dbcf9937ca2a64604133b2c38ecea906c90f7f2c;hp=f6076d2b8b3fb3858480edb5b62b799d91b90c2e;hpb=a45154a49b743eba4669442e6993c50583329d99;p=lwext4.git diff --git a/include/ext4_xattr.h b/include/ext4_xattr.h index f6076d2..3cd1bcd 100644 --- a/include/ext4_xattr.h +++ b/include/ext4_xattr.h @@ -43,6 +43,78 @@ extern "C" { #include "ext4_config.h" #include "ext4_types.h" +#include "ext4_inode.h" +#include "misc/tree.h" +#include "misc/queue.h" + +struct ext4_xattr_item { + /* This attribute should be stored in inode body */ + bool in_inode; + bool is_data; + + uint8_t name_index; + char *name; + size_t name_len; + void *data; + size_t data_size; + + RB_ENTRY(ext4_xattr_item) node; +}; + +struct ext4_xattr_ref { + bool block_loaded; + struct ext4_block block; + struct ext4_inode_ref *inode_ref; + bool dirty; + size_t ea_size; + size_t block_size_rem; + size_t inode_size_rem; + struct ext4_fs *fs; + + void *iter_arg; + struct ext4_xattr_item *iter_from; + + RB_HEAD(ext4_xattr_tree, + ext4_xattr_item) root; +}; + +#define EXT4_XATTR_PAD_BITS 2 +#define EXT4_XATTR_PAD (1<e_name_len))) +#define EXT4_XATTR_SIZE(size) \ + (((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND) +#define EXT4_XATTR_NAME(entry) \ + ((char *)((entry) + 1)) + +#define EXT4_XATTR_IHDR(sb, raw_inode) \ + ((struct ext4_xattr_ibody_header *) \ + ((char *)raw_inode + \ + EXT4_GOOD_OLD_INODE_SIZE + \ + ext4_inode_get_extra_isize(sb, raw_inode))) +#define EXT4_XATTR_IFIRST(hdr) \ + ((struct ext4_xattr_entry *)((hdr)+1)) + +#define EXT4_XATTR_BHDR(block) \ + ((struct ext4_xattr_header *)((block)->data)) +#define EXT4_XATTR_ENTRY(ptr) \ + ((struct ext4_xattr_entry *)(ptr)) +#define EXT4_XATTR_BFIRST(block) \ + EXT4_XATTR_ENTRY(EXT4_XATTR_BHDR(block)+1) +#define EXT4_XATTR_IS_LAST_ENTRY(entry) \ + (*(uint32_t *)(entry) == 0) + +#define EXT4_ZERO_XATTR_VALUE ((void *)-1) + + +#define EXT4_XATTR_ITERATE_CONT 0 +#define EXT4_XATTR_ITERATE_STOP 1 +#define EXT4_XATTR_ITERATE_PAUSE 2 int ext4_fs_get_xattr_ref(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref, struct ext4_xattr_ref *ref); @@ -67,7 +139,8 @@ void ext4_fs_xattr_iterate(struct ext4_xattr_ref *ref, void ext4_fs_xattr_iterate_reset(struct ext4_xattr_ref *ref); const char *ext4_extract_xattr_name(const char *full_name, size_t full_name_len, - uint8_t *name_index, size_t *name_len); + uint8_t *name_index, size_t *name_len, + bool *found); const char *ext4_get_xattr_name_prefix(uint8_t name_index, size_t *ret_prefix_len);