]> wimlib.net Git - wimlib/blobdiff - src/extract.c
Make sequential extraction the default
[wimlib] / src / extract.c
index 5939671716455dc0c0a3b0008db82da450050e59..467452dcbb96a2d512618d9ecd2ae1b7425703ab 100644 (file)
@@ -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)
@@ -1221,11 +1220,12 @@ retry:
        raw_fd = topen(name, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0600);
 
        if (raw_fd < 0) {
-               int errno_save = errno;
-               FREE(name);
-               if (errno_save == EEXIST)
+               if (errno == EEXIST) {
+                       FREE(name);
                        goto retry;
+               }
                ERROR_WITH_ERRNO("Failed to open temporary file \"%"TS"\"", name);
+               FREE(name);
                return WIMLIB_ERR_OPEN;
        }
 
@@ -1307,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;
@@ -1319,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);
@@ -1376,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 = {
@@ -1389,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;
@@ -1436,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;
        }
@@ -1509,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;
 
@@ -2431,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)
@@ -2510,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);
@@ -2587,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 "
@@ -2597,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");
                }
@@ -2879,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