diff options
Diffstat (limited to 'lib/fstree/add_by_path.c')
-rw-r--r-- | lib/fstree/add_by_path.c | 56 |
1 files changed, 5 insertions, 51 deletions
diff --git a/lib/fstree/add_by_path.c b/lib/fstree/add_by_path.c index bd47a76..7c9063e 100644 --- a/lib/fstree/add_by_path.c +++ b/lib/fstree/add_by_path.c @@ -11,69 +11,23 @@ #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.dir.children; - - while (n != NULL) { - if (strncmp(n->name, name, len) == 0 && n->name[len] == '\0') - break; - - n = n->next; - } - - return n; -} - -static tree_node_t *get_parent_node(fstree_t *fs, tree_node_t *root, - const char *path) -{ - const char *end; - tree_node_t *n; - - for (;;) { - if (!S_ISDIR(root->mode)) { - errno = ENOTDIR; - return NULL; - } - - end = strchr(path, '/'); - if (end == NULL) - break; - - n = child_by_name(root, path, end - path); - - if (n == NULL) { - n = fstree_mknode(root, path, end - path, NULL, - &fs->defaults); - if (n == NULL) - return NULL; - - n->data.dir.created_implicitly = true; - } - - root = n; - path = end + 1; - } - - 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; - parent = get_parent_node(fs, fs->root, path); + 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)); + child = parent->data.dir.children; + while (child != NULL && strcmp(child->name, name) != 0) + child = child->next; + if (child != NULL) { if (!S_ISDIR(child->mode) || !S_ISDIR(sb->st_mode) || !child->data.dir.created_implicitly) { |