- ret = wimlib_set_output_dir(w, dir);
- if (ret != 0)
- goto done;
- wimlib_set_verbose(w, verbose);
- wimlib_set_link_type(w, link_type);
- ret = wimlib_extract_image(w, image);
-done:
+
+ if (swm_glob) {
+ ret = glob(swm_glob, GLOB_ERR | GLOB_NOSORT, NULL, &globbuf);
+ if (ret != 0) {
+ imagex_error_with_errno("Failed to process glob "
+ "\"%s\"", swm_glob);
+ ret = -1;
+ goto out;
+ }
+ num_additional_swms = globbuf.gl_pathc;
+ additional_swms = calloc(num_additional_swms, sizeof(additional_swms[0]));
+ if (!additional_swms) {
+ imagex_error("Out of memory");
+ ret = -1;
+ goto out;
+ }
+ size_t offset = 0;
+ for (size_t i = 0; i < num_additional_swms; i++) {
+ if (strcmp(globbuf.gl_pathv[i], wimfile) == 0) {
+ offset++;
+ continue;
+ }
+ ret = wimlib_open_wim(globbuf.gl_pathv[i],
+ open_flags | WIMLIB_OPEN_FLAG_SPLIT_OK,
+ &additional_swms[i - offset]);
+ if (ret != 0)
+ goto out;
+ }
+ num_additional_swms -= offset;
+ }
+
+#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,
+ additional_swms,
+ num_additional_swms);
+ 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,
+ additional_swms, num_additional_swms);
+out: