]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
wimlib_apply_image_to_ntfs_volume() API function
[wimlib] / programs / imagex.c
index f83bbb0b1ded60aad5ba178557a264868df66b8f..a9bdab02e059454ceec778123940668f24322537 100644 (file)
 #include <errno.h>
 #include <sys/stat.h>
 
+#ifdef WITH_NTFS_3G
+#include <unistd.h>
+#include <sys/wait.h>
+#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,
@@ -127,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[] = {
@@ -136,7 +141,6 @@ 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},
 };
@@ -375,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;
@@ -401,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) {
@@ -414,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;
 }
@@ -1261,6 +1283,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;
                }