]> wimlib.net Git - wimlib/blobdiff - src/dentry.c
Rearrange struct wim_inode and improve comments
[wimlib] / src / dentry.c
index 435a7c919665f89ee3736069e7f4f432b233d87b..d6eb8a5c737f3942e80d4b753ea47a314ff697ce 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. */
@@ -1138,7 +1137,6 @@ free_inode(struct wim_inode *inode)
                 * 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 +1825,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;
        }