X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fextract.c;h=467452dcbb96a2d512618d9ecd2ae1b7425703ab;hp=3438ca73327ba3f29684967a2ba91536027810d8;hb=bc6fb02d19caf8e5db9d1634e6a21238e683ec00;hpb=bbedc3e1934278c2ff2746b25b688477cffc9d83 diff --git a/src/extract.c b/src/extract.c index 3438ca73..467452dc 100644 --- a/src/extract.c +++ b/src/extract.c @@ -140,7 +140,7 @@ ref_stream_to_extract(struct wim_lookup_table_entry *lte, ctx->num_streams_remaining++; } - if (ctx->extract_flags & WIMLIB_EXTRACT_FLAG_SEQUENTIAL) { + if (!(ctx->extract_flags & WIMLIB_EXTRACT_FLAG_FILE_ORDER)) { struct wim_dentry **lte_dentries; /* Append dentry to this stream's array of dentries referencing @@ -534,10 +534,10 @@ error: * This function operates slightly differently depending on whether @lte_spec is * NULL or not. When @lte_spec is NULL, the behavior is to extract the default * file contents (unnamed stream), and, if named data streams are supported in - * the extract mode and volume, any named data streams. When @lte_spec is NULL, - * the behavior is to extract only all copies of the stream @lte_spec, and in - * addition use @lte_spec to set the reparse data or create the symbolic link if - * appropriate. + * the extract mode and volume, any named data streams. When @lte_spec is not + * NULL, the behavior is to extract only all copies of the stream @lte_spec, and + * in addition use @lte_spec to set the reparse data or create the symbolic link + * if appropriate. * * @path * Path to file to extract (as can be passed to apply_operations @@ -1182,8 +1182,7 @@ dentry_extract_dir_skeleton(struct wim_dentry *dentry, void *_ctx) return 0; } -/* Create a file or directory, then immediately extract all streams. This - * assumes that WIMLIB_EXTRACT_FLAG_SEQUENTIAL is not specified, since the WIM +/* Create a file or directory, then immediately extract all streams. The WIM * may not be read sequentially by this function. */ static int dentry_extract(struct wim_dentry *dentry, void *_ctx) @@ -1308,7 +1307,8 @@ need_tmpfile_to_extract(struct wim_lookup_table_entry *lte, static int begin_extract_stream_to_tmpfile(struct wim_lookup_table_entry *lte, - bool is_partial_res, void *_ctx) + bool is_partial_res, + void *_ctx) { struct apply_ctx *ctx = _ctx; int ret; @@ -1320,10 +1320,7 @@ begin_extract_stream_to_tmpfile(struct wim_lookup_table_entry *lte, if (ret) return ret; - /* Negative return value here means the function was successful, - * but the consume_chunk and end_chunk callbacks need not be - * called. */ - return -1; + return BEGIN_STREAM_STATUS_SKIP_STREAM; } DEBUG("Temporary file needed for stream (size=%"PRIu64")", lte->size); @@ -1377,7 +1374,7 @@ out_delete_tmpfile: static int extract_stream_list(struct apply_ctx *ctx) { - if (ctx->extract_flags & WIMLIB_EXTRACT_FLAG_SEQUENTIAL) { + if (!(ctx->extract_flags & WIMLIB_EXTRACT_FLAG_FILE_ORDER)) { /* Sequential extraction: read the streams in the order in which * they appear in the WIM file. */ struct read_stream_list_callbacks cbs = { @@ -1390,7 +1387,7 @@ extract_stream_list(struct apply_ctx *ctx) }; return read_stream_list(&ctx->stream_list, offsetof(struct wim_lookup_table_entry, extraction_list), - 0, &cbs); + &cbs, VERIFY_STREAM_HASHES); } else { /* Extract the streams in unsorted order. */ struct wim_lookup_table_entry *lte; @@ -1437,7 +1434,7 @@ read_pwm_stream_header(WIMStruct *pwm, struct wim_lookup_table_entry *lte, return 0; } - if (buf.stream_hdr.magic != PWM_STREAM_MAGIC) { + if (le64_to_cpu(buf.stream_hdr.magic) != PWM_STREAM_MAGIC) { ERROR("Data read on pipe is invalid (expected stream header)."); return WIMLIB_ERR_INVALID_PIPABLE_WIM; } @@ -1510,7 +1507,7 @@ extract_streams_from_pipe(struct apply_ctx *ctx) && (needed_lte = lookup_resource(lookup_table, found_lte->hash)) && (needed_lte->out_refcnt)) { - char *tmpfile_name = NULL; + tchar *tmpfile_name = NULL; struct wim_lookup_table_entry *lte_override; struct wim_lookup_table_entry tmpfile_lte; @@ -2432,8 +2429,7 @@ extract_tree(WIMStruct *wim, const tchar *wim_source_path, const tchar *target, } /* Finally, the important part: extract the tree of files. */ - if (extract_flags & (WIMLIB_EXTRACT_FLAG_SEQUENTIAL | - WIMLIB_EXTRACT_FLAG_FROM_PIPE)) { + if (!(extract_flags & WIMLIB_EXTRACT_FLAG_FILE_ORDER)) { /* Sequential extraction requested, so two passes are needed * (one for directory structure, one for streams.) */ if (progress_func) @@ -2511,7 +2507,7 @@ out_free_realtarget: out_teardown_stream_list: /* Free memory allocated as part of the mapping from each * wim_lookup_table_entry to the dentries that reference it. */ - if (ctx.extract_flags & WIMLIB_EXTRACT_FLAG_SEQUENTIAL) + if (!(ctx.extract_flags & WIMLIB_EXTRACT_FLAG_FILE_ORDER)) list_for_each_entry(lte, &ctx.stream_list, extraction_list) if (lte->out_refcnt > ARRAY_LEN(lte->inline_lte_dentries)) FREE(lte->lte_dentries); @@ -2588,9 +2584,8 @@ check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags) * corresponding file or symbolic link data. This needs to be handled * better. */ if ((extract_flags & (WIMLIB_EXTRACT_FLAG_UNIX_DATA | - WIMLIB_EXTRACT_FLAG_SEQUENTIAL)) - == (WIMLIB_EXTRACT_FLAG_UNIX_DATA | - WIMLIB_EXTRACT_FLAG_SEQUENTIAL)) + WIMLIB_EXTRACT_FLAG_FILE_ORDER)) + == WIMLIB_EXTRACT_FLAG_UNIX_DATA) { if (extract_flags & WIMLIB_EXTRACT_FLAG_FROM_PIPE) { WARNING("Setting UNIX file/owner group may " @@ -2598,7 +2593,7 @@ check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags) " symbolic links " "when applying from a pipe."); } else { - extract_flags &= ~WIMLIB_EXTRACT_FLAG_SEQUENTIAL; + extract_flags |= WIMLIB_EXTRACT_FLAG_FILE_ORDER; WARNING("Disabling sequential extraction for " "UNIX data mode"); } @@ -2880,8 +2875,6 @@ wimlib_extract_image_from_pipe(int pipe_fd, const tchar *image_num_or_name, if (extract_flags & WIMLIB_EXTRACT_FLAG_TO_STDOUT) return WIMLIB_ERR_INVALID_PARAM; - extract_flags |= WIMLIB_EXTRACT_FLAG_SEQUENTIAL; - /* Read the WIM header from the pipe and get a WIMStruct to represent * the pipable WIM. Caveats: Unlike getting a WIMStruct with * wimlib_open_wim(), getting a WIMStruct in this way will result in