inode_for_each_dentry(other_dentry, dentry->d_inode) {
if (dentry_has_short_name(other_dentry)
&& !other_dentry->skeleton_extracted
- && other_dentry->in_extraction_tree)
+ && other_dentry->in_extraction_tree
+ && !other_dentry->extraction_skipped)
{
DEBUG("Creating %"TS" before %"TS" "
"to guarantee correct DOS name extraction",
/* Extract stream to temporary file. */
ret = create_temporary_file(&tmpfile_fd, &tmpfile_name);
- if (ret)
+ if (ret) {
+ lte_unbind_wim_resource_spec(needed_lte);
goto out_free_found_lte;
+ }
- ret = extract_stream_to_fd(needed_lte, &tmpfile_fd,
- needed_lte->size);
+ ret = extract_full_stream_to_fd(needed_lte,
+ &tmpfile_fd);
if (ret) {
filedes_close(&tmpfile_fd);
goto delete_tmpfile;
if (lte) {
struct filedes _stdout;
filedes_init(&_stdout, STDOUT_FILENO);
- ret = extract_stream_to_fd(lte, &_stdout, lte->size);
+ ret = extract_full_stream_to_fd(lte, &_stdout);
}
}
return ret;
* directory tree. (If not, extract_dentry_to_stdout() will
* return an error.) */
if (extract_flags & WIMLIB_EXTRACT_FLAG_TO_STDOUT) {
- ret = extract_dentry_to_stdout(ctx.extract_root);
+ ret = 0;
+ for (size_t i = 0; i < num_trees; i++) {
+ ret = extract_dentry_to_stdout(trees[i]);
+ if (ret)
+ break;
+ }
goto out_teardown_stream_list;
}
goto out_free_realtarget;
if (progress_func) {
- progress_func(*wim_source_path ? WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END :
- WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END,
- &ctx.progress);
+ int msg;
+ if (*wim_source_path || (extract_flags & WIMLIB_EXTRACT_FLAG_PATHMODE))
+ msg = WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END;
+ else
+ msg = WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END;
+ progress_func(msg, &ctx.progress);
}
do_extract_warnings(&ctx);
target, extract_flags, progress_func);
}
-/* Validates a single wimlib_extract_command, mostly checking to make sure the
- * extract flags make sense. */
+/* Make sure the extraction flags make sense, and update them if needed. */
static int
-check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags)
+check_extract_flags(int extract_flags,
+ const u32 wim_header_flags,
+ int *updated_extract_flags_ret)
{
- int extract_flags;
-
- /* Empty destination path? */
- if (cmd->fs_dest_path[0] == T('\0'))
- return WIMLIB_ERR_INVALID_PARAM;
-
- extract_flags = cmd->extract_flags;
-
/* Check for invalid flag combinations */
if ((extract_flags &
(WIMLIB_EXTRACT_FLAG_SYMLINK |
WIMLIB_EXTRACT_FLAG_HARDLINK))
return WIMLIB_ERR_INVALID_PARAM;
- if (extract_flags & WIMLIB_EXTRACT_FLAG_GLOB_PATHS)
- return WIMLIB_ERR_INVALID_PARAM;
-
if ((extract_flags &
(WIMLIB_EXTRACT_FLAG_NO_ACLS |
WIMLIB_EXTRACT_FLAG_STRICT_ACLS)) == (WIMLIB_EXTRACT_FLAG_NO_ACLS |
WIMLIB_EXTRACT_FLAG_FROM_PIPE)) == WIMLIB_EXTRACT_FLAG_RESUME)
return WIMLIB_ERR_INVALID_PARAM;
- if (extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
#ifndef WITH_NTFS_3G
+ if (extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
ERROR("wimlib was compiled without support for NTFS-3g, so\n"
" we cannot apply a WIM image directly to a NTFS volume.");
return WIMLIB_ERR_UNSUPPORTED;
-#endif
}
+#endif
if ((extract_flags & (WIMLIB_EXTRACT_FLAG_RPFIX |
WIMLIB_EXTRACT_FLAG_NORPFIX)) == 0)
}
}
- cmd->extract_flags = extract_flags;
+ if (updated_extract_flags_ret)
+ *updated_extract_flags_ret = extract_flags;
return 0;
}
/* Check for problems with the extraction commands */
for (size_t i = 0; i < num_cmds; i++) {
- ret = check_extract_command(&cmds[i], wim->hdr.flags);
+
+ if (cmds[i].fs_dest_path[0] == T('\0'))
+ return WIMLIB_ERR_INVALID_PARAM;
+
+ if (cmds[i].extract_flags & WIMLIB_EXTRACT_FLAG_GLOB_PATHS)
+ return WIMLIB_ERR_INVALID_PARAM;
+
+ ret = check_extract_flags(cmds[i].extract_flags,
+ wim->hdr.flags,
+ &cmds[i].extract_flags);
if (ret)
return ret;
if (cmds[i].extract_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK |
void *mem;
ret = read_path_list_file(path_list_file, &paths, &num_paths, &mem);
- if (ret)
+ if (ret) {
+ ERROR("Failed to read path list file \"%"TS"\"",
+ path_list_file);
return ret;
+ }
ret = wimlib_extract_paths(wim, image, target,
(const tchar * const *)paths, num_paths,
extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
- if (target == NULL || (num_paths != 0 && paths == NULL))
+ if (wim == NULL || target == NULL || target[0] == T('\0') ||
+ (num_paths != 0 && paths == NULL))
return WIMLIB_ERR_INVALID_PARAM;
+ ret = check_extract_flags(extract_flags, wim->hdr.flags,
+ &extract_flags);
+ if (ret)
+ return ret;
+
ret = select_wim_image(wim, image);
if (ret)
return ret;
~WIMLIB_EXTRACT_FLAG_GLOB_PATHS)
| WIMLIB_EXTRACT_FLAG_PATHMODE),
progress_func);
+
+ if (extract_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK |
+ WIMLIB_EXTRACT_FLAG_HARDLINK))
+ {
+ for_lookup_table_entry(wim->lookup_table,
+ lte_free_extracted_file,
+ NULL);
+ }
out_free_trees:
FREE(trees);
return ret;