newdir = new_dentry(basename);
newdir->attributes |= FILE_ATTRIBUTE_DIRECTORY;
newdir->resolved = true;
+ newdir->hard_link = next_link_group_id++;
link_dentry(newdir, parent);
return 0;
}
dentry->attributes = FILE_ATTRIBUTE_REPARSE_POINT;
dentry->reparse_tag = WIM_IO_REPARSE_TAG_SYMLINK;
+ dentry->hard_link = next_link_group_id++;
if (dentry_set_symlink(dentry, to, w->lookup_table, <e) != 0)
goto out_free_dentry;
+ wimlib_assert(lte);
+
dentry->ads_entries[1].lte_group_list.type = STREAM_TYPE_ADS;
list_add(&dentry->ads_entries[1].lte_group_list.list,
<e->lte_group_list);
};
+static int check_lte_refcnt(struct lookup_table_entry *lte, void *ignore)
+{
+ size_t lte_group_size = 0;
+ struct list_head *cur;
+ list_for_each(cur, <e->lte_group_list)
+ lte_group_size++;
+ if (lte_group_size > lte->refcnt) {
+#ifdef ENABLE_ERROR_MESSAGES
+ ERROR("The following lookup table entry has a reference count "
+ "of %u, but", lte->refcnt);
+ ERROR("We found %u references to it", lte_group_size);
+ print_lookup_table_entry(lte, NULL);
+#endif
+ return WIMLIB_ERR_INVALID_DENTRY;
+ }
+ return 0;
+}
+
/* Mounts a WIM file. */
WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir,
int flags)
for_dentry_in_tree(wim_root_dentry(wim), dentry_resolve_ltes,
wim->lookup_table);
+ ret = for_lookup_table_entry(wim->lookup_table, check_lte_refcnt, NULL);
+ if (ret != 0)
+ return ret;
+
if (flags & WIMLIB_MOUNT_FLAG_READWRITE)
wim_get_current_image_metadata(wim)->modified = true;
* filesystem daemon has crashed or failed for some reason.
*
* XXX come up with some method to determine if the filesystem
- * daemon has really crashed or not. */
+ * daemon has really crashed or not.
+ *
+ * XXX Idea: have mount daemon write its PID into the WIM file header?
+ * */
gettimeofday(&now, NULL);
timeout.tv_sec = now.tv_sec + 600;