X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=programs%2Fimagex.c;h=e62757b897153c3fbdb72d2d808b0d7de0ff9950;hp=fdd35c8072b089b19b6793da3d16a78ad60a3cb0;hb=533c97bba23794f9bd014626dd1ba2477c628919;hpb=4b1e717ade0d3a519f84b950f33d8cd14a30b698 diff --git a/programs/imagex.c b/programs/imagex.c index fdd35c80..e62757b8 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2012-2016 Eric Biggers + * Copyright (C) 2012-2017 Eric Biggers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -131,7 +131,7 @@ enum { static void usage(int cmd, FILE *fp); static void usage_all(FILE *fp); static void recommend_man_page(int cmd, FILE *fp); -static const tchar *get_cmd_string(int cmd, bool nospace); +static const tchar *get_cmd_string(int cmd, bool only_short_form); static bool imagex_be_quiet = false; static FILE *imagex_info_file; @@ -149,7 +149,6 @@ enum { IMAGEX_COMMIT_OPTION, IMAGEX_COMPACT_OPTION, IMAGEX_COMPRESS_OPTION, - IMAGEX_COMPRESS_SLOW_OPTION, IMAGEX_CONFIG_OPTION, IMAGEX_DEBUG_OPTION, IMAGEX_DELTA_FROM_OPTION, @@ -226,7 +225,6 @@ static const struct option capture_or_append_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("nocheck"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, - {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, @@ -278,7 +276,6 @@ static const struct option export_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION}, - {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, @@ -324,7 +321,6 @@ static const struct option info_options[] = { {T("header"), no_argument, NULL, IMAGEX_HEADER_OPTION}, {T("lookup-table"), no_argument, NULL, IMAGEX_BLOBS_OPTION}, {T("blobs"), no_argument, NULL, IMAGEX_BLOBS_OPTION}, - {T("metadata"), no_argument, NULL, IMAGEX_METADATA_OPTION}, {T("xml"), no_argument, NULL, IMAGEX_XML_OPTION}, {T("image-property"), required_argument, NULL, IMAGEX_IMAGE_PROPERTY_OPTION}, {NULL, 0, NULL, 0}, @@ -335,6 +331,7 @@ static const struct option join_options[] = { {NULL, 0, NULL, 0}, }; +#if WIM_MOUNTING_SUPPORTED static const struct option mount_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("debug"), no_argument, NULL, IMAGEX_DEBUG_OPTION}, @@ -345,6 +342,7 @@ static const struct option mount_options[] = { {T("allow-other"), no_argument, NULL, IMAGEX_ALLOW_OTHER_OPTION}, {NULL, 0, NULL, 0}, }; +#endif static const struct option optimize_options[] = { {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, @@ -352,8 +350,6 @@ static const struct option optimize_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION}, - {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, - {T("recompress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, @@ -371,6 +367,7 @@ static const struct option split_options[] = { {NULL, 0, NULL, 0}, }; +#if WIM_MOUNTING_SUPPORTED static const struct option unmount_options[] = { {T("commit"), no_argument, NULL, IMAGEX_COMMIT_OPTION}, {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, @@ -380,6 +377,7 @@ static const struct option unmount_options[] = { {T("new-image"), no_argument, NULL, IMAGEX_NEW_IMAGE_OPTION}, {NULL, 0, NULL, 0}, }; +#endif static const struct option update_options[] = { /* Careful: some of the options here set the defaults for update @@ -492,7 +490,7 @@ verify_image_exists_and_is_single(int image, const tchar *image_name, static void print_available_compression_types(FILE *fp) { - static const tchar *s = + static const tchar * const s = T( "Available compression types:\n" "\n" @@ -592,78 +590,68 @@ set_compact_mode(const tchar *arg, int *extract_flags) } -static void -set_compress_slow(void) -{ -#if 0 - fprintf(stderr, "WARNING: the '--compress-slow' option is deprecated.\n" - " Use the '--compress=TYPE:LEVEL' option instead.\n"); -#endif - wimlib_set_default_compression_level(-1, 100); -} - -struct string_set { +struct string_list { tchar **strings; unsigned num_strings; unsigned num_alloc_strings; }; -#define STRING_SET_INITIALIZER \ +#define STRING_LIST_INITIALIZER \ { .strings = NULL, .num_strings = 0, .num_alloc_strings = 0, } -#define STRING_SET(_strings) \ - struct string_set _strings = STRING_SET_INITIALIZER +#define STRING_LIST(_strings) \ + struct string_list _strings = STRING_LIST_INITIALIZER static int -string_set_append(struct string_set *set, tchar *glob) +string_list_append(struct string_list *list, tchar *glob) { - unsigned num_alloc_strings = set->num_alloc_strings; + unsigned num_alloc_strings = list->num_alloc_strings; - if (set->num_strings == num_alloc_strings) { + if (list->num_strings == num_alloc_strings) { tchar **new_strings; num_alloc_strings += 4; - new_strings = realloc(set->strings, - sizeof(set->strings[0]) * num_alloc_strings); + new_strings = realloc(list->strings, + sizeof(list->strings[0]) * num_alloc_strings); if (!new_strings) { imagex_error(T("Out of memory!")); return -1; } - set->strings = new_strings; - set->num_alloc_strings = num_alloc_strings; + list->strings = new_strings; + list->num_alloc_strings = num_alloc_strings; } - set->strings[set->num_strings++] = glob; + list->strings[list->num_strings++] = glob; return 0; } static void -string_set_destroy(struct string_set *set) +string_list_destroy(struct string_list *list) { - free(set->strings); + free(list->strings); } static int -wim_reference_globs(WIMStruct *wim, struct string_set *set, int open_flags) +wim_reference_globs(WIMStruct *wim, struct string_list *list, int open_flags) { - return wimlib_reference_resource_files(wim, (const tchar **)set->strings, - set->num_strings, + return wimlib_reference_resource_files(wim, (const tchar **)list->strings, + list->num_strings, WIMLIB_REF_FLAG_GLOB_ENABLE, open_flags); } static int -append_image_property_argument(struct string_set *image_properties) +append_image_property_argument(struct string_list *image_properties) { if (!tstrchr(optarg, '=')) { imagex_error(T("'--image-property' argument " "must be in the form NAME=VALUE")); return -1; } - return string_set_append(image_properties, optarg); + return string_list_append(image_properties, optarg); } static int -apply_image_properties(struct string_set *image_properties, +apply_image_properties(struct string_list *image_properties, WIMStruct *wim, int image, bool *any_changes_ret) { bool any_changes = false; @@ -699,7 +687,7 @@ apply_image_properties(struct string_set *image_properties, static void do_resource_not_found_warning(const tchar *wimfile, const struct wimlib_wim_info *info, - const struct string_set *refglobs) + const struct string_list *refglobs) { if (info->total_parts > 1) { if (refglobs->num_strings == 0) { @@ -1670,7 +1658,7 @@ imagex_apply(int argc, tchar **argv, int cmd) const tchar *image_num_or_name = NULL; int extract_flags = 0; - STRING_SET(refglobs); + STRING_LIST(refglobs); for_opt(c, apply_options) { switch (c) { @@ -1681,7 +1669,7 @@ imagex_apply(int argc, tchar **argv, int cmd) /* No longer does anything. */ break; case IMAGEX_REF_OPTION: - ret = string_set_append(&refglobs, optarg); + ret = string_list_append(&refglobs, optarg); if (ret) goto out_free_refglobs; break; @@ -1828,7 +1816,7 @@ imagex_apply(int argc, tchar **argv, int cmd) out_wimlib_free: wimlib_free(wim); out_free_refglobs: - string_set_destroy(&refglobs); + string_list_destroy(&refglobs); return ret; out_usage: @@ -1848,7 +1836,8 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) int open_flags = 0; int add_flags = WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE | WIMLIB_ADD_FLAG_WINCONFIG | - WIMLIB_ADD_FLAG_VERBOSE; + WIMLIB_ADD_FLAG_VERBOSE | + WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED; int write_flags = 0; int compression_type = WIMLIB_COMPRESSION_TYPE_INVALID; uint32_t chunk_size = UINT32_MAX; @@ -1857,10 +1846,10 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) const tchar *wimfile; int wim_fd; const tchar *name; - STRING_SET(image_properties); + STRING_LIST(image_properties); WIMStruct *wim; - STRING_SET(base_wimfiles); + STRING_LIST(base_wimfiles); WIMStruct **base_wims; WIMStruct *template_wim; @@ -1905,9 +1894,6 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; - case IMAGEX_COMPRESS_SLOW_OPTION: - set_compress_slow(); - break; case IMAGEX_CHUNK_SIZE_OPTION: chunk_size = parse_chunk_size(optarg); if (chunk_size == UINT32_MAX) @@ -1932,7 +1918,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) case IMAGEX_FLAGS_OPTION: { tchar *p = alloca((6 + tstrlen(optarg) + 1) * sizeof(tchar)); tsprintf(p, T("FLAGS=%"TS), optarg); - ret = string_set_append(&image_properties, p); + ret = string_list_append(&image_properties, p); if (ret) goto out; break; @@ -2000,12 +1986,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) } break; case IMAGEX_DELTA_FROM_OPTION: - if (cmd != CMD_CAPTURE) { - imagex_error(T("'--delta-from' is only " - "valid for capture!")); - goto out_usage; - } - ret = string_set_append(&base_wimfiles, optarg); + ret = string_list_append(&base_wimfiles, optarg); if (ret) goto out; write_flags |= WIMLIB_WRITE_FLAG_SKIP_EXTERNAL_WIMS; @@ -2129,7 +2110,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) if (argc >= 4) { tchar *p = alloca((12 + tstrlen(argv[3]) + 1) * sizeof(tchar)); tsprintf(p, T("DESCRIPTION=%"TS), argv[3]); - ret = string_set_append(&image_properties, p); + ret = string_list_append(&image_properties, p); if (ret) goto out; } @@ -2397,8 +2378,8 @@ out_free_capture_sources: out_free_source_list_contents: free(source_list_contents); out: - string_set_destroy(&image_properties); - string_set_destroy(&base_wimfiles); + string_list_destroy(&image_properties); + string_list_destroy(&base_wimfiles); return ret; out_usage: @@ -2646,6 +2627,7 @@ print_blobs(WIMStruct *wim) wimlib_iterate_lookup_table(wim, 0, print_resource, NULL); } +#ifndef __WIN32__ static void default_print_security_descriptor(const uint8_t *sd, size_t size) { @@ -2653,11 +2635,29 @@ default_print_security_descriptor(const uint8_t *sd, size_t size) print_byte_field(sd, size); tputchar(T('\n')); } +#endif + +static bool +is_null_guid(const uint8_t *guid) +{ + static const uint8_t null_guid[WIMLIB_GUID_LEN]; + + return !memcmp(guid, null_guid, WIMLIB_GUID_LEN); +} static void -print_dentry_detailed(const struct wimlib_dir_entry *dentry) +print_guid(const tchar *label, const uint8_t *guid) { + if (is_null_guid(guid)) + return; + tprintf(T("%-20"TS"= 0x"), label); + print_byte_field(guid, WIMLIB_GUID_LEN); + tputchar(T('\n')); +} +static void +print_dentry_detailed(const struct wimlib_dir_entry *dentry) +{ tprintf(T( "----------------------------------------------------------------------------\n")); tprintf(T("Full Path = \"%"TS"\"\n"), dentry->full_path); @@ -2692,6 +2692,13 @@ print_dentry_detailed(const struct wimlib_dir_entry *dentry) dentry->unix_mode, dentry->unix_rdev); } + if (!is_null_guid(dentry->object_id.object_id)) { + print_guid(T("Object ID"), dentry->object_id.object_id); + print_guid(T("Birth Volume ID"), dentry->object_id.birth_volume_id); + print_guid(T("Birth Object ID"), dentry->object_id.birth_object_id); + print_guid(T("Domain ID"), dentry->object_id.domain_id); + } + for (uint32_t i = 0; i <= dentry->num_named_streams; i++) { if (dentry->streams[i].stream_name) { tprintf(T("\tNamed data stream \"%"TS"\":\n"), @@ -2733,7 +2740,7 @@ imagex_dir(int argc, tchar **argv, int cmd) }; int iterate_flags = WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE; - STRING_SET(refglobs); + STRING_LIST(refglobs); for_opt(c, dir_options) { switch (c) { @@ -2747,7 +2754,7 @@ imagex_dir(int argc, tchar **argv, int cmd) iterate_flags &= ~WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE; break; case IMAGEX_REF_OPTION: - ret = string_set_append(&refglobs, optarg); + ret = string_list_append(&refglobs, optarg); if (ret) goto out_free_refglobs; break; @@ -2812,7 +2819,7 @@ imagex_dir(int argc, tchar **argv, int cmd) out_wimlib_free: wimlib_free(wim); out_free_refglobs: - string_set_destroy(&refglobs); + string_list_destroy(&refglobs); return ret; out_usage: @@ -2844,7 +2851,7 @@ imagex_export(int argc, tchar **argv, int cmd) int image; struct stat stbuf; bool wim_is_new; - STRING_SET(refglobs); + STRING_LIST(refglobs); unsigned num_threads = 0; uint32_t chunk_size = UINT32_MAX; uint32_t solid_chunk_size = UINT32_MAX; @@ -2867,10 +2874,6 @@ imagex_export(int argc, tchar **argv, int cmd) if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; - case IMAGEX_COMPRESS_SLOW_OPTION: - set_compress_slow(); - write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - break; case IMAGEX_RECOMPRESS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; break; @@ -2896,7 +2899,7 @@ imagex_export(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_REF_OPTION: - ret = string_set_append(&refglobs, optarg); + ret = string_list_append(&refglobs, optarg); if (ret) goto out_free_refglobs; break; @@ -2968,9 +2971,9 @@ imagex_export(int argc, tchar **argv, int cmd) wim_is_new = false; /* Destination file exists. */ - if (!S_ISREG(stbuf.st_mode)) { - imagex_error(T("\"%"TS"\" is not a regular file"), - dest_wimfile); + if (!S_ISREG(stbuf.st_mode) && !S_ISBLK(stbuf.st_mode)) { + imagex_error(T("\"%"TS"\" is not a regular file " + "or block device"), dest_wimfile); ret = -1; goto out_free_src_wim; } @@ -3113,7 +3116,7 @@ out_free_dest_wim: out_free_src_wim: wimlib_free(src_wim); out_free_refglobs: - string_set_destroy(&refglobs); + string_list_destroy(&refglobs); return ret; out_usage: @@ -3140,7 +3143,7 @@ imagex_extract(int argc, tchar **argv, int cmd) WIMLIB_EXTRACT_FLAG_STRICT_GLOB; int notlist_extract_flags = WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE; - STRING_SET(refglobs); + STRING_LIST(refglobs); tchar *root_path = WIMLIB_WIM_ROOT_PATH; @@ -3153,7 +3156,7 @@ imagex_extract(int argc, tchar **argv, int cmd) /* No longer does anything. */ break; case IMAGEX_REF_OPTION: - ret = string_set_append(&refglobs, optarg); + ret = string_list_append(&refglobs, optarg); if (ret) goto out_free_refglobs; break; @@ -3301,7 +3304,7 @@ imagex_extract(int argc, tchar **argv, int cmd) out_wimlib_free: wimlib_free(wim); out_free_refglobs: - string_set_destroy(&refglobs); + string_list_destroy(&refglobs); return ret; out_usage: @@ -3327,7 +3330,7 @@ imagex_info(int argc, tchar **argv, int cmd) const tchar *xml_out_file = NULL; const tchar *wimfile; const tchar *image_num_or_name; - STRING_SET(image_properties); + STRING_LIST(image_properties); WIMStruct *wim; int image; int ret; @@ -3361,10 +3364,6 @@ imagex_info(int argc, tchar **argv, int cmd) xml_out_file = optarg; short_header = false; break; - case IMAGEX_METADATA_OPTION: - imagex_error(T("The --metadata option has been removed. " - "Use 'wimdir --detail' instead.")); - goto out_err; case IMAGEX_IMAGE_PROPERTY_OPTION: ret = append_image_property_argument(&image_properties); if (ret) @@ -3387,7 +3386,7 @@ imagex_info(int argc, tchar **argv, int cmd) /* NEW_NAME */ tchar *p = alloca((5 + tstrlen(argv[2]) + 1) * sizeof(tchar)); tsprintf(p, T("NAME=%"TS), argv[2]); - ret = string_set_append(&image_properties, p); + ret = string_list_append(&image_properties, p); if (ret) goto out; } @@ -3396,7 +3395,7 @@ imagex_info(int argc, tchar **argv, int cmd) /* NEW_DESC */ tchar *p = alloca((12 + tstrlen(argv[3]) + 1) * sizeof(tchar)); tsprintf(p, T("DESCRIPTION=%"TS), argv[3]); - ret = string_set_append(&image_properties, p); + ret = string_list_append(&image_properties, p); if (ret) goto out; } @@ -3566,7 +3565,7 @@ imagex_info(int argc, tchar **argv, int cmd) out_wimlib_free: wimlib_free(wim); out: - string_set_destroy(&image_properties); + string_list_destroy(&image_properties); return ret; out_usage: @@ -3638,7 +3637,7 @@ imagex_mount_rw_or_ro(int argc, tchar **argv, int cmd) int image; int ret; - STRING_SET(refglobs); + STRING_LIST(refglobs); if (cmd == CMD_MOUNTRW) { mount_flags |= WIMLIB_MOUNT_FLAG_READWRITE; @@ -3670,7 +3669,7 @@ imagex_mount_rw_or_ro(int argc, tchar **argv, int cmd) } break; case IMAGEX_REF_OPTION: - ret = string_set_append(&refglobs, optarg); + ret = string_list_append(&refglobs, optarg); if (ret) goto out_free_refglobs; break; @@ -3738,7 +3737,7 @@ imagex_mount_rw_or_ro(int argc, tchar **argv, int cmd) out_free_wim: wimlib_free(wim); out_free_refglobs: - string_set_destroy(&refglobs); + string_list_destroy(&refglobs); return ret; out_usage: @@ -3781,10 +3780,6 @@ imagex_optimize(int argc, tchar **argv, int cmd) if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; - case IMAGEX_COMPRESS_SLOW_OPTION: - set_compress_slow(); - write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - break; case IMAGEX_RECOMPRESS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; break; @@ -4261,13 +4256,13 @@ imagex_verify(int argc, tchar **argv, int cmd) WIMStruct *wim; int open_flags = WIMLIB_OPEN_FLAG_CHECK_INTEGRITY; int verify_flags = 0; - STRING_SET(refglobs); + STRING_LIST(refglobs); int c; for_opt(c, verify_options) { switch (c) { case IMAGEX_REF_OPTION: - ret = string_set_append(&refglobs, optarg); + ret = string_list_append(&refglobs, optarg); if (ret) goto out_free_refglobs; break; @@ -4323,7 +4318,7 @@ imagex_verify(int argc, tchar **argv, int cmd) out_wimlib_free: wimlib_free(wim); out_free_refglobs: - string_set_destroy(&refglobs); + string_list_destroy(&refglobs); return ret; out_usage: @@ -4378,14 +4373,15 @@ static const struct imagex_command imagex_commands[] = { #endif -static const tchar *usage_strings[] = { +static const tchar * const usage_strings[] = { [CMD_APPEND] = T( " %"TS" " SOURCE_STR " WIMFILE [IMAGE_NAME [IMAGE_DESC]]\n" " [--boot] [--check] [--nocheck] [--config=FILE]\n" " [--threads=NUM_THREADS] [--no-acls] [--strict-acls]\n" " [--rpfix] [--norpfix] [--update-of=[WIMFILE:]IMAGE]\n" -" [--wimboot] [--unix-data] [--dereference] [--snapshot]\n" +" [--delta-from=WIMFILE] [--wimboot] [--unix-data]\n" +" [--dereference] [--snapshot]\n" ), [CMD_APPLY] = T( @@ -4411,7 +4407,7 @@ T( ), [CMD_DIR] = T( -" %"TS" WIMFILE IMAGE [--path=PATH] [--detailed]\n" +" %"TS" WIMFILE [IMAGE] [--path=PATH] [--detailed]\n" ), [CMD_EXPORT] = T( @@ -4489,21 +4485,18 @@ T( static const tchar *invocation_name; static int invocation_cmd = CMD_NONE; -static const tchar *get_cmd_string(int cmd, bool nospace) +static const tchar *get_cmd_string(int cmd, bool only_short_form) { static tchar buf[50]; - if (cmd == CMD_NONE) { + + if (cmd == CMD_NONE) return T("wimlib-imagex"); - } else if (invocation_cmd != CMD_NONE) { + + if (only_short_form || invocation_cmd != CMD_NONE) { tsprintf(buf, T("wim%"TS), imagex_commands[cmd].name); } else { - const tchar *format; - - if (nospace) - format = T("%"TS"-%"TS""); - else - format = T("%"TS" %"TS""); - tsprintf(buf, format, invocation_name, imagex_commands[cmd].name); + tsprintf(buf, T("%"TS" %"TS), invocation_name, + imagex_commands[cmd].name); } return buf; } @@ -4511,10 +4504,10 @@ static const tchar *get_cmd_string(int cmd, bool nospace) static void version(void) { - static const tchar *s = + static const tchar * const s = T( "wimlib-imagex (distributed with " PACKAGE " " PACKAGE_VERSION ")\n" -"Copyright (C) 2012-2016 Eric Biggers\n" +"Copyright (C) 2012-2017 Eric Biggers\n" "License GPLv3+; GNU GPL version 3 or later .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" @@ -4563,8 +4556,7 @@ recommend_man_page(int cmd, FILE *fp) format_str = T("Some uncommon options are not listed;\n" "See %"TS".pdf in the doc directory for more details.\n"); #else - format_str = T("Some uncommon options are not listed;\n" - "Try `man %"TS"' for more details.\n"); + format_str = T("Some uncommon options are not listed; see `man %"TS"' for more details.\n"); #endif tfprintf(fp, format_str, get_cmd_string(cmd, true)); } @@ -4586,7 +4578,7 @@ usage_all(FILE *fp) print_usage_string(cmd, fp); tfprintf(fp, T("\n")); } - static const tchar *extra = + static const tchar * const extra = T( " %"TS" --help\n" " %"TS" --version\n" @@ -4601,16 +4593,17 @@ usage_all(FILE *fp) recommend_man_page(CMD_NONE, fp); } +#ifdef __WIN32__ +extern int wmain(int argc, wchar_t **argv); +#define main wmain +#endif + /* Entry point for wimlib's ImageX implementation. On UNIX the command * arguments will just be 'char' strings (ideally UTF-8 encoded, but could be * something else), while on Windows the command arguments will be UTF-16LE * encoded 'wchar_t' strings. */ int -#ifdef __WIN32__ -wmain(int argc, wchar_t **argv, wchar_t **envp) -#else -main(int argc, char **argv) -#endif +main(int argc, tchar **argv) { int ret; int init_flags = 0; @@ -4619,31 +4612,6 @@ main(int argc, char **argv) imagex_info_file = stdout; invocation_name = tbasename(argv[0]); -#ifndef __WIN32__ - if (getenv("WIMLIB_IMAGEX_USE_UTF8")) { - init_flags |= WIMLIB_INIT_FLAG_ASSUME_UTF8; - } else { - char *codeset; - - setlocale(LC_ALL, ""); - codeset = nl_langinfo(CODESET); - if (!strstr(codeset, "UTF-8") && - !strstr(codeset, "UTF8") && - !strstr(codeset, "utf-8") && - !strstr(codeset, "utf8")) - { - fprintf(stderr, -"WARNING: Running %"TS" in a UTF-8 locale is recommended!\n" -" Maybe try: `export LANG=en_US.UTF-8'?\n" -" Alternatively, set the environmental variable WIMLIB_IMAGEX_USE_UTF8\n" -" to any value to force wimlib to use UTF-8.\n", - invocation_name); - - } - } - -#endif /* !__WIN32__ */ - { tchar *igcase = tgetenv(T("WIMLIB_IMAGEX_IGNORE_CASE")); if (igcase != NULL) {