diff options
Diffstat (limited to 'lib/fstree')
| -rw-r--r-- | lib/fstree/fstree.c | 1 | ||||
| -rw-r--r-- | lib/fstree/post_process.c | 27 | 
2 files changed, 25 insertions, 3 deletions
diff --git a/lib/fstree/fstree.c b/lib/fstree/fstree.c index ce35b84..b2e199d 100644 --- a/lib/fstree/fstree.c +++ b/lib/fstree/fstree.c @@ -126,5 +126,6 @@ int fstree_init(fstree_t *fs, char *defaults)  void fstree_cleanup(fstree_t *fs)  {  	free_recursive(fs->root); +	free(fs->inodes);  	memset(fs, 0, sizeof(*fs));  } diff --git a/lib/fstree/post_process.c b/lib/fstree/post_process.c index e6bcb3f..c2b462b 100644 --- a/lib/fstree/post_process.c +++ b/lib/fstree/post_process.c @@ -47,7 +47,7 @@ static void hard_link_snap(tree_node_t *n)  		n->data.target_node = n->data.target_node->data.target_node;  } -static int map_child_nodes(fstree_t *fs, tree_node_t *root, size_t *counter) +static int alloc_inode_num_dfs(fstree_t *fs, tree_node_t *root, size_t *counter)  {  	bool has_subdirs = false;  	tree_node_t *it, *tgt; @@ -68,7 +68,7 @@ static int map_child_nodes(fstree_t *fs, tree_node_t *root, size_t *counter)  	if (has_subdirs) {  		for (it = root->data.dir.children; it != NULL; it = it->next) {  			if (S_ISDIR(it->mode)) { -				if (map_child_nodes(fs, it, counter)) +				if (alloc_inode_num_dfs(fs, it, counter))  					return -1;  			}  		} @@ -172,6 +172,19 @@ static file_info_t *file_list_dfs(tree_node_t *n)  	return NULL;  } +static void map_inodes_dfs(fstree_t *fs, tree_node_t *n) +{ +	if (n->mode == FSTREE_MODE_HARD_LINK_RESOLVED) +		return; + +	fs->inodes[n->inode_num - 1] = n; + +	if (S_ISDIR(n->mode)) { +		for (n = n->data.dir.children; n != NULL; n = n->next) +			map_inodes_dfs(fs, n); +	} +} +  int fstree_post_process(fstree_t *fs)  {  	size_t inum = 1; @@ -182,11 +195,19 @@ int fstree_post_process(fstree_t *fs)  		return -1;  	fs->unique_inode_count = 0; -	if (map_child_nodes(fs, fs->root, &inum)) +	if (alloc_inode_num_dfs(fs, fs->root, &inum))  		return -1;  	fs->root->inode_num = inum;  	fs->unique_inode_count += 1; +	fs->inodes = calloc(sizeof(fs->inodes[0]), fs->unique_inode_count); +	if (fs->inodes == NULL) { +		perror("Allocating inode list"); +		return -1; +	} + +	map_inodes_dfs(fs, fs->root); +  	fs->files = file_list_dfs(fs->root);  	return 0;  }  | 
