X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=programs%2Fimagex.c;h=1fce776bcd5b1684cfd1174768a858496ba7d8cd;hp=11becdd2593b354a28dd3cdd8542beaf813eed75;hb=f7d48eea9e1a6a9620ee7d8e883a6505939c7777;hpb=ef8f45b98b5c4db398321cd36d052ccbb9c3784a diff --git a/programs/imagex.c b/programs/imagex.c index 11becdd2..1fce776b 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -31,6 +31,11 @@ #include #include +#ifdef WITH_NTFS_3G +#include +#include +#endif + #define ARRAY_LEN(array) (sizeof(array) / sizeof(array[0])) #define swap(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); \ @@ -39,6 +44,7 @@ #define for_opt(c, opts) while ((c = getopt_long_only(argc, (char**)argv, "", \ opts, NULL)) != -1) + enum imagex_op_type { APPEND, APPLY, @@ -75,14 +81,14 @@ static const char *path_basename(const char *path) static const char *usage_strings[] = { [APPEND] = " imagex append DIRECTORY WIMFILE [\"IMAGE_NAME\"] [\"DESCRIPTION\"] [--boot]\n" -" [--check] [--flags EDITIONID]\n", +" [--check] [--flags EDITIONID] [--dereference]\n", [APPLY] = " imagex apply WIMFILE [IMAGE_NUM | IMAGE_NAME | all] DIRECTORY [--check]\n" " [--hardlink] [--symlink] [--verbose]\n", [CAPTURE] = " imagex capture DIRECTORY WIMFILE [\"IMAGE_NAME\"] [\"DESCRIPTION\"]\n" " l [--boot] [--check] [--compress[=TYPE]]\n" -" [--flags \"EditionID\"] [--verbose]\n", +" [--flags \"EditionID\"] [--verbose] [--dereference]\n", [DELETE] = " imagex delete WIMFILE (IMAGE_NUM | IMAGE_NAME | all) [--check]\n", [DIR] = @@ -119,6 +125,7 @@ static const struct option append_options[] = { {"boot", no_argument, NULL, 'b'}, {"check", no_argument, NULL, 'c'}, {"flags", required_argument, NULL, 'f'}, + {"dereference", no_argument, NULL, 'L'}, {NULL, 0, NULL, 0}, }; static const struct option apply_options[] = { @@ -126,7 +133,6 @@ static const struct option apply_options[] = { {"hardlink", no_argument, NULL, 'h'}, {"symlink", no_argument, NULL, 's'}, {"verbose", no_argument, NULL, 'v'}, - {"ntfs", no_argument, NULL, 'N'}, {NULL, 0, NULL, 0}, }; static const struct option capture_options[] = { @@ -135,7 +141,7 @@ static const struct option capture_options[] = { {"compress", optional_argument, NULL, 'x'}, {"flags", required_argument, NULL, 'f'}, {"verbose", no_argument, NULL,'v'}, - {"ntfs", no_argument, NULL, 'N'}, + {"dereference", no_argument, NULL, 'L'}, {NULL, 0, NULL, 0}, }; static const struct option delete_options[] = { @@ -272,7 +278,7 @@ static int verify_image_exists_and_is_single(int image) static int get_compression_type(const char *optarg) { if (!optarg) - return WIM_COMPRESSION_TYPE_LZX; + return WIM_COMPRESSION_TYPE_XPRESS; if (strcasecmp(optarg, "maximum") == 0 || strcasecmp(optarg, "lzx") == 0) return WIM_COMPRESSION_TYPE_LZX; else if (strcasecmp(optarg, "fast") == 0 || strcasecmp(optarg, "xpress") == 0) @@ -312,6 +318,9 @@ static int imagex_append(int argc, const char **argv) case 'f': flags_element = optarg; break; + case 'L': + add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE; + break; default: usage(APPEND); return -1; @@ -370,9 +379,6 @@ static int imagex_apply(int argc, const char **argv) case 'v': extract_flags |= WIMLIB_EXTRACT_FLAG_VERBOSE; break; - case 'N': - extract_flags |= WIMLIB_EXTRACT_FLAG_NTFS; - break; default: usage(APPLY); return -1; @@ -396,12 +402,12 @@ static int imagex_apply(int argc, const char **argv) ret = wimlib_open_wim(wimfile, open_flags, &w); if (ret != 0) - return ret; + goto out; image = wimlib_resolve_image(w, image_num_or_name); ret = verify_image_exists(image); if (ret != 0) - goto done; + goto out; num_images = wimlib_get_num_images(w); if (argc == 2 && num_images != 1) { @@ -409,10 +415,31 @@ static int imagex_apply(int argc, const char **argv) "(or all)", wimfile, num_images); usage(APPLY); ret = -1; - goto done; + goto out; } + +#ifdef WITH_NTFS_3G + struct stat stbuf; + + ret = stat(dir, &stbuf); + if (ret == 0) { + if (S_ISBLK(stbuf.st_mode) || S_ISREG(stbuf.st_mode)) { + const char *ntfs_device = dir; + printf("Applying image %d of `%s' to NTFS filesystem on `%s'\n", + image, wimfile, ntfs_device); + ret = wimlib_apply_image_to_ntfs_volume(w, image, + ntfs_device, + extract_flags); + goto out; + } + } else { + if (errno != -ENOENT) + imagex_error_with_errno("Failed to stat `%s'", dir); + } +#endif + ret = wimlib_extract_image(w, image, dir, extract_flags); -done: +out: wimlib_free(w); return ret; } @@ -424,7 +451,7 @@ static int imagex_capture(int argc, const char **argv) int c; int add_image_flags = 0; int write_flags = WIMLIB_WRITE_FLAG_SHOW_PROGRESS; - int compression_type = WIM_COMPRESSION_TYPE_NONE; + int compression_type = WIM_COMPRESSION_TYPE_XPRESS; const char *flags_element = NULL; const char *dir; const char *wimfile; @@ -451,9 +478,10 @@ static int imagex_capture(int argc, const char **argv) break; case 'v': add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE; + write_flags |= WIMLIB_WRITE_FLAG_VERBOSE; break; - case 'N': - add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_NTFS; + case 'L': + add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE; break; default: usage(CAPTURE); @@ -622,7 +650,7 @@ static int imagex_export(int argc, const char **argv) int open_flags = WIMLIB_OPEN_FLAG_SHOW_PROGRESS; int export_flags = 0; int write_flags = WIMLIB_WRITE_FLAG_SHOW_PROGRESS; - int compression_type = WIM_COMPRESSION_TYPE_NONE; + int compression_type = WIM_COMPRESSION_TYPE_XPRESS; bool compression_type_specified = false; const char *src_wimfile; const char *src_image_num_or_name; @@ -677,7 +705,7 @@ static int imagex_export(int argc, const char **argv) if (stat(dest_wimfile, &stbuf) == 0) { wim_is_new = false; /* Destination file exists. */ - if (!S_ISREG(stbuf.st_mode)) { + if (!S_ISREG(stbuf.st_mode) && !S_ISLNK(stbuf.st_mode)) { imagex_error("`%s' is not a regular file", dest_wimfile); goto done; @@ -691,6 +719,7 @@ static int imagex_export(int argc, const char **argv) imagex_error("Cannot specify a compression type that is " "not the same as that used in the " "destination WIM"); + ret = -1; goto done; } compression_type = wimlib_get_compression_type(dest_w); @@ -1252,6 +1281,8 @@ int main(int argc, const char **argv) 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; }