- return 0;
-}
-
-static int
-extract_dentries(struct list_head *dentry_list, struct apply_ctx *ctx)
-{
- struct wim_dentry *dentry;
- int ret;
-
- list_for_each_entry(dentry, dentry_list, extraction_list) {
- ret = dentry_extract(dentry, ctx);
- if (ret)
- return ret;
- }
- return 0;
-}
-
-static int
-extract_final_metadata(struct list_head *dentry_list, struct apply_ctx *ctx)
-{
- struct wim_dentry *dentry;
- int ret;
-
- list_for_each_entry_reverse(dentry, dentry_list, extraction_list) {
- ret = dentry_extract_final(dentry, ctx);
- if (ret)
- return ret;
- }
- return 0;
-}
-
-/* Creates a temporary file opened for writing. The open file descriptor is
- * returned in @fd_ret and its name is returned in @name_ret (dynamically
- * allocated). */
-static int
-create_temporary_file(struct filedes *fd_ret, tchar **name_ret)
-{
- tchar *name;
- int raw_fd;
-
-retry:
- name = ttempnam(NULL, T("wimlib"));
- if (name == NULL) {
- ERROR_WITH_ERRNO("Failed to create temporary filename");
- return WIMLIB_ERR_NOMEM;
- }
-
- raw_fd = topen(name, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0600);
-
- if (raw_fd < 0) {
- if (errno == EEXIST) {
- FREE(name);
- goto retry;
- }
- ERROR_WITH_ERRNO("Failed to open temporary file \"%"TS"\"", name);
- FREE(name);
- return WIMLIB_ERR_OPEN;
- }
-
- filedes_init(fd_ret, raw_fd);
- *name_ret = name;
- return 0;
-}
-
-/* Extract all instances of the stream @lte that are being extracted in this
- * call of extract_tree(), but actually read the stream data from @lte_override.
- */
-static int
-extract_stream_instances(struct wim_lookup_table_entry *lte,
- struct wim_lookup_table_entry *lte_override,
- struct apply_ctx *ctx)
-{
- struct wim_dentry **lte_dentries;
- tchar path[ctx->ops->path_max];
- size_t i;
- int ret;
-
- if (lte->out_refcnt <= ARRAY_LEN(lte->inline_lte_dentries))
- lte_dentries = lte->inline_lte_dentries;
- else
- lte_dentries = lte->lte_dentries;
-
- for (i = 0; i < lte->out_refcnt; i++) {
- struct wim_dentry *dentry = lte_dentries[i];
-
- if (dentry->tmp_flag)
- continue;
- if (!build_extraction_path(path, dentry, ctx))
- continue;
- ret = extract_streams(path, ctx, dentry, lte, lte_override);
- if (ret)
- goto out_clear_tmp_flags;
- dentry->tmp_flag = 1;
- }
- ret = 0;
-out_clear_tmp_flags:
- for (i = 0; i < lte->out_refcnt; i++)
- lte_dentries[i]->tmp_flag = 0;
- return ret;
-}
-
-/* Determine whether the specified stream needs to be extracted to a temporary
- * file or not.
- *
- * @lte->out_refcnt specifies the number of instances of this stream that must
- * be extracted.
- *
- * @is_partial_res is %true if this stream is just one of multiple in a single
- * WIM resource being extracted. */
-static bool
-need_tmpfile_to_extract(struct wim_lookup_table_entry *lte,
- bool is_partial_res)
-{
- /* Temporary file is always required when reading a partial resource,
- * since in that case we retrieve all the contained streams in one pass.
- * */
- if (is_partial_res)
- return true;
-
- /* Otherwise we don't need a temporary file if only a single instance of
- * the stream is needed. */
- if (lte->out_refcnt == 1)
- return false;
-
- wimlib_assert(lte->out_refcnt >= 2);
-
- /* We also don't need a temporary file if random access to the stream is
- * allowed. */
- if (lte->resource_location != RESOURCE_IN_WIM ||
- filedes_is_seekable(<e->rspec->wim->in_fd))
- return false;
-
- return true;
-}
-
-static int
-begin_extract_stream_to_tmpfile(struct wim_lookup_table_entry *lte,
- bool is_partial_res,
- void *_ctx)
-{
- struct apply_ctx *ctx = _ctx;
- int ret;
-
- if (!need_tmpfile_to_extract(lte, is_partial_res)) {
- DEBUG("Temporary file not needed "
- "for stream (size=%"PRIu64")", lte->size);
- ret = extract_stream_instances(lte, lte, ctx);
- if (ret)
- return ret;
-
- return BEGIN_STREAM_STATUS_SKIP_STREAM;
- }