]> wimlib.net Git - wimlib/blobdiff - src/dentry.c
dentry.{c,h}: Cleanup and fixes
[wimlib] / src / dentry.c
index 435a7c919665f89ee3736069e7f4f432b233d87b..70250a7f049b6e546fbca0dac8894e41aba9de85 100644 (file)
@@ -79,7 +79,9 @@ struct wim_dentry_on_disk {
        /* Length of this directory entry in bytes, not including any alternate
         * data stream entries.  Should be a multiple of 8 so that the following
         * dentry or alternate data stream entry is aligned on an 8-byte
-        * boundary.  (If not, wimlib will round it up.)
+        * boundary.  (If not, wimlib will round it up.)  It must be at least as
+        * long as the fixed-length fields of the dentry (WIM_DENTRY_DISK_SIZE),
+        * plus the lengths of the file name and/or short name if present.
         *
         * It is also possible for this field to be 0.  This situation, which is
         * undocumented, indicates the end of a list of sibling nodes in a
@@ -98,26 +100,23 @@ struct wim_dentry_on_disk {
         * security descriptors (see: `struct wim_security_data') */
        sle32 security_id;
 
-       /* Offset from the start of the uncompressed metadata resource of this
-        * directory's child directory entries, or 0 if this directory entry
-        * does not correspond to a directory or otherwise does not have any
-        * children. */
+       /* Offset, in bytes, from the start of the uncompressed metadata
+        * resource of this directory's child directory entries, or 0 if this
+        * directory entry does not correspond to a directory or otherwise does
+        * not have any children. */
        le64 subdir_offset;
 
        /* Reserved fields */
        le64 unused_1;
        le64 unused_2;
 
-       /* The following three time fields should correspond to those gotten by
-        * calling GetFileTime() on Windows. */
 
-       /* Creation time, in 100-nanosecond intervals since January 1, 1601. */
+       /* Creation time, last access time, and last write time, in
+        * 100-nanosecond intervals since 12:00 a.m UTC January 1, 1601.  They
+        * should correspond to the times gotten by calling GetFileTime() on
+        * Windows. */
        le64 creation_time;
-
-       /* Last access time, in 100-nanosecond intervals since January 1, 1601. */
        le64 last_access_time;
-
-       /* Last write time, in 100-nanosecond intervals since January 1, 1601. */
        le64 last_write_time;
 
        /* Vaguely, the SHA-1 message digest ("hash") of the file's contents.
@@ -153,7 +152,7 @@ struct wim_dentry_on_disk {
         * version of the following fields containing the reparse tag is valid.
         * Furthermore, the field notated as not_rpfixed, as far as I can tell,
         * is supposed to be set to 1 if reparse point fixups (a.k.a. fixing the
-        * targets of absolute symbolic links) were done, and otherwise 0.
+        * targets of absolute symbolic links) were *not* done, and otherwise 0.
         *
         * If this directory entry is not for a reparse point, then the version
         * of the following fields containing the hard_link_group_id is valid.
@@ -170,9 +169,9 @@ struct wim_dentry_on_disk {
         *    guaranteed that directory entries that share the same hard link
         *    group ID are actually hard linked to each either.  We have to
         *    handle this by using special code to use distinguishing features
-        *    (possible because some information about the underlying inode is
-        *    repeated in each dentry) to split up these fake hard link groups
-        *    into what they actually are supposed to be.
+        *    (which is possible because some information about the underlying
+        *    inode is repeated in each dentry) to split up these fake hard link
+        *    groups into what they actually are supposed to be.
         */
        union {
                struct {
@@ -204,7 +203,7 @@ struct wim_dentry_on_disk {
 
        /* Follewed by variable length file name, in UTF16-LE, if
         * file_name_nbytes != 0.  Includes null terminator. */
-       utf16lechar file_name[];
+       /*utf16lechar file_name[];*/
 
        /* Followed by variable length short name, in UTF16-LE, if
         * short_name_nbytes != 0.  Includes null terminator. */
@@ -984,13 +983,6 @@ new_timeless_inode(void)
                inode->i_next_stream_id = 1;
                inode->i_not_rpfixed = 1;
                INIT_LIST_HEAD(&inode->i_list);
-       #ifdef WITH_FUSE
-               if (pthread_mutex_init(&inode->i_mutex, NULL) != 0) {
-                       ERROR_WITH_ERRNO("Error initializing mutex");
-                       FREE(inode);
-                       return NULL;
-               }
-       #endif
                INIT_LIST_HEAD(&inode->i_dentry);
        }
        return inode;
@@ -1132,13 +1124,11 @@ free_inode(struct wim_inode *inode)
        #ifdef WITH_FUSE
                wimlib_assert(inode->i_num_opened_fds == 0);
                FREE(inode->i_fds);
-               pthread_mutex_destroy(&inode->i_mutex);
        #endif
                /* HACK: This may instead delete the inode from i_list, but the
                 * hlist_del() behaves the same as list_del(). */
                if (!hlist_unhashed(&inode->i_hlist))
                        hlist_del(&inode->i_hlist);
-               FREE(inode->i_extracted_file);
                FREE(inode);
        }
 }
@@ -1827,7 +1817,7 @@ read_dentry(const u8 * restrict metadata_resource, u64 metadata_resource_len,
         * fixed-length fields */
        if (dentry->length < sizeof(struct wim_dentry_on_disk)) {
                ERROR("Directory entry has invalid length of %"PRIu64" bytes",
-                     entry->length);
+                     dentry->length);
                return WIMLIB_ERR_INVALID_DENTRY;
        }
 
@@ -2004,8 +1994,9 @@ dentry_get_file_type_string(const struct wim_dentry *dentry)
  * Returns zero on success; nonzero on failure.
  */
 int
-read_dentry_tree(const u8 metadata_resource[], u64 metadata_resource_len,
-                struct wim_dentry *dentry)
+read_dentry_tree(const u8 * restrict metadata_resource,
+                u64 metadata_resource_len,
+                struct wim_dentry * restrict dentry)
 {
        u64 cur_offset = dentry->subdir_offset;
        struct wim_dentry *child;
@@ -2251,7 +2242,7 @@ write_dentry_tree_recursive(const struct wim_dentry *parent, u8 *p)
  * Returns pointer to the byte after the last byte we wrote.
  */
 u8 *
-write_dentry_tree(const struct wim_dentry *root, u8 *p)
+write_dentry_tree(const struct wim_dentry * restrict root, u8 * restrict p)
 {
        DEBUG("Writing dentry tree.");
        wimlib_assert(dentry_is_root(root));