X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=7dbbc8a4330addd60c8a1f668d62853996ff4e37;hb=5caa3dfded8e0f590112b59feeb3b55e4fa28420;hp=4d0c2ff31fdeb9076348dad8854f90c8ba866e6e;hpb=6e747130553f395513895b1de9389216a16a01cd;p=wimlib
diff --git a/programs/imagex.c b/programs/imagex.c
index 4d0c2ff3..7dbbc8a4 100644
--- a/programs/imagex.c
+++ b/programs/imagex.c
@@ -22,7 +22,10 @@
* along with this program. If not, see .
*/
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h" /* Need for PACKAGE_VERSION, etc. */
+#endif
+
#include "wimlib.h"
#include "wimlib_tchar.h"
@@ -40,7 +43,7 @@
#include
#ifdef HAVE_ALLOCA_H
-#include
+# include
#endif
#ifdef __WIN32__
@@ -80,7 +83,7 @@ enum imagex_op_type {
};
static void usage(int cmd_type);
-static void usage_all();
+static void usage_all(void);
static bool imagex_be_quiet = false;
@@ -169,17 +172,27 @@ IMAGEX_PROGNAME" unmount DIRECTORY [--commit] [--check] [--rebuild]\n"
),
[UPDATE] =
T(
-IMAGEX_PROGNAME" update WIMFILE IMAGE [--check] [--rebuild]\n"
-" [--threads=NUM_THREADS] [DEFAULT_ADD_OPTIONS]\n"
-" [DEFAULT_DELETE_OPTIONS] [< CMDFILE]\n"
-" ... where each CMD is:\n"
-" add [--unix-data] [--no-acls] [--strict-acls] [--dereference]\n"
-" [--verbose] FILE_OR_DIRECTORY DEST_WIM_PATH\n"
-" delete [--force] [--recursive] WIM_PATH\n"
-" rename SRC_PATH_IN_WIM DEST_PATH_IN_WIM\n"
+IMAGEX_PROGNAME" update WIMFILE [IMAGE_NUM | IMAGE_NAME] [--check] [--rebuild]\n"
+" [--threads=NUM_THREADS] [DEFAULT_ADD_OPTIONS]\n"
+" [DEFAULT_DELETE_OPTIONS] < CMDFILE\n"
),
};
+
+static void
+recommend_man_page(const tchar *cmd_name)
+{
+ const tchar *format_str;
+#ifdef __WIN32__
+ format_str = T("See "IMAGEX_PROGNAME"%"TS"%"TS".pdf in the "
+ "doc directory for more details.\n");
+#else
+ format_str = T("Try `man "IMAGEX_PROGNAME"%"TS"%"TS"' "
+ "for more details.\n");
+#endif
+ tprintf(format_str, *cmd_name ? T("-") : T(""), cmd_name);
+}
+
enum {
IMAGEX_ALLOW_OTHER_OPTION,
IMAGEX_BOOT_OPTION,
@@ -333,9 +346,16 @@ static const struct option update_options[] = {
{T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION},
{T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION},
{T("rebuild"), no_argument, NULL, IMAGEX_REBUILD_OPTION},
+
+ /* Default delete options */
{T("force"), no_argument, NULL, IMAGEX_FORCE_OPTION},
{T("recursive"), no_argument, NULL, IMAGEX_RECURSIVE_OPTION},
+
+ /* Global add option */
{T("config"), required_argument, NULL, IMAGEX_CONFIG_OPTION},
+
+ /* Default add options */
+ {T("verbose"), no_argument, NULL, IMAGEX_VERBOSE_OPTION},
{T("dereference"), no_argument, NULL, IMAGEX_DEREFERENCE_OPTION},
{T("unix-data"), no_argument, NULL, IMAGEX_UNIX_DATA_OPTION},
{T("noacls"), no_argument, NULL, IMAGEX_NO_ACLS_OPTION},
@@ -1224,7 +1244,9 @@ update_command_add_option(int op, const tchar *option,
bool recognized = true;
switch (op) {
case WIMLIB_UPDATE_OP_ADD:
- if (!tstrcmp(option, T("--unix-data")))
+ if (!tstrcmp(option, T("--verbose")))
+ cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE;
+ else if (!tstrcmp(option, T("--unix-data")))
cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA;
else if (!tstrcmp(option, T("--no-acls")) || !tstrcmp(option, T("--noacls")))
cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_NO_ACLS;
@@ -1243,7 +1265,7 @@ update_command_add_option(int op, const tchar *option,
else
recognized = false;
break;
- case WIMLIB_UPDATE_OP_RENAME:
+ default:
recognized = false;
break;
}
@@ -1338,8 +1360,8 @@ parse_update_command(tchar *line, size_t len,
if (!update_command_add_option(op, next_string, command))
{
imagex_error(T("Unrecognized option \"%"TS"\" to "
- "update command on line %zu"),
- next_string, line_number);
+ "update command \"%"TS"\" on line %zu"),
+ next_string, command_name, line_number);
return false;
}
@@ -2106,18 +2128,19 @@ free_extract_commands(struct wimlib_extract_command *cmds, size_t num_cmds,
}
static struct wimlib_extract_command *
-prepare_extract_commands(tchar **argv, int argc, int extract_flags,
- tchar *dest_dir, size_t *num_cmds_ret)
+prepare_extract_commands(tchar **paths, unsigned num_paths,
+ int extract_flags, tchar *dest_dir,
+ size_t *num_cmds_ret)
{
struct wimlib_extract_command *cmds;
size_t num_cmds;
tchar *emptystr = T("");
- if (argc == 0) {
- argc = 1;
- argv = &emptystr;
+ if (num_paths == 0) {
+ num_paths = 1;
+ paths = &emptystr;
}
- num_cmds = argc;
+ num_cmds = num_paths;
cmds = calloc(num_cmds, sizeof(cmds[0]));
if (!cmds) {
imagex_error(T("Out of memory!"));
@@ -2126,18 +2149,18 @@ prepare_extract_commands(tchar **argv, int argc, int extract_flags,
for (size_t i = 0; i < num_cmds; i++) {
cmds[i].extract_flags = extract_flags;
- cmds[i].wim_source_path = argv[i];
- if (is_root_wim_path(argv[i])) {
+ cmds[i].wim_source_path = paths[i];
+ if (is_root_wim_path(paths[i])) {
cmds[i].fs_dest_path = dest_dir;
} else {
- size_t len = tstrlen(dest_dir) + 1 + tstrlen(argv[i]);
+ size_t len = tstrlen(dest_dir) + 1 + tstrlen(paths[i]);
cmds[i].fs_dest_path = malloc((len + 1) * sizeof(tchar));
if (!cmds[i].fs_dest_path) {
free_extract_commands(cmds, num_cmds, dest_dir);
return NULL;
}
tsprintf(cmds[i].fs_dest_path, T("%"TS"/%"TS), dest_dir,
- tbasename(argv[i]));
+ tbasename(paths[i]));
}
}
*num_cmds_ret = num_cmds;
@@ -2193,19 +2216,15 @@ imagex_extract(int argc, tchar **argv)
imagex_be_quiet = true;
break;
default:
- usage(EXTRACT);
- ret = -1;
- goto out;
+ goto out_usage;
}
}
argc -= optind;
argv += optind;
- if (argc < 2) {
- usage(EXTRACT);
- ret = -1;
- goto out;
- }
+ if (argc < 2)
+ goto out_usage;
+
wimfile = argv[0];
image_num_or_name = argv[1];
@@ -2242,7 +2261,7 @@ imagex_extract(int argc, tchar **argv)
win32_acquire_restore_privileges();
#endif
- ret = wimlib_extract_files(wim, image, 0, cmds, num_cmds,
+ ret = wimlib_extract_files(wim, image, cmds, num_cmds, 0,
additional_swms, num_additional_swms,
imagex_progress_func);
if (ret == 0) {
@@ -2267,6 +2286,10 @@ out_free_cmds:
free_extract_commands(cmds, num_cmds, dest_dir);
out:
return ret;
+out_usage:
+ usage(EXTRACT);
+ ret = -1;
+ goto out;
}
/* Prints information about a WIM file; also can mark an image as bootable,
@@ -2761,9 +2784,13 @@ imagex_optimize(int argc, tchar **argv)
wimfile = argv[0];
+ ret = file_writable(wimfile);
+ if (ret)
+ return ret;
+
ret = wimlib_open_wim(wimfile, open_flags, &w,
imagex_progress_func);
- if (ret != 0)
+ if (ret)
return ret;
old_size = file_get_size(argv[0]);
@@ -2892,9 +2919,9 @@ imagex_update(int argc, tchar **argv)
WIMStruct *wim;
int ret;
int open_flags = 0;
- int write_flags = WIMLIB_WRITE_FLAG_SOFT_DELETE;
+ int write_flags = 0;
int update_flags = 0;
- int default_add_flags = 0;
+ int default_add_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE;
int default_delete_flags = 0;
unsigned num_threads = 0;
int c;
@@ -2909,6 +2936,7 @@ imagex_update(int argc, tchar **argv)
for_opt(c, update_options) {
switch (c) {
+ /* Generic or write options */
case IMAGEX_THREADS_OPTION:
num_threads = parse_num_threads(optarg);
if (num_threads == UINT_MAX) {
@@ -2923,15 +2951,24 @@ imagex_update(int argc, tchar **argv)
case IMAGEX_REBUILD_OPTION:
write_flags |= WIMLIB_WRITE_FLAG_REBUILD;
break;
+
+ /* Default delete options */
case IMAGEX_FORCE_OPTION:
default_delete_flags |= WIMLIB_DELETE_FLAG_FORCE;
break;
case IMAGEX_RECURSIVE_OPTION:
default_delete_flags |= WIMLIB_DELETE_FLAG_RECURSIVE;
break;
+
+ /* Global add option */
case IMAGEX_CONFIG_OPTION:
config_file = optarg;
break;
+
+ /* Default add options */
+ case IMAGEX_VERBOSE_OPTION:
+ default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE;
+ break;
case IMAGEX_DEREFERENCE_OPTION:
default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE;
break;
@@ -2954,6 +2991,11 @@ imagex_update(int argc, tchar **argv)
if (argc < 1 || argc > 2)
goto out_usage;
wimfile = argv[0];
+
+ ret = file_writable(wimfile);
+ if (ret)
+ goto out;
+
ret = wimlib_open_wim(wimfile, open_flags, &wim, imagex_progress_func);
if (ret)
goto out;
@@ -2989,8 +3031,10 @@ imagex_update(int argc, tchar **argv)
}
/* Read update commands from standard input */
- if (isatty(STDIN_FILENO))
+ if (isatty(STDIN_FILENO)) {
tputs(T("Reading update commands from standard input..."));
+ recommend_man_page(T("update"));
+ }
cmd_file_contents = stdin_get_text_contents(&cmd_file_nchars);
if (!cmd_file_contents) {
ret = -1;
@@ -3078,7 +3122,7 @@ static const struct imagex_command imagex_commands[] = {
};
static void
-version()
+version(void)
{
static const tchar *s =
T(
@@ -3134,14 +3178,14 @@ usage(int cmd_type)
tprintf(T("Usage:\n%"TS), usage_strings[cmd_type]);
for_imagex_command(cmd) {
if (cmd->cmd == cmd_type) {
- tprintf(T("\nTry `man "IMAGEX_PROGNAME"-%"TS"' "
- "for more details.\n"), cmd->name);
+ tputc(T('\n'), stdout);
+ recommend_man_page(cmd->name);
}
}
}
static void
-usage_all()
+usage_all(void)
{
tfputs(T("Usage:\n"), stdout);
for (int i = 0; i < ARRAY_LEN(usage_strings); i++)
@@ -3153,9 +3197,9 @@ usage_all()
"\n"
" The compression TYPE may be \"maximum\", \"fast\", or \"none\".\n"
"\n"
-" Try `man "IMAGEX_PROGNAME"' for more information.\n"
);
tfputs(extra, stdout);
+ recommend_man_page(T(""));
}
/* Entry point for wimlib's ImageX implementation. On UNIX the command