From 50b67940c793e72656787469ced6e0245bb580b4 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 29 May 2023 20:16:38 +0200 Subject: libfstree: accept dir_entry_t instead of path and struct stat Because the dir_entry_t also has a flag for had links, the regular node and hard-link node interface can be unified. This simplifies the users of libfstree (gensquashfs, tar2sqfs) since we can simply hose the entries from an iterator directly into the tree. Signed-off-by: David Oberhollenzer --- lib/fstree/test/mknode_simple.c | 148 +++++++++++++++++++++++++++------------- 1 file changed, 101 insertions(+), 47 deletions(-) (limited to 'lib/fstree/test/mknode_simple.c') diff --git a/lib/fstree/test/mknode_simple.c b/lib/fstree/test/mknode_simple.c index a96ee42..2a18121 100644 --- a/lib/fstree/test/mknode_simple.c +++ b/lib/fstree/test/mknode_simple.c @@ -9,11 +9,25 @@ #include "fstree.h" #include "util/test.h" +static dir_entry_t *mkentry(const char *name, sqfs_u16 mode) +{ + dir_entry_t *ent = calloc(1, sizeof(*ent) + strlen(name) + 1); + + TEST_NOT_NULL(ent); + strcpy(ent->name, name); + ent->mode = mode | 0654; + ent->uid = 123; + ent->gid = 456; + ent->rdev = 789; + ent->size = 1337; + return ent; +} + int main(int argc, char **argv) { fstree_defaults_t defaults; tree_node_t *node; - struct stat sb; + dir_entry_t *ent; fstree_t fs; int ret; (void)argc; (void)argv; @@ -22,21 +36,16 @@ int main(int argc, char **argv) ret = fstree_init(&fs, &defaults); TEST_EQUAL_I(ret, 0); - memset(&sb, 0, sizeof(sb)); - sb.st_mode = S_IFSOCK | 0654; - sb.st_uid = 123; - sb.st_gid = 456; - sb.st_rdev = 789; - sb.st_size = 1337; - - node = fstree_add_generic(&fs, "/sockfile", &sb, "target"); + ent = mkentry("/sockfile", S_IFSOCK); + node = fstree_add_generic(&fs, ent, "target"); + free(ent); TEST_NOT_NULL(node); TEST_ASSERT(node->parent == fs.root); TEST_ASSERT((char *)node->name >= (char *)node->payload); TEST_STR_EQUAL(node->name, "sockfile"); - TEST_EQUAL_UI(node->uid, sb.st_uid); - TEST_EQUAL_UI(node->gid, sb.st_gid); - TEST_EQUAL_UI(node->mode, sb.st_mode); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFSOCK | 0654)); TEST_EQUAL_UI(node->link_count, 1); TEST_NULL(node->data.target); TEST_EQUAL_UI(node->data.devno, 0); @@ -45,21 +54,16 @@ int main(int argc, char **argv) ret = fstree_init(&fs, &defaults); TEST_EQUAL_I(ret, 0); - memset(&sb, 0, sizeof(sb)); - sb.st_mode = S_IFIFO | 0654; - sb.st_uid = 123; - sb.st_gid = 456; - sb.st_rdev = 789; - sb.st_size = 1337; - - node = fstree_add_generic(&fs, "/fifo", &sb, "target"); + ent = mkentry("/fifo", S_IFIFO); + node = fstree_add_generic(&fs, ent, "target"); + free(ent); TEST_NOT_NULL(node); TEST_ASSERT(node->parent == fs.root); TEST_ASSERT((char *)node->name >= (char *)node->payload); TEST_STR_EQUAL(node->name, "fifo"); - TEST_EQUAL_UI(node->uid, sb.st_uid); - TEST_EQUAL_UI(node->gid, sb.st_gid); - TEST_EQUAL_UI(node->mode, sb.st_mode); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFIFO | 0654)); TEST_EQUAL_UI(node->link_count, 1); TEST_NULL(node->data.target); TEST_EQUAL_UI(node->data.devno, 0); @@ -68,45 +72,95 @@ int main(int argc, char **argv) ret = fstree_init(&fs, &defaults); TEST_EQUAL_I(ret, 0); - memset(&sb, 0, sizeof(sb)); - sb.st_mode = S_IFBLK | 0654; - sb.st_uid = 123; - sb.st_gid = 456; - sb.st_rdev = 789; - sb.st_size = 1337; - - node = fstree_add_generic(&fs, "/blkdev", &sb, NULL); + ent = mkentry("/blkdev", S_IFBLK); + node = fstree_add_generic(&fs, ent, NULL); + free(ent); TEST_NOT_NULL(node); TEST_ASSERT(node->parent == fs.root); TEST_ASSERT((char *)node->name >= (char *)node->payload); TEST_STR_EQUAL(node->name, "blkdev"); - TEST_EQUAL_UI(node->uid, sb.st_uid); - TEST_EQUAL_UI(node->gid, sb.st_gid); - TEST_EQUAL_UI(node->mode, sb.st_mode); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFBLK | 0654)); TEST_EQUAL_UI(node->link_count, 1); - TEST_EQUAL_UI(node->data.devno, sb.st_rdev); + TEST_EQUAL_UI(node->data.devno, 789); fstree_cleanup(&fs); ret = fstree_init(&fs, &defaults); TEST_EQUAL_I(ret, 0); - memset(&sb, 0, sizeof(sb)); - sb.st_mode = S_IFCHR | 0654; - sb.st_uid = 123; - sb.st_gid = 456; - sb.st_rdev = 789; - sb.st_size = 1337; - - node = fstree_add_generic(&fs, "/chardev", &sb, NULL); + ent = mkentry("/chardev", S_IFCHR); + node = fstree_add_generic(&fs, ent, NULL); + free(ent); TEST_NOT_NULL(node); TEST_ASSERT(node->parent == fs.root); TEST_ASSERT((char *)node->name >= (char *)node->payload); TEST_STR_EQUAL(node->name, "chardev"); - TEST_EQUAL_UI(node->uid, sb.st_uid); - TEST_EQUAL_UI(node->gid, sb.st_gid); - TEST_EQUAL_UI(node->mode, sb.st_mode); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFCHR | 0654)); + TEST_EQUAL_UI(node->link_count, 1); + TEST_EQUAL_UI(node->data.devno, 789); + fstree_cleanup(&fs); + + memset(&defaults, 0, sizeof(defaults)); + ret = fstree_init(&fs, &defaults); + TEST_EQUAL_I(ret, 0); + + ent = mkentry("/symlink", S_IFLNK); + node = fstree_add_generic(&fs, ent, "target"); + free(ent); + TEST_NOT_NULL(node); + TEST_ASSERT(node->parent == fs.root); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFLNK | 0777)); + TEST_EQUAL_UI(node->link_count, 1); + TEST_ASSERT((char *)node->name >= (char *)node->payload); + TEST_ASSERT(node->data.target >= (char *)node->payload); + TEST_ASSERT(node->data.target >= node->name + 8); + TEST_STR_EQUAL(node->name, "symlink"); + TEST_STR_EQUAL(node->data.target, "target"); + fstree_cleanup(&fs); + + memset(&defaults, 0, sizeof(defaults)); + ret = fstree_init(&fs, &defaults); + TEST_EQUAL_I(ret, 0); + + ent = mkentry("/foo", S_IFLNK); + node = fstree_add_generic(&fs, ent, ""); + free(ent); + TEST_NOT_NULL(node); + TEST_ASSERT(node->parent == fs.root); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFLNK | 0777)); TEST_EQUAL_UI(node->link_count, 1); - TEST_EQUAL_UI(node->data.devno, sb.st_rdev); + TEST_ASSERT((char *)node->name >= (char *)node->payload); + TEST_ASSERT(node->data.target >= (char *)node->payload); + TEST_ASSERT(node->data.target >= node->name + 3); + TEST_STR_EQUAL(node->name, "foo"); + TEST_STR_EQUAL(node->data.target, ""); + fstree_cleanup(&fs); + + memset(&defaults, 0, sizeof(defaults)); + ret = fstree_init(&fs, &defaults); + TEST_EQUAL_I(ret, 0); + + ent = mkentry("/filename", S_IFREG); + node = fstree_add_generic(&fs, ent, "input"); + free(ent); + TEST_NOT_NULL(node); + TEST_ASSERT(node->parent == fs.root); + TEST_EQUAL_UI(node->uid, 123); + TEST_EQUAL_UI(node->gid, 456); + TEST_EQUAL_UI(node->mode, (S_IFREG | 0654)); + TEST_EQUAL_UI(node->link_count, 1); + TEST_ASSERT((char *)node->name >= (char *)node->payload); + TEST_ASSERT(node->data.file.input_file >= (char *)node->payload); + TEST_ASSERT(node->data.file.input_file >= node->name + 8); + TEST_STR_EQUAL(node->name, "filename"); + TEST_STR_EQUAL(node->data.file.input_file, "input"); fstree_cleanup(&fs); return EXIT_SUCCESS; -- cgit v1.2.3