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.
*
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;
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;
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 */
}
if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
- ret = lock_wim(wim, wim->fp);
+ ret = lock_wim(wim, wim->in_fd);
if (ret)
goto out;
}