]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
add System Compression support
[wimlib] / programs / imagex.c
index 762459e84ebc36cd42399c4308dea96b2d6604c1..556006f6e82b4ea61551c805aa6b2bd9b0919c48 100644 (file)
@@ -147,6 +147,7 @@ enum {
        IMAGEX_CHUNK_SIZE_OPTION,
        IMAGEX_COMMAND_OPTION,
        IMAGEX_COMMIT_OPTION,
        IMAGEX_CHUNK_SIZE_OPTION,
        IMAGEX_COMMAND_OPTION,
        IMAGEX_COMMIT_OPTION,
+       IMAGEX_COMPACT_OPTION,
        IMAGEX_COMPRESS_OPTION,
        IMAGEX_COMPRESS_SLOW_OPTION,
        IMAGEX_CONFIG_OPTION,
        IMAGEX_COMPRESS_OPTION,
        IMAGEX_COMPRESS_SLOW_OPTION,
        IMAGEX_CONFIG_OPTION,
@@ -216,6 +217,7 @@ static const struct option apply_options[] = {
        /* --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},
        /* --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},
 };
 
        {NULL, 0, NULL, 0},
 };
 
@@ -310,6 +312,7 @@ static const struct option extract_options[] = {
        {T("nullglob"),     no_argument,      NULL, IMAGEX_NULLGLOB_OPTION},
        {T("preserve-dir-structure"), no_argument, NULL, IMAGEX_PRESERVE_DIR_STRUCTURE_OPTION},
        {T("wimboot"),     no_argument,       NULL, IMAGEX_WIMBOOT_OPTION},
        {T("nullglob"),     no_argument,      NULL, IMAGEX_NULLGLOB_OPTION},
        {T("preserve-dir-structure"), no_argument, NULL, IMAGEX_PRESERVE_DIR_STRUCTURE_OPTION},
        {T("wimboot"),     no_argument,       NULL, IMAGEX_WIMBOOT_OPTION},
+       {T("compact"),     required_argument, NULL, IMAGEX_COMPACT_OPTION},
        {NULL, 0, NULL, 0},
 };
 
        {NULL, 0, NULL, 0},
 };
 
@@ -547,6 +550,37 @@ get_compression_type(tchar *optarg)
        return ctype;
 }
 
        return ctype;
 }
 
+/* Parse the argument to --compact */
+static int
+set_compact_mode(const tchar *arg, int *extract_flags)
+{
+       int flag = 0;
+       if (!tstrcasecmp(arg, T("xpress4k")))
+               flag = WIMLIB_EXTRACT_FLAG_COMPACT_XPRESS4K;
+       else if (!tstrcasecmp(arg, T("xpress8k")))
+               flag = WIMLIB_EXTRACT_FLAG_COMPACT_XPRESS8K;
+       else if (!tstrcasecmp(arg, T("xpress16k")))
+               flag = WIMLIB_EXTRACT_FLAG_COMPACT_XPRESS16K;
+       else if (!tstrcasecmp(arg, T("lzx")))
+               flag = WIMLIB_EXTRACT_FLAG_COMPACT_LZX;
+
+       if (flag) {
+               *extract_flags |= flag;
+               return 0;
+       }
+
+       imagex_error(T(
+"\"%"TS"\" is not a recognized System Compression format.  The options are:"
+"\n"
+"    --compact=xpress4k\n"
+"    --compact=xpress8k\n"
+"    --compact=xpress16k\n"
+"    --compact=lzx\n"
+       ), arg);
+       return -1;
+}
+
+
 static void
 set_compress_slow(void)
 {
 static void
 set_compress_slow(void)
 {
@@ -1181,7 +1215,7 @@ imagex_progress_func(enum wimlib_progress_msg msg,
                percent_done = TO_PERCENT(info->extract.completed_bytes,
                                          info->extract.total_bytes);
                unit_shift = get_unit(info->extract.total_bytes, &unit_name);
                percent_done = TO_PERCENT(info->extract.completed_bytes,
                                          info->extract.total_bytes);
                unit_shift = get_unit(info->extract.total_bytes, &unit_name);
-               imagex_printf(T("\rExtracting files: "
+               imagex_printf(T("\rExtracting file data: "
                          "%"PRIu64" %"TS" of %"PRIu64" %"TS" (%u%%) done"),
                        info->extract.completed_bytes >> unit_shift,
                        unit_name,
                          "%"PRIu64" %"TS" of %"PRIu64" %"TS" (%u%%) done"),
                        info->extract.completed_bytes >> unit_shift,
                        unit_name,
@@ -1611,6 +1645,11 @@ imagex_apply(int argc, tchar **argv, int cmd)
                case IMAGEX_WIMBOOT_OPTION:
                        extract_flags |= WIMLIB_EXTRACT_FLAG_WIMBOOT;
                        break;
                case IMAGEX_WIMBOOT_OPTION:
                        extract_flags |= WIMLIB_EXTRACT_FLAG_WIMBOOT;
                        break;
+               case IMAGEX_COMPACT_OPTION:
+                       ret = set_compact_mode(optarg, &extract_flags);
+                       if (ret)
+                               goto out_free_refglobs;
+                       break;
                default:
                        goto out_usage;
                }
                default:
                        goto out_usage;
                }
@@ -2435,26 +2474,26 @@ print_wim_information(const tchar *wimfile, const struct wimlib_wim_info *info)
        attr_string[0] = T('\0');
 
        if (info->pipable)
        attr_string[0] = T('\0');
 
        if (info->pipable)
-               tstrcat(attr_string, "Pipable, ");
+               tstrcat(attr_string, T("Pipable, "));
 
        if (info->has_integrity_table)
 
        if (info->has_integrity_table)
-               tstrcat(attr_string, "Integrity info, ");
+               tstrcat(attr_string, T("Integrity info, "));
 
        if (info->has_rpfix)
 
        if (info->has_rpfix)
-               tstrcat(attr_string, "Relative path junction, ");
+               tstrcat(attr_string, T("Relative path junction, "));
 
        if (info->resource_only)
 
        if (info->resource_only)
-               tstrcat(attr_string, "Resource only, ");
+               tstrcat(attr_string, T("Resource only, "));
 
        if (info->metadata_only)
 
        if (info->metadata_only)
-               tstrcat(attr_string, "Metadata only, ");
+               tstrcat(attr_string, T("Metadata only, "));
 
        if (info->is_marked_readonly)
 
        if (info->is_marked_readonly)
-               tstrcat(attr_string, "Readonly, ");
+               tstrcat(attr_string, T("Readonly, "));
 
 
-       p = tstrchr(attr_string, '\0');
+       p = tstrchr(attr_string, T('\0'));
        if (p >= &attr_string[2] && p[-1] == T(' ') && p[-2] == T(','))
        if (p >= &attr_string[2] && p[-1] == T(' ') && p[-2] == T(','))
-               p[-2] = '\0';
+               p[-2] = T('\0');
 
        tprintf(T("Attributes:     %"TS"\n\n"), attr_string);
 }
 
        tprintf(T("Attributes:     %"TS"\n\n"), attr_string);
 }
@@ -3029,6 +3068,11 @@ imagex_extract(int argc, tchar **argv, int cmd)
                case IMAGEX_WIMBOOT_OPTION:
                        extract_flags |= WIMLIB_EXTRACT_FLAG_WIMBOOT;
                        break;
                case IMAGEX_WIMBOOT_OPTION:
                        extract_flags |= WIMLIB_EXTRACT_FLAG_WIMBOOT;
                        break;
+               case IMAGEX_COMPACT_OPTION:
+                       ret = set_compact_mode(optarg, &extract_flags);
+                       if (ret)
+                               goto out_free_refglobs;
+                       break;
                default:
                        goto out_usage;
                }
                default:
                        goto out_usage;
                }
@@ -4212,6 +4256,7 @@ T(
 "                    [--check] [--ref=\"GLOB\"] [--no-acls] [--strict-acls]\n"
 "                    [--no-attributes] [--rpfix] [--norpfix]\n"
 "                    [--include-invalid-names] [--wimboot] [--unix-data]\n"
 "                    [--check] [--ref=\"GLOB\"] [--no-acls] [--strict-acls]\n"
 "                    [--no-attributes] [--rpfix] [--norpfix]\n"
 "                    [--include-invalid-names] [--wimboot] [--unix-data]\n"
+"                    [--compact=FORMAT]\n"
 ),
 [CMD_CAPTURE] =
 T(
 ),
 [CMD_CAPTURE] =
 T(