]> wimlib.net Git - wimlib/blobdiff - src/blob_table.c
NTFS-3g capture: open inodes by inode number
[wimlib] / src / blob_table.c
index bcccae8ba9ddb1ab96ef362cdab176756dcb375f..39dc865bf048c6e6e7fbde2789be29f4dcc32ba1 100644 (file)
@@ -143,21 +143,15 @@ clone_blob_descriptor(const struct blob_descriptor *old)
                                               sizeof(struct ntfs_location));
                        if (new->ntfs_loc == NULL)
                                goto out_free;
-                       new->ntfs_loc->path = STRDUP(old->ntfs_loc->path);
-                       new->ntfs_loc->attr_name = NULL;
-                       if (new->ntfs_loc->path == NULL)
-                               goto out_free;
-                       if (new->ntfs_loc->attr_name_nchars != 0) {
+                       if (new->ntfs_loc->attr_name != NULL) {
                                new->ntfs_loc->attr_name =
-                                       utf16le_dup(old->ntfs_loc->attr_name);
+                                       utf16le_dup(new->ntfs_loc->attr_name);
                                if (new->ntfs_loc->attr_name == NULL)
                                        goto out_free;
                        }
                }
                break;
 #endif
-       default:
-               break;
        }
        return new;
 
@@ -193,7 +187,6 @@ blob_release_location(struct blob_descriptor *blob)
 #ifdef WITH_NTFS_3G
        case BLOB_IN_NTFS_VOLUME:
                if (blob->ntfs_loc) {
-                       FREE(blob->ntfs_loc->path);
                        FREE(blob->ntfs_loc->attr_name);
                        FREE(blob->ntfs_loc);
                }
@@ -455,7 +448,7 @@ cmp_blobs_by_sequential_order(const void *p1, const void *p2)
                return tstrcmp(blob1->file_on_disk, blob2->file_on_disk);
 #ifdef WITH_NTFS_3G
        case BLOB_IN_NTFS_VOLUME:
-               return tstrcmp(blob1->ntfs_loc->path, blob2->ntfs_loc->path);
+               return cmp_u64(blob1->ntfs_loc->mft_no, blob2->ntfs_loc->mft_no);
 #endif
        default:
                /* No additional sorting order defined for this resource
@@ -1357,7 +1350,8 @@ blob_to_wimlib_resource_entry(const struct blob_descriptor *blob,
                wentry->is_spanned = (res_flags & WIM_RESHDR_FLAG_SPANNED) != 0;
                wentry->packed = (res_flags & WIM_RESHDR_FLAG_SOLID) != 0;
        }
-       copy_hash(wentry->sha1_hash, blob->hash);
+       if (!blob->unhashed)
+               copy_hash(wentry->sha1_hash, blob->hash);
        wentry->reference_count = blob->refcnt;
        wentry->is_metadata = blob->is_metadata;
 }
@@ -1393,10 +1387,17 @@ wimlib_iterate_lookup_table(WIMStruct *wim, int flags,
        if (wim_has_metadata(wim)) {
                int ret;
                for (int i = 0; i < wim->hdr.image_count; i++) {
-                       ret = do_iterate_blob(wim->image_metadata[i]->metadata_blob,
-                                             &ctx);
+                       struct blob_descriptor *blob;
+                       struct wim_image_metadata *imd = wim->image_metadata[i];
+
+                       ret = do_iterate_blob(imd->metadata_blob, &ctx);
                        if (ret)
                                return ret;
+                       image_for_each_unhashed_blob(blob, imd) {
+                               ret = do_iterate_blob(blob, &ctx);
+                               if (ret)
+                                       return ret;
+                       }
                }
        }
        return for_blob_in_table(wim->blob_table, do_iterate_blob, &ctx);