* 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>
#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;
}
static const u16 max_fds = 0xffff;
int ret;
- pthread_mutex_lock(&inode->i_mutex);
-
DEBUG("Allocating fd for stream ID %u from inode %#"PRIx64" "
"(open = %u, allocated = %u)",
stream_id, inode->i_ino, inode->i_num_opened_fds,
}
}
out:
- pthread_mutex_unlock(&inode->i_mutex);
return ret;
}
inode_put_fd(struct wim_inode *inode, struct wimfs_fd *fd)
{
wimlib_assert(inode != NULL);
-
- pthread_mutex_lock(&inode->i_mutex);
-
wimlib_assert(fd->f_inode == inode);
wimlib_assert(inode->i_num_opened_fds != 0);
wimlib_assert(fd->idx < inode->i_num_allocated_fds);
inode->i_fds[fd->idx] = NULL;
FREE(fd);
- if (--inode->i_num_opened_fds == 0 && inode->i_nlink == 0) {
- pthread_mutex_unlock(&inode->i_mutex);
- free_inode(inode);
- } else {
- pthread_mutex_unlock(&inode->i_mutex);
+ if (--inode->i_num_opened_fds == 0) {
+ FREE(inode->i_fds);
+ inode->i_fds = NULL;
+ inode->i_num_allocated_fds = 0;
+ if (inode->i_nlink == 0)
+ free_inode(inode);
}
}
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,
* 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)
goto out_free_message_queue_names;
argc = 0;
- argv[argc++] = "imagex";
+ argv[argc++] = IMAGEX_PROGNAME;
argv[argc++] = dir_copy;
- /* disable multi-threaded operation for read-write mounts */
- if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE)
- argv[argc++] = "-s";
+ /* disable multi-threaded operation */
+ argv[argc++] = "-s";
if (mount_flags & WIMLIB_MOUNT_FLAG_DEBUG)
argv[argc++] = "-d";
* assign inode numbers */
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);
+ image_for_each_inode(inode, imd)
inode->i_ino = ctx.next_ino++;
- }
DEBUG("(next_ino = %"PRIu64")", ctx.next_ino);
DEBUG("Calling fuse_main()");
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;
static int
-mount_unsupported_error()
+mount_unsupported_error(void)
{
#if defined(__WIN32__)
ERROR("Sorry-- Mounting WIM images is not supported on Windows!");