]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
imagex_info(): Do not leak WIMStruct when file not writable
[wimlib] / programs / imagex.c
index b78fa325abd37488f4954947c15771fe1ac68171..0bba3546bd55a8c7fc381f63cafa8d196b2477e3 100644 (file)
@@ -89,13 +89,14 @@ IMAGEX_PROGNAME" append (DIRECTORY | NTFS_VOLUME) WIMFILE [IMAGE_NAME]\n"
 "                     [--verbose] [--dereference] [--config=FILE]\n"
 "                     [--threads=NUM_THREADS] [--rebuild] [--unix-data]\n"
 "                     [--source-list] [--no-acls] [--strict-acls]\n"
+"                     [--rpfix] [--norpfix]\n"
 ),
 [APPLY] =
 T(
 IMAGEX_PROGNAME" apply WIMFILE [IMAGE_NUM | IMAGE_NAME | all]\n"
 "                    (DIRECTORY | NTFS_VOLUME) [--check] [--hardlink]\n"
 "                    [--symlink] [--verbose] [--ref=\"GLOB\"] [--unix-data]\n"
-"                    [--no-acls] [--strict-acls]\n"
+"                    [--no-acls] [--strict-acls] [--rpfix] [--norpfix]\n"
 ),
 [CAPTURE] =
 T(
@@ -104,6 +105,7 @@ IMAGEX_PROGNAME" capture (DIRECTORY | NTFS_VOLUME) WIMFILE [IMAGE_NAME]\n"
 "                      [--flags EDITION_ID] [--verbose] [--dereference]\n"
 "                      [--config=FILE] [--threads=NUM_THREADS] [--unix-data]\n"
 "                      [--source-list] [--no-acls] [--strict-acls]\n"
+"                      [--rpfix] [--norpfix]\n"
 ),
 [DELETE] =
 T(
@@ -145,6 +147,7 @@ IMAGEX_PROGNAME" mountrw WIMFILE [IMAGE_NUM | IMAGE_NAME] DIRECTORY\n"
 [OPTIMIZE] =
 T(
 IMAGEX_PROGNAME" optimize WIMFILE [--check] [--recompress]\n"
+"                      [--threads=NUM_THREADS]\n"
 ),
 [SPLIT] =
 T(
@@ -172,9 +175,11 @@ enum {
        IMAGEX_LOOKUP_TABLE_OPTION,
        IMAGEX_METADATA_OPTION,
        IMAGEX_NO_ACLS_OPTION,
+       IMAGEX_NORPFIX_OPTION,
        IMAGEX_REBULID_OPTION,
        IMAGEX_RECOMPRESS_OPTION,
        IMAGEX_REF_OPTION,
+       IMAGEX_RPFIX_OPTION,
        IMAGEX_SOFT_OPTION,
        IMAGEX_SOURCE_LIST_OPTION,
        IMAGEX_STAGING_DIR_OPTION,
@@ -197,6 +202,8 @@ static const struct option apply_options[] = {
        {T("noacls"),      no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
        {T("no-acls"),     no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
        {T("strict-acls"), no_argument,       NULL, IMAGEX_STRICT_ACLS_OPTION},
+       {T("rpfix"),       no_argument,       NULL, IMAGEX_RPFIX_OPTION},
+       {T("norpfix"),     no_argument,       NULL, IMAGEX_NORPFIX_OPTION},
        {NULL, 0, NULL, 0},
 };
 static const struct option capture_or_append_options[] = {
@@ -214,6 +221,8 @@ static const struct option capture_or_append_options[] = {
        {T("noacls"),      no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
        {T("no-acls"),     no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
        {T("strict-acls"), no_argument,       NULL, IMAGEX_STRICT_ACLS_OPTION},
+       {T("rpfix"),       no_argument,       NULL, IMAGEX_RPFIX_OPTION},
+       {T("norpfix"),     no_argument,       NULL, IMAGEX_NORPFIX_OPTION},
        {NULL, 0, NULL, 0},
 };
 static const struct option delete_options[] = {
@@ -262,6 +271,7 @@ static const struct option mount_options[] = {
 static const struct option optimize_options[] = {
        {T("check"),      no_argument, NULL, IMAGEX_CHECK_OPTION},
        {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION},
+       {T("threads"),    required_argument, NULL, IMAGEX_THREADS_OPTION},
        {NULL, 0, NULL, 0},
 };
 
@@ -1176,6 +1186,12 @@ imagex_apply(int argc, tchar **argv)
                case IMAGEX_STRICT_ACLS_OPTION:
                        extract_flags |= WIMLIB_EXTRACT_FLAG_STRICT_ACLS;
                        break;
+               case IMAGEX_NORPFIX_OPTION:
+                       extract_flags |= WIMLIB_EXTRACT_FLAG_NORPFIX;
+                       break;
+               case IMAGEX_RPFIX_OPTION:
+                       extract_flags |= WIMLIB_EXTRACT_FLAG_RPFIX;
+                       break;
                default:
                        usage(APPLY);
                        return -1;
@@ -1342,6 +1358,12 @@ imagex_capture_or_append(int argc, tchar **argv)
                case IMAGEX_STRICT_ACLS_OPTION:
                        add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_STRICT_ACLS;
                        break;
+               case IMAGEX_RPFIX_OPTION:
+                       add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_RPFIX;
+                       break;
+               case IMAGEX_NORPFIX_OPTION:
+                       add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_NORPFIX;
+                       break;
                default:
                        usage(cmd);
                        return -1;
@@ -2055,7 +2077,7 @@ imagex_info(int argc, tchar **argv)
 
                        ret = file_writable(wimfile);
                        if (ret != 0)
-                               return ret;
+                               goto out;
 
                        if (check)
                                write_flags = WIMLIB_WRITE_FLAG_CHECK_INTEGRITY;
@@ -2254,6 +2276,7 @@ imagex_optimize(int argc, tchar **argv)
        const tchar *wimfile;
        off_t old_size;
        off_t new_size;
+       unsigned num_threads = 0;
 
        for_opt(c, optimize_options) {
                switch (c) {
@@ -2264,6 +2287,11 @@ imagex_optimize(int argc, tchar **argv)
                case IMAGEX_RECOMPRESS_OPTION:
                        write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS;
                        break;
+               case IMAGEX_THREADS_OPTION:
+                       num_threads = parse_num_threads(optarg);
+                       if (num_threads == UINT_MAX)
+                               return -1;
+                       break;
                default:
                        usage(OPTIMIZE);
                        return -1;
@@ -2291,7 +2319,8 @@ imagex_optimize(int argc, tchar **argv)
        else
                tprintf(T("%"PRIu64" KiB\n"), old_size >> 10);
 
-       ret = wimlib_overwrite(w, write_flags, 0, imagex_progress_func);
+       ret = wimlib_overwrite(w, write_flags, num_threads,
+                              imagex_progress_func);
 
        if (ret == 0) {
                new_size = file_get_size(argv[0]);
@@ -2517,11 +2546,16 @@ main(int argc, char **argv)
 {
        const struct imagex_command *cmd;
        int ret;
+       int init_flags = 0;
 
 #ifndef __WIN32__
-       setlocale(LC_ALL, "");
-       {
-               char *codeset = nl_langinfo(CODESET);
+       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") &&
@@ -2529,7 +2563,10 @@ main(int argc, char **argv)
                {
                        fputs(
 "WARNING: Running "IMAGEX_PROGNAME" in a UTF-8 locale is recommended!\n"
-"         (Maybe try: `export LANG=en_US.UTF-8'?\n", stderr);
+"         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",
+                       stderr);
 
                }
        }
@@ -2552,7 +2589,7 @@ main(int argc, char **argv)
        wimlib_set_print_errors(true);
 
        /* Do any initializations that the library needs */
-       ret = wimlib_global_init();
+       ret = wimlib_global_init(init_flags);
        if (ret)
                goto out_check_status;