pthread_mutex_lock(&inode->i_mutex);
- DEBUG("Allocating fd for stream ID %u from inode %lx (open = %u, allocated = %u)",
+ DEBUG("Allocating fd for stream ID %u from inode %#"PRIx64" "
+ "(open = %u, allocated = %u)",
stream_id, inode->i_ino, inode->i_num_opened_fds,
inode->i_num_allocated_fds);
static int close_wimfs_fd(struct wimfs_fd *fd)
{
int ret;
- DEBUG("Closing fd (inode = %lu, opened = %u, allocated = %u)",
+ DEBUG("Closing fd (ino = %#"PRIx64", opened = %u, allocated = %u)",
fd->f_inode->i_ino, fd->f_inode->i_num_opened_fds,
fd->f_inode->i_num_allocated_fds);
ret = lte_put_fd(fd->f_lte, fd);
}
DEBUG("Calculating SHA1 checksums for all new staging files.");
- list_for_each_entry(lte, &ctx->staging_list, staging_list) {
+ list_for_each_entry_safe(lte, tmp, &ctx->staging_list, staging_list) {
ret = update_lte_of_staging_file(lte, w->lookup_table);
if (ret != 0)
return ret;
{
int ret;
struct wim_inode *inode;
- struct ads_entry *ads_entry;
+ struct wim_ads_entry *ads_entry;
size_t res_size;
struct wim_lookup_table_entry *lte;
struct wimfs_context *ctx = wimfs_get_context();
if (!inode)
return -errno;
- if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT)
- return -EEXIST;
-
- if (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY)
+ if (inode->i_attributes & (FILE_ATTRIBUTE_DIRECTORY |
+ FILE_ATTRIBUTE_REPARSE_POINT))
return -EPERM;
from_dentry_parent = get_parent_dentry(w, from);
if (!from_dentry_parent)
- return -ENOENT;
+ return -errno;
if (!dentry_is_directory(from_dentry_parent))
return -ENOTDIR;
if ((ctx->mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS)
&& (stream_name = path_stream_name(path))) {
/* Make an alternate data stream */
- struct ads_entry *new_entry;
+ struct wim_ads_entry *new_entry;
struct wim_inode *inode;
char *p = (char*)stream_name - 1;
}
ret = alloc_wimfs_fd(inode, stream_id, lte, &fd,
- wimfs_ctx_readonly(ctx));
+ wimfs_ctx_readonly(ctx));
if (ret != 0)
return ret;
wimlib_assert(fd->f_lte->staging_file_name);
wimlib_assert(fd->staging_fd != -1);
- DEBUG("Seek to offset %zu", offset);
+ DEBUG("Seek to offset %"PRIu64, offset);
if (lseek(fd->staging_fd, offset, SEEK_SET) == -1)
return -errno;
static int wimfs_removexattr(const char *path, const char *name)
{
struct wim_inode *inode;
- struct ads_entry *ads_entry;
+ struct wim_ads_entry *ads_entry;
u16 ads_idx;
struct wimfs_context *ctx = wimfs_get_context();
return -ENOTDIR;
}
- ret = set_dentry_name(src, to);
+ ret = set_dentry_name(src, path_basename(to));
if (ret != 0)
return -ENOMEM;
if (dst)
static int wimfs_setxattr(const char *path, const char *name,
const char *value, size_t size, int flags)
{
- struct ads_entry *existing_ads_entry;
- struct ads_entry *new_ads_entry;
+ struct wim_ads_entry *existing_ads_entry;
+ struct wim_ads_entry *new_ads_entry;
struct wim_lookup_table_entry *existing_lte;
struct wim_lookup_table_entry *lte;
struct wim_inode *inode;
int ret;
char *dir_copy;
struct wim_lookup_table *joined_tab, *wim_tab_save;
- struct image_metadata *imd;
+ struct wim_image_metadata *imd;
struct wimfs_context ctx;
struct hlist_node *cur_node;
struct wim_inode *inode;
/*
* We provide the use_ino option to the FUSE mount because we are going
- * to assign inode numbers oursides. */
+ * to assign inode numbers ourselves. */
char optstring[256] =
"use_ino"
",subtype=wimfs"
if (ret)
ret = WIMLIB_ERR_FUSE;
+
+ /* Try to delete the staging directory if a deletion wasn't yet
+ * attempted due to an earlier error */
+ if (ctx.staging_dir_name)
+ delete_staging_dir(&ctx);
+
out_free_dir_copy:
FREE(dir_copy);
out_unlock: