X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmount.c;h=3c0b9290e1a209c12e79942a3dd5a659787df373;hb=eff67c0d712100642ae6dce8262366eb0c3b911b;hp=54c7b0990d8726d75cb7e884e38af238fb5b5b61;hpb=2900a982859da75d35e2a18a2e4f10b29a828226;p=wimlib diff --git a/src/mount.c b/src/mount.c index 54c7b099..3c0b9290 100644 --- a/src/mount.c +++ b/src/mount.c @@ -497,11 +497,9 @@ out_delete_staging_file: } /* - * Creates a randomly named staging directory and returns its name into the - * static variable staging_dir_name. - * - * If the staging directory cannot be created, staging_dir_name is set to NULL. - * */ + * Creates a randomly named staging directory and saves its name in the + * filesystem context structure. + */ static int make_staging_dir(struct wimfs_context *ctx) { /* XXX Give the user an option of where to stage files */ @@ -891,7 +889,7 @@ static int rebuild_wim(struct wimfs_context *ctx, bool check_integrity) xml_update_image_info(w, w->current_image); - ret = wimlib_overwrite(w, check_integrity); + ret = wimlib_overwrite(w, check_integrity, 0); if (ret != 0) { ERROR("Failed to commit changes"); return ret; @@ -1058,7 +1056,8 @@ static int wimfs_getxattr(const char *path, const char *name, char *value, if (res_size > size) return -ERANGE; - ret = read_full_wim_resource(lte, (u8*)value); + ret = read_full_wim_resource(lte, (u8*)value, + WIMLIB_RESOURCE_FLAG_MULTITHREADED); if (ret != 0) return -EIO; @@ -1336,6 +1335,8 @@ static int wimfs_read(const char *path, char *buf, size_t size, } else { /* Read from WIM */ + wimlib_assert(fd->f_lte->resource_location == RESOURCE_IN_WIM); + u64 res_size = wim_resource_size(fd->f_lte); if (offset > res_size) @@ -1344,7 +1345,8 @@ static int wimfs_read(const char *path, char *buf, size_t size, size = min(size, res_size - offset); if (read_wim_resource(fd->f_lte, (u8*)buf, - size, offset, false) != 0) + size, offset, + WIMLIB_RESOURCE_FLAG_MULTITHREADED) != 0) return -EIO; return size; } @@ -1398,7 +1400,8 @@ static int wimfs_readlink(const char *path, char *buf, size_t buf_len) if (!inode_is_symlink(inode)) return -EINVAL; - ret = inode_readlink(inode, buf, buf_len, ctx->wim); + ret = inode_readlink(inode, buf, buf_len, ctx->wim, + WIMLIB_RESOURCE_FLAG_MULTITHREADED); if (ret > 0) ret = 0; return ret; @@ -1830,6 +1833,10 @@ static struct fuse_operations wimfs_operations = { .utime = wimfs_utime, #endif .write = wimfs_write, + + .flag_nullpath_ok = 1, + .flag_nopath = 1, + .flag_utime_omit_ok = 1, }; @@ -1856,6 +1863,11 @@ WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir, if (ret != 0) return ret; + if ((flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) { + ERROR("Cannot mount a split WIM read-write"); + return WIMLIB_ERR_SPLIT_UNSUPPORTED; + } + if (num_additional_swms) { ret = new_joined_lookup_table(wim, additional_swms, num_additional_swms, @@ -1877,7 +1889,14 @@ WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir, if (imd->root_dentry->refcnt != 1) { ERROR("Cannot mount image that was just exported with " - "wimlib_export()"); + "wimlib_export_image()"); + ret = WIMLIB_ERR_INVALID_PARAM; + goto out; + } + + if (imd->modified) { + ERROR("Cannot mount image that was added " + "with wimlib_add_image()"); ret = WIMLIB_ERR_INVALID_PARAM; goto out; }