NTFS mount(to be removed)
authorEric Biggers <ebiggers3@gmail.com>
Tue, 21 Aug 2012 03:14:17 +0000 (22:14 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 21 Aug 2012 03:14:17 +0000 (22:14 -0500)
programs/imagex.c
src/extract.c
src/mount.c
src/util.c
src/wimlib.h

index 7bb553700541015cf42dca2efbc22385b085a889..45d7dd1eca76aa1c5d3264cbb2ce4363b1288de4 100644 (file)
@@ -133,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'},
        {"mkntfs-args", required_argument, NULL, 'm'},
        {NULL, 0, NULL, 0},
 };
@@ -143,7 +142,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},
 };
@@ -369,6 +367,7 @@ static int imagex_apply(int argc, const char **argv)
        const char *mkntfs_args = "";
        int extract_flags = 0;
 
+
        for_opt(c, apply_options) {
                switch (c) {
                case 'c':
@@ -383,9 +382,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;
                case 'm':
                        mkntfs_args = optarg;
                        break;
@@ -413,9 +409,31 @@ static int imagex_apply(int argc, const char **argv)
 #ifdef WITH_NTFS_3G
        char tmpdir[strlen(dir) + 50];
        tmpdir[0] = '\0';
+#endif
+
+       ret = wimlib_open_wim(wimfile, open_flags, &w);
+       if (ret != 0)
+               goto out;
+
+       image = wimlib_resolve_image(w, image_num_or_name);
+       ret = verify_image_exists(image);
+       if (ret != 0)
+               goto out;
+
+       num_images = wimlib_get_num_images(w);
+       if (argc == 2 && num_images != 1) {
+               imagex_error("`%s' contains %d images; Please select one "
+                            "(or all)", wimfile, num_images);
+               usage(APPLY);
+               ret = -1;
+               goto out;
+       }
 
-       /* Check to see if a block device file was specified.  If so, 
-        * create a NTFS filesystem on it. */
+#ifdef WITH_NTFS_3G
+       /* Check to see if a block device file or regular file was specified.
+        * If so, try to create a NTFS filesystem on it, mount it on a temporary
+        * directory, and replace @dir with the name of the temporary directory
+        * so that we extract the files to the NTFS filesystem. */
        struct stat stbuf;
 
        ret = stat(dir, &stbuf);
@@ -460,37 +478,21 @@ static int imagex_apply(int argc, const char **argv)
                        imagex_error_with_errno("Failed to execute the "
                                                "`ntfs-3g' program");
                        ret = -1;
-                       goto out_rm_tmpdir;
+                       goto out;
                } else if (ret > 0) {
                        imagex_error("`ntfs-3g' exited with failure status");
                        ret = -1;
-                       goto out_rm_tmpdir;
+                       goto out;
                }
+               printf("Applying image %d of `%s' to NTFS filesystem on `%s'\n",
+                      image, wimfile, dev);
        }
 #endif
 
-       ret = wimlib_open_wim(wimfile, open_flags, &w);
-       if (ret != 0)
-               goto done;
-
-       image = wimlib_resolve_image(w, image_num_or_name);
-       ret = verify_image_exists(image);
-       if (ret != 0)
-               goto done;
-
-       num_images = wimlib_get_num_images(w);
-       if (argc == 2 && num_images != 1) {
-               imagex_error("`%s' contains %d images; Please select one "
-                            "(or all)", wimfile, num_images);
-               usage(APPLY);
-               ret = -1;
-               goto done;
-       }
        ret = wimlib_extract_image(w, image, dir, extract_flags);
-done:
+out:
        wimlib_free(w);
 #ifdef WITH_NTFS_3G
