diff options
Diffstat (limited to 'lib/fstree/src/hardlink.c')
-rw-r--r-- | lib/fstree/src/hardlink.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/fstree/src/hardlink.c b/lib/fstree/src/hardlink.c index 81636c7..b6467e2 100644 --- a/lib/fstree/src/hardlink.c +++ b/lib/fstree/src/hardlink.c @@ -18,16 +18,17 @@ static int resolve_link(fstree_t *fs, tree_node_t *node) tree_node_t *start = node; for (;;) { - if (node->mode == FSTREE_MODE_HARD_LINK_RESOLVED) { + if (!S_ISLNK(node->mode) || !(node->flags & FLAG_LINK_IS_HARD)) + break; + + if (node->flags & FLAG_LINK_RESOVED) { node = node->data.target_node; - } else if (node->mode == FSTREE_MODE_HARD_LINK) { + } else { node = fstree_get_node_by_path(fs, fs->root, node->data.target, false, false); if (node == NULL) return -1; - } else { - break; } if (node == start) { @@ -46,7 +47,7 @@ static int resolve_link(fstree_t *fs, tree_node_t *node) return -1; } - start->mode = FSTREE_MODE_HARD_LINK_RESOLVED; + start->flags |= FLAG_LINK_RESOVED; start->data.target_node = node; node->link_count++; @@ -70,7 +71,7 @@ tree_node_t *fstree_add_hard_link(fstree_t *fs, const char *path, return NULL; } - n->mode = FSTREE_MODE_HARD_LINK; + n->flags |= FLAG_LINK_IS_HARD; } n->next_by_type = fs->links_unresolved; |