resource.c: Cleanup and refactor
[wimlib] / src / extract.c
index 115d5ea..4448a6e 100644 (file)
@@ -1143,7 +1143,8 @@ dentry_extract_skeleton(struct wim_dentry *dentry, void *_ctx)
        {
                inode_for_each_dentry(other_dentry, dentry->d_inode) {
                        if (dentry_has_short_name(other_dentry)
-                           && !other_dentry->skeleton_extracted)
+                           && !other_dentry->skeleton_extracted
+                           && other_dentry->in_extraction_tree)
                        {
                                DEBUG("Creating %"TS" before %"TS" "
                                      "to guarantee correct DOS name extraction",
@@ -1377,13 +1378,22 @@ read_error:
        return ret;
 }
 
+static int
+skip_pwm_chunk_cb(const void *chunk, size_t chunk_size, void *_ctx)
+{
+       return 0;
+}
+
 /* Skip over an unneeded stream in a pipable WIM being read from a pipe.  */
 static int
 skip_pwm_stream(struct wim_lookup_table_entry *lte)
 {
-       return read_partial_wim_resource(lte, wim_resource_size(lte),
-                                        NULL, NULL,
-                                        WIMLIB_READ_RESOURCE_FLAG_SEEK_ONLY,
+       return read_partial_wim_resource(lte,
+                                        wim_resource_size(lte),
+                                        skip_pwm_chunk_cb,
+                                        wim_resource_chunk_size(lte),
+                                        NULL,
+                                        WIMLIB_READ_RESOURCE_FLAG_RAW_CHUNKS,
                                         0);
 }
 
@@ -1623,6 +1633,8 @@ dentry_calculate_extraction_path(struct wim_dentry *dentry, void *_args)
        struct apply_ctx *ctx = _args;
        int ret;
 
+       dentry->in_extraction_tree = 1;
+
        if (dentry == ctx->extract_root || dentry->extraction_skipped)
                return 0;
 
@@ -1742,6 +1754,7 @@ dentry_reset_needs_extraction(struct wim_dentry *dentry, void *_ignore)
 {
        struct wim_inode *inode = dentry->d_inode;
 
+       dentry->in_extraction_tree = 0;
        dentry->extraction_skipped = 0;
        dentry->was_hardlinked = 0;
        dentry->skeleton_extracted = 0;
@@ -2061,7 +2074,7 @@ do_extract_warnings(struct apply_ctx *ctx)
            ctx->no_security_descriptors == 0)
                return;
 
-       WARNING("Extraction of \"%"TS"\" complete, but with one or more warnings:",
+       WARNING("Extraction to \"%"TS"\" complete, but with one or more warnings:",
                ctx->target);
        if (ctx->partial_security_descriptors != 0) {
                WARNING("- Could only partially set the security descriptor\n"