};
struct ext2_xattr_handle {
+ errcode_t magic;
ext2_filsys fs;
struct ext2_xattr *attrs;
size_t length, count;
{0, NULL},
};
+static void move_inline_data_to_front(struct ext2_xattr_handle *h)
+{
+ struct ext2_xattr *x;
+ struct ext2_xattr tmp;
+
+ for (x = h->attrs + 1; x < h->attrs + h->length; x++) {
+ if (!x->name)
+ continue;
+
+ if (strcmp(x->name, "system.data") == 0) {
+ memcpy(&tmp, x, sizeof(tmp));
+ memcpy(x, h->attrs, sizeof(tmp));
+ memcpy(h->attrs, &tmp, sizeof(tmp));
+ return;
+ }
+ }
+}
+
static const char *find_ea_prefix(int index)
{
struct ea_name_index *e;
unsigned int entry_size, value_size;
int idx, ret;
+ memset(entries_start, 0, storage_size);
/* For all remaining x... */
for (; x < handle->attrs + handle->length; x++) {
if (!x->name)
unsigned int i;
errcode_t err;
+ EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
i = EXT2_INODE_SIZE(handle->fs->super);
if (i < sizeof(*inode))
i = sizeof(*inode);
if (err)
goto out;
+ move_inline_data_to_front(handle);
+
x = handle->attrs;
/* Does the inode have size for EA? */
if (EXT2_INODE_SIZE(handle->fs->super) <= EXT2_GOOD_OLD_INODE_SIZE +
write_ea_block:
/* Write the EA block */
- err = ext2fs_get_memzero(handle->fs->blocksize, &block_buf);
+ err = ext2fs_get_mem(handle->fs->blocksize, &block_buf);
if (err)
goto out;
x++;
entry = entries;
+ remain = storage_size;
while (!EXT2_EXT_IS_LAST_ENTRY(entry)) {
__u32 hash;
int i;
errcode_t err;
+ EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
i = EXT2_INODE_SIZE(handle->fs->super);
if (i < sizeof(*inode))
i = sizeof(*inode);
errcode_t err;
int ret;
+ EXT2_CHECK_MAGIC(h, EXT2_ET_MAGIC_EA_HANDLE);
for (x = h->attrs; x < h->attrs + h->length; x++) {
if (!x->name)
continue;
void *val;
errcode_t err;
+ EXT2_CHECK_MAGIC(h, EXT2_ET_MAGIC_EA_HANDLE);
for (x = h->attrs; x < h->attrs + h->length; x++) {
if (!x->name)
continue;
char *new_value;
errcode_t err;
+ EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
last_empty = NULL;
for (x = handle->attrs; x < handle->attrs + handle->length; x++) {
if (!x->name) {
struct ext2_xattr *x;
errcode_t err;
+ EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
for (x = handle->attrs; x < handle->attrs + handle->length; x++) {
if (!x->name)
continue;
if (err)
return err;
+ h->magic = EXT2_ET_MAGIC_EA_HANDLE;
h->length = 4;
err = ext2fs_get_arrayzero(h->length, sizeof(struct ext2_xattr),
&h->attrs);
struct ext2_xattr_handle *h = *handle;
errcode_t err;
+ EXT2_CHECK_MAGIC(h, EXT2_ET_MAGIC_EA_HANDLE);
if (h->dirty) {
err = ext2fs_xattrs_write(h);
if (err)
return 0;
}
-size_t ext2fs_xattrs_count(struct ext2_xattr_handle *handle)
+errcode_t ext2fs_xattrs_count(struct ext2_xattr_handle *handle, size_t *count)
{
- return handle->count;
+ EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
+ *count = handle->count;
+ return 0;
}