#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;
+struct ext4_xattr_info {
uint8_t name_index;
- char *name;
+ const char *name;
size_t name_len;
- void *data;
- size_t data_size;
-
- RB_ENTRY(ext4_xattr_item) node;
+ const void *value;
+ size_t value_len;
};
-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;
+struct ext4_xattr_list_entry {
+ uint8_t name_index;
+ char *name;
+ size_t name_len;
+ struct ext4_xattr_list_entry *next;
};
-#define EXT4_XATTR_PAD_BITS 2
-#define EXT4_XATTR_PAD (1<<EXT4_XATTR_PAD_BITS)
-#define EXT4_XATTR_ROUND (EXT4_XATTR_PAD-1)
-#define EXT4_XATTR_LEN(name_len) \
- (((name_len) + EXT4_XATTR_ROUND + \
- sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND)
-#define EXT4_XATTR_NEXT(entry) \
- ((struct ext4_xattr_entry *)( \
- (char *)(entry) + EXT4_XATTR_LEN((entry)->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)
+struct ext4_xattr_search {
+ /* The first entry in the buffer */
+ struct ext4_xattr_entry *first;
-#define EXT4_ZERO_XATTR_VALUE ((void *)-1)
+ /* The address of the buffer */
+ void *base;
+ /* The first inaccessible address */
+ void *end;
-#define EXT4_XATTR_ITERATE_CONT 0
-#define EXT4_XATTR_ITERATE_STOP 1
-#define EXT4_XATTR_ITERATE_PAUSE 2
+ /* The current entry pointer */
+ struct ext4_xattr_entry *here;
-int ext4_fs_get_xattr_ref(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref,
- struct ext4_xattr_ref *ref);
+ /* Entry not found */
+ bool not_found;
+};
-void ext4_fs_put_xattr_ref(struct ext4_xattr_ref *ref);
+#define EXT4_XATTR_PAD_BITS 2
+#define EXT4_XATTR_PAD (1 << EXT4_XATTR_PAD_BITS)
+#define EXT4_XATTR_ROUND (EXT4_XATTR_PAD - 1)
+#define EXT4_XATTR_LEN(name_len) \
+ (((name_len) + EXT4_XATTR_ROUND + sizeof(struct ext4_xattr_entry)) & \
+ ~EXT4_XATTR_ROUND)
+#define EXT4_XATTR_NEXT(entry) \
+ ((struct ext4_xattr_entry *)((char *)(entry) + \
+ EXT4_XATTR_LEN((entry)->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)
-int ext4_fs_set_xattr(struct ext4_xattr_ref *ref, uint8_t name_index,
- const char *name, size_t name_len, const void *data,
- size_t data_size, bool replace);
+#define EXT4_ZERO_XATTR_VALUE ((void *)-1)
-int ext4_fs_remove_xattr(struct ext4_xattr_ref *ref, uint8_t name_index,
- const char *name, size_t name_len);
+const char *ext4_extract_xattr_name(const char *full_name, size_t full_name_len,
+ uint8_t *name_index, size_t *name_len,
+ bool *found);
-int ext4_fs_get_xattr(struct ext4_xattr_ref *ref, uint8_t name_index,
- const char *name, size_t name_len, void *buf,
- size_t buf_size, size_t *data_size);
+const char *ext4_get_xattr_name_prefix(uint8_t name_index,
+ size_t *ret_prefix_len);
-void ext4_fs_xattr_iterate(struct ext4_xattr_ref *ref,
- int (*iter)(struct ext4_xattr_ref *ref,
- struct ext4_xattr_item *item));
+int ext4_xattr_list(struct ext4_inode_ref *inode_ref,
+ struct ext4_xattr_list_entry *list, size_t *list_len);
-void ext4_fs_xattr_iterate_reset(struct ext4_xattr_ref *ref);
+int ext4_xattr_get(struct ext4_inode_ref *inode_ref, uint8_t name_index,
+ const char *name, size_t name_len, void *buf, size_t buf_len,
+ size_t *data_len);
-const char *ext4_extract_xattr_name(const char *full_name, size_t full_name_len,
- uint8_t *name_index, size_t *name_len,
- bool *found);
+int ext4_xattr_remove(struct ext4_inode_ref *inode_ref, uint8_t name_index,
+ const char *name, size_t name_len);
-const char *ext4_get_xattr_name_prefix(uint8_t name_index,
- size_t *ret_prefix_len);
+int ext4_xattr_set(struct ext4_inode_ref *inode_ref, uint8_t name_index,
+ const char *name, size_t name_len, const void *value,
+ size_t value_len);
#ifdef __cplusplus
}