u32 cur_version;
u32 msg_type;
u32 msg_size;
-} PACKED;
+} _packed_attribute;
struct msg_unmount_request {
struct unmount_msg_hdr hdr;
u32 unmount_flags;
u8 want_progress_messages;
-} PACKED;
+} _packed_attribute;
struct msg_daemon_info {
struct unmount_msg_hdr hdr;
pid_t daemon_pid;
u32 mount_flags;
-} PACKED;
+} _packed_attribute;
struct msg_unmount_finished {
struct unmount_msg_hdr hdr;
s32 status;
-} PACKED;
+} _packed_attribute;
struct msg_write_streams_progress {
struct unmount_msg_hdr hdr;
union wimlib_progress_info info;
-} PACKED;
+} _packed_attribute;
enum {
MSG_TYPE_UNMOUNT_REQUEST,
* daemon to finish writing the WIM file.
*/
static int
-execute_fusermount(const char *dir)
+execute_fusermount(const char *dir, bool lazy)
{
pid_t pid;
int ret;
}
if (pid == 0) {
/* Child */
- execlp("fusermount", "fusermount", "-u", dir, NULL);
+ char *argv[10];
+ char **argp = argv;
+ *argp++ = "fusermount";
+ if (lazy)
+ *argp++ = "-z";
+ *argp++ = "-u";
+ *argp++ = (char*)dir;
+ *argp = NULL;
+ execvp("fusermount", argv);
ERROR_WITH_ERRNO("Failed to execute `fusermount'");
exit(WIMLIB_ERR_FUSERMOUNT);
}
}
if (pid == 0) {
/* Child */
- execlp("umount", "umount", dir, NULL);
+ char *argv[10];
+ char **argp = argv;
+ *argp++ = "umount";
+ if (lazy)
+ *argp++ = "-l";
+ *argp++ = (char*)dir;
+ *argp = NULL;
+ execvp("umount", argv);
ERROR_WITH_ERRNO("Failed to execute `umount'");
exit(WIMLIB_ERR_FUSERMOUNT);
}
if (ret)
goto out;
- if ((mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) {
- ERROR("Cannot mount a split WIM read-write");
- ret = WIMLIB_ERR_SPLIT_UNSUPPORTED;
- goto out;
- }
-
- if (num_additional_swms)
- merge_lookup_tables(wim, additional_swms, num_additional_swms);
-
if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
- ret = wim_run_full_verifications(wim);
+ ret = can_delete_from_wim(wim);
if (ret)
- goto out_restore_lookup_table;
+ goto out;
}
- ret = wim_checksum_unhashed_streams(wim);
- if (ret)
- goto out_restore_lookup_table;
+ if (num_additional_swms)
+ merge_lookup_tables(wim, additional_swms, num_additional_swms);
ret = select_wim_image(wim, image);
if (ret)
if (ret != 0)
goto out_close_message_queues;
- ret = execute_fusermount(dir);
+ ret = execute_fusermount(dir, (unmount_flags & WIMLIB_UNMOUNT_FLAG_LAZY) != 0);
if (ret != 0)
goto out_close_message_queues;