static void usage(int cmd_type);
static void usage_all();
+static bool imagex_be_quiet = false;
+
static const tchar *usage_strings[] = {
[APPEND] =
const union wimlib_progress_info *info)
{
unsigned percent_done;
+ if (imagex_be_quiet)
+ return 0;
switch (msg) {
case WIMLIB_PROGRESS_MSG_WRITE_STREAMS:
percent_done = TO_PERCENT(info->write_streams.completed_bytes,
break;
case IMAGEX_TO_STDOUT_OPTION:
extract_flags |= WIMLIB_EXTRACT_FLAG_TO_STDOUT;
+ imagex_be_quiet = true;
break;
default:
usage(EXTRACT);
ret = wimlib_extract_files(wim, image, 0, cmds, num_cmds,
additional_swms, num_additional_swms,
imagex_progress_func);
- if (ret == 0)
- tprintf(T("Done extracting files.\n"));
+ if (ret == 0) {
+ if (!imagex_be_quiet)
+ tprintf(T("Done extracting files.\n"));
+ } else if (ret == WIMLIB_ERR_PATH_DOES_NOT_EXIST) {
+ tfprintf(stderr, T("Note: You can use `"IMAGEX_PROGNAME" dir' to see what "
+ "files and directories\n"
+ " are in the WIM image.\n"));
+ }
#ifdef __WIN32__
win32_release_restore_privileges();
#endif
return 0;
}
+/*
+ * Extract a dentry to standard output.
+ *
+ * This obviously doesn't make sense in all cases. We return an error if the
+ * dentry does not correspond to a regular file. Otherwise we extract the
+ * unnamed data stream only.
+ */
+static int
+extract_dentry_to_stdout(struct wim_dentry *dentry)
+{
+ int ret = 0;
+ if (!dentry_is_regular_file(dentry)) {
+ ERROR("\"%"TS"\" is not a regular file and therefore cannot be "
+ "extracted to standard output", dentry->_full_path);
+ ret = WIMLIB_ERR_NOT_A_REGULAR_FILE;
+ } else {
+ struct wim_lookup_table_entry *lte;
+
+ lte = inode_unnamed_lte_resolved(dentry->d_inode);
+ if (lte) {
+ ret = extract_wim_resource_to_fd(lte, STDOUT_FILENO,
+ wim_resource_size(lte));
+ }
+ }
+ return ret;
+}
+
/*
* extract_tree - Extract a file or directory tree from the currently selected
* WIM image.
}
args.extract_root = root;
+ ret = calculate_dentry_tree_full_paths(root);
+ if (ret)
+ goto out_ntfs_umount;
+
+
/* Build a list of the streams that need to be extracted */
find_streams_for_extraction(root,
&stream_list,
calculate_bytes_to_extract(&stream_list, extract_flags,
&args.progress);
+ if (extract_flags & WIMLIB_EXTRACT_FLAG_TO_STDOUT) {
+ ret = extract_dentry_to_stdout(root);
+ goto out_mark_inodes_unvisited;
+ }
+
if (progress_func) {
progress_func(*wim_source_path ? WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN :
WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN,
&args.progress);
}
- ret = calculate_dentry_tree_full_paths(root);
- if (ret)
- goto out_mark_inodes_unvisited;
-
/* Make the directory structure and extract empty files */
args.extract_flags |= WIMLIB_EXTRACT_FLAG_NO_STREAMS;
args.apply_dentry = ops->apply_dentry;
[WIMLIB_ERR_NOT_A_WIM_FILE]
= T("The file did not begin with the magic characters that "
"identify a WIM file"),
+ [WIMLIB_ERR_NOT_A_REGULAR_FILE]
+ = T("One of the specified paths to extract did not "
+ "correspond to a regular file"),
[WIMLIB_ERR_NO_FILENAME]
= T("The WIM is not identified with a filename"),
[WIMLIB_ERR_NTFS_3G]