diff options
-rw-r--r-- | include/fstree.h | 14 | ||||
-rw-r--r-- | lib/common/writer.c | 5 | ||||
-rw-r--r-- | lib/fstree/Makemodule.am | 2 | ||||
-rw-r--r-- | lib/fstree/fstree.c | 1 | ||||
-rw-r--r-- | lib/fstree/gen_inode_numbers.c (renamed from lib/fstree/gen_inode_table.c) | 37 | ||||
-rw-r--r-- | tests/Makemodule.am | 8 | ||||
-rw-r--r-- | tests/gen_inode_numbers.c (renamed from tests/gen_inode_table.c) | 15 |
7 files changed, 25 insertions, 57 deletions
diff --git a/include/fstree.h b/include/fstree.h index 44428cd..ab44e3e 100644 --- a/include/fstree.h +++ b/include/fstree.h @@ -83,13 +83,10 @@ struct tree_node_t { struct fstree_t { struct stat defaults; size_t block_size; - size_t inode_tbl_size; + size_t unique_inode_count; tree_node_t *root; - /* linear array of tree nodes. inode number is array index */ - tree_node_t **inode_table; - /* linear linked list of all regular files */ file_info_t *files; }; @@ -157,8 +154,13 @@ tree_node_t *fstree_add_generic(fstree_t *fs, const char *path, */ int fstree_from_file(fstree_t *fs, const char *filename, FILE *fp); -/* Returns 0 on success. Prints to stderr on failure */ -int fstree_gen_inode_table(fstree_t *fs); +/* + Allocates inode numbers for all nodes. Directory entries are numbered in + ascending order. + + The total inode count is stored in unique_inode_count. + */ +void fstree_gen_inode_numbers(fstree_t *fs); void fstree_gen_file_list(fstree_t *fs); diff --git a/lib/common/writer.c b/lib/common/writer.c index 0b7f378..087ee3c 100644 --- a/lib/common/writer.c +++ b/lib/common/writer.c @@ -214,10 +214,9 @@ int sqfs_writer_finish(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *cfg) fputs("Writing inodes and directories...\n", stdout); tree_node_sort_recursive(sqfs->fs.root); - if (fstree_gen_inode_table(&sqfs->fs)) - return -1; + fstree_gen_inode_numbers(&sqfs->fs); - sqfs->super.inode_count = sqfs->fs.inode_tbl_size; + sqfs->super.inode_count = sqfs->fs.unique_inode_count; if (sqfs_serialize_fstree(cfg->filename, sqfs)) return -1; diff --git a/lib/fstree/Makemodule.am b/lib/fstree/Makemodule.am index 6638480..bb17d24 100644 --- a/lib/fstree/Makemodule.am +++ b/lib/fstree/Makemodule.am @@ -1,6 +1,6 @@ libfstree_a_SOURCES = lib/fstree/fstree.c lib/fstree/fstree_from_file.c libfstree_a_SOURCES += lib/fstree/fstree_sort.c -libfstree_a_SOURCES += lib/fstree/gen_inode_table.c lib/fstree/get_path.c +libfstree_a_SOURCES += lib/fstree/gen_inode_numbers.c lib/fstree/get_path.c libfstree_a_SOURCES += lib/fstree/mknode.c libfstree_a_SOURCES += lib/fstree/add_by_path.c libfstree_a_SOURCES += include/fstree.h diff --git a/lib/fstree/fstree.c b/lib/fstree/fstree.c index ad48508..90e14ce 100644 --- a/lib/fstree/fstree.c +++ b/lib/fstree/fstree.c @@ -128,6 +128,5 @@ int fstree_init(fstree_t *fs, char *defaults) void fstree_cleanup(fstree_t *fs) { free_recursive(fs->root); - free(fs->inode_table); memset(fs, 0, sizeof(*fs)); } diff --git a/lib/fstree/gen_inode_table.c b/lib/fstree/gen_inode_numbers.c index 006029f..35dbc7a 100644 --- a/lib/fstree/gen_inode_table.c +++ b/lib/fstree/gen_inode_numbers.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-3.0-or-later */ /* - * gen_inode_table.c + * gen_inode_numbers.c * * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> */ @@ -11,23 +11,6 @@ #include <stdlib.h> #include <stdio.h> -static size_t count_nodes(tree_node_t *root) -{ - tree_node_t *n = root->data.dir.children; - size_t count = 1; - - while (n != NULL) { - if (S_ISDIR(n->mode)) { - count += count_nodes(n); - } else { - ++count; - } - n = n->next; - } - - return count; -} - static void map_child_nodes(fstree_t *fs, tree_node_t *root, size_t *counter) { bool has_subdirs = false; @@ -48,27 +31,19 @@ static void map_child_nodes(fstree_t *fs, tree_node_t *root, size_t *counter) } for (it = root->data.dir.children; it != NULL; it = it->next) { + fs->unique_inode_count += 1; + it->inode_num = *counter; *counter += 1; - - fs->inode_table[it->inode_num - 1] = it; } } -int fstree_gen_inode_table(fstree_t *fs) +void fstree_gen_inode_numbers(fstree_t *fs) { size_t inum = 1; - fs->inode_tbl_size = count_nodes(fs->root); - fs->inode_table = calloc(1, sizeof(tree_node_t*) * fs->inode_tbl_size); - - if (fs->inode_table == NULL) { - perror("allocating inode table"); - return -1; - } - + fs->unique_inode_count = 0; map_child_nodes(fs, fs->root, &inum); fs->root->inode_num = inum; - fs->inode_table[inum - 1] = fs->root; - return 0; + fs->unique_inode_count += 1; } diff --git a/tests/Makemodule.am b/tests/Makemodule.am index fc27de0..2fb7654 100644 --- a/tests/Makemodule.am +++ b/tests/Makemodule.am @@ -27,8 +27,8 @@ test_mknode_reg_LDADD = libfstree.a libcompat.a test_mknode_dir_SOURCES = tests/mknode_dir.c test_mknode_dir_LDADD = libfstree.a libcompat.a -test_gen_inode_table_SOURCES = tests/gen_inode_table.c -test_gen_inode_table_LDADD = libfstree.a libcompat.a +test_gen_inode_numbers_SOURCES = tests/gen_inode_numbers.c +test_gen_inode_numbers_LDADD = libfstree.a libcompat.a test_add_by_path_SOURCES = tests/add_by_path.c test_add_by_path_LDADD = libfstree.a libcompat.a @@ -93,7 +93,7 @@ tar_fuzz_SOURCES = tests/tar_fuzz.c tar_fuzz_LDADD = libtar.a libcompat.a check_PROGRAMS += test_mknode_simple test_mknode_slink test_mknode_reg -check_PROGRAMS += test_mknode_dir test_gen_inode_table test_add_by_path +check_PROGRAMS += test_mknode_dir test_gen_inode_numbers test_add_by_path check_PROGRAMS += test_get_path test_fstree_sort test_fstree_from_file check_PROGRAMS += test_fstree_init test_tar_ustar test_tar_pax test_tar_gnu check_PROGRAMS += test_tar_sparse_gnu test_tar_sparse_gnu1 test_tar_sparse_gnu2 @@ -104,7 +104,7 @@ check_SCRIPTS += tests/cantrbry.sh tests/test_tar_sqfs.sh noinst_PROGRAMS += fstree_fuzz tar_fuzz TESTS += test_mknode_simple test_mknode_slink -TESTS += test_mknode_reg test_mknode_dir test_gen_inode_table +TESTS += test_mknode_reg test_mknode_dir test_gen_inode_numbers TESTS += test_add_by_path test_get_path test_fstree_sort test_fstree_from_file TESTS += test_fstree_init test_tar_ustar test_tar_pax TESTS += test_tar_gnu test_tar_sparse_gnu test_tar_sparse_gnu1 diff --git a/tests/gen_inode_table.c b/tests/gen_inode_numbers.c index d70f463..e16abbe 100644 --- a/tests/gen_inode_table.c +++ b/tests/gen_inode_numbers.c @@ -50,15 +50,13 @@ static void check_children_continuous(tree_node_t *root) int main(void) { tree_node_t *a, *b, *c; - unsigned int i; fstree_t fs; // inode table for the empty tree assert(fstree_init(&fs, NULL) == 0); - assert(fstree_gen_inode_table(&fs) == 0); - assert(fs.inode_tbl_size == 1); + fstree_gen_inode_numbers(&fs); + assert(fs.unique_inode_count == 1); assert(fs.root->inode_num == 1); - assert(fs.inode_table[0] == fs.root); fstree_cleanup(&fs); // tree with 2 levels under root, fan out 3 @@ -83,13 +81,8 @@ int main(void) assert(gen_node(c, "c_b") != NULL); assert(gen_node(c, "c_c") != NULL); - assert(fstree_gen_inode_table(&fs) == 0); - assert(fs.inode_tbl_size == 13); - - for (i = 0; i < 13; ++i) { - assert(fs.inode_table[i] != NULL); - assert(fs.inode_table[i]->inode_num == i + 1); - } + fstree_gen_inode_numbers(&fs); + assert(fs.unique_inode_count == 13); check_children_before_root(fs.root); check_children_continuous(fs.root); |