{"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},
};
{"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},
};
const char *mkntfs_args = "";
int extract_flags = 0;
+
for_opt(c, apply_options) {
switch (c) {
case 'c':
case 'v':
extract_flags |= WIMLIB_EXTRACT_FLAG_VERBOSE;
break;
- case 'N':
- extract_flags |= WIMLIB_EXTRACT_FLAG_NTFS;
- break;
case 'm':
mkntfs_args = optarg;
break;
#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);
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 */
* @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);
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);
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;
== (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);
}
}
+
+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;
+ }
+ }
+}
if (!p)
return WIMLIB_ERR_NOMEM;
- argv[argc++] = "mount";
+ argv[argc++] = "imagex";
argv[argc++] = p;
argv[argc++] = "-s"; /* disable multi-threaded operation */
va_start(va, format);
errno_save = errno;
- fputs("ERROR: ", stderr);
+ fputs("[ERROR] ", stderr);
vfprintf(stderr, format, va);
putc('\n', stderr);
errno = errno_save;
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;
va_start(va, format);
errno_save = errno;
- fputs("WARNING: ", stderr);
+ fputs("[WARNING] ", stderr);
vfprintf(stderr, format, va);
putc('\n', stderr);
errno = errno_save;
"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]
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,
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.
*