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);
int ext4_setxattr(const char *path, const char *name, size_t name_len,
const void *data, size_t data_size, bool replace)
{
+ bool found;
int r = EOK;
ext4_file f;
uint32_t inode;
return EROFS;
dissected_name = ext4_extract_xattr_name(name, name_len,
- &name_index, &dissected_len);
- if (!dissected_len)
+ &name_index, &dissected_len,
+ &found);
+ if (!found)
return EINVAL;
EXT4_MP_LOCK(mp);
int ext4_getxattr(const char *path, const char *name, size_t name_len,
void *buf, size_t buf_size, size_t *data_size)
{
+ bool found;
int r = EOK;
ext4_file f;
uint32_t inode;
return ENOENT;
dissected_name = ext4_extract_xattr_name(name, name_len,
- &name_index, &dissected_len);
- if (!dissected_len)
+ &name_index, &dissected_len,
+ &found);
+ if (!found)
return EINVAL;
EXT4_MP_LOCK(mp);
int ext4_removexattr(const char *path, const char *name, size_t name_len)
{
+ bool found;
int r = EOK;
ext4_file f;
uint32_t inode;
return EROFS;
dissected_name = ext4_extract_xattr_name(name, name_len,
- &name_index, &dissected_len);
- if (!dissected_len)
+ &name_index, &dissected_len,
+ &found);
+ if (!found)
return EINVAL;
EXT4_MP_LOCK(mp);
};
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)
{
int i;
ext4_assert(name_index);
+ ext4_assert(found);
+
+ *found = false;
+
if (!full_name_len) {
if (name_len)
*name_len = 0;
size_t prefix_len = strlen(prefix_tbl[i].prefix);
if (full_name_len >= prefix_len &&
!memcmp(full_name, prefix_tbl[i].prefix, prefix_len)) {
+ bool require_name =
+ prefix_tbl[i].prefix[prefix_len - 1] == '.';
*name_index = prefix_tbl[i].name_index;
if (name_len)
*name_len = full_name_len - prefix_len;
- return full_name + prefix_len;
+ if (!(full_name_len - prefix_len) && require_name)
+ return NULL;
+
+ *found = true;
+ if (require_name)
+ return full_name + prefix_len;
+
+ return NULL;
}
}
if (name_len)