From: Eric Biggers Date: Tue, 21 Aug 2012 03:14:17 +0000 (-0500) Subject: NTFS mount(to be removed) X-Git-Tag: v1.0.0~108 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=c1b8c30d561d369889ff1b37d65748cada8d7325 NTFS mount(to be removed) --- diff --git a/programs/imagex.c b/programs/imagex.c index 7bb55370..45d7dd1e 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -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 */ diff --git a/src/extract.c b/src/extract.c index 911d1d98..4a9b0399 100644 --- a/src/extract.c +++ b/src/extract.c @@ -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; + } + } +} diff --git a/src/mount.c b/src/mount.c index 19e8d5d7..0536c016 100644 --- a/src/mount.c +++ b/src/mount.c @@ -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 */ diff --git a/src/util.c b/src/util.c index a2a50faa..9fbca12d 100644 --- a/src/util.c +++ b/src/util.c @@ -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] diff --git a/src/wimlib.h b/src/wimlib.h index d2b230be..7fff0549 100644 --- a/src/wimlib.h +++ b/src/wimlib.h @@ -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. *