]> wimlib.net Git - wimlib/blobdiff - src/dentry.c
make_symlink_reparse_data_buf(): Use full path
[wimlib] / src / dentry.c
index 5b19f6f51af2ac59a4c63cff51e61c950c13c3ee..5da7e8dbc9d6c16917f167f5f05d94b39da82899 100644 (file)
@@ -646,7 +646,15 @@ print_dentry(struct wim_dentry *dentry, void *lookup_table)
        wim_timestamp_to_str(inode->i_last_write_time, buf, sizeof(buf));
        tprintf(T("Last Write Time   = %"TS"\n"), buf);
 
-       tprintf(T("Reparse Tag       = 0x%"PRIx32"\n"), inode->i_reparse_tag);
+       if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+               tprintf(T("Reparse Tag       = 0x%"PRIx32"\n"), inode->i_reparse_tag);
+               tprintf(T("Reparse Point Flags = 0x%"PRIx16"\n"),
+                       inode->i_not_rpfixed);
+               tprintf(T("Reparse Point Unknown 2 = 0x%"PRIx32"\n"),
+                       inode->i_rp_unknown_2);
+       }
+       tprintf(T("Reparse Point Unknown 1 = 0x%"PRIx32"\n"),
+               inode->i_rp_unknown_1);
        tprintf(T("Hard Link Group   = 0x%"PRIx64"\n"), inode->i_ino);
        tprintf(T("Hard Link Group Size = %"PRIu32"\n"), inode->i_nlink);
        tprintf(T("Number of Alternate Data Streams = %hu\n"), inode->i_num_ads);
@@ -702,6 +710,7 @@ new_timeless_inode()
                inode->i_security_id = -1;
                inode->i_nlink = 1;
                inode->i_next_stream_id = 1;
+               inode->i_not_rpfixed = 1;
        #ifdef WITH_FUSE
                if (pthread_mutex_init(&inode->i_mutex, NULL) != 0) {
                        ERROR_WITH_ERRNO("Error initializing mutex");
@@ -1217,8 +1226,9 @@ replace_forbidden_characters(utf16lechar *name)
        #ifdef __WIN32__
                if (wcschr(L"<>:\"/\\|?*", (wchar_t)*p))
        #else
-               if (*p == '/') {
+               if (*p == '/')
        #endif
+               {
                        if (name) {
                                WARNING("File, directory, or stream name \"%"WS"\"\n"
                                        "          contains forbidden characters; "
@@ -1480,12 +1490,12 @@ read_dentry(const u8 metadata_resource[], u64 metadata_resource_len,
         * reparse points, then put the fields in the same place and didn't
         * document it.  */
        if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
-               p += 4;
+               p = get_u32(p, &inode->i_rp_unknown_1);
                p = get_u32(p, &inode->i_reparse_tag);
-               p += 4;
+               p = get_u16(p, &inode->i_rp_unknown_2);
+               p = get_u16(p, &inode->i_not_rpfixed);
        } else {
-               p += 4;
-               /* i_reparse_tag is irrelevant; just leave it at 0. */
+               p = get_u32(p, &inode->i_rp_unknown_1);
                p = get_u64(p, &inode->i_ino);
        }
 
@@ -1754,9 +1764,10 @@ write_dentry(const struct wim_dentry *dentry, u8 *p)
        hash = inode_stream_hash(inode, 0);
        p = put_bytes(p, SHA1_HASH_SIZE, hash);
        if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
-               p = put_zeroes(p, 4);
+               p = put_u32(p, 0);
                p = put_u32(p, inode->i_reparse_tag);
-               p = put_zeroes(p, 4);
+               p = put_u16(p, 0);
+               p = put_u16(p, inode->i_not_rpfixed);
        } else {
                u64 link_group_id;
                p = put_u32(p, 0);