*/
/*
- * Copyright (C) 2012 Eric Biggers
+ * Copyright (C) 2012, 2013 Eric Biggers
*
* This file is part of wimlib, a library for working with WIM files.
*
*
* - Groups we create ourselves by splitting a nominal inode due to
* inconsistencies in the dentries. These inodes will share a inode
- * ID with some other inode until assign_inode_numbers() is called.
+ * number with some other inode until assign_inode_numbers() is
+ * called.
*/
struct hlist_head extra_inodes;
};
-static inline void destroy_inode_table(struct wim_inode_table *table)
-{
- FREE(table->array);
-}
-
-static int init_inode_table(struct wim_inode_table *table, size_t capacity)
+static int
+init_inode_table(struct wim_inode_table *table, size_t capacity)
{
table->array = CALLOC(capacity, sizeof(table->array[0]));
if (!table->array) {
return 0;
}
-static inline size_t inode_link_count(const struct wim_inode *inode)
+static inline void
+destroy_inode_table(struct wim_inode_table *table)
+{
+ FREE(table->array);
+}
+
+static inline size_t
+inode_link_count(const struct wim_inode *inode)
{
const struct list_head *cur;
size_t size = 0;
/* Insert a dentry into the inode table based on the inode number of the
* attached inode (which came from the hard link group ID field of the on-disk
* WIM dentry) */
-static int inode_table_insert(struct wim_dentry *dentry, void *__table)
+static int
+inode_table_insert(struct wim_dentry *dentry, void *_table)
{
- struct wim_inode_table *table = __table;
+ struct wim_inode_table *table = _table;
struct wim_inode *d_inode = dentry->d_inode;
if (d_inode->i_ino == 0) {
return 0;
}
-static void print_inode_dentries(const struct wim_inode *inode)
+#if defined(ENABLE_ERROR_MESSAGES) || defined(ENABLE_DEBUG)
+static void
+print_inode_dentries(const struct wim_inode *inode)
{
struct wim_dentry *dentry;
inode_for_each_dentry(dentry, inode)
- printf("`%s'\n", dentry->full_path_utf8);
+ tprintf(T("`%"TS"'\n"), dentry->full_path);
}
+#endif
-static void inconsistent_inode(const struct wim_inode *inode)
+static void
+inconsistent_inode(const struct wim_inode *inode)
{
+#ifdef ENABLE_ERROR_MESSAGES
ERROR("An inconsistent hard link group that cannot be corrected has "
"been detected");
ERROR("The dentries are located at the following paths:");
-#ifdef ENABLE_ERROR_MESSAGES
print_inode_dentries(inode);
#endif
}
-static bool ref_inodes_consistent(const struct wim_inode * restrict ref_inode_1,
- const struct wim_inode * restrict ref_inode_2)
+static bool
+ref_inodes_consistent(const struct wim_inode * restrict ref_inode_1,
+ const struct wim_inode * restrict ref_inode_2)
{
wimlib_assert(ref_inode_1 != ref_inode_2);
return true;
}
-static bool inodes_consistent(const struct wim_inode * restrict ref_inode,
- const struct wim_inode * restrict inode)
+static bool
+inodes_consistent(const struct wim_inode * restrict ref_inode,
+ const struct wim_inode * restrict inode)
{
wimlib_assert(ref_inode != inode);
}
/* Fix up a "true" inode and check for inconsistencies */
-static int fix_true_inode(struct wim_inode *inode, struct hlist_head *inode_list)
+static int
+fix_true_inode(struct wim_inode *inode, struct hlist_head *inode_list)
{
struct wim_dentry *dentry;
struct wim_dentry *ref_dentry = NULL;
* wim_inode's. There will be just one `struct wim_inode' for each hard link
* group remaining.
*/
-static int fix_nominal_inode(struct wim_inode *inode,
- struct hlist_head *inode_list)
+static int
+fix_nominal_inode(struct wim_inode *inode, struct hlist_head *inode_list)
{
struct wim_dentry *dentry;
struct hlist_node *cur, *tmp;
if (num_true_inodes != 1) {
inode = container_of(true_inodes.first, struct wim_inode, i_hlist);
- printf("Split nominal inode 0x%"PRIx64" into %zu "
- "inodes:\n",
- inode->i_ino, num_true_inodes);
- puts("------------------------------------------------------------------------------");
+ tprintf(T("Split nominal inode 0x%"PRIx64" into %zu "
+ "inodes:\n"), inode->i_ino, num_true_inodes);
+ tputs(T("----------------------------------------------------"
+ "--------------------------"));
size_t i = 1;
hlist_for_each_entry(inode, cur, &true_inodes, i_hlist) {
- printf("[Split inode %zu]\n", i++);
+ tprintf(T("[Split inode %zu]\n"), i++);
print_inode_dentries(inode);
- putchar('\n');
+ tputchar(T('\n'));
}
- puts("------------------------------------------------------------------------------");
+ tputs(T("----------------------------------------------------"
+ "--------------------------"));
}
#endif
return 0;
}
-static int fix_inodes(struct wim_inode_table *table,
- struct hlist_head *inode_list)
+static int
+fix_inodes(struct wim_inode_table *table, struct hlist_head *inode_list)
{
struct wim_inode *inode;
struct hlist_node *cur, *tmp;
/*
* dentry_tree_fix_inodes():
*
- * This function takes as input a tree of WIM dentries that has a different
- * inode associated with every dentry. Sets of dentries that share the same
- * inode (a.k.a. hard link groups) are built using the i_ino field of each
- * inode, then the link count and alias list for one inode in each set is set
- * correctly and the unnecessary struct wim_inode's freed. The effect is to
- * correctly associate exactly one struct wim_inode with each original inode,
- * regardless of how many dentries are aliases for that inode.
+ * This function takes as input a tree of WIM dentries that initially has a
+ * different inode associated with each dentry. Sets of dentries that should
+ * share the same inode (a.k.a. hard link groups) are built using the i_ino
+ * field of each inode, then the link count and alias list for one inode in each
+ * set is set correctly and the unnecessary struct wim_inode's freed. The
+ * effect is to correctly associate exactly one struct wim_inode with each
+ * original inode, regardless of how many dentries are aliases for that inode.
*
* The special inode number of 0 indicates that the dentry is in a hard link
* group by itself, and therefore has a 'struct wim_inode' with i_nlink=1 to
* This function also checks the dentries in each hard link group for
* consistency. In some WIMs, such as install.wim for some versions of Windows
* 7, dentries can share the same hard link group ID but not actually be hard
- * linked to each other (e.g. to having different data streams). This should be
- * an error, but this case needs be handled. So, each "nominal" inode (the
- * inode based on the inode numbers provided in the WIM) is examined for
- * consistency and may be split into multiple "true" inodes that are maximally
- * sized consistent sets of dentries.
+ * linked to each other (based on conflicting information, such as file
+ * contents). This should be an error, but this case needs be handled. So,
+ * each "nominal" inode (the inode based on the inode numbers provided in the
+ * WIM) is examined for consistency and may be split into multiple "true" inodes
+ * that are maximally sized consistent sets of dentries.
*
* Return 0 on success; WIMLIB_ERR_NOMEM or WIMLIB_ERR_INVALID_DENTRY on
* failure. On success, the list of "true" inodes, linked by the i_hlist field,
* is returned in the hlist @inode_list.
*/
-int dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list)
+int
+dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list)
{
struct wim_inode_table inode_tab;
int ret;
return ret;
}
-/* Assign inode numbers to a list of inode, and return the next available
+/* Assign inode numbers to a list of inodes and return the next available
* number. */
-u64 assign_inode_numbers(struct hlist_head *inode_list)
+u64
+assign_inode_numbers(struct hlist_head *inode_list)
{
DEBUG("Assigning inode numbers");
struct wim_inode *inode;