aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-05-29 20:16:38 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-05-30 14:47:14 +0200
commit50b67940c793e72656787469ced6e0245bb580b4 (patch)
treea35e728c1b5193867bba61747b4410898fd40ce2 /lib
parent926987f338f7b3aba99dc25afd442ddd3e70d16d (diff)
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 <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib')
-rw-r--r--lib/fstree/Makemodule.am13
-rw-r--r--lib/fstree/src/fstree.c84
-rw-r--r--lib/fstree/src/hardlink.c27
-rw-r--r--lib/fstree/test/add_by_path.c107
-rw-r--r--lib/fstree/test/fstree_sort.c38
-rw-r--r--lib/fstree/test/gen_inode_numbers.c12
-rw-r--r--lib/fstree/test/get_path.c35
-rw-r--r--lib/fstree/test/mknode_dir.c41
-rw-r--r--lib/fstree/test/mknode_reg.c47
-rw-r--r--lib/fstree/test/mknode_simple.c148
-rw-r--r--lib/fstree/test/mknode_slink.c60
11 files changed, 305 insertions, 307 deletions
diff --git a/lib/fstree/Makemodule.am b/lib/fstree/Makemodule.am
index 109af8e..965251b 100644
--- a/lib/fstree/Makemodule.am
+++ b/lib/fstree/Makemodule.am
@@ -5,16 +5,10 @@ libfstree_a_SOURCES = include/fstree.h lib/fstree/src/fstree.c \
noinst_LIBRARIES += libfstree.a
test_mknode_simple_SOURCES = lib/fstree/test/mknode_simple.c
-test_mknode_simple_LDADD = libfstree.a libcompat.a
-
-test_mknode_slink_SOURCES = lib/fstree/test/mknode_slink.c
-test_mknode_slink_LDADD = libfstree.a libcompat.a
-
-test_mknode_reg_SOURCES = lib/fstree/test/mknode_reg.c
-test_mknode_reg_LDADD = libfstree.a libcompat.a
+test_mknode_simple_LDADD = libfstree.a libutil.a libcompat.a
test_mknode_dir_SOURCES = lib/fstree/test/mknode_dir.c
-test_mknode_dir_LDADD = libfstree.a libcompat.a
+test_mknode_dir_LDADD = libfstree.a libutil.a libcompat.a
test_gen_inode_numbers_SOURCES = lib/fstree/test/gen_inode_numbers.c
test_gen_inode_numbers_LDADD = libcommon.a libfstree.a libutil.a libcompat.a
@@ -29,8 +23,7 @@ test_fstree_sort_SOURCES = lib/fstree/test/fstree_sort.c
test_fstree_sort_LDADD = libcommon.a libfstree.a libio.a libutil.a libcompat.a
FSTREE_TESTS = \
- test_mknode_simple test_mknode_slink \
- test_mknode_reg test_mknode_dir test_gen_inode_numbers \
+ test_mknode_simple test_mknode_dir test_gen_inode_numbers \
test_add_by_path test_get_path test_fstree_sort
check_PROGRAMS += $(FSTREE_TESTS)
diff --git a/lib/fstree/src/fstree.c b/lib/fstree/src/fstree.c
index 43a6ccc..1421d44 100644
--- a/lib/fstree/src/fstree.c
+++ b/lib/fstree/src/fstree.c
@@ -5,6 +5,7 @@
* Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
*/
#include "config.h"
+#include "util/util.h"
#include "fstree.h"
#include <string.h>
@@ -13,6 +14,15 @@
#include <stdio.h>
#include <errno.h>
+static sqfs_u32 clamp_timestamp(sqfs_s64 ts)
+{
+ if (ts < 0)
+ return 0;
+ if (ts > 0x0FFFFFFFFLL)
+ return 0xFFFFFFFF;
+ return ts;
+}
+
static void free_recursive(tree_node_t *n)
{
tree_node_t *it;
@@ -63,9 +73,9 @@ static void insert_sorted(tree_node_t *root, tree_node_t *n)
}
}
-static tree_node_t *mknode(tree_node_t *parent, const char *name,
+static tree_node_t *mknode(fstree_t *fs, tree_node_t *parent, const char *name,
size_t name_len, const char *extra,
- const struct stat *sb)
+ const dir_entry_t *ent)
{
tree_node_t *n;
size_t size;
@@ -80,10 +90,10 @@ static tree_node_t *mknode(tree_node_t *parent, const char *name,
return NULL;
n->xattr_idx = 0xFFFFFFFF;
- n->uid = sb->st_uid;
- n->gid = sb->st_gid;
- n->mode = sb->st_mode;
- n->mod_time = sb->st_mtime;
+ n->uid = ent->uid;
+ n->gid = ent->gid;
+ n->mode = ent->mode;
+ n->mod_time = clamp_timestamp(ent->mtime);
n->link_count = 1;
n->name = (char *)n->payload;
memcpy(n->name, name, name_len);
@@ -91,11 +101,24 @@ static tree_node_t *mknode(tree_node_t *parent, const char *name,
if (extra != NULL) {
ptr = n->name + name_len + 1;
strcpy(ptr, extra);
+
+ if (ent->flags & DIR_ENTRY_FLAG_HARD_LINK) {
+ if (canonicalize_name(ptr)) {
+ free(n);
+ errno = EINVAL;
+ return NULL;
+ }
+ }
} else {
ptr = NULL;
}
- switch (sb->st_mode & S_IFMT) {
+ if (ent->flags & DIR_ENTRY_FLAG_HARD_LINK) {
+ n->mode = S_IFLNK | 0777;
+ n->flags |= FLAG_LINK_IS_HARD;
+ }
+
+ switch (n->mode & S_IFMT) {
case S_IFREG:
n->data.file.input_file = ptr;
break;
@@ -105,7 +128,7 @@ static tree_node_t *mknode(tree_node_t *parent, const char *name,
break;
case S_IFBLK:
case S_IFCHR:
- n->data.devno = sb->st_rdev;
+ n->data.devno = ent->rdev;
break;
case S_IFDIR:
n->link_count = 2;
@@ -120,6 +143,11 @@ static tree_node_t *mknode(tree_node_t *parent, const char *name,
return NULL;
}
+ if (ent->flags & DIR_ENTRY_FLAG_HARD_LINK) {
+ n->next_by_type = fs->links_unresolved;
+ fs->links_unresolved = n;
+ }
+
insert_sorted(parent, n);
parent->link_count++;
return n;
@@ -184,20 +212,20 @@ tree_node_t *fstree_get_node_by_path(fstree_t *fs, tree_node_t *root,
n = child_by_name(root, path, len);
if (n == NULL) {
- struct stat sb;
+ dir_entry_t ent;
if (!create_implicitly) {
errno = ENOENT;
return NULL;
}
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | (fs->defaults.mode & 07777);
- sb.st_uid = fs->defaults.uid;
- sb.st_gid = fs->defaults.gid;
- sb.st_mtime = fs->defaults.mtime;
+ memset(&ent, 0, sizeof(ent));
+ ent.mode = S_IFDIR | (fs->defaults.mode & 07777);
+ ent.uid = fs->defaults.uid;
+ ent.gid = fs->defaults.gid;
+ ent.mtime = fs->defaults.mtime;
- n = mknode(root, path, len, NULL, &sb);
+ n = mknode(fs, root, path, len, NULL, &ent);
if (n == NULL)
return NULL;
@@ -211,46 +239,46 @@ tree_node_t *fstree_get_node_by_path(fstree_t *fs, tree_node_t *root,
return root;
}
-tree_node_t *fstree_add_generic(fstree_t *fs, const char *path,
- const struct stat *sb, const char *extra)
+tree_node_t *fstree_add_generic(fstree_t *fs, const dir_entry_t *ent,
+ const char *extra)
{
tree_node_t *child, *parent;
const char *name;
- if (S_ISLNK(sb->st_mode) && extra == NULL) {
+ if (S_ISLNK(ent->mode) && extra == NULL) {
errno = EINVAL;
return NULL;
}
- if (*path == '\0') {
+ if (ent->name[0] == '\0') {
child = fs->root;
assert(child != NULL);
goto out;
}
- parent = fstree_get_node_by_path(fs, fs->root, path, true, true);
+ parent = fstree_get_node_by_path(fs, fs->root, ent->name, true, true);
if (parent == NULL)
return NULL;
- name = strrchr(path, '/');
- name = (name == NULL ? path : (name + 1));
+ name = strrchr(ent->name, '/');
+ name = (name == NULL ? ent->name : (name + 1));
child = child_by_name(parent, name, strlen(name));
out:
if (child != NULL) {
- if (!S_ISDIR(child->mode) || !S_ISDIR(sb->st_mode) ||
+ if (!S_ISDIR(child->mode) || !S_ISDIR(ent->mode) ||
!(child->flags & FLAG_DIR_CREATED_IMPLICITLY)) {
errno = EEXIST;
return NULL;
}
- child->uid = sb->st_uid;
- child->gid = sb->st_gid;
- child->mode = sb->st_mode;
- child->mod_time = sb->st_mtime;
+ child->uid = ent->uid;
+ child->gid = ent->gid;
+ child->mode = ent->mode;
+ child->mod_time = ent->mtime;
child->flags &= ~FLAG_DIR_CREATED_IMPLICITLY;
return child;
}
- return mknode(parent, name, strlen(name), extra, sb);
+ return mknode(fs, parent, name, strlen(name), extra, ent);
}
diff --git a/lib/fstree/src/hardlink.c b/lib/fstree/src/hardlink.c
index b6467e2..849ec1c 100644
--- a/lib/fstree/src/hardlink.c
+++ b/lib/fstree/src/hardlink.c
@@ -6,7 +6,6 @@
*/
#include "config.h"
-#include "util/util.h"
#include "fstree.h"
#include <string.h>
@@ -54,32 +53,6 @@ static int resolve_link(fstree_t *fs, tree_node_t *node)
return 0;
}
-tree_node_t *fstree_add_hard_link(fstree_t *fs, const char *path,
- const char *target)
-{
- struct stat sb;
- tree_node_t *n;
-
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFLNK | 0777;
-
- n = fstree_add_generic(fs, path, &sb, target);
- if (n != NULL) {
- if (canonicalize_name(n->data.target)) {
- free(n);
- errno = EINVAL;
- return NULL;
- }
-
- n->flags |= FLAG_LINK_IS_HARD;
- }
-
- n->next_by_type = fs->links_unresolved;
- fs->links_unresolved = n;
-
- return n;
-}
-
int fstree_resolve_hard_links(fstree_t *fs)
{
while (fs->links_unresolved != NULL) {
diff --git a/lib/fstree/test/add_by_path.c b/lib/fstree/test/add_by_path.c
index 7df1e55..7fb9d37 100644
--- a/lib/fstree/test/add_by_path.c
+++ b/lib/fstree/test/add_by_path.c
@@ -10,11 +10,24 @@
#include "common.h"
#include "util/test.h"
+static dir_entry_t *mkentry(const char *name, sqfs_u16 mode, sqfs_u32 uid,
+ sqfs_u32 gid)
+{
+ dir_entry_t *ent = calloc(1, sizeof(*ent) + strlen(name) + 1);
+
+ TEST_NOT_NULL(ent);
+ strcpy(ent->name, name);
+ ent->mode = mode;
+ ent->uid = uid;
+ ent->gid = gid;
+ return ent;
+}
+
int main(int argc, char **argv)
{
fstree_defaults_t fsd;
tree_node_t *a, *b;
- struct stat sb;
+ dir_entry_t *ent;
fstree_t fs;
char *opts;
(void)argc; (void)argv;
@@ -23,20 +36,16 @@ int main(int argc, char **argv)
TEST_ASSERT(parse_fstree_defaults(&fsd, opts) == 0);
free(opts);
TEST_ASSERT(fstree_init(&fs, &fsd) == 0);
-
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | 0750;
- sb.st_uid = 1000;
- sb.st_gid = 100;
-
TEST_EQUAL_UI(fs.root->link_count, 2);
- a = fstree_add_generic(&fs, "dir", &sb, NULL);
+ ent = mkentry("dir", S_IFDIR | 0750, 1000, 100);
+ a = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(a);
TEST_STR_EQUAL(a->name, "dir");
- TEST_EQUAL_UI(a->mode, sb.st_mode);
- TEST_EQUAL_UI(a->uid, sb.st_uid);
- TEST_EQUAL_UI(a->gid, sb.st_gid);
+ TEST_EQUAL_UI(a->mode, (S_IFDIR | 0750));
+ TEST_EQUAL_UI(a->uid, 1000);
+ TEST_EQUAL_UI(a->gid, 100);
TEST_ASSERT(a->parent == fs.root);
TEST_EQUAL_UI(a->link_count, 2);
TEST_NULL(a->next);
@@ -44,61 +53,68 @@ int main(int argc, char **argv)
TEST_EQUAL_UI(fs.root->link_count, 3);
TEST_ASSERT(!(a->flags & FLAG_DIR_CREATED_IMPLICITLY));
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFBLK | 0640;
- sb.st_rdev = 1234;
-
- b = fstree_add_generic(&fs, "blkdev", &sb, NULL);
+ ent = mkentry("blkdev", S_IFBLK | 0640, 0, 0);
+ ent->rdev = 1234;
+ b = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(b);
TEST_ASSERT(b != a);
TEST_STR_EQUAL(b->name, "blkdev");
- TEST_EQUAL_UI(b->mode, sb.st_mode);
- TEST_EQUAL_UI(b->uid, sb.st_uid);
- TEST_EQUAL_UI(b->gid, sb.st_gid);
+ TEST_EQUAL_UI(b->mode, (S_IFBLK | 0640));
+ TEST_EQUAL_UI(b->uid, 0);
+ TEST_EQUAL_UI(b->gid, 0);
TEST_ASSERT(b->parent == fs.root);
TEST_EQUAL_UI(b->link_count, 1);
- TEST_EQUAL_UI(b->data.devno, sb.st_rdev);
+ TEST_EQUAL_UI(b->data.devno, 1234);
TEST_ASSERT(b->next == a);
TEST_EQUAL_UI(fs.root->link_count, 4);
TEST_ASSERT(fs.root->data.children == b);
- TEST_NULL(fstree_add_generic(&fs, "blkdev/foo", &sb, NULL));
+ ent = mkentry("blkdev/foo", S_IFBLK | 0640, 0, 0);
+ TEST_NULL(fstree_add_generic(&fs, ent, NULL));
TEST_EQUAL_UI(errno, ENOTDIR);
+ free(ent);
- TEST_NULL(fstree_add_generic(&fs, "dir", &sb, NULL));
+ ent = mkentry("dir", S_IFBLK | 0640, 0, 0);
+ TEST_NULL(fstree_add_generic(&fs, ent, NULL));
TEST_EQUAL_UI(errno, EEXIST);
+ free(ent);
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | 0755;
- TEST_NULL(fstree_add_generic(&fs, "dir", &sb, NULL));
+ ent = mkentry("dir", S_IFDIR | 0755, 0, 0);
+ TEST_NULL(fstree_add_generic(&fs, ent, NULL));
TEST_EQUAL_UI(errno, EEXIST);
+ free(ent);
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFCHR | 0444;
- b = fstree_add_generic(&fs, "dir/chrdev", &sb, NULL);
+ ent = mkentry("dir/chrdev", S_IFCHR | 0444, 0, 0);
+ ent->rdev = 5678;
+ b = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(b);
- TEST_EQUAL_UI(b->mode, sb.st_mode);
- TEST_EQUAL_UI(b->uid, sb.st_uid);
- TEST_EQUAL_UI(b->gid, sb.st_gid);
+ TEST_EQUAL_UI(b->mode, (S_IFCHR | 0444));
+ TEST_EQUAL_UI(b->uid, 0);
+ TEST_EQUAL_UI(b->gid, 0);
TEST_EQUAL_UI(b->link_count, 1);
TEST_ASSERT(b->parent == a);
- TEST_EQUAL_UI(b->data.devno, sb.st_rdev);
+ TEST_EQUAL_UI(b->data.devno, 5678);
TEST_NULL(b->next);
TEST_ASSERT(a->data.children == b);
TEST_EQUAL_UI(a->link_count, 3);
TEST_EQUAL_UI(fs.root->link_count, 4);
- b = fstree_add_generic(&fs, "dir/foo/chrdev", &sb, NULL);
+ ent = mkentry("dir/foo/chrdev", S_IFCHR | 0444, 0, 0);
+ ent->rdev = 91011;
+ b = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(b);
TEST_NULL(b->next);
- TEST_EQUAL_UI(b->mode, sb.st_mode);
- TEST_EQUAL_UI(b->uid, sb.st_uid);
- TEST_EQUAL_UI(b->gid, sb.st_gid);
+ TEST_EQUAL_UI(b->mode, (S_IFCHR | 0444));
+ TEST_EQUAL_UI(b->uid, 0);
+ TEST_EQUAL_UI(b->gid, 0);
TEST_EQUAL_UI(b->link_count, 1);
TEST_ASSERT(b->parent != a);
TEST_ASSERT(b->parent->parent == a);
- TEST_EQUAL_UI(b->data.devno, sb.st_rdev);
+ TEST_EQUAL_UI(b->data.devno, 91011);
TEST_NULL(b->next);
TEST_EQUAL_UI(a->link_count, 4);
@@ -112,25 +128,22 @@ int main(int argc, char **argv)
TEST_EQUAL_UI(b->gid, 42);
TEST_EQUAL_UI(b->link_count, 3);
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | 0750;
- sb.st_uid = 1000;
- sb.st_gid = 100;
-
- a = fstree_add_generic(&fs, "dir/foo", &sb, NULL);
+ ent = mkentry("dir/foo", S_IFDIR | 0755, 1000, 100);
+ a = fstree_add_generic(&fs, ent, NULL);
TEST_NOT_NULL(a);
TEST_ASSERT(a == b);
TEST_ASSERT(!(a->flags & FLAG_DIR_CREATED_IMPLICITLY));
- TEST_EQUAL_UI(a->mode, sb.st_mode);
- TEST_EQUAL_UI(a->uid, sb.st_uid);
- TEST_EQUAL_UI(a->gid, sb.st_gid);
+ TEST_EQUAL_UI(a->mode, (S_IFDIR | 0755));
+ TEST_EQUAL_UI(a->uid, 1000);
+ TEST_EQUAL_UI(a->gid, 100);
TEST_EQUAL_UI(a->link_count, 3);
TEST_EQUAL_UI(a->parent->link_count, 4);
TEST_EQUAL_UI(fs.root->link_count, 4);
- TEST_NULL(fstree_add_generic(&fs, "dir/foo", &sb, NULL));
+ TEST_NULL(fstree_add_generic(&fs, ent, NULL));
TEST_EQUAL_UI(errno, EEXIST);
+ free(ent);
fstree_cleanup(&fs);
return EXIT_SUCCESS;
diff --git a/lib/fstree/test/fstree_sort.c b/lib/fstree/test/fstree_sort.c
index 135976d..82d6e9d 100644
--- a/lib/fstree/test/fstree_sort.c
+++ b/lib/fstree/test/fstree_sort.c
@@ -10,43 +10,55 @@
#include "common.h"
#include "util/test.h"
+static tree_node_t *mkentry(fstree_t *fs, const char *name)
+{
+ dir_entry_t *ent = calloc(1, sizeof(*ent) + strlen(name) + 1);
+ tree_node_t *out;
+
+ TEST_NOT_NULL(ent);
+ strcpy(ent->name, name);
+ ent->mode = S_IFBLK | 0600;
+ ent->rdev = 1337;
+
+ out = fstree_add_generic(fs, ent, NULL);
+ free(ent);
+ TEST_NOT_NULL(out);
+
+ return out;
+}
+
int main(int argc, char **argv)
{
tree_node_t *a, *b, *c, *d;
fstree_defaults_t fsd;
- struct stat sb;
fstree_t fs;
int ret;
(void)argc; (void)argv;
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFBLK | 0600;
- sb.st_rdev = 1337;
-
/* in order */
TEST_ASSERT(parse_fstree_defaults(&fsd, NULL) == 0);
ret = fstree_init(&fs, &fsd);
TEST_EQUAL_I(ret, 0);
- a = fstree_add_generic(&fs, "a", &sb, NULL);
+ a = mkentry(&fs, "a");
TEST_NOT_NULL(a);
TEST_ASSERT(fs.root->data.children == a);
TEST_NULL(a->next);
- b = fstree_add_generic(&fs, "b", &sb, NULL);
+ b = mkentry(&fs, "b");
TEST_NOT_NULL(a);
TEST_ASSERT(fs.root->data.children == a);
TEST_ASSERT(a->next == b);
TEST_NULL(b->next);
- c = fstree_add_generic(&fs, "c", &sb, NULL);
+ c = mkentry(&fs, "c");
TEST_NOT_NULL(c);
TEST_ASSERT(fs.root->data.children == a);
TEST_ASSERT(a->next == b);
TEST_ASSERT(b->next == c);
TEST_NULL(c->next);
- d = fstree_add_generic(&fs, "d", &sb, NULL);
+ d = mkentry(&fs, "d");
TEST_NOT_NULL(d);
TEST_ASSERT(fs.root->data.children == a);
TEST_ASSERT(a->next == b);
@@ -60,25 +72,25 @@ int main(int argc, char **argv)
ret = fstree_init(&fs, &fsd);
TEST_EQUAL_I(ret, 0);
- d = fstree_add_generic(&fs, "d", &sb, NULL);
+ d = mkentry(&fs, "d");
TEST_NOT_NULL(d);
TEST_ASSERT(fs.root->data.children == d);
TEST_NULL(d->next);
- c = fstree_add_generic(&fs, "c", &sb, NULL);
+ c = mkentry(&fs, "c");
TEST_NOT_NULL(c);
TEST_ASSERT(fs.root->data.children == c);
TEST_ASSERT(c->next == d);
TEST_NULL(d->next);
- b = fstree_add_generic(&fs, "b", &sb, NULL);
+ b = mkentry(&fs, "b");
TEST_NOT_NULL(b);
TEST_ASSERT(fs.root->data.children == b);
TEST_ASSERT(b->next == c);
TEST_ASSERT(c->next == d);
TEST_NULL(d->next);
- a = fstree_add_generic(&fs, "a", &sb, NULL);
+ a = mkentry(&fs, "a");
TEST_NOT_NULL(a);
TEST_ASSERT(fs.root->data.children == a);
TEST_ASSERT(a->next == b);
diff --git a/lib/fstree/test/gen_inode_numbers.c b/lib/fstree/test/gen_inode_numbers.c
index 9e046a8..ae7198e 100644
--- a/lib/fstree/test/gen_inode_numbers.c
+++ b/lib/fstree/test/gen_inode_numbers.c
@@ -12,12 +12,16 @@
static tree_node_t *gen_node(fstree_t *fs, const char *path)
{
- struct stat sb;
+ dir_entry_t *ent = calloc(1, sizeof(*ent) + strlen(path) + 1);
+ tree_node_t *ret;
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | 0755;
+ TEST_NOT_NULL(ent);
+ strcpy(ent->name, path);
+ ent->mode = S_IFDIR | 0755;
- return fstree_add_generic(fs, path, &sb, NULL);
+ ret = fstree_add_generic(fs, ent, NULL);
+ free(ent);
+ return ret;
}
static void check_children_before_root(tree_node_t *root)
diff --git a/lib/fstree/test/get_path.c b/lib/fstree/test/get_path.c
index 572cde7..a158764 100644
--- a/lib/fstree/test/get_path.c
+++ b/lib/fstree/test/get_path.c
@@ -10,11 +10,23 @@
#include "common.h"
#include "util/test.h"
+static dir_entry_t *mkentry(const char *name)
+{
+ dir_entry_t *ent = calloc(1, sizeof(*ent) + strlen(name) + 1);
+ TEST_NOT_NULL(ent);
+
+ strcpy(ent->name, name);
+ ent->mode = S_IFDIR | 0750;
+ ent->uid = 1000;
+ ent->gid = 100;
+ return ent;
+}
+
int main(int argc, char **argv)
{
tree_node_t *a, *b, *c, *d;
fstree_defaults_t fsd;
- struct stat sb;
+ dir_entry_t *ent;
fstree_t fs;
char *str;
(void)argc; (void)argv;
@@ -22,15 +34,18 @@ int main(int argc, char **argv)
TEST_ASSERT(parse_fstree_defaults(&fsd, NULL) == 0);
TEST_ASSERT(fstree_init(&fs, &fsd) == 0);
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | 0750;
- sb.st_uid = 1000;
- sb.st_gid = 100;
-
- a = fstree_add_generic(&fs, "foo", &sb, NULL);
- b = fstree_add_generic(&fs, "foo/bar", &sb, NULL);
- c = fstree_add_generic(&fs, "foo/bar/baz", &sb, NULL);
- d = fstree_add_generic(&fs, "foo/bar/baz/dir", &sb, NULL);
+ ent = mkentry("foo");
+ a = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
+ ent = mkentry("foo/bar");
+ b = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
+ ent = mkentry("foo/bar/baz");
+ c = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
+ ent = mkentry("foo/bar/baz/dir");
+ d = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
str = fstree_get_path(fs.root);
TEST_NOT_NULL(str);
diff --git a/lib/fstree/test/mknode_dir.c b/lib/fstree/test/mknode_dir.c
index c2812ac..20cba45 100644
--- a/lib/fstree/test/mknode_dir.c
+++ b/lib/fstree/test/mknode_dir.c
@@ -9,11 +9,25 @@
#include "fstree.h"
#include "util/test.h"
+static dir_entry_t *mkentry(const char *name)
+{
+ dir_entry_t *ent = calloc(1, sizeof(*ent) + strlen(name) + 1);
+
+ TEST_NOT_NULL(ent);
+ strcpy(ent->name, name);
+ ent->mode = S_IFDIR | 0654;
+ ent->uid = 123;
+ ent->gid = 456;
+ ent->rdev = 789;
+ ent->size = 4096;
+ return ent;
+}
+
int main(int argc, char **argv)
{
fstree_defaults_t defaults;
tree_node_t *root, *a, *b;
- struct stat sb;
+ dir_entry_t *ent;
fstree_t fs;
int ret;
(void)argc; (void)argv;
@@ -22,26 +36,23 @@ 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_IFDIR | 0654;
- sb.st_uid = 123;
- sb.st_gid = 456;
- sb.st_rdev = 789;
- sb.st_size = 4096;
-
- root = fstree_add_generic(&fs, "rootdir", &sb, NULL);
+ ent = mkentry("rootdir");
+ root = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(root);
TEST_ASSERT(root->parent == fs.root);
- TEST_EQUAL_UI(root->uid, sb.st_uid);
- TEST_EQUAL_UI(root->gid, sb.st_gid);
- TEST_EQUAL_UI(root->mode, sb.st_mode);
+ TEST_EQUAL_UI(root->uid, 123);
+ TEST_EQUAL_UI(root->gid, 456);
+ TEST_EQUAL_UI(root->mode, (S_IFDIR | 0654));
TEST_EQUAL_UI(root->link_count, 2);
TEST_ASSERT(root->name >= (char *)root->payload);
TEST_STR_EQUAL(root->name, "rootdir");
TEST_NULL(root->data.children);
TEST_NULL(root->next);
- a = fstree_add_generic(&fs, "rootdir/adir", &sb, NULL);
+ ent = mkentry("rootdir/adir");
+ a = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(a);
TEST_ASSERT(a->parent == root);
TEST_NULL(a->next);
@@ -51,7 +62,9 @@ int main(int argc, char **argv)
TEST_ASSERT(root->parent == fs.root);
TEST_NULL(root->next);
- b = fstree_add_generic(&fs, "rootdir/bdir", &sb, NULL);
+ ent = mkentry("rootdir/bdir");
+ b = fstree_add_generic(&fs, ent, NULL);
+ free(ent);
TEST_NOT_NULL(b);
TEST_ASSERT(a->parent == root);
TEST_ASSERT(b->parent == root);
diff --git a/lib/fstree/test/mknode_reg.c b/lib/fstree/test/mknode_reg.c
deleted file mode 100644
index 3dc6eb3..0000000
--- a/lib/fstree/test/mknode_reg.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * mknode_reg.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "config.h"
-
-#include "fstree.h"
-#include "util/test.h"
-
-int main(int argc, char **argv)
-{
- fstree_defaults_t defaults;
- tree_node_t *node;
- struct stat sb;
- fstree_t fs;
- int ret;
- (void)argc; (void)argv;
-
- memset(&defaults, 0, sizeof(defaults));
- ret = fstree_init(&fs, &defaults);
- TEST_EQUAL_I(ret, 0);
-
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFREG | 0654;
- sb.st_uid = 123;
- sb.st_gid = 456;
- sb.st_rdev = 789;
- sb.st_size = 4096;
-
- node = fstree_add_generic(&fs, "filename", &sb, "input");
- TEST_NOT_NULL(node);
- TEST_ASSERT(node->parent == fs.root);
- 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->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;
-}
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;
diff --git a/lib/fstree/test/mknode_slink.c b/lib/fstree/test/mknode_slink.c
deleted file mode 100644
index d741746..0000000
--- a/lib/fstree/test/mknode_slink.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * mknode_slink.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "config.h"
-
-#include "fstree.h"
-#include "util/test.h"
-
-int main(int argc, char **argv)
-{
- fstree_defaults_t defaults;
- tree_node_t *node;
- struct stat sb;
- fstree_t fs;
- int ret;
- (void)argc; (void)argv;
-
- memset(&defaults, 0, sizeof(defaults));
- ret = fstree_init(&fs, &defaults);
- TEST_EQUAL_I(ret, 0);
-
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFLNK | 0654;
- sb.st_uid = 123;
- sb.st_gid = 456;
- sb.st_rdev = 789;
- sb.st_size = 1337;
-
- node = fstree_add_generic(&fs, "/symlink", &sb, "target");
- TEST_NOT_NULL(node);
- TEST_ASSERT(node->parent == fs.root);
- TEST_EQUAL_UI(node->uid, sb.st_uid);
- TEST_EQUAL_UI(node->gid, sb.st_gid);
- 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");
-
- node = fstree_add_generic(&fs, "/foo", &sb, "");
- TEST_NOT_NULL(node);
- TEST_ASSERT(node->parent == fs.root);
- TEST_EQUAL_UI(node->uid, sb.st_uid);
- TEST_EQUAL_UI(node->gid, sb.st_gid);
- 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 + 3);
- TEST_STR_EQUAL(node->name, "foo");
- TEST_STR_EQUAL(node->data.target, "");
-
- fstree_cleanup(&fs);
- return EXIT_SUCCESS;
-}