]> wimlib.net Git - wimlib/blobdiff - src/mount_image.c
Check for missing streams when resolving them
[wimlib] / src / mount_image.c
index f816db1ea7ee1e6816e50ca3f0e53455ff41d82d..088363829bf0cd1376fb73692b585d84ae61de62 100644 (file)
  * along with wimlib; if not, see http://www.gnu.org/licenses/.
  */
 
-#include "wimlib_internal.h"
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "wimlib.h"
+#include "wimlib/error.h"
 
 #ifdef WITH_FUSE
 
 #  error "FUSE mount not supported on Win32!  Please configure --without-fuse"
 #endif
 
-#include "buffer_io.h"
-#include "lookup_table.h"
-#include "sha1.h"
-#include "timestamp.h"
-#include "xml.h"
+#include "wimlib/encoding.h"
+#include "wimlib/file_io.h"
+#include "wimlib/lookup_table.h"
+#include "wimlib/metadata.h"
+#include "wimlib/paths.h"
+#include "wimlib/reparse.h"
+#include "wimlib/resource.h"
+#include "wimlib/swm.h"
+#include "wimlib/timestamp.h"
+#include "wimlib/version.h"
+#include "wimlib/write.h"
+#include "wimlib/xml.h"
 
 #include <errno.h>
 #include <ftw.h>
@@ -130,13 +142,13 @@ init_wimfs_context(struct wimfs_context *ctx)
 #define WIMFS_CTX(fuse_ctx) ((struct wimfs_context*)(fuse_ctx)->private_data)
 
 static inline struct wimfs_context *
-wimfs_get_context()
+wimfs_get_context(void)
 {
        return WIMFS_CTX(fuse_get_context());
 }
 
 static inline WIMStruct *
-wimfs_get_WIMStruct()
+wimfs_get_WIMStruct(void)
 {
        return wimfs_get_context()->wim;
 }
@@ -1034,29 +1046,29 @@ struct unmount_msg_hdr {
        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;
-       int32_t status;
-} PACKED;
+       s32 status;
+} _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,
@@ -1432,7 +1444,7 @@ message_loop(mqd_t mq,
  *  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;
@@ -1445,7 +1457,15 @@ execute_fusermount(const char *dir)
        }
        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);
        }
@@ -1483,7 +1503,14 @@ execute_fusermount(const char *dir)
        }
        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);
        }
@@ -2380,24 +2407,14 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
        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)
@@ -2517,7 +2534,9 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
        DEBUG("Resolving lookup table entries and assigning inode numbers");
        ctx.next_ino = 1;
        image_for_each_inode(inode, imd) {
-               inode_resolve_ltes(inode, wim->lookup_table);
+               ret = inode_resolve_ltes(inode, wim->lookup_table);
+               if (ret)
+                       goto out_delete_staging_dir;
                inode->i_ino = ctx.next_ino++;
        }
        DEBUG("(next_ino = %"PRIu64")", ctx.next_ino);
@@ -2543,6 +2562,7 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
 
        /* Try to delete the staging directory if a deletion wasn't yet
         * attempted due to an earlier error */
+out_delete_staging_dir:
        if (ctx.staging_dir_name)
                delete_staging_dir(&ctx);
 out_free_dir_copy:
@@ -2585,7 +2605,7 @@ wimlib_unmount_image(const char *dir, int unmount_flags,
        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;
 
@@ -2614,7 +2634,7 @@ out:
 
 
 static int
-mount_unsupported_error()
+mount_unsupported_error(void)
 {
 #if defined(__WIN32__)
        ERROR("Sorry-- Mounting WIM images is not supported on Windows!");