X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fmount_image.c;h=4c0c93e50126553f449f98806c6ca67951427e60;hp=b658effd07e28240a82cf979ee4e5ee53f8cba9f;hb=ee742f0a166d4aa4a1ab5c495aaa5029d8cf8e66;hpb=f9695b9f40035f1a20968293255761a8301eaba0 diff --git a/src/mount_image.c b/src/mount_image.c index b658effd..4c0c93e5 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 */ @@ -2423,16 +2372,19 @@ 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) { @@ -2440,7 +2392,7 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, num_additional_swms, &joined_tab); if (ret) - return ret; + goto out; wim_tab_save = wim->lookup_table; wim->lookup_table = joined_tab; } @@ -2448,16 +2400,16 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, 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 +2419,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 +2559,12 @@ out_unlock: wim->wim_locked = 0; out_free_message_queue_names: free_message_queue_names(&ctx); -out: +out_restore_lookup_table: if (num_additional_swms) { free_lookup_table(wim->lookup_table); wim->lookup_table = wim_tab_save; } +out: return ret; }