+static int imagex_optimize(int argc, const char **argv)
+{
+ int c;
+ int open_flags = WIMLIB_OPEN_FLAG_SHOW_PROGRESS;
+ int write_flags = WIMLIB_WRITE_FLAG_REBUILD |
+ WIMLIB_WRITE_FLAG_SHOW_PROGRESS;
+ int ret;
+ WIMStruct *w;
+ const char *wimfile;
+ off_t old_size;
+ off_t new_size;
+
+ for_opt(c, optimize_options) {
+ switch (c) {
+ case 'c':
+ open_flags |= WIMLIB_OPEN_FLAG_CHECK_INTEGRITY;
+ write_flags |= WIMLIB_WRITE_FLAG_CHECK_INTEGRITY;
+ break;
+ case 'r':
+ write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS;
+ break;
+ default:
+ usage(OPTIMIZE);
+ return -1;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1) {
+ usage(OPTIMIZE);
+ return -1;
+ }
+
+ wimfile = argv[0];
+
+ ret = wimlib_open_wim(wimfile, open_flags, &w);
+ if (ret != 0)
+ return ret;
+
+ old_size = file_get_size(argv[0]);
+ printf("`%s' original size: ", wimfile);
+ if (old_size == -1)
+ puts("Unknown");
+ else
+ printf("%"PRIu64" KiB\n", old_size >> 10);
+
+ ret = wimlib_overwrite(w, write_flags, 0);
+
+ new_size = file_get_size(argv[0]);
+ printf("`%s' optimized size: ", wimfile);
+ if (new_size == -1)
+ puts("Unknown");
+ else
+ printf("%"PRIu64" KiB\n", new_size >> 10);
+
+ fputs("Space saved: ", stdout);
+ if (new_size != -1 && old_size != -1) {
+ printf("%lld KiB\n",
+ ((long long)old_size - (long long)new_size) >> 10);
+ } else {
+ puts("Unknown");
+ }
+
+ wimlib_free(w);
+ return ret;
+}
+