- if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
- tprintf(T("Reparse Tag = 0x%"PRIx32"\n"), inode->i_reparse_tag);
- tprintf(T("Reparse Point Flags = 0x%"PRIx16"\n"),
- inode->i_not_rpfixed);
- tprintf(T("Reparse Point Unknown 2 = 0x%"PRIx32"\n"),
- inode->i_rp_unknown_2);
- }
- tprintf(T("Reparse Point Unknown 1 = 0x%"PRIx32"\n"),
- inode->i_rp_unknown_1);
- tprintf(T("Hard Link Group = 0x%"PRIx64"\n"), inode->i_ino);
- tprintf(T("Hard Link Group Size = %"PRIu32"\n"), inode->i_nlink);
- tprintf(T("Number of Alternate Data Streams = %hu\n"), inode->i_num_ads);
- if (dentry_has_long_name(dentry))
- wimlib_printf(T("Filename = \"%"WS"\"\n"), dentry->file_name);
- if (dentry_has_short_name(dentry))
- wimlib_printf(T("Short Name \"%"WS"\"\n"), dentry->short_name);
- if (dentry->_full_path)
- tprintf(T("Full Path = \"%"TS"\"\n"), dentry->_full_path);
-
- lte = inode_stream_lte(dentry->d_inode, 0, lookup_table);
- if (lte) {
- print_lookup_table_entry(lte, stdout);
- } else {
- hash = inode_stream_hash(inode, 0);
- if (hash) {
- tprintf(T("Hash = 0x"));
- print_hash(hash, stdout);
- tputchar(T('\n'));
- tputchar(T('\n'));
- }
- }
- for (u16 i = 0; i < inode->i_num_ads; i++) {
- tprintf(T("[Alternate Stream Entry %u]\n"), i);
- wimlib_printf(T("Name = \"%"WS"\"\n"),
- inode->i_ads_entries[i].stream_name);
- tprintf(T("Name Length (UTF16 bytes) = %hu\n"),
- inode->i_ads_entries[i].stream_name_nbytes);
- hash = inode_stream_hash(inode, i + 1);
- if (hash) {
- tprintf(T("Hash = 0x"));
- print_hash(hash, stdout);
- tputchar(T('\n'));
- }
- print_lookup_table_entry(inode_stream_lte(inode, i + 1, lookup_table),
- stdout);
- }
- return 0;
-}
-
-/* Initializations done on every `struct wim_dentry'. */
-static void
-dentry_common_init(struct wim_dentry *dentry)
-{
- memset(dentry, 0, sizeof(struct wim_dentry));
-}
-
-/* Creates an unlinked directory entry. */
-int
-new_dentry(const tchar *name, struct wim_dentry **dentry_ret)
-{
- struct wim_dentry *dentry;
- int ret;
-
- dentry = MALLOC(sizeof(struct wim_dentry));
- if (dentry == NULL)
- return WIMLIB_ERR_NOMEM;
-
- dentry_common_init(dentry);
- ret = dentry_set_name(dentry, name);
- if (ret == 0) {
- dentry->parent = dentry;
- *dentry_ret = dentry;
- } else {
- FREE(dentry);
- ERROR("Failed to set name on new dentry with name \"%"TS"\"",
- name);
- }
- return ret;
-}
-
-static int
-_new_dentry_with_inode(const tchar *name, struct wim_dentry **dentry_ret,
- bool timeless)
-{
- struct wim_dentry *dentry;
- int ret;
-
- ret = new_dentry(name, &dentry);
- if (ret)
- return ret;
-
- if (timeless)
- dentry->d_inode = new_timeless_inode();
- else
- dentry->d_inode = new_inode();
- if (dentry->d_inode == NULL) {
- free_dentry(dentry);
- return WIMLIB_ERR_NOMEM;
- }
-
- inode_add_dentry(dentry, dentry->d_inode);
- *dentry_ret = dentry;
- return 0;
-}
-
-int
-new_dentry_with_timeless_inode(const tchar *name, struct wim_dentry **dentry_ret)
-{
- return _new_dentry_with_inode(name, dentry_ret, true);
-}
-
-int
-new_dentry_with_inode(const tchar *name, struct wim_dentry **dentry_ret)
-{
- return _new_dentry_with_inode(name, dentry_ret, false);
-}
-
-int
-new_filler_directory(const tchar *name, struct wim_dentry **dentry_ret)
-{
- int ret;
- struct wim_dentry *dentry;
-
- DEBUG("Creating filler directory \"%"TS"\"", name);
- ret = new_dentry_with_inode(name, &dentry);