diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-28 23:08:39 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-28 23:34:17 +0200 |
commit | d758950ac88c2c6759d1616ac8be2c70c9dcf761 (patch) | |
tree | e96860712abea784525a2b7feb3a690b443e1372 /lib/fstree/xattr.c | |
parent | 9bcb6edfe419d390acddc2ed7d0c04d37b753ac3 (diff) |
Replace fstree/sqfshelper xattr code with sqfs_xattr_writer_t
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/fstree/xattr.c')
-rw-r--r-- | lib/fstree/xattr.c | 174 |
1 files changed, 0 insertions, 174 deletions
diff --git a/lib/fstree/xattr.c b/lib/fstree/xattr.c deleted file mode 100644 index 45ea8a6..0000000 --- a/lib/fstree/xattr.c +++ /dev/null @@ -1,174 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * xattr.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "config.h" - -#include "fstree.h" -#include "util.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <errno.h> - -static void remove_from_list(fstree_t *fs, tree_xattr_t *xattr) -{ - tree_xattr_t *prev = NULL, *it = fs->xattr; - - while (it != xattr) { - prev = it; - it = it->next; - } - - if (prev == NULL) { - fs->xattr = xattr->next; - } else { - prev->next = xattr->next; - } -} - -static tree_xattr_t *grow_xattr_block(tree_xattr_t *xattr) -{ - size_t new_size, old_size = 0, new_count = 4; - void *new; - - if (xattr != NULL) { - if (SZ_MUL_OV(xattr->max_attr, 2, &new_count)) - goto fail_ov; - old_size = sizeof(*xattr) + sizeof(sqfs_u64) * xattr->max_attr; - } - - if (SZ_MUL_OV(sizeof(sqfs_u64), new_count, &new_size) || - SZ_ADD_OV(sizeof(*xattr), new_size, &new_size)) { - goto fail_ov; - } - - new = realloc(xattr, new_size); - if (new == NULL) - goto fail; - - memset((char *)new + old_size, 0, new_size - old_size); - - xattr = new; - xattr->max_attr = new_count; - return xattr; -fail_ov: - errno = EOVERFLOW; -fail: - perror("adding extended attributes"); - free(xattr); - return NULL; -} - -int fstree_add_xattr(fstree_t *fs, tree_node_t *node, - const char *key, const char *value) -{ - size_t key_idx, value_idx; - tree_xattr_t *xattr; - - if (str_table_get_index(&fs->xattr_keys, key, &key_idx)) - return -1; - - if (str_table_get_index(&fs->xattr_values, value, &value_idx)) - return -1; - - if (sizeof(size_t) > sizeof(sqfs_u32)) { - if (key_idx > 0xFFFFFFFFUL) { - fputs("Too many unique xattr keys\n", stderr); - return -1; - } - - if (value_idx > 0xFFFFFFFFUL) { - fputs("Too many unique xattr values\n", stderr); - return -1; - } - } - - xattr = node->xattr; - - if (xattr == NULL || xattr->max_attr == xattr->num_attr) { - if (xattr != NULL) - remove_from_list(fs, xattr); - - xattr = grow_xattr_block(xattr); - if (xattr == NULL) - return -1; - - node->xattr = xattr; - xattr->owner = node; - xattr->next = fs->xattr; - fs->xattr = xattr; - } - - xattr->attr[xattr->num_attr].key_index = key_idx; - xattr->attr[xattr->num_attr].value_index = value_idx; - xattr->num_attr += 1; - return 0; -} - -static int cmp_attr(const void *lhs, const void *rhs) -{ - return memcmp(lhs, rhs, sizeof(((tree_xattr_t *)0)->attr[0])); -} - -void fstree_xattr_reindex(fstree_t *fs) -{ - sqfs_u32 key_idx, value_idx; - size_t i, index = 0; - tree_xattr_t *it; - - str_table_reset_ref_count(&fs->xattr_keys); - str_table_reset_ref_count(&fs->xattr_values); - - for (it = fs->xattr; it != NULL; it = it->next) { - it->index = index++; - - for (i = 0; i < it->num_attr; ++i) { - key_idx = it->attr[i].key_index; - value_idx = it->attr[i].value_index; - - str_table_add_ref(&fs->xattr_keys, key_idx); - str_table_add_ref(&fs->xattr_values, value_idx); - } - } -} - -void fstree_xattr_deduplicate(fstree_t *fs) -{ - tree_xattr_t *it, *it1, *prev; - int diff; - - for (it = fs->xattr; it != NULL; it = it->next) - qsort(it->attr, it->num_attr, sizeof(it->attr[0]), cmp_attr); - - prev = NULL; - it = fs->xattr; - - while (it != NULL) { - for (it1 = fs->xattr; it1 != it; it1 = it1->next) { - if (it1->num_attr != it->num_attr) - continue; - - diff = memcmp(it1->attr, it->attr, - it->num_attr * sizeof(it->attr[0])); - if (diff == 0) - break; - } - - if (it1 != it) { - prev->next = it->next; - it->owner->xattr = it1; - - free(it); - it = prev->next; - } else { - prev = it; - it = it->next; - } - } - - fstree_xattr_reindex(fs); -} |