X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmount_image.c;h=f816db1ea7ee1e6816e50ca3f0e53455ff41d82d;hb=1e167170cdc048c6a93db6d994d9da161f8553d9;hp=b658effd07e28240a82cf979ee4e5ee53f8cba9f;hpb=f9695b9f40035f1a20968293255761a8301eaba0;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index b658effd..f816db1e 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -2047,58 +2047,7 @@ wimfs_removexattr(const char *path, const char *name) static int wimfs_rename(const char *from, const char *to) { - struct wim_dentry *src; - struct wim_dentry *dst; - struct wim_dentry *parent_of_dst; - WIMStruct *w = wimfs_get_WIMStruct(); - int ret; - - /* This rename() implementation currently only supports actual files - * (not alternate data streams) */ - - src = get_dentry(w, from); - if (!src) - return -errno; - - dst = get_dentry(w, to); - - if (dst) { - /* Destination file exists */ - - if (src == dst) /* Same file */ - return 0; - - if (!dentry_is_directory(src)) { - /* Cannot rename non-directory to directory. */ - if (dentry_is_directory(dst)) - return -EISDIR; - } else { - /* Cannot rename directory to a non-directory or a non-empty - * directory */ - if (!dentry_is_directory(dst)) - return -ENOTDIR; - if (inode_has_children(dst->d_inode)) - return -ENOTEMPTY; - } - parent_of_dst = dst->parent; - } else { - /* Destination does not exist */ - parent_of_dst = get_parent_dentry(w, to); - if (!parent_of_dst) - return -errno; - - if (!dentry_is_directory(parent_of_dst)) - return -ENOTDIR; - } - - ret = set_dentry_name(src, path_basename(to)); - if (ret != 0) - return -ENOMEM; - if (dst) - remove_dentry(dst, w->lookup_table); - unlink_dentry(src); - dentry_add_child(parent_of_dst, src); - return 0; + return rename_wim_path(wimfs_get_WIMStruct(), from, to); } /* Remove a directory */ @@ -2415,7 +2364,6 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, char *argv[16]; int ret; char *dir_copy; - struct wim_lookup_table *joined_tab, *wim_tab_save; struct wim_image_metadata *imd; struct wimfs_context ctx; struct wim_inode *inode; @@ -2423,41 +2371,37 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, DEBUG("Mount: wim = %p, image = %d, dir = %s, flags = %d, ", wim, image, dir, mount_flags); - if (!wim || !dir) - return WIMLIB_ERR_INVALID_PARAM; + if (!wim || !dir) { + ret = WIMLIB_ERR_INVALID_PARAM; + goto out; + } ret = verify_swm_set(wim, additional_swms, num_additional_swms); if (ret) - return ret; + goto out; 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; + ret = WIMLIB_ERR_SPLIT_UNSUPPORTED; + goto out; } - if (num_additional_swms) { - ret = new_joined_lookup_table(wim, additional_swms, - num_additional_swms, - &joined_tab); - if (ret) - return ret; - wim_tab_save = wim->lookup_table; - wim->lookup_table = joined_tab; - } + 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); if (ret) - goto out; + goto out_restore_lookup_table; } ret = wim_checksum_unhashed_streams(wim); if (ret) - goto out; + goto out_restore_lookup_table; ret = select_wim_image(wim, image); if (ret) - goto out; + goto out_restore_lookup_table; DEBUG("Selected image %d", image); @@ -2467,20 +2411,20 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, ERROR("Cannot mount image that was just exported with " "wimlib_export_image()"); ret = WIMLIB_ERR_INVALID_PARAM; - goto out; + goto out_restore_lookup_table; } if (imd->modified) { ERROR("Cannot mount image that was added " "with wimlib_add_image()"); ret = WIMLIB_ERR_INVALID_PARAM; - goto out; + goto out_restore_lookup_table; } if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { ret = lock_wim(wim, wim->in_fd); if (ret) - goto out; + goto out_restore_lookup_table; } /* Use default stream interface if one was not specified */ @@ -2607,11 +2551,10 @@ out_unlock: wim->wim_locked = 0; out_free_message_queue_names: free_message_queue_names(&ctx); +out_restore_lookup_table: + if (num_additional_swms) + unmerge_lookup_table(wim); out: - if (num_additional_swms) { - free_lookup_table(wim->lookup_table); - wim->lookup_table = wim_tab_save; - } return ret; }