]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
remove dead variable store
[wimlib] / programs / imagex.c
index 7cfc91c087bb66e6914b9031fcd4f2ec3e96ae04..ed0f24dce3bc853c4f3c60151152ae74c051138a 100644 (file)
@@ -67,16 +67,16 @@ static const char *usage_strings[] = {
 "imagex append (DIRECTORY | NTFS_VOLUME) WIMFILE [IMAGE_NAME]\n"
 "                     [DESCRIPTION] [--boot] [--check] [--flags EDITION_ID]\n"
 "                     [--verbose] [--dereference] [--config=FILE]\n"
-"                     [--threads=NUM_THREADS] [--rebuild]\n",
+"                     [--threads=NUM_THREADS] [--rebuild] [--unix-data]\n",
 [APPLY] =
 "imagex apply WIMFILE [IMAGE_NUM | IMAGE_NAME | all]\n"
 "                    (DIRECTORY | NTFS_VOLUME) [--check] [--hardlink]\n"
-"                    [--symlink] [--verbose] [--ref=\"GLOB\"]\n",
+"                    [--symlink] [--verbose] [--ref=\"GLOB\"] [--unix-data]\n",
 [CAPTURE] =
 "imagex capture (DIRECTORY | NTFS_VOLUME) WIMFILE [IMAGE_NAME]\n"
 "                      [DESCRIPTION] [--boot] [--check] [--compress=TYPE]\n"
 "                      [--flags EDITION_ID] [--verbose] [--dereference]\n"
-"                      [--config=FILE] [--threads=NUM_THREADS]\n",
+"                      [--config=FILE] [--threads=NUM_THREADS] [--unix-data]\n",
 [DELETE] =
 "imagex delete WIMFILE (IMAGE_NUM | IMAGE_NAME | all) [--check] [--soft]\n",
 [DIR] =
@@ -95,11 +95,11 @@ static const char *usage_strings[] = {
 [MOUNT] =
 "imagex mount WIMFILE (IMAGE_NUM | IMAGE_NAME) DIRECTORY\n"
 "                    [--check] [--debug] [--streams-interface=INTERFACE]\n"
-"                    [--ref=\"GLOB\"]\n",
+"                    [--ref=\"GLOB\"] [--unix-data] [--allow-other]\n",
 [MOUNTRW] =
 "imagex mountrw WIMFILE [IMAGE_NUM | IMAGE_NAME] DIRECTORY\n"
 "                      [--check] [--debug] [--streams-interface=INTERFACE]\n"
-"                      [--staging-dir=DIR]\n",
+"                      [--staging-dir=DIR] [--unix-data] [--allow-other]\n",
 [OPTIMIZE] =
 "imagex optimize WIMFILE [--check] [--recompress] [--compress=TYPE]\n",
 [SPLIT] =
@@ -115,11 +115,12 @@ static const struct option common_options[] = {
 };
 
 static const struct option apply_options[] = {
-       {"check",    no_argument,       NULL, 'c'},
-       {"hardlink", no_argument,       NULL, 'h'},
-       {"symlink",  no_argument,       NULL, 's'},
-       {"verbose",  no_argument,       NULL, 'v'},
-       {"ref",      required_argument, NULL, 'r'},
+       {"check",     no_argument,       NULL, 'c'},
+       {"hardlink",  no_argument,       NULL, 'h'},
+       {"symlink",   no_argument,       NULL, 's'},
+       {"verbose",   no_argument,       NULL, 'v'},
+       {"ref",       required_argument, NULL, 'r'},
+       {"unix-data", no_argument,       NULL, 'U'},
        {NULL, 0, NULL, 0},
 };
 static const struct option capture_or_append_options[] = {
@@ -132,6 +133,7 @@ static const struct option capture_or_append_options[] = {
        {"verbose",     no_argument,       NULL, 'v'},
        {"threads",     required_argument, NULL, 't'},
        {"rebuild",     no_argument,       NULL, 'R'},
+       {"unix-data",   no_argument,       NULL, 'U'},
        {NULL, 0, NULL, 0},
 };
 static const struct option delete_options[] = {
@@ -172,6 +174,8 @@ static const struct option mount_options[] = {
        {"streams-interface", required_argument, NULL, 's'},
        {"ref",               required_argument, NULL, 'r'},
        {"staging-dir",       required_argument, NULL, 'D'},
+       {"unix-data",         no_argument,       NULL, 'U'},
+       {"allow-other",       no_argument,       NULL, 'A'},
        {NULL, 0, NULL, 0},
 };
 
@@ -276,6 +280,21 @@ static off_t file_get_size(const char *filename)
                return (off_t)-1;
 }
 
+static const char *default_capture_config =
+"[ExclusionList]\n"
+"\\$ntfs.log\n"
+"\\hiberfil.sys\n"
+"\\pagefile.sys\n"
+"\\System Volume Information\n"
+"\\RECYCLER\n"
+"\\Windows\\CSC\n"
+"\n"
+"[CompressionExclusionList]\n"
+"*.mp3\n"
+"*.zip\n"
+"*.cab\n"
+"\\WINDOWS\\inf\\*.pnf\n";
+
 static char *file_get_contents(const char *filename, size_t *len_ret)
 {
        struct stat stbuf;
@@ -318,7 +337,7 @@ out_fclose:
 static int file_writable(const char *path)
 {
        int ret;
-       ret = access(path, F_OK | W_OK);
+       ret = access(path, W_OK);
        if (ret != 0)
                imagex_error_with_errno("Can't modify `%s'", path);
        return ret;
@@ -361,7 +380,7 @@ static int imagex_progress_func(enum wimlib_progress_msg msg,
                       info->write_streams.completed_bytes >> 20,
                       info->write_streams.total_bytes >> 20,
                       percent_done);
-               if (info->write_streams.completed_bytes == info->write_streams.total_bytes)
+               if (info->write_streams.completed_bytes >= info->write_streams.total_bytes)
                        putchar('\n');
                break;
        case WIMLIB_PROGRESS_MSG_SCAN_BEGIN:
@@ -407,13 +426,6 @@ static int imagex_progress_func(enum wimlib_progress_msg msg,
                                "NTFS volume" : "directory"),
                       info->extract.target);
                break;
-       case WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END:
-               printf("Done applying WIM image.\n");
-               if (info->extract.extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
-                       printf("Unmounting NTFS volume `%s'...\n",
-                              info->extract.target);
-               }
-               break;
        /*case WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN:*/
                /*printf("Applying directory structure to %s\n",*/
                       /*info->extract.target);*/
@@ -426,12 +438,21 @@ static int imagex_progress_func(enum wimlib_progress_msg msg,
                       info->extract.completed_bytes >> 20,
                       info->extract.total_bytes >> 20,
                       percent_done);
-               if (info->extract.completed_bytes == info->extract.total_bytes)
+               if (info->extract.completed_bytes >= info->extract.total_bytes)
                        putchar('\n');
                break;
        case WIMLIB_PROGRESS_MSG_EXTRACT_DENTRY:
                puts(info->extract.cur_path);
                break;
+       case WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS:
+               printf("Setting timestamps on all extracted files...\n");
+               break;
+       case WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END:
+               if (info->extract.extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) {
+                       printf("Unmounting NTFS volume `%s'...\n",
+                              info->extract.target);
+               }
+               break;
        case WIMLIB_PROGRESS_MSG_JOIN_STREAMS:
                percent_done = TO_PERCENT(info->join.completed_bytes,
                                          info->join.total_bytes);
@@ -573,6 +594,9 @@ static int imagex_apply(int argc, const char **argv)
                case 'r':
                        swm_glob = optarg;
                        break;
+               case 'U':
+                       extract_flags |= WIMLIB_EXTRACT_FLAG_UNIX_DATA;
+                       break;
                default:
                        usage(APPLY);
                        return -1;
@@ -637,6 +661,8 @@ static int imagex_apply(int argc, const char **argv)
        ret = wimlib_extract_image(w, image, target, extract_flags,
                                   additional_swms, num_additional_swms,
                                   imagex_progress_func);
+       if (ret == 0)
+               printf("Done applying WIM image.\n");
 out:
        wimlib_free(w);
        if (additional_swms) {
@@ -703,6 +729,9 @@ static int imagex_capture_or_append(int argc, const char **argv)
                case 'R':
                        write_flags |= WIMLIB_WRITE_FLAG_REBUILD;
                        break;
+               case 'U':
+                       add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA;
+                       break;
                default:
                        usage(cmd);
                        return -1;
@@ -755,8 +784,10 @@ static int imagex_capture_or_append(int argc, const char **argv)
                }
        }
 
-       ret = wimlib_add_image(w, source, name, config_str, config_len,
-                              add_image_flags, imagex_progress_func);
+       ret = wimlib_add_image(w, source, name,
+                              config_str ? config_str : default_capture_config,
+                              config_len, add_image_flags,
+                              imagex_progress_func);
 
        if (ret != 0)
                goto out;
@@ -1007,7 +1038,7 @@ static int imagex_export(int argc, const char **argv)
 
                ret = file_writable(dest_wimfile);
                if (ret != 0)
-                       return ret;
+                       goto out;
 
                dest_ctype = wimlib_get_compression_type(dest_w);
                if (compression_type_specified
@@ -1019,7 +1050,6 @@ static int imagex_export(int argc, const char **argv)
                        ret = -1;
                        goto out;
                }
-               compression_type = dest_ctype;
        } else {
                wim_is_new = true;
                /* dest_wimfile is not an existing file, so create a new WIM. */
@@ -1414,6 +1444,9 @@ static int imagex_mount_rw_or_ro(int argc, const char **argv)
 
        for_opt(c, mount_options) {
                switch (c) {
+               case 'A':
+                       mount_flags |= WIMLIB_MOUNT_FLAG_ALLOW_OTHER;
+                       break;
                case 'c':
                        open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY;
                        break;
@@ -1438,6 +1471,9 @@ static int imagex_mount_rw_or_ro(int argc, const char **argv)
                case 'D':
                        staging_dir = optarg;
                        break;
+               case 'U':
+                       mount_flags |= WIMLIB_MOUNT_FLAG_UNIX_DATA;
+                       break;
                default:
                        goto mount_usage;
                }
@@ -1485,7 +1521,7 @@ static int imagex_mount_rw_or_ro(int argc, const char **argv)
        if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
                ret = file_writable(wimfile);
                if (ret != 0)
-                       return ret;
+                       goto out;
        }
 
        ret = wimlib_mount_image(w, image, dir, mount_flags, additional_swms,
@@ -1775,22 +1811,28 @@ int main(int argc, const char **argv)
        argv++;
 
        wimlib_set_print_errors(true);
+       ret = wimlib_global_init();
+       if (ret)
+               goto out;
 
        for_imagex_command(cmd) {
                if (strcmp(cmd->name, *argv) == 0) {
                        ret = cmd->func(argc, argv);
-                       if (ret > 0) {
-                               imagex_error("Exiting with error code %d:\n"
-                                            "       %s.", ret,
-                                            wimlib_get_error_string(ret));
-                               if (ret == WIMLIB_ERR_NTFS_3G)
-                                       imagex_error_with_errno("errno");
-                       }
-                       return ret;
+                       goto out;
                }
        }
 
        imagex_error("Unrecognized command: `%s'", argv[0]);
        usage_all();
        return 1;
+out:
+       if (ret > 0) {
+               imagex_error("Exiting with error code %d:\n"
+                            "       %s.", ret,
+                            wimlib_get_error_string(ret));
+               if (ret == WIMLIB_ERR_NTFS_3G && errno != 0)
+                       imagex_error_with_errno("errno");
+       }
+       wimlib_global_cleanup();
+       return ret;
 }