]> wimlib.net Git - wimlib/blobdiff - src/hardlink.c
Fix when debugging enabled but error messages are not
[wimlib] / src / hardlink.c
index ed605d675b898aeafc70bf73756a966a0698e71e..479b1266d1af7f6fba5896a748885c51bc4cc12b 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (C) 2012 Eric Biggers
+ * Copyright (C) 2012, 2013 Eric Biggers
  *
  * This file is part of wimlib, a library for working with WIM files.
  *
@@ -66,17 +66,14 @@ struct wim_inode_table {
          *
         * - 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) {
@@ -89,7 +86,14 @@ static int init_inode_table(struct wim_inode_table *table, size_t capacity)
        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;
@@ -101,9 +105,10 @@ static inline size_t inode_link_count(const struct wim_inode *inode)
 /* 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) {
@@ -145,25 +150,30 @@ static int inode_table_insert(struct wim_dentry *dentry, void *__table)
        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);
+               printf("`%s'\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);
 
@@ -186,8 +196,9 @@ static bool ref_inodes_consistent(const struct wim_inode * restrict ref_inode_1,
        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);
 
@@ -211,7 +222,8 @@ static bool inodes_consistent(const struct wim_inode * restrict ref_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;
@@ -273,8 +285,8 @@ static int fix_true_inode(struct wim_inode *inode, struct hlist_head *inode_list
  * 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;
@@ -392,8 +404,8 @@ next_dentry_2:
        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;
@@ -414,13 +426,13 @@ static int fix_inodes(struct wim_inode_table *table,
 /*
  * 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
@@ -429,17 +441,18 @@ static int fix_inodes(struct wim_inode_table *table,
  * 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;
@@ -457,9 +470,10 @@ int dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_lis
        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;