X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=8a0b48df08cff51944c47a904c41643575a2b094;hb=37d9c3935130128901f6eee8d7531d8ae4b1bca6;hp=b21de01bdbcadfb80727fde8d5b378f2317c19a3;hpb=0945405bedb03d9929243e2eab30f6555de281ae;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index b21de01b..8a0b48df 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers + * Copyright (C) 2012-2016 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 @@ -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, @@ -182,7 +181,6 @@ enum { IMAGEX_RECOMPRESS_OPTION, IMAGEX_RECURSIVE_OPTION, IMAGEX_REF_OPTION, - IMAGEX_RESUME_OPTION, IMAGEX_RPFIX_OPTION, IMAGEX_SNAPSHOT_OPTION, IMAGEX_SOFT_OPTION, @@ -216,9 +214,6 @@ static const struct option apply_options[] = { {T("rpfix"), no_argument, NULL, IMAGEX_RPFIX_OPTION}, {T("norpfix"), no_argument, NULL, IMAGEX_NORPFIX_OPTION}, {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION}, - - /* --resume is undocumented for now as it needs improvement. */ - {T("resume"), no_argument, NULL, IMAGEX_RESUME_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, {T("compact"), required_argument, NULL, IMAGEX_COMPACT_OPTION}, {NULL, 0, NULL, 0}, @@ -230,14 +225,10 @@ 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("pack-streams"), no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, - {T("pack-compress"), required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, {T("solid-chunk-size"),required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, - {T("pack-chunk-size"), required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, {T("no-solid-sort"), no_argument, NULL, IMAGEX_NO_SOLID_SORT_OPTION}, {T("config"), required_argument, NULL, IMAGEX_CONFIG_OPTION}, {T("dereference"), no_argument, NULL, IMAGEX_DEREFERENCE_OPTION}, @@ -285,14 +276,10 @@ 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("pack-streams"),no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, - {T("pack-compress"), required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, {T("solid-chunk-size"),required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, - {T("pack-chunk-size"), required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, {T("no-solid-sort"), no_argument, NULL, IMAGEX_NO_SOLID_SORT_OPTION}, {T("ref"), required_argument, NULL, IMAGEX_REF_OPTION}, {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, @@ -334,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}, @@ -362,15 +348,10 @@ 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("pack-streams"),no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, - {T("pack-compress"), required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, {T("solid-chunk-size"),required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, - {T("pack-chunk-size"), required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, {T("no-solid-sort"), no_argument, NULL, IMAGEX_NO_SOLID_SORT_OPTION}, {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, {T("pipable"), no_argument, NULL, IMAGEX_PIPABLE_OPTION}, @@ -518,9 +499,9 @@ print_available_compression_types(FILE *fp) tfputs(s, fp); } -/* Parse the argument to --compress */ +/* Parse the argument to --compress or --solid-compress */ static int -get_compression_type(tchar *optarg) +get_compression_type(tchar *optarg, bool solid) { int ctype; unsigned int compression_level = 0; @@ -543,15 +524,27 @@ get_compression_type(tchar *optarg) if (!tstrcasecmp(optarg, T("maximum")) || !tstrcasecmp(optarg, T("lzx")) || - !tstrcasecmp(optarg, T("max"))) + !tstrcasecmp(optarg, T("max"))) { ctype = WIMLIB_COMPRESSION_TYPE_LZX; - else if (!tstrcasecmp(optarg, T("fast")) || !tstrcasecmp(optarg, T("xpress"))) + } else if (!tstrcasecmp(optarg, T("fast")) || !tstrcasecmp(optarg, T("xpress"))) { ctype = WIMLIB_COMPRESSION_TYPE_XPRESS; - else if (!tstrcasecmp(optarg, T("recovery")) || !tstrcasecmp(optarg, T("lzms"))) + } else if (!tstrcasecmp(optarg, T("recovery"))) { + if (!solid) { + tfprintf(stderr, +T( +"Warning: use of '--compress=recovery' is discouraged because it behaves\n" +" differently from DISM. Instead, you typically want to use '--solid' to\n" +" create a solid LZMS-compressed WIM or \"ESD file\", similar to DISM's\n" +" /compress:recovery. But if you really want *non-solid* LZMS compression,\n" +" then you may suppress this warning by specifying '--compress=lzms' instead\n" +" of '--compress=recovery'.\n")); + } + ctype = WIMLIB_COMPRESSION_TYPE_LZMS; + } else if (!tstrcasecmp(optarg, T("lzms"))) { ctype = WIMLIB_COMPRESSION_TYPE_LZMS; - else if (!tstrcasecmp(optarg, T("none"))) + } else if (!tstrcasecmp(optarg, T("none"))) { ctype = WIMLIB_COMPRESSION_TYPE_NONE; - else { + } else { imagex_error(T("Invalid compression type \"%"TS"\"!"), optarg); print_available_compression_types(stderr); return WIMLIB_COMPRESSION_TYPE_INVALID; @@ -593,78 +586,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; @@ -700,7 +683,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) { @@ -1671,7 +1654,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) { @@ -1682,7 +1665,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; @@ -1708,9 +1691,6 @@ imagex_apply(int argc, tchar **argv, int cmd) extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES; extract_flags |= WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS; break; - case IMAGEX_RESUME_OPTION: - extract_flags |= WIMLIB_EXTRACT_FLAG_RESUME; - break; case IMAGEX_WIMBOOT_OPTION: extract_flags |= WIMLIB_EXTRACT_FLAG_WIMBOOT; break; @@ -1832,7 +1812,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: @@ -1852,7 +1832,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; @@ -1861,10 +1842,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,13 +1886,10 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) add_flags &= ~WIMLIB_ADD_FLAG_WINCONFIG; break; case IMAGEX_COMPRESS_OPTION: - compression_type = get_compression_type(optarg); + compression_type = get_compression_type(optarg, false); 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) @@ -1923,7 +1901,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_SOLID_COMPRESS_OPTION: - solid_ctype = get_compression_type(optarg); + solid_ctype = get_compression_type(optarg, true); if (solid_ctype == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; @@ -1936,7 +1914,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; @@ -2009,7 +1987,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) "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; @@ -2133,7 +2111,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; } @@ -2401,8 +2379,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: @@ -2650,6 +2628,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) { @@ -2657,11 +2636,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_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); @@ -2696,6 +2693,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"), @@ -2737,7 +2741,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) { @@ -2751,7 +2755,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; @@ -2816,7 +2820,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: @@ -2848,7 +2852,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,14 +2871,10 @@ imagex_export(int argc, tchar **argv, int cmd) write_flags |= WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY; break; case IMAGEX_COMPRESS_OPTION: - compression_type = get_compression_type(optarg); + compression_type = get_compression_type(optarg, false); 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; @@ -2895,12 +2895,12 @@ imagex_export(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_SOLID_COMPRESS_OPTION: - solid_ctype = get_compression_type(optarg); + solid_ctype = get_compression_type(optarg, true); if (solid_ctype == WIMLIB_COMPRESSION_TYPE_INVALID) 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; @@ -3117,7 +3117,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: @@ -3144,7 +3144,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; @@ -3157,7 +3157,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; @@ -3305,7 +3305,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: @@ -3331,7 +3331,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; @@ -3365,10 +3365,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) @@ -3391,7 +3387,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; } @@ -3400,7 +3396,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; } @@ -3570,7 +3566,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: @@ -3642,7 +3638,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; @@ -3674,7 +3670,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; @@ -3742,7 +3738,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,14 +3777,10 @@ imagex_optimize(int argc, tchar **argv, int cmd) break; case IMAGEX_COMPRESS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - compression_type = get_compression_type(optarg); + compression_type = get_compression_type(optarg, false); 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; @@ -3803,7 +3795,7 @@ imagex_optimize(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_SOLID_COMPRESS_OPTION: - solid_ctype = get_compression_type(optarg); + solid_ctype = get_compression_type(optarg, true); if (solid_ctype == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; @@ -4265,13 +4257,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; @@ -4327,7 +4319,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: @@ -4518,7 +4510,7 @@ version(void) static const tchar *s = T( "wimlib-imagex (distributed with " PACKAGE " " PACKAGE_VERSION ")\n" -"Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers\n" +"Copyright (C) 2012-2016 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" @@ -4605,16 +4597,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;