X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fmount_image.c;h=0538fbc9a9da1d65dbc54e9306ad35e6b57e53aa;hp=bd27a46aa74902ad71bb72a613c13abee87b76ef;hb=bb40342796df9c677f6903b596abf4e9e5769845;hpb=b5238e5a022184cbc13ebf510bc5081140867abe diff --git a/src/mount_image.c b/src/mount_image.c index bd27a46a..0538fbc9 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -160,54 +160,6 @@ flags_writable(int open_flags) return open_flags & (O_RDWR | O_WRONLY); } -/* Like pread(), but keep trying until everything has been read or we know for - * sure that there was an error. */ -static ssize_t -full_pread(int fd, void *buf, size_t count, off_t offset) -{ - ssize_t bytes_remaining = count; - ssize_t bytes_read; - - while (bytes_remaining > 0) { - bytes_read = pread(fd, buf, bytes_remaining, offset); - if (bytes_read <= 0) { - if (bytes_read < 0) { - if (errno == EINTR) - continue; - } else { - errno = EIO; - } - break; - } - bytes_remaining -= bytes_read; - buf += bytes_read; - offset += bytes_read; - } - return count - bytes_remaining; -} - -/* Like pwrite(), but keep trying until everything has been written or we know - * for sure that there was an error. */ -static ssize_t -full_pwrite(int fd, const void *buf, size_t count, off_t offset) -{ - ssize_t bytes_remaining = count; - ssize_t bytes_written; - - while (bytes_remaining > 0) { - bytes_written = pwrite(fd, buf, bytes_remaining, offset); - if (bytes_written < 0) { - if (errno == EINTR) - continue; - break; - } - bytes_remaining -= bytes_written; - buf += bytes_written; - offset += bytes_written; - } - return count - bytes_remaining; -} - /* * Allocate a file descriptor for a stream. * @@ -1687,8 +1639,8 @@ wimfs_getxattr(const char *path, const char *name, char *value, if (res_size > size) return -ERANGE; - ret = read_full_resource_into_buf(lte, value, true); - if (ret != 0) + ret = read_full_resource_into_buf(lte, value); + if (ret) return -EIO; return res_size; @@ -1953,7 +1905,7 @@ wimfs_read(const char *path, char *buf, size_t size, break; case RESOURCE_IN_WIM: if (read_partial_wim_resource_into_buf(fd->f_lte, size, - offset, buf, true)) + offset, buf)) ret = -errno; else ret = size; @@ -2095,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 */ @@ -2526,7 +2427,7 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, } if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { - ret = lock_wim(wim, wim->fp); + ret = lock_wim(wim, wim->in_fd); if (ret) goto out; }