* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
-#include "wimlib_internal.h"
-#include "dentry.h"
-#include "list.h"
-#include "lookup_table.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "wimlib/capture.h"
+#include "wimlib/dentry.h"
+#include "wimlib/error.h"
+#include "wimlib/lookup_table.h"
/* NULL NULL
* ^ ^
*/
int
inode_table_new_dentry(struct wim_inode_table *table, const tchar *name,
- u64 ino, u64 devno, struct wim_dentry **dentry_ret)
+ u64 ino, u64 devno, bool noshare,
+ struct wim_dentry **dentry_ret)
{
struct wim_dentry *dentry;
struct wim_inode *inode;
int ret;
- ret = new_dentry(name, &dentry);
- if (ret)
- return ret;
-
- inode = inode_table_get_inode(table, ino, devno);
- if (!inode) {
- free_dentry(dentry);
- return WIMLIB_ERR_NOMEM;
+ if (noshare) {
+ ret = new_dentry_with_timeless_inode(name, &dentry);
+ if (ret)
+ return ret;
+ list_add_tail(&dentry->d_inode->i_list, &table->extra_inodes);
+ } else {
+ ret = new_dentry(name, &dentry);
+ if (ret)
+ return ret;
+ inode = inode_table_get_inode(table, ino, devno);
+ if (!inode) {
+ free_dentry(dentry);
+ return WIMLIB_ERR_NOMEM;
+ }
+ if (inode->i_nlink > 1)
+ inode_ref_streams(inode);
+ dentry->d_inode = inode;
+ inode_add_dentry(dentry, inode);
}
- if (inode->i_nlink > 1)
- inode_ref_streams(inode);
- dentry->d_inode = inode;
- inode_add_dentry(dentry, inode);
*dentry_ret = dentry;
return 0;
}
{
struct wim_dentry *dentry;
inode_for_each_dentry(dentry, inode)
- tprintf(T("%"TS), dentry_full_path(dentry));
+ tfprintf(stderr, T("%"TS"\n"), dentry_full_path(dentry));
}
#endif
return WIMLIB_ERR_INVALID_DENTRY;
}
/* Free the unneeded `struct wim_inode'. */
- dentry->d_inode->i_hlist.next = NULL;
- dentry->d_inode->i_hlist.pprev = NULL;
free_inode(dentry->d_inode);
dentry->d_inode = ref_inode;
ref_inode->i_nlink++;
wimlib_assert(inode->i_nlink == inode_link_count(inode));
+ if (inode->i_nlink > 1 &&
+ (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ ERROR("Found unsupported directory hard link!");
+ return WIMLIB_ERR_INVALID_DENTRY;
+ }
+
LIST_HEAD(dentries_with_data_streams);
LIST_HEAD(dentries_with_no_data_streams);
HLIST_HEAD(true_inodes);
INIT_LIST_HEAD(inode_list);
for (u64 i = 0; i < table->capacity; i++) {
hlist_for_each_entry_safe(inode, cur, tmp, &table->array[i], i_hlist) {
+ INIT_LIST_HEAD(&inode->i_list);
ret = fix_nominal_inode(inode, inode_list, ino_changes_needed);
if (ret)
return ret;
struct hlist_node *cur, *tmp;
u64 cur_ino = 1;
- INIT_LIST_HEAD(head);
+ list_for_each_entry(inode, head, i_list) {
+ if (inode->i_nlink > 1)
+ inode->i_ino = cur_ino++;
+ else
+ inode->i_ino = 0;
+ }
+
for (size_t i = 0; i < table->capacity; i++) {
hlist_for_each_entry_safe(inode, cur, tmp, &table->array[i], i_hlist)
{
}
INIT_HLIST_HEAD(&table->array[i]);
}
+ list_splice_tail(&table->extra_inodes, head);
table->num_entries = 0;
}