]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
wimexport: Add --wimboot flag
[wimlib] / programs / imagex.c
index 32f24c3884b451147509d36722b3a302ed0e8847..3501f4c861f88c4404ba33134002af66d4ba5a7e 100644 (file)
@@ -157,7 +157,6 @@ enum {
        IMAGEX_EXTRACT_XML_OPTION,
        IMAGEX_FLAGS_OPTION,
        IMAGEX_FORCE_OPTION,
-       IMAGEX_HARDLINK_OPTION,
        IMAGEX_HEADER_OPTION,
        IMAGEX_INCLUDE_INVALID_NAMES_OPTION,
        IMAGEX_LAZY_OPTION,
@@ -190,7 +189,6 @@ enum {
        IMAGEX_STAGING_DIR_OPTION,
        IMAGEX_STREAMS_INTERFACE_OPTION,
        IMAGEX_STRICT_ACLS_OPTION,
-       IMAGEX_SYMLINK_OPTION,
        IMAGEX_THREADS_OPTION,
        IMAGEX_TO_STDOUT_OPTION,
        IMAGEX_UNIX_DATA_OPTION,
@@ -203,8 +201,6 @@ enum {
 
 static const struct option apply_options[] = {
        {T("check"),       no_argument,       NULL, IMAGEX_CHECK_OPTION},
-       {T("hardlink"),    no_argument,       NULL, IMAGEX_HARDLINK_OPTION},
-       {T("symlink"),     no_argument,       NULL, IMAGEX_SYMLINK_OPTION},
        {T("verbose"),     no_argument,       NULL, IMAGEX_VERBOSE_OPTION},
        {T("ref"),         required_argument, NULL, IMAGEX_REF_OPTION},
        {T("unix-data"),   no_argument,       NULL, IMAGEX_UNIX_DATA_OPTION},
@@ -289,6 +285,7 @@ static const struct option export_options[] = {
        {T("rebuild"),     no_argument,       NULL, IMAGEX_REBUILD_OPTION},
        {T("pipable"),     no_argument,       NULL, IMAGEX_PIPABLE_OPTION},
        {T("not-pipable"), no_argument,       NULL, IMAGEX_NOT_PIPABLE_OPTION},
+       {T("wimboot"),     no_argument,       NULL, IMAGEX_WIMBOOT_OPTION},
        {NULL, 0, NULL, 0},
 };
 
@@ -479,7 +476,9 @@ verify_image_exists_and_is_single(int image, const tchar *image_name,
 static int
 get_compression_type(const tchar *optarg)
 {
-       if (!tstrcasecmp(optarg, T("maximum")) || !tstrcasecmp(optarg, T("lzx")))
+       if (!tstrcasecmp(optarg, T("maximum")) ||
+           !tstrcasecmp(optarg, T("lzx")) ||
+           !tstrcasecmp(optarg, T("max")))
                return WIMLIB_COMPRESSION_TYPE_LZX;
        else if (!tstrcasecmp(optarg, T("fast")) || !tstrcasecmp(optarg, T("xpress")))
                return WIMLIB_COMPRESSION_TYPE_XPRESS;
@@ -1157,15 +1156,6 @@ imagex_progress_func(enum wimlib_progress_msg msg,
                                      info->extract.total_parts);
                }
                break;
-       case WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS:
-               imagex_printf(T("Setting timestamps on all extracted files...\n"));
-               break;
-       case WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END:
-               if (info->extract.extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
-                       imagex_printf(T("Unmounting NTFS volume \"%"TS"\"...\n"),
-                               info->extract.target);
-               }
-               break;
        case WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART:
                percent_done = TO_PERCENT(info->split.completed_bytes,
                                          info->split.total_bytes);
@@ -1208,6 +1198,10 @@ imagex_progress_func(enum wimlib_progress_msg msg,
                imagex_printf(T("Updating \"%"TS"\" in WIM image\n"),
                              info->replace.path_in_wim);
                break;
+       case WIMLIB_PROGRESS_MSG_WIMBOOT_EXCLUDE:
+               imagex_printf(T("\nExtracting \"%"TS"\" as normal file (not WIMBoot pointer)\n"),
+                             info->wimboot_exclude.path_in_wim);
+               break;
        default:
                break;
        }
@@ -1452,7 +1446,7 @@ parse_update_command_file(tchar **cmd_file_contents_p, size_t cmd_file_nchars,
 }
 
 /* Apply one image, or all images, from a WIM file to a directory, OR apply
- * one image from a WIM file to a NTFS volume.  */
+ * one image from a WIM file to an NTFS volume.  */
 static int
 imagex_apply(int argc, tchar **argv, int cmd)
 {
@@ -1474,12 +1468,6 @@ imagex_apply(int argc, tchar **argv, int cmd)
                case IMAGEX_CHECK_OPTION:
                        open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY;
                        break;
-               case IMAGEX_HARDLINK_OPTION:
-                       extract_flags |= WIMLIB_EXTRACT_FLAG_HARDLINK;
-                       break;
-               case IMAGEX_SYMLINK_OPTION:
-                       extract_flags |= WIMLIB_EXTRACT_FLAG_SYMLINK;
-                       break;
                case IMAGEX_VERBOSE_OPTION:
                        /* No longer does anything.  */
                        break;
@@ -1582,7 +1570,7 @@ imagex_apply(int argc, tchar **argv, int cmd)
 
 #ifndef __WIN32__
        {
-               /* Interpret a regular file or block device target as a NTFS
+               /* Interpret a regular file or block device target as an NTFS
                 * volume.  */
                struct stat stbuf;
 
@@ -1816,9 +1804,19 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
 
 
        if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) {
+               /* No compression type specified.  Use the default.  */
+
                if (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_WIMBOOT) {
+                       /* With --wimboot, default to XPRESS compression.  */
                        compression_type = WIMLIB_COMPRESSION_TYPE_XPRESS;
+               } else if (write_flags & WIMLIB_WRITE_FLAG_PACK_STREAMS) {
+                       /* With --pack-streams or --solid, default to LZMS
+                        * compression.  (However, this will not affect packed
+                        * resources!)  */
+                       compression_type = WIMLIB_COMPRESSION_TYPE_LZMS;
                } else {
+                       /* Otherwise, default to LZX compression in fast mode.
+                        */
                        compression_type = WIMLIB_COMPRESSION_TYPE_LZX;
                        if (!compress_slow && pack_ctype != WIMLIB_COMPRESSION_TYPE_LZX) {
                                struct wimlib_lzx_compressor_params params = {
@@ -2540,7 +2538,7 @@ imagex_export(int argc, tchar **argv, int cmd)
 {
        int c;
        int open_flags = 0;
-       int export_flags = 0;
+       int export_flags = WIMLIB_EXPORT_FLAG_GIFT;
        int write_flags = 0;
        int compression_type = WIMLIB_COMPRESSION_TYPE_INVALID;
        const tchar *src_wimfile;
@@ -2620,6 +2618,9 @@ imagex_export(int argc, tchar **argv, int cmd)
                case IMAGEX_NOT_PIPABLE_OPTION:
                        write_flags |= WIMLIB_WRITE_FLAG_NOT_PIPABLE;
                        break;
+               case IMAGEX_WIMBOOT_OPTION:
+                       export_flags |= WIMLIB_EXPORT_FLAG_WIMBOOT;
+                       break;
                default:
                        goto out_usage;
                }
@@ -2710,18 +2711,31 @@ imagex_export(int argc, tchar **argv, int cmd)
 
                if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) {
                        /* The user did not specify a compression type; default
-                        * to that of the source WIM.  */
-
-                       compression_type = src_info.compression_type;
+                        * to that of the source WIM, unless --pack-streams,
+                        * --solid, or --wimboot was specified.   */
+
+                       if (write_flags & WIMLIB_WRITE_FLAG_PACK_STREAMS)
+                               compression_type = WIMLIB_COMPRESSION_TYPE_LZMS;
+                       else if (export_flags & WIMLIB_EXPORT_FLAG_WIMBOOT)
+                               compression_type = WIMLIB_COMPRESSION_TYPE_XPRESS;
+                       else
+                               compression_type = src_info.compression_type;
                }
                ret = wimlib_create_new_wim(compression_type, &dest_wim);
                if (ret)
                        goto out_free_src_wim;
 
-               /* Use same chunk size if compression type is the same.  */
-               if (compression_type == src_info.compression_type &&
-                   chunk_size == UINT32_MAX)
+               if ((export_flags & WIMLIB_EXPORT_FLAG_WIMBOOT)
+                   && compression_type == WIMLIB_COMPRESSION_TYPE_XPRESS)
+               {
+                       /* For --wimboot export, use small XPRESS chunks.  */
+                       wimlib_set_output_chunk_size(dest_wim, 4096);
+               } else if (compression_type == src_info.compression_type &&
+                          chunk_size == UINT32_MAX)
+               {
+                       /* Use same chunk size if compression type is the same.  */
                        wimlib_set_output_chunk_size(dest_wim, src_info.chunk_size);
+               }
        }
 
        if (chunk_size != UINT32_MAX) {
@@ -2850,6 +2864,7 @@ imagex_extract(int argc, tchar **argv, int cmd)
                        extract_flags |= WIMLIB_EXTRACT_FLAG_TO_STDOUT;
                        imagex_info_file = stderr;
                        imagex_be_quiet = true;
+                       set_fd_to_binary_mode(STDOUT_FILENO);
                        break;
                case IMAGEX_INCLUDE_INVALID_NAMES_OPTION:
                        extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES;
@@ -3928,8 +3943,8 @@ T(
 "    %"TS" WIMFILE [(IMAGE_NUM | IMAGE_NAME | all)]\n"
 "                    (DIRECTORY | NTFS_VOLUME) [--check] [--ref=\"GLOB\"]\n"
 "                    [--no-acls] [--strict-acls] [--no-attributes]\n"
-"                    [--rpfix] [--norpfix] [--hardlink] [--symlink]\n"
-"                    [--include-invalid-names] [--wimboot]\n"
+"                    [--rpfix] [--norpfix] [--include-invalid-names]\n"
+"                    [--wimboot]\n"
 ),
 [CMD_CAPTURE] =
 T(
@@ -4129,7 +4144,7 @@ usage_all(FILE *fp)
 
 /* 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 an Windows the command arguments will be UTF-16LE
+ * something else), while on Windows the command arguments will be UTF-16LE
  * encoded 'wchar_t' strings. */
 int
 #ifdef __WIN32__