aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/fstree/Makemodule.am4
-rw-r--r--lib/fstree/src/add_by_path.c54
-rw-r--r--lib/fstree/src/fstree.c217
-rw-r--r--lib/fstree/src/get_by_path.c84
-rw-r--r--lib/fstree/src/mknode.c101
-rw-r--r--lib/fstree/test/fstree_sort.c16
-rw-r--r--lib/fstree/test/gen_inode_numbers.c28
-rw-r--r--lib/fstree/test/mknode_dir.c27
-rw-r--r--lib/fstree/test/mknode_reg.c13
-rw-r--r--lib/fstree/test/mknode_simple.c47
-rw-r--r--lib/fstree/test/mknode_slink.c24
11 files changed, 301 insertions, 314 deletions
diff --git a/lib/fstree/Makemodule.am b/lib/fstree/Makemodule.am
index 833fe51..109af8e 100644
--- a/lib/fstree/Makemodule.am
+++ b/lib/fstree/Makemodule.am
@@ -1,8 +1,6 @@
libfstree_a_SOURCES = include/fstree.h lib/fstree/src/fstree.c \
lib/fstree/src/post_process.c lib/fstree/src/get_path.c \
- lib/fstree/src/mknode.c lib/fstree/src/hardlink.c \
- lib/fstree/src/add_by_path.c lib/fstree/src/get_by_path.c \
- lib/fstree/src/stats.c
+ lib/fstree/src/hardlink.c lib/fstree/src/stats.c
noinst_LIBRARIES += libfstree.a
diff --git a/lib/fstree/src/add_by_path.c b/lib/fstree/src/add_by_path.c
deleted file mode 100644
index 344b586..0000000
--- a/lib/fstree/src/add_by_path.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * add_by_path.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "config.h"
-
-#include "fstree.h"
-
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-
-tree_node_t *fstree_add_generic(fstree_t *fs, const char *path,
- const struct stat *sb, const char *extra)
-{
- tree_node_t *child, *parent;
- const char *name;
-
- if (*path == '\0') {
- child = fs->root;
- assert(child != NULL);
- goto out;
- }
-
- parent = fstree_get_node_by_path(fs, fs->root, path, true, true);
- if (parent == NULL)
- return NULL;
-
- name = strrchr(path, '/');
- name = (name == NULL ? path : (name + 1));
-
- child = parent->data.children;
- while (child != NULL && strcmp(child->name, name) != 0)
- child = child->next;
-out:
- if (child != NULL) {
- if (!S_ISDIR(child->mode) || !S_ISDIR(sb->st_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->flags &= ~FLAG_DIR_CREATED_IMPLICITLY;
- return child;
- }
-
- return fstree_mknode(parent, name, strlen(name), extra, sb);
-}
diff --git a/lib/fstree/src/fstree.c b/lib/fstree/src/fstree.c
index bf84c17..43a6ccc 100644
--- a/lib/fstree/src/fstree.c
+++ b/lib/fstree/src/fstree.c
@@ -9,7 +9,9 @@
#include <string.h>
#include <stdlib.h>
+#include <assert.h>
#include <stdio.h>
+#include <errno.h>
static void free_recursive(tree_node_t *n)
{
@@ -27,26 +29,120 @@ static void free_recursive(tree_node_t *n)
free(n);
}
-int fstree_init(fstree_t *fs, const fstree_defaults_t *defaults)
+static tree_node_t *child_by_name(tree_node_t *root, const char *name,
+ size_t len)
{
- struct stat sb;
+ tree_node_t *n = root->data.children;
- memset(fs, 0, sizeof(*fs));
- fs->defaults = *defaults;
+ while (n != NULL) {
+ if (strncmp(n->name, name, len) == 0 && n->name[len] == '\0')
+ break;
+
+ n = n->next;
+ }
+
+ return n;
+}
+
+static void insert_sorted(tree_node_t *root, tree_node_t *n)
+{
+ tree_node_t *it = root->data.children, *prev = NULL;
+
+ while (it != NULL && strcmp(it->name, n->name) < 0) {
+ prev = it;
+ it = it->next;
+ }
+
+ n->parent = root;
+ n->next = it;
+
+ if (prev == NULL) {
+ root->data.children = n;
+ } else {
+ prev->next = n;
+ }
+}
+
+static tree_node_t *mknode(tree_node_t *parent, const char *name,
+ size_t name_len, const char *extra,
+ const struct stat *sb)
+{
+ tree_node_t *n;
+ size_t size;
+ char *ptr;
+
+ size = sizeof(tree_node_t) + name_len + 1;
+ if (extra != NULL)
+ size += strlen(extra) + 1;
+
+ n = calloc(1, size);
+ if (n == NULL)
+ 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->link_count = 1;
+ n->name = (char *)n->payload;
+ memcpy(n->name, name, name_len);
+
+ if (extra != NULL) {
+ ptr = n->name + name_len + 1;
+ strcpy(ptr, extra);
+ } else {
+ ptr = NULL;
+ }
+
+ switch (sb->st_mode & S_IFMT) {
+ case S_IFREG:
+ n->data.file.input_file = ptr;
+ break;
+ case S_IFLNK:
+ n->mode = S_IFLNK | 0777;
+ n->data.target = ptr;
+ break;
+ case S_IFBLK:
+ case S_IFCHR:
+ n->data.devno = sb->st_rdev;
+ break;
+ case S_IFDIR:
+ n->link_count = 2;
+ break;
+ default:
+ break;
+ }
- memset(&sb, 0, sizeof(sb));
- sb.st_mode = S_IFDIR | (defaults->mode & 07777);
- sb.st_uid = defaults->uid;
- sb.st_gid = defaults->gid;
- sb.st_mtime = defaults->mtime;
+ if (parent->link_count == 0xFFFFFFFF) {
+ free(n);
+ errno = EMLINK;
+ return NULL;
+ }
+
+ insert_sorted(parent, n);
+ parent->link_count++;
+ return n;
+}
- fs->root = fstree_mknode(NULL, "", 0, NULL, &sb);
+int fstree_init(fstree_t *fs, const fstree_defaults_t *defaults)
+{
+ memset(fs, 0, sizeof(*fs));
+ fs->defaults = *defaults;
+ fs->root = calloc(1, sizeof(tree_node_t) + 1);
if (fs->root == NULL) {
perror("initializing file system tree");
return -1;
}
+ fs->root->xattr_idx = 0xFFFFFFFF;
+ fs->root->uid = defaults->uid;
+ fs->root->gid = defaults->gid;
+ fs->root->mode = S_IFDIR | (defaults->mode & 07777);
+ fs->root->mod_time = defaults->mtime;
+ fs->root->link_count = 2;
+ fs->root->name = (char *)fs->root->payload;
fs->root->flags |= FLAG_DIR_CREATED_IMPLICITLY;
return 0;
}
@@ -57,3 +153,104 @@ void fstree_cleanup(fstree_t *fs)
free(fs->inodes);
memset(fs, 0, sizeof(*fs));
}
+
+tree_node_t *fstree_get_node_by_path(fstree_t *fs, tree_node_t *root,
+ const char *path, bool create_implicitly,
+ bool stop_at_parent)
+{
+ const char *end;
+ tree_node_t *n;
+ size_t len;
+
+ while (*path != '\0') {
+ while (*path == '/')
+ ++path;
+
+ if (!S_ISDIR(root->mode)) {
+ errno = ENOTDIR;
+ return NULL;
+ }
+
+ end = strchr(path, '/');
+ if (end == NULL) {
+ if (stop_at_parent)
+ break;
+
+ len = strlen(path);
+ } else {
+ len = end - path;
+ }
+
+ n = child_by_name(root, path, len);
+
+ if (n == NULL) {
+ struct stat sb;
+
+ 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;
+
+ n = mknode(root, path, len, NULL, &sb);
+ if (n == NULL)
+ return NULL;
+
+ n->flags |= FLAG_DIR_CREATED_IMPLICITLY;
+ }
+
+ root = n;
+ path = path + len;
+ }
+
+ return root;
+}
+
+tree_node_t *fstree_add_generic(fstree_t *fs, const char *path,
+ const struct stat *sb, const char *extra)
+{
+ tree_node_t *child, *parent;
+ const char *name;
+
+ if (S_ISLNK(sb->st_mode) && extra == NULL) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (*path == '\0') {
+ child = fs->root;
+ assert(child != NULL);
+ goto out;
+ }
+
+ parent = fstree_get_node_by_path(fs, fs->root, path, true, true);
+ if (parent == NULL)
+ return NULL;
+
+ name = strrchr(path, '/');
+ name = (name == NULL ? path : (name + 1));
+
+ child = child_by_name(parent, name, strlen(name));
+out:
+ if (child != NULL) {
+ if (!S_ISDIR(child->mode) || !S_ISDIR(sb->st_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->flags &= ~FLAG_DIR_CREATED_IMPLICITLY;
+ return child;
+ }
+
+ return mknode(parent, name, strlen(name), extra, sb);
+}
diff --git a/lib/fstree/src/get_by_path.c b/lib/fstree/src/get_by_path.c
deleted file mode 100644
index 133f412..0000000
--- a/lib/fstree/src/get_by_path.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * get_by_path.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "config.h"
-
-#include "fstree.h"
-
-#include <string.h>
-#include <errno.h>
-
-static tree_node_t *child_by_name(tree_node_t *root, const char *name,
- size_t len)
-{
- tree_node_t *n = root->data.children;
-
- while (n != NULL) {
- if (strncmp(n->name, name, len) == 0 && n->name[len] == '\0')
- break;
-
- n = n->next;
- }
-
- return n;
-}
-
-tree_node_t *fstree_get_node_by_path(fstree_t *fs, tree_node_t *root,
- const char *path, bool create_implicitly,
- bool stop_at_parent)
-{
- const char *end;
- tree_node_t *n;
- size_t len;
-
- while (*path != '\0') {
- while (*path == '/')
- ++path;
-
- if (!S_ISDIR(root->mode)) {
- errno = ENOTDIR;
- return NULL;
- }
-
- end = strchr(path, '/');
- if (end == NULL) {
- if (stop_at_parent)
- break;
-
- len = strlen(path);
- } else {
- len = end - path;
- }
-
- n = child_by_name(root, path, len);
-
- if (n == NULL) {
- struct stat sb;
-
- 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;
-
- n = fstree_mknode(root, path, len, NULL, &sb);
- if (n == NULL)
- return NULL;
-
- n->flags |= FLAG_DIR_CREATED_IMPLICITLY;
- }
-
- root = n;
- path = path + len;
- }
-
- return root;
-}
diff --git a/lib/fstree/src/mknode.c b/lib/fstree/src/mknode.c
deleted file mode 100644
index a48cf06..0000000
--- a/lib/fstree/src/mknode.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * mknode.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "config.h"
-#include "fstree.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-
-static void insert_sorted(tree_node_t *root, tree_node_t *n)
-{
- tree_node_t *it = root->data.children, *prev = NULL;
-
- while (it != NULL && strcmp(it->name, n->name) < 0) {
- prev = it;
- it = it->next;
- }
-
- n->parent = root;
- n->next = it;
-
- if (prev == NULL) {
- root->data.children = n;
- } else {
- prev->next = n;
- }
-}
-
-tree_node_t *fstree_mknode(tree_node_t *parent, const char *name,
- size_t name_len, const char *extra,
- const struct stat *sb)
-{
- tree_node_t *n;
- size_t size;
- char *ptr;
-
- if (S_ISLNK(sb->st_mode) && extra == NULL) {
- errno = EINVAL;
- return NULL;
- }
-
- size = sizeof(tree_node_t) + name_len + 1;
- if (extra != NULL)
- size += strlen(extra) + 1;
-
- n = calloc(1, size);
- if (n == NULL)
- 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->link_count = 1;
- n->name = (char *)n->payload;
- memcpy(n->name, name, name_len);
-
- if (extra != NULL) {
- ptr = n->name + name_len + 1;
- strcpy(ptr, extra);
- } else {
- ptr = NULL;
- }
-
- switch (sb->st_mode & S_IFMT) {
- case S_IFREG:
- n->data.file.input_file = ptr;
- break;
- case S_IFLNK:
- n->mode = S_IFLNK | 0777;
- n->data.target = ptr;
- break;
- case S_IFBLK:
- case S_IFCHR:
- n->data.devno = sb->st_rdev;
- break;
- case S_IFDIR:
- n->link_count = 2;
- break;
- default:
- break;
- }
-
- if (parent != NULL) {
- if (parent->link_count == 0xFFFFFFFF) {
- free(n);
- errno = EMLINK;
- return NULL;
- }
-
- insert_sorted(parent, n);
- parent->link_count++;
- }
-
- return n;
-}
diff --git a/lib/fstree/test/fstree_sort.c b/lib/fstree/test/fstree_sort.c
index fc44899..135976d 100644
--- a/lib/fstree/test/fstree_sort.c
+++ b/lib/fstree/test/fstree_sort.c
@@ -28,25 +28,25 @@ int main(int argc, char **argv)
ret = fstree_init(&fs, &fsd);
TEST_EQUAL_I(ret, 0);
- a = fstree_mknode(fs.root, "a", 1, NULL, &sb);
+ a = fstree_add_generic(&fs, "a", &sb, NULL);
TEST_NOT_NULL(a);
TEST_ASSERT(fs.root->data.children == a);
TEST_NULL(a->next);
- b = fstree_mknode(fs.root, "b", 1, NULL, &sb);
+ b = fstree_add_generic(&fs, "b", &sb, NULL);
TEST_NOT_NULL(a);
TEST_ASSERT(fs.root->data.children == a);
TEST_ASSERT(a->next == b);
TEST_NULL(b->next);
- c = fstree_mknode(fs.root, "c", 1, NULL, &sb);
+ c = fstree_add_generic(&fs, "c", &sb, NULL);
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_mknode(fs.root, "d", 1, NULL, &sb);
+ d = fstree_add_generic(&fs, "d", &sb, NULL);
TEST_NOT_NULL(d);
TEST_ASSERT(fs.root->data.children == a);
TEST_ASSERT(a->next == b);
@@ -60,25 +60,25 @@ int main(int argc, char **argv)
ret = fstree_init(&fs, &fsd);
TEST_EQUAL_I(ret, 0);
- d = fstree_mknode(fs.root, "d", 1, NULL, &sb);
+ d = fstree_add_generic(&fs, "d", &sb, NULL);
TEST_NOT_NULL(d);
TEST_ASSERT(fs.root->data.children == d);
TEST_NULL(d->next);
- c = fstree_mknode(fs.root, "c", 1, NULL, &sb);
+ c = fstree_add_generic(&fs, "c", &sb, NULL);
TEST_NOT_NULL(c);
TEST_ASSERT(fs.root->data.children == c);
TEST_ASSERT(c->next == d);
TEST_NULL(d->next);
- b = fstree_mknode(fs.root, "b", 1, NULL, &sb);
+ b = fstree_add_generic(&fs, "b", &sb, NULL);
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_mknode(fs.root, "a", 1, NULL, &sb);
+ a = fstree_add_generic(&fs, "a", &sb, NULL);
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 b65f64b..9e046a8 100644
--- a/lib/fstree/test/gen_inode_numbers.c
+++ b/lib/fstree/test/gen_inode_numbers.c
@@ -10,14 +10,14 @@
#include "common.h"
#include "util/test.h"
-static tree_node_t *gen_node(tree_node_t *parent, const char *name)
+static tree_node_t *gen_node(fstree_t *fs, const char *path)
{
struct stat sb;
memset(&sb, 0, sizeof(sb));
sb.st_mode = S_IFDIR | 0755;
- return fstree_mknode(parent, name, strlen(name), NULL, &sb);
+ return fstree_add_generic(fs, path, &sb, NULL);
}
static void check_children_before_root(tree_node_t *root)
@@ -63,24 +63,24 @@ int main(int argc, char **argv)
// tree with 2 levels under root, fan out 3
TEST_ASSERT(fstree_init(&fs, &fsd) == 0);
- a = gen_node(fs.root, "a");
- b = gen_node(fs.root, "b");
- c = gen_node(fs.root, "c");
+ a = gen_node(&fs, "a");
+ b = gen_node(&fs, "b");
+ c = gen_node(&fs, "c");
TEST_NOT_NULL(a);
TEST_NOT_NULL(b);
TEST_NOT_NULL(c);
- TEST_NOT_NULL(gen_node(a, "a_a"));
- TEST_NOT_NULL(gen_node(a, "a_b"));
- TEST_NOT_NULL(gen_node(a, "a_c"));
+ TEST_NOT_NULL(gen_node(&fs, "a/a_a"));
+ TEST_NOT_NULL(gen_node(&fs, "a/a_b"));
+ TEST_NOT_NULL(gen_node(&fs, "a/a_c"));
- TEST_NOT_NULL(gen_node(b, "b_a"));
- TEST_NOT_NULL(gen_node(b, "b_b"));
- TEST_NOT_NULL(gen_node(b, "b_c"));
+ TEST_NOT_NULL(gen_node(&fs, "b/b_a"));
+ TEST_NOT_NULL(gen_node(&fs, "b/b_b"));
+ TEST_NOT_NULL(gen_node(&fs, "b/b_c"));
- TEST_NOT_NULL(gen_node(c, "c_a"));
- TEST_NOT_NULL(gen_node(c, "c_b"));
- TEST_NOT_NULL(gen_node(c, "c_c"));
+ TEST_NOT_NULL(gen_node(&fs, "c/c_a"));
+ TEST_NOT_NULL(gen_node(&fs, "c/c_b"));
+ TEST_NOT_NULL(gen_node(&fs, "c/c_c"));
fstree_post_process(&fs);
TEST_EQUAL_UI(fs.unique_inode_count, 13);
diff --git a/lib/fstree/test/mknode_dir.c b/lib/fstree/test/mknode_dir.c
index a5f6d9a..c2812ac 100644
--- a/lib/fstree/test/mknode_dir.c
+++ b/lib/fstree/test/mknode_dir.c
@@ -11,12 +11,17 @@
int main(int argc, char **argv)
{
+ fstree_defaults_t defaults;
tree_node_t *root, *a, *b;
struct stat sb;
fstree_t fs;
+ int ret;
(void)argc; (void)argv;
- memset(&fs, 0, sizeof(fs));
+ memset(&defaults, 0, sizeof(defaults));
+ 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;
@@ -24,7 +29,9 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 4096;
- root = fstree_mknode(NULL, "rootdir", 7, NULL, &sb);
+ root = fstree_add_generic(&fs, "rootdir", &sb, NULL);
+ 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);
@@ -32,19 +39,20 @@ int main(int argc, char **argv)
TEST_ASSERT(root->name >= (char *)root->payload);
TEST_STR_EQUAL(root->name, "rootdir");
TEST_NULL(root->data.children);
- TEST_NULL(root->parent);
TEST_NULL(root->next);
- a = fstree_mknode(root, "adir", 4, NULL, &sb);
+ a = fstree_add_generic(&fs, "rootdir/adir", &sb, NULL);
+ TEST_NOT_NULL(a);
TEST_ASSERT(a->parent == root);
TEST_NULL(a->next);
TEST_EQUAL_UI(a->link_count, 2);
TEST_EQUAL_UI(root->link_count, 3);
TEST_ASSERT(root->data.children == a);
- TEST_NULL(root->parent);
+ TEST_ASSERT(root->parent == fs.root);
TEST_NULL(root->next);
- b = fstree_mknode(root, "bdir", 4, NULL, &sb);
+ b = fstree_add_generic(&fs, "rootdir/bdir", &sb, NULL);
+ TEST_NOT_NULL(b);
TEST_ASSERT(a->parent == root);
TEST_ASSERT(b->parent == root);
TEST_EQUAL_UI(b->link_count, 2);
@@ -52,12 +60,9 @@ int main(int argc, char **argv)
TEST_ASSERT(a->next == b);
TEST_EQUAL_UI(root->link_count, 4);
TEST_NULL(b->next);
- TEST_NULL(root->parent);
+ TEST_ASSERT(root->parent == fs.root);
TEST_NULL(root->next);
- free(root);
- free(a);
- free(b);
-
+ fstree_cleanup(&fs);
return EXIT_SUCCESS;
}
diff --git a/lib/fstree/test/mknode_reg.c b/lib/fstree/test/mknode_reg.c
index 368720f..3dc6eb3 100644
--- a/lib/fstree/test/mknode_reg.c
+++ b/lib/fstree/test/mknode_reg.c
@@ -11,12 +11,16 @@
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(&fs, 0, sizeof(fs));
+ 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;
@@ -25,18 +29,19 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 4096;
- node = fstree_mknode(NULL, "filename", 8, "input", &sb);
+ 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_NULL(node->parent);
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");
- free(node);
+ fstree_cleanup(&fs);
return EXIT_SUCCESS;
}
diff --git a/lib/fstree/test/mknode_simple.c b/lib/fstree/test/mknode_simple.c
index c7efb49..a96ee42 100644
--- a/lib/fstree/test/mknode_simple.c
+++ b/lib/fstree/test/mknode_simple.c
@@ -11,12 +11,17 @@
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(&fs, 0, sizeof(fs));
+ memset(&defaults, 0, sizeof(defaults));
+ 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;
@@ -24,19 +29,22 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 1337;
- node = fstree_mknode(NULL, "sockfile", 8, NULL, &sb);
+ node = fstree_add_generic(&fs, "/sockfile", &sb, "target");
+ 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->link_count, 1);
- TEST_NULL(node->parent);
TEST_NULL(node->data.target);
TEST_EQUAL_UI(node->data.devno, 0);
- free(node);
- memset(&fs, 0, sizeof(fs));
+ fstree_cleanup(&fs);
+ 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;
@@ -44,19 +52,22 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 1337;
- node = fstree_mknode(NULL, "fifo", 4, NULL, &sb);
+ node = fstree_add_generic(&fs, "/fifo", &sb, "target");
+ 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->link_count, 1);
- TEST_NULL(node->parent);
TEST_NULL(node->data.target);
TEST_EQUAL_UI(node->data.devno, 0);
- free(node);
- memset(&fs, 0, sizeof(fs));
+ fstree_cleanup(&fs);
+ 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;
@@ -64,7 +75,9 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 1337;
- node = fstree_mknode(NULL, "blkdev", 6, NULL, &sb);
+ node = fstree_add_generic(&fs, "/blkdev", &sb, NULL);
+ 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);
@@ -72,10 +85,11 @@ int main(int argc, char **argv)
TEST_EQUAL_UI(node->mode, sb.st_mode);
TEST_EQUAL_UI(node->link_count, 1);
TEST_EQUAL_UI(node->data.devno, sb.st_rdev);
- TEST_NULL(node->parent);
- free(node);
- memset(&fs, 0, sizeof(fs));
+ 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;
@@ -83,7 +97,9 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 1337;
- node = fstree_mknode(NULL, "chardev", 7, NULL, &sb);
+ node = fstree_add_generic(&fs, "/chardev", &sb, NULL);
+ 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);
@@ -91,8 +107,7 @@ int main(int argc, char **argv)
TEST_EQUAL_UI(node->mode, sb.st_mode);
TEST_EQUAL_UI(node->link_count, 1);
TEST_EQUAL_UI(node->data.devno, sb.st_rdev);
- TEST_NULL(node->parent);
- free(node);
+ fstree_cleanup(&fs);
return EXIT_SUCCESS;
}
diff --git a/lib/fstree/test/mknode_slink.c b/lib/fstree/test/mknode_slink.c
index c50a0ba..d741746 100644
--- a/lib/fstree/test/mknode_slink.c
+++ b/lib/fstree/test/mknode_slink.c
@@ -11,12 +11,17 @@
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(&fs, 0, sizeof(fs));
+ 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;
@@ -24,31 +29,32 @@ int main(int argc, char **argv)
sb.st_rdev = 789;
sb.st_size = 1337;
- node = fstree_mknode(NULL, "symlink", 7, "target", &sb);
+ 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_NULL(node->parent);
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");
- free(node);
- node = fstree_mknode(NULL, "symlink", 7, "", &sb);
+ 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_NULL(node->parent);
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_ASSERT(node->data.target >= node->name + 3);
+ TEST_STR_EQUAL(node->name, "foo");
TEST_STR_EQUAL(node->data.target, "");
- free(node);
+ fstree_cleanup(&fs);
return EXIT_SUCCESS;
}