return wimfs_get_context()->wim;
}
+static inline bool wimfs_ctx_readonly(const struct wimfs_context *ctx)
+{
+ return (ctx->mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) == 0;
+}
+
static inline int get_lookup_flags(const struct wimfs_context *ctx)
{
if (ctx->mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS)
* @stream_id: ID of the stream we're opening
* @lte: Lookup table entry for the stream (may be NULL)
* @fd_ret: Return the allocated file descriptor if successful.
+ * @readonly: True if this is a read-only mount.
*
* Return 0 iff successful or error code if unsuccessful.
*/
static int alloc_wimlib_fd(struct inode *inode,
u32 stream_id,
struct lookup_table_entry *lte,
- struct wimlib_fd **fd_ret)
+ struct wimlib_fd **fd_ret,
+ bool readonly)
{
static const u16 fds_per_alloc = 8;
static const u16 max_fds = 0xffff;
*fd_ret = fd;
inode->fds[i] = fd;
inode->num_opened_fds++;
- if (lte)
- atomic_inc(<e->num_opened_fds);
+ if (lte && !readonly)
+ lte->num_opened_fds++;
DEBUG("Allocated fd (idx = %u)", fd->idx);
ret = 0;
break;
xml_update_image_info(w, w->current_image);
- ret = wimlib_overwrite(w, check_integrity);
+ ret = wimlib_overwrite(w, check_integrity, 0, NULL);
if (ret != 0) {
ERROR("Failed to commit changes");
return ret;
return ret;
}
- ret = alloc_wimlib_fd(inode, stream_id, lte, &fd);
+ ret = alloc_wimlib_fd(inode, stream_id, lte, &fd,
+ wimfs_ctx_readonly(ctx));
if (ret != 0)
return ret;
struct inode *inode;
int ret;
struct wimlib_fd *fd = NULL;
- WIMStruct *w = wimfs_get_WIMStruct();
+ struct wimfs_context *ctx = wimfs_get_context();
+ WIMStruct *w = ctx->wim;
inode = wim_pathname_to_inode(w, path);
if (!inode)
return -ENOENT;
if (!inode_is_directory(inode))
return -ENOTDIR;
- ret = alloc_wimlib_fd(inode, 0, NULL, &fd);
+ ret = alloc_wimlib_fd(inode, 0, NULL, &fd, wimfs_ctx_readonly(ctx));
fi->fh = (uintptr_t)fd;
return ret;
}
#endif
.write = wimfs_write,
+#if FUSE_MAJOR_VERSION > 2 || (FUSE_MAJOR_VERSION == 2 && FUSE_MINOR_VERSION >= 8)
.flag_nullpath_ok = 1,
+#endif
+#if FUSE_MAJOR_VERSION > 2 || (FUSE_MAJOR_VERSION == 2 && FUSE_MINOR_VERSION >= 9)
.flag_nopath = 1,
.flag_utime_omit_ok = 1,
+#endif
};
-/* Mounts a WIM file. */
-WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir,
- int flags, WIMStruct **additional_swms,
- unsigned num_additional_swms)
+/* Mounts an image from a WIM file. */
+WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
+ int mount_flags, WIMStruct **additional_swms,
+ unsigned num_additional_swms,
+ const char *staging_dir)
{
int argc = 0;
char *argv[16];
struct wimfs_context ctx;
DEBUG("Mount: wim = %p, image = %d, dir = %s, flags = %d, ",
- wim, image, dir, flags);
+ wim, image, dir, mount_flags);
if (!wim || !dir)
return WIMLIB_ERR_INVALID_PARAM;
if (ret != 0)
return ret;
- if ((flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) {
+ if ((mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) {
ERROR("Cannot mount a split WIM read-write");
return WIMLIB_ERR_SPLIT_UNSUPPORTED;
}
goto out;
}
- if (!(flags & (WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_NONE |
+ if (!(mount_flags & (WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_NONE |
WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR |
WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS)))
- flags |= WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR;
+ mount_flags |= WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR;
DEBUG("Initializing struct wimfs_context");
argv[argc++] = dir_copy;
/* disable multi-threaded operation for read-write mounts */
- if (flags & WIMLIB_MOUNT_FLAG_READWRITE)
+ if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE)
argv[argc++] = "-s";
- if (flags & WIMLIB_MOUNT_FLAG_DEBUG)
+ if (mount_flags & WIMLIB_MOUNT_FLAG_DEBUG)
argv[argc++] = "-d";
/*
char optstring[256] = "use_ino,subtype=wimfs,attr_timeout=0";
argv[argc++] = "-o";
argv[argc++] = optstring;
- if ((flags & WIMLIB_MOUNT_FLAG_READWRITE)) {
+ if ((mount_flags & WIMLIB_MOUNT_FLAG_READWRITE)) {
/* Read-write mount. Make the staging directory */
ret = make_staging_dir(&ctx);
if (ret != 0)
#endif
/* Mark dentry tree as modified if read-write mount. */
- if (flags & WIMLIB_MOUNT_FLAG_READWRITE)
+ if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
imd->modified = true;
+ imd->has_been_mounted_rw = true;
+ }
/* Resolve all the lookup table entries of the dentry tree */
DEBUG("Resolving lookup table entries");
/* Finish initializing the filesystem context. */
ctx.wim = wim;
- ctx.mount_flags = flags;
+ ctx.mount_flags = mount_flags;
DEBUG("Calling fuse_main()");
/*
* Unmounts the WIM file that was previously mounted on @dir by using
- * wimlib_mount().
+ * wimlib_mount_image().
*/
-WIMLIBAPI int wimlib_unmount(const char *dir, int flags)
+WIMLIBAPI int wimlib_unmount_image(const char *dir, int unmount_flags,
+ wimlib_progress_func_t progress_func)
{
pid_t pid;
int status;
/* Send a message to the filesystem daemon saying whether to commit or
* not. */
- msg[0] = (flags & WIMLIB_UNMOUNT_FLAG_COMMIT) ? 1 : 0;
- msg[1] = (flags & WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY) ? 1 : 0;
+ msg[0] = (unmount_flags & WIMLIB_UNMOUNT_FLAG_COMMIT) ? 1 : 0;
+ msg[1] = (unmount_flags & WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY) ? 1 : 0;
DEBUG("Sending message: %scommit, %scheck",
(msg[0] ? "" : "don't "),
return WIMLIB_ERR_UNSUPPORTED;
}
-WIMLIBAPI int wimlib_unmount(const char *dir, int flags)
+WIMLIBAPI int wimlib_unmount_image(const char *dir, int unmount_flags,
+ wimlib_progress_func_t progress_func)
{
return mount_unsupported_error();
}
-WIMLIBAPI int wimlib_mount(WIMStruct *wim_p, int image, const char *dir,
- int flags, WIMStruct **additional_swms,
- unsigned num_additional_swms)
+WIMLIBAPI int wimlib_mount_image(WIMStruct *wim_p, int image, const char *dir,
+ int mount_flags, WIMStruct **additional_swms,
+ unsigned num_additional_swms,
+ const char *staging_dir)
{
return mount_unsupported_error();
}