-/*
- * Unlink a dentry from the directory tree.
- *
- * Note: This merely removes it from the in-memory tree structure.
- */
-void unlink_dentry(struct dentry *dentry)
-{
- if (dentry_is_root(dentry))
- return;
- if (dentry_is_only_child(dentry)) {
- dentry->parent->inode->children = NULL;
- } else {
- if (dentry_is_first_sibling(dentry))
- dentry->parent->inode->children = dentry->next;
- dentry->next->prev = dentry->prev;
- dentry->prev->next = dentry->next;
- }
-}
-
-
-/* Parameters for calculate_dentry_statistics(). */
-struct image_statistics {
- struct lookup_table *lookup_table;
- u64 *dir_count;
- u64 *file_count;
- u64 *total_bytes;
- u64 *hard_link_bytes;
-};
-
-static int calculate_dentry_statistics(struct dentry *dentry, void *arg)
-{
- struct image_statistics *stats;
- struct lookup_table_entry *lte;
-
- stats = arg;
-
- if (dentry_is_directory(dentry) && !dentry_is_root(dentry))
- ++*stats->dir_count;
- else
- ++*stats->file_count;
-
- for (unsigned i = 0; i <= dentry->inode->num_ads; i++) {
- lte = inode_stream_lte(dentry->inode, i, stats->lookup_table);
- if (lte) {
- *stats->total_bytes += wim_resource_size(lte);
- if (++lte->out_refcnt == 1)
- *stats->hard_link_bytes += wim_resource_size(lte);
- }
- }
- return 0;
-}
-
-/* Calculates some statistics about a dentry tree. */
-void calculate_dir_tree_statistics(struct dentry *root, struct lookup_table *table,
- u64 *dir_count_ret, u64 *file_count_ret,
- u64 *total_bytes_ret,
- u64 *hard_link_bytes_ret)
-{
- struct image_statistics stats;
- *dir_count_ret = 0;
- *file_count_ret = 0;
- *total_bytes_ret = 0;
- *hard_link_bytes_ret = 0;
- stats.lookup_table = table;
- stats.dir_count = dir_count_ret;
- stats.file_count = file_count_ret;
- stats.total_bytes = total_bytes_ret;
- stats.hard_link_bytes = hard_link_bytes_ret;
- for_lookup_table_entry(table, lte_zero_out_refcnt, NULL);
- for_dentry_in_tree(root, calculate_dentry_statistics, &stats);
-}
-
-static inline struct dentry *inode_first_dentry(struct inode *inode)
-{
- wimlib_assert(inode->dentry_list.next != &inode->dentry_list);
- return container_of(inode->dentry_list.next, struct dentry,
- inode_dentry_list);
-}
-
-static int verify_inode(struct inode *inode, const WIMStruct *w)
-{
- const struct lookup_table *table = w->lookup_table;
- const struct wim_security_data *sd = wim_const_security_data(w);
- const struct dentry *first_dentry = inode_first_dentry(inode);
- int ret = WIMLIB_ERR_INVALID_DENTRY;
-
- /* Check the security ID */
- if (inode->security_id < -1) {
- ERROR("Dentry `%s' has an invalid security ID (%d)",
- first_dentry->full_path_utf8, inode->security_id);
- goto out;
- }
- if (inode->security_id >= sd->num_entries) {
- ERROR("Dentry `%s' has an invalid security ID (%d) "
- "(there are only %u entries in the security table)",
- first_dentry->full_path_utf8, inode->security_id,
- sd->num_entries);
- goto out;
- }