/* Name of the directory on which the WIM file is mounted. */
static const char *mount_dir;
+/* Next hard link group ID to be assigned. These are also used as the inode
+ * numbers. */
+static u64 next_link_group_id;
+
static inline int get_lookup_flags()
{
if (close(fd->staging_fd) != 0)
return -errno;
}
- if (--lte->num_opened_fds == 0 && lte->refcnt == 0)
+ if (--lte->num_opened_fds == 0 && lte->refcnt == 0) {
+ if (lte->staging_file_name)
+ unlink(lte->staging_file_name);
free_lookup_table_entry(lte);
+ }
lte->fds[fd->idx] = NULL;
FREE(fd);
return 0;
/* Called when the filesystem is unmounted. */
static void wimfs_destroy(void *p)
{
-
/* For read-write mounts, the `imagex unmount' command, which is
* running in a separate process and is executing the
* wimlib_unmount() function, will send this process a byte
close_message_queues();
}
+static int wimfs_fallocate(const char *path, int mode,
+ off_t offset, off_t len, struct fuse_file_info *fi)
+{
+ struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+ wimlib_assert(fd->staging_fd != -1);
+ return fallocate(fd->staging_fd, mode, offset, len);
+}
+
static int wimfs_fgetattr(const char *path, struct stat *stbuf,
struct fuse_file_info *fi)
{
struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
- dentry_to_stbuf(fd->dentry, stbuf, w->lookup_table);
- return 0;
+ return dentry_to_stbuf(fd->dentry, stbuf, w->lookup_table);
}
static int wimfs_ftruncate(const char *path, off_t size,
struct dentry *dentry = get_dentry(w, path);
if (!dentry)
return -ENOENT;
- dentry_to_stbuf(dentry, stbuf, w->lookup_table);
- return 0;
+ return dentry_to_stbuf(dentry, stbuf, w->lookup_table);
+}
+
+static int wimfs_getxattr(const char *path, const char *name, char *value,
+ size_t size)
+{
+ /* XXX */
+ return -ENOTSUP;
}
/* Create a hard link */
return 0;
}
+static int wimfs_listxattr(const char *path, char *list, size_t size)
+{
+ /* XXX */
+ return -ENOTSUP;
+}
+
/*
* Create a directory in the WIM.
* @mode is currently ignored.
dentry = new_dentry(basename);
if (!dentry)
return -ENOMEM;
+ dentry->hard_link = next_link_group_id++;
link_dentry(dentry, parent);
}
return 0;
return 0;
}
+static int wimfs_removexattr(const char *path, const char *name)
+{
+ /* XXX */
+ return -ENOTSUP;
+}
+
/* Renames a file or directory. See rename (3) */
static int wimfs_rename(const char *from, const char *to)
{
return 0;
}
+static int wimfs_setxattr(const char *path, const char *name,
+ const char *value, size_t size, int flags)
+{
+ /* XXX */
+ return -ENOTSUP;
+}
+
static int wimfs_symlink(const char *to, const char *from)
{
struct dentry *dentry_parent, *dentry;
if (ret != 0)
return ret;
- if (lte && lte->staging_file_name)
- if (unlink(lte->staging_file_name) != 0)
- return -errno;
-
if (dentry_hash == dentry->hash) {
/* We are removing the full dentry including all alternate data
* streams. */
wimlib_assert(fd->lte->staging_file_name);
wimlib_assert(fd->staging_fd != -1);
+ /* Seek to the requested position */
+ if (lseek(fd->staging_fd, offset, SEEK_SET) == -1)
+ return -errno;
+
/* Write the data. */
ret = write(fd->staging_fd, buf, size);
if (ret == -1)
static struct fuse_operations wimfs_operations = {
- .access = wimfs_access,
- .destroy = wimfs_destroy,
- .fgetattr = wimfs_fgetattr,
- .ftruncate = wimfs_ftruncate,
- .getattr = wimfs_getattr,
- .link = wimfs_link,
- .mkdir = wimfs_mkdir,
- .mknod = wimfs_mknod,
- .open = wimfs_open,
- .opendir = wimfs_opendir,
- .read = wimfs_read,
- .readdir = wimfs_readdir,
- .readlink = wimfs_readlink,
- .release = wimfs_release,
- .releasedir = wimfs_releasedir,
- .rename = wimfs_rename,
- .rmdir = wimfs_rmdir,
- .symlink = wimfs_symlink,
- .truncate = wimfs_truncate,
- .unlink = wimfs_unlink,
- .utimens = wimfs_utimens,
- .write = wimfs_write,
+ .access = wimfs_access,
+ .destroy = wimfs_destroy,
+ .fallocate = wimfs_fallocate,
+ .fgetattr = wimfs_fgetattr,
+ .ftruncate = wimfs_ftruncate,
+ .getattr = wimfs_getattr,
+ .getxattr = wimfs_getxattr,
+ .link = wimfs_link,
+ .listxattr = wimfs_listxattr,
+ .mkdir = wimfs_mkdir,
+ .mknod = wimfs_mknod,
+ .open = wimfs_open,
+ .opendir = wimfs_opendir,
+ .read = wimfs_read,
+ .readdir = wimfs_readdir,
+ .readlink = wimfs_readlink,
+ .release = wimfs_release,
+ .releasedir = wimfs_releasedir,
+ .removexattr = wimfs_removexattr,
+ .rename = wimfs_rename,
+ .rmdir = wimfs_rmdir,
+ .setxattr = wimfs_setxattr,
+ .symlink = wimfs_symlink,
+ .truncate = wimfs_truncate,
+ .unlink = wimfs_unlink,
+ .utimens = wimfs_utimens,
+ .write = wimfs_write,
};
if (ret != 0)
return ret;
+ DEBUG("Selected image %d", image);
+
+ next_link_group_id = assign_link_groups(wim->image_metadata[image - 1].lgt);
+
if (flags & WIMLIB_MOUNT_FLAG_READWRITE)
wim_get_current_image_metadata(wim)->modified = true;