-out_rm_tmpdir:
        if (tmpdir[0] != '\0') {
                /* Unmount and remove the NTFS-3g mounted directory */
 
index 911d1d985bfa31040538cb206e6e2a64409ff857..4a9b03998ce0db0392dd4c270a292c6c3b2fb094 100644 (file)
@@ -259,14 +259,15 @@ static int extract_symlink(const struct dentry *dentry, const char *output_path,
  * @output_path:       The path to which the directory is to be extracted to.
  * @return:            True on success, false on failure. 
  */
-static int extract_directory(const char *output_path)
+static int extract_directory(const char *output_path, bool is_root)
 {
        int ret;
        struct stat stbuf;
        ret = stat(output_path, &stbuf);
        if (ret == 0) {
                if (S_ISDIR(stbuf.st_mode)) {
-                       WARNING("`%s' already exists", output_path);
+                       if (!is_root)
+                               WARNING("`%s' already exists", output_path);
                        return 0;
                } else {
                        ERROR("`%s' is not a directory", output_path);
@@ -322,7 +323,7 @@ static int extract_dentry(struct dentry *dentry, void *arg)
        if (dentry_is_symlink(dentry))
                ret = extract_symlink(dentry, output_path, w);
        else if (dentry_is_directory(dentry))
-               ret = extract_directory(output_path);
+               ret = extract_directory(output_path, dentry_is_root(dentry));
        else
                ret = extract_regular_file(w, dentry, args->output_dir,
                                            output_path, extract_flags);
@@ -395,7 +396,7 @@ static int extract_all_images(WIMStruct *w, const char *output_dir,
 
        DEBUG("Attempting to extract all images from `%s'", w->filename);
 
-       ret = extract_directory(output_dir);
+       ret = extract_directory(output_dir, true);
        if (ret != 0)
                return ret;
 
@@ -432,35 +433,8 @@ WIMLIBAPI int wimlib_extract_image(WIMStruct *w, int image,
                        == (WIMLIB_EXTRACT_FLAG_SYMLINK | WIMLIB_EXTRACT_FLAG_HARDLINK))
                return WIMLIB_ERR_INVALID_PARAM;
 
-       if ((flags & WIMLIB_EXTRACT_FLAG_NTFS)) {
-               if (flags & (WIMLIB_EXTRACT_FLAG_SYMLINK | WIMLIB_EXTRACT_FLAG_HARDLINK))
-                       return WIMLIB_ERR_INVALID_PARAM;
-       #ifdef WITH_NTFS_3G
-               unsigned long mnt_flags;
-               int ret = ntfs_check_if_mounted(output_dir, &mnt_flags);
-               if (ret != 0) {
-                       ERROR_WITH_ERRNO("NTFS-3g: Cannot determine if a NTFS "
-                                        "filesystem is mounted on `%s'",
-                                        output_dir);
-                       return WIMLIB_ERR_NTFS_3G;
-               }
-               if (!(mnt_flags & NTFS_MF_MOUNTED)) {
-                       ERROR("NTFS-3g: No NTFS filesystem is mounted on `%s'",
-                             output_dir);
-                       return WIMLIB_ERR_NTFS_3G;
-               }
-               if (mnt_flags & NTFS_MF_READONLY) {
-                       ERROR("NTFS-3g: NTFS filesystem on `%s' is mounted "
-                             "read-only", output_dir);
-                       return WIMLIB_ERR_NTFS_3G;
-               }
-       #else
-               ERROR("wimlib was compiled without support for NTFS-3g, so");
-               ERROR("we cannot extract a WIM image while preserving NTFS-");
-               ERROR("specific information");
-               return WIMLIB_ERR_UNSUPPORTED;
-       #endif
-       }
+
+       /*ntfs_initialize_file_security(*/
 
        for_lookup_table_entry(w->lookup_table, zero_out_refcnts, NULL);
 
@@ -473,3 +447,25 @@ WIMLIBAPI int wimlib_extract_image(WIMStruct *w, int image,
        }
 
 }
+
+WIMLIBAPI int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image,
+                                               const char *device, int flags)
+{
+       if ((flags & WIMLIB_EXTRACT_FLAG_NTFS)) {
+       #ifndef WITH_NTFS_3G
+               ERROR("wimlib was compiled without support for NTFS-3g, so");
+               ERROR("we cannot extract a WIM image while preserving NTFS-");
+               ERROR("specific information");
+       #endif
+               if (flags & (WIMLIB_EXTRACT_FLAG_SYMLINK | WIMLIB_EXTRACT_FLAG_HARDLINK))
+                       return WIMLIB_ERR_INVALID_PARAM;
+               if (getuid() != 0) {
+                       ERROR("We are not root, but NTFS-3g requires root privileges to set arbitrary");
+                       ERROR("security data on the NTFS filesystem.  Please run this program as root");
+                       ERROR("if you want to extract a WIM image while preserving NTFS-specific");
+                       ERROR("information.");
+
+                       return WIMLIB_ERR_NOT_ROOT;
+               }
+       }
+}
index 19e8d5d700a573b39063a8f69b89ae44daecece2..0536c01647a5b784b7539451863f7a8c801bf1f9 100644 (file)
@@ -1673,7 +1673,7 @@ WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir,
        if (!p)
                return WIMLIB_ERR_NOMEM;
 
-       argv[argc++] = "mount";
+       argv[argc++] = "imagex";
        argv[argc++] = p;
        argv[argc++] = "-s"; /* disable multi-threaded operation */
 
index a2a50faa0614d873d8611db6fd4ee3179616d502..9fbca12d14d68028498361c4b80fd97252f5f42a 100644 (file)
@@ -51,7 +51,7 @@ void wimlib_error(const char *format, ...)
 
                va_start(va, format);
                errno_save = errno;
-               fputs("ERROR: ", stderr);
+               fputs("[ERROR] ", stderr);
                vfprintf(stderr, format, va);
                putc('\n', stderr);
                errno = errno_save;
@@ -67,7 +67,7 @@ void wimlib_error_with_errno(const char *format, ...)
 
                va_start(va, format);
                errno_save = errno;
-               fputs("ERROR: ", stderr);
+               fputs("[ERROR] ", stderr);
                vfprintf(stderr, format, va);
                fprintf(stderr, ": %s\n", strerror(errno_save));
                errno = errno_save;
@@ -83,7 +83,7 @@ void wimlib_warning(const char *format, ...)
 
                va_start(va, format);
                errno_save = errno;
-               fputs("WARNING: ", stderr);
+               fputs("[WARNING] ", stderr);
                vfprintf(stderr, format, va);
                putc('\n', stderr);
                errno = errno_save;
@@ -161,6 +161,8 @@ static const char *error_strings[] = {
                        "identify a WIM file",
        [WIMLIB_ERR_NO_FILENAME] 
                = "The WIM is not identified with a filename",
+       [WIMLIB_ERR_NOT_ROOT]
+               = "Root privileges are required for this operation",
        [WIMLIB_ERR_NTFS_3G]
                = "NTFS-3g encountered an error (check errno)",
        [WIMLIB_ERR_OPEN] 
index d2b230be1bf16348118b1eb88ee1373d0d513b3a..7fff05491278855c7d747bf4294e6eac7b052142 100644 (file)
@@ -339,6 +339,7 @@ enum wimlib_error_code {
        WIMLIB_ERR_NOMEM,
        WIMLIB_ERR_NOTDIR,
        WIMLIB_ERR_NOT_A_WIM_FILE,
+       WIMLIB_ERR_NOT_ROOT,
        WIMLIB_ERR_NO_FILENAME,
        WIMLIB_ERR_NTFS_3G,
        WIMLIB_ERR_OPEN,
@@ -424,6 +425,9 @@ extern int wimlib_add_image(WIMStruct *wim, const char *dir,
                            const char *name, const char *description, 
                            const char *flags_element, int flags);
 
+extern int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image,
+                                            const char *device, int flags);
+
 /** 
  * Creates a WIMStruct for a new WIM file.
  *