#ifdef WITH_FUSE
+#ifdef __WIN32__
+# error "FUSE mount not supported on Win32! Please configure --without-fuse"
+#endif
+
#include "buffer_io.h"
#include "lookup_table.h"
#include "sha1.h"
* file in the WIM is modified, it is extracted to the staging directory. If
* changes are commited when the WIM is unmounted, the file resources are merged
* in from the staging directory when writing the new WIM. */
- mbchar *staging_dir_name;
+ char *staging_dir_name;
size_t staging_dir_name_len;
/* Flags passed to wimlib_mount(). */
* wimlib_unmount_image() (i.e. the `imagex unmount' command) needs to
* communicate with the filesystem daemon running fuse_main() (i.e. the
* daemon created by the `imagex mount' or `imagex mountrw' commands */
- mbchar *unmount_to_daemon_mq_name;
- mbchar *daemon_to_unmount_mq_name;
+ char *unmount_to_daemon_mq_name;
+ char *daemon_to_unmount_mq_name;
mqd_t unmount_to_daemon_mq;
mqd_t daemon_to_unmount_mq;
* Returns 0 on success, or negative error number on failure.
*/
static int
-create_dentry(struct fuse_context *fuse_ctx, const mbchar *path,
+create_dentry(struct fuse_context *fuse_ctx, const char *path,
mode_t mode, int attributes, struct wim_dentry **dentry_ret)
{
struct wim_dentry *parent;
struct wim_dentry *new;
- const mbchar *basename;
+ const char *basename;
struct wimfs_context *wimfs_ctx = WIMFS_CTX(fuse_ctx);
+ int ret;
parent = get_parent_dentry(wimfs_ctx->wim, path);
if (!parent)
if (get_dentry_child_with_name(parent, basename))
return -EEXIST;
- new = new_dentry_with_inode(basename);
- if (!new)
- return -errno;
+ ret = new_dentry_with_inode(basename, &new);
+ if (ret)
+ return -ENOMEM;
new->d_inode->i_resolved = 1;
new->d_inode->i_ino = wimfs_ctx->next_ino++;
* writing. On failure, returns -1 and sets errno.
*/
static int
-create_staging_file(mbchar **name_ret, struct wimfs_context *ctx)
+create_staging_file(char **name_ret, struct wimfs_context *ctx)
{
size_t name_len;
- mbchar *name;
+ char *name;
struct stat stbuf;
int fd;
int errno_save;
* filesystem context structure.
*/
static int
-make_staging_dir(struct wimfs_context *ctx, const mbchar *user_prefix)
+make_staging_dir(struct wimfs_context *ctx, const char *user_prefix)
{
static const size_t random_suffix_len = 10;
- static const mbchar *common_suffix = ".staging";
+ static const char *common_suffix = ".staging";
static const size_t common_suffix_len = 8;
- mbchar *staging_dir_name = NULL;
+ char *staging_dir_name = NULL;
size_t staging_dir_name_len;
size_t prefix_len;
- const mbchar *wim_basename;
- mbchar *real_user_prefix = NULL;
+ const char *wim_basename;
+ char *real_user_prefix = NULL;
int ret;
if (user_prefix) {
}
static int
-remove_file_or_directory(const mbchar *fpath, const struct stat *sb,
+remove_file_or_directory(const char *fpath, const struct stat *sb,
int typeflag, struct FTW *ftwbuf)
{
if (remove(fpath) == 0)
}
static int
-set_message_queue_names(struct wimfs_context *ctx, const mbchar *mount_dir)
+set_message_queue_names(struct wimfs_context *ctx, const char *mount_dir)
{
- static const mbchar *u2d_prefix = "/wimlib-unmount-to-daemon-mq";
- static const mbchar *d2u_prefix = "/wimlib-daemon-to-unmount-mq";
- mbchar *dir_path;
- mbchar *p;
+ static const char *u2d_prefix = "/wimlib-unmount-to-daemon-mq";
+ static const char *d2u_prefix = "/wimlib-daemon-to-unmount-mq";
+ char *dir_path;
+ char *p;
int ret;
dir_path = realpath(mount_dir, NULL);
void **mailbox_ret)
{
long msgsize;
- char *mailbox;
+ void *mailbox;
msgsize = mq_get_msgsize(mq);
* daemon to finish writing the WIM file.
*/
static int
-execute_fusermount(const mbchar *dir)
+execute_fusermount(const char *dir)
{
pid_t pid;
int ret;
#endif
static int
-wimfs_chmod(const mbchar *path, mode_t mask)
+wimfs_chmod(const char *path, mode_t mask)
{
struct wim_dentry *dentry;
struct wimfs_context *ctx = wimfs_get_context();
}
static int
-wimfs_chown(const mbchar *path, uid_t uid, gid_t gid)
+wimfs_chown(const char *path, uid_t uid, gid_t gid)
{
struct wim_dentry *dentry;
struct wimfs_context *ctx = wimfs_get_context();
#endif
static int
-wimfs_fgetattr(const mbchar *path, struct stat *stbuf,
+wimfs_fgetattr(const char *path, struct stat *stbuf,
struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
}
static int
-wimfs_ftruncate(const mbchar *path, off_t size, struct fuse_file_info *fi)
+wimfs_ftruncate(const char *path, off_t size, struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
int ret = ftruncate(fd->staging_fd, size);
* Fills in a `struct stat' that corresponds to a file or directory in the WIM.
*/
static int
-wimfs_getattr(const mbchar *path, struct stat *stbuf)
+wimfs_getattr(const char *path, struct stat *stbuf)
{
struct wim_dentry *dentry;
struct wim_lookup_table_entry *lte;
#ifdef ENABLE_XATTR
/* Read an alternate data stream through the XATTR interface, or get its size */
static int
-wimfs_getxattr(const mbchar *path, const mbchar *name, char *value,
+wimfs_getxattr(const char *path, const char *name, char *value,
size_t size)
{
int ret;
/* Create a hard link */
static int
-wimfs_link(const mbchar *to, const mbchar *from)
+wimfs_link(const char *to, const char *from)
{
struct wim_dentry *from_dentry, *from_dentry_parent;
- const mbchar *link_name;
+ const char *link_name;
struct wim_inode *inode;
struct wim_lookup_table_entry *lte;
WIMStruct *w = wimfs_get_WIMStruct();
u16 i;
+ int ret;
inode = wim_pathname_to_inode(w, to);
if (!inode)
link_name = path_basename(from);
if (get_dentry_child_with_name(from_dentry_parent, link_name))
return -EEXIST;
- from_dentry = new_dentry(link_name);
- if (!from_dentry)
- return -errno;
+
+ ret = new_dentry(link_name, &from_dentry);
+ if (ret)
+ return -ENOMEM;
inode_add_dentry(from_dentry, inode);
from_dentry->d_inode = inode;
#ifdef ENABLE_XATTR
static int
-wimfs_listxattr(const mbchar *path, mbchar *list, size_t size)
+wimfs_listxattr(const char *path, char *list, size_t size)
{
size_t needed_size;
struct wim_inode *inode;
struct wimfs_context *ctx = wimfs_get_context();
u16 i;
- mbchar *p;
+ char *p;
bool size_only = (size == 0);
if (!(ctx->mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR))
p = list;
for (i = 0; i < inode->i_num_ads; i++) {
- mbchar *stream_name_mbs;
+ char *stream_name_mbs;
size_t stream_name_mbs_nbytes;
int ret;
- ret = utf16le_to_mbs(inode->i_ads_entries[i].stream_name,
- inode->i_ads_entries[i].stream_name_nbytes,
- &stream_name_mbs,
- &stream_name_mbs_nbytes);
- if (ret) {
- if (ret == WIMLIB_ERR_NOMEM)
- return -ENOMEM;
- else
- return -EIO;
- }
+ ret = utf16le_to_tstr(inode->i_ads_entries[i].stream_name,
+ inode->i_ads_entries[i].stream_name_nbytes,
+ &stream_name_mbs,
+ &stream_name_mbs_nbytes);
+ if (ret)
+ return -errno;
needed_size = stream_name_mbs_nbytes + 6;
if (!size_only) {
/* Create a directory in the WIM image. */
static int
-wimfs_mkdir(const mbchar *path, mode_t mode)
+wimfs_mkdir(const char *path, mode_t mode)
{
return create_dentry(fuse_get_context(), path, mode | S_IFDIR,
FILE_ATTRIBUTE_DIRECTORY, NULL);
/* Create a regular file or alternate data stream in the WIM image. */
static int
-wimfs_mknod(const mbchar *path, mode_t mode, dev_t rdev)
+wimfs_mknod(const char *path, mode_t mode, dev_t rdev)
{
- const mbchar *stream_name;
+ const char *stream_name;
struct fuse_context *fuse_ctx = fuse_get_context();
struct wimfs_context *wimfs_ctx = WIMFS_CTX(fuse_ctx);
struct wim_ads_entry *new_entry;
struct wim_inode *inode;
- mbchar *p = (mbchar*)stream_name - 1;
+ char *p = (char*)stream_name - 1;
wimlib_assert(*p == ':');
*p = '\0';
/* Open a file. */
static int
-wimfs_open(const mbchar *path, struct fuse_file_info *fi)
+wimfs_open(const char *path, struct fuse_file_info *fi)
{
struct wim_dentry *dentry;
struct wim_lookup_table_entry *lte;
/* Opens a directory. */
static int
-wimfs_opendir(const mbchar *path, struct fuse_file_info *fi)
+wimfs_opendir(const char *path, struct fuse_file_info *fi)
{
struct wim_inode *inode;
int ret;
* Read data from a file in the WIM or in the staging directory.
*/
static int
-wimfs_read(const mbchar *path, char *buf, size_t size,
+wimfs_read(const char *path, char *buf, size_t size,
off_t offset, struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
{
struct fill_params *fill_params = arg;
- mbchar *file_name_mbs;
+ char *file_name_mbs;
size_t file_name_mbs_nbytes;
int ret;
- ret = utf16le_to_mbs(dentry->file_name,
- dentry->file_name_nbytes,
- &file_name_mbs,
- &file_name_mbs_nbytes);
- if (ret) {
- if (ret == WIMLIB_ERR_NOMEM)
- return -ENOMEM;
- else
- return -EILSEQ;
- }
+ ret = utf16le_to_tstr(dentry->file_name,
+ dentry->file_name_nbytes,
+ &file_name_mbs,
+ &file_name_mbs_nbytes);
+ if (ret)
+ return -errno;
+
ret = fill_params->filler(fill_params->buf, file_name_mbs, NULL, 0);
FREE(file_name_mbs);
return ret;
/* Fills in the entries of the directory specified by @path using the
* FUSE-provided function @filler. */
static int
-wimfs_readdir(const mbchar *path, void *buf, fuse_fill_dir_t filler,
+wimfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
static int
-wimfs_readlink(const mbchar *path, char *buf, size_t buf_len)
+wimfs_readlink(const char *path, char *buf, size_t buf_len)
{
struct wimfs_context *ctx = wimfs_get_context();
struct wim_inode *inode = wim_pathname_to_inode(ctx->wim, path);
/* Close a file. */
static int
-wimfs_release(const mbchar *path, struct fuse_file_info *fi)
+wimfs_release(const char *path, struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
return close_wimfs_fd(fd);
/* Close a directory */
static int
-wimfs_releasedir(const mbchar *path, struct fuse_file_info *fi)
+wimfs_releasedir(const char *path, struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
return close_wimfs_fd(fd);
#ifdef ENABLE_XATTR
/* Remove an alternate data stream through the XATTR interface */
static int
-wimfs_removexattr(const char *path, const mbchar *name)
+wimfs_removexattr(const char *path, const char *name)
{
struct wim_inode *inode;
struct wim_ads_entry *ads_entry;
/* Renames a file or directory. See rename (3) */
static int
-wimfs_rename(const mbchar *from, const mbchar *to)
+wimfs_rename(const char *from, const char *to)
{
struct wim_dentry *src;
struct wim_dentry *dst;
/* Remove a directory */
static int
-wimfs_rmdir(const mbchar *path)
+wimfs_rmdir(const char *path)
{
struct wim_dentry *dentry;
WIMStruct *w = wimfs_get_WIMStruct();
#ifdef ENABLE_XATTR
/* Write an alternate data stream through the XATTR interface */
static int
-wimfs_setxattr(const mbchar *path, const mbchar *name,
+wimfs_setxattr(const char *path, const char *name,
const char *value, size_t size, int flags)
{
struct wim_ads_entry *existing_ads_entry;
#endif
static int
-wimfs_symlink(const mbchar *to, const mbchar *from)
+wimfs_symlink(const char *to, const char *from)
{
struct fuse_context *fuse_ctx = fuse_get_context();
struct wimfs_context *wimfs_ctx = WIMFS_CTX(fuse_ctx);
/* Reduce the size of a file */
static int
-wimfs_truncate(const mbchar *path, off_t size)
+wimfs_truncate(const char *path, off_t size)
{
struct wim_dentry *dentry;
struct wim_lookup_table_entry *lte;
/* Unlink a non-directory or alternate data stream */
static int
-wimfs_unlink(const mbchar *path)
+wimfs_unlink(const char *path)
{
struct wim_dentry *dentry;
struct wim_lookup_table_entry *lte;
* Note that alternate data streams do not have their own timestamps.
*/
static int
-wimfs_utimens(const mbchar *path, const struct timespec tv[2])
+wimfs_utimens(const char *path, const struct timespec tv[2])
{
struct wim_dentry *dentry;
struct wim_inode *inode;
}
#else /* HAVE_UTIMENSAT */
static int
-wimfs_utime(const mbchar *path, struct utimbuf *times)
+wimfs_utime(const char *path, struct utimbuf *times)
{
struct wim_dentry *dentry;
struct wim_inode *inode;
* It may be an alternate data stream, but here we don't even notice because we
* just get a lookup table entry. */
static int
-wimfs_write(const mbchar *path, const char *buf, size_t size,
+wimfs_write(const char *path, const char *buf, size_t size,
off_t offset, struct fuse_file_info *fi)
{
struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh;
int ret;
- u64 now;
if (!fd)
return -EBADF;
/* Mounts an image from a WIM file. */
WIMLIBAPI int
-wimlib_mount_image(WIMStruct *wim, int image, const mbchar *dir,
+wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
int mount_flags, WIMStruct **additional_swms,
unsigned num_additional_swms,
- const mbchar *staging_dir)
+ const char *staging_dir)
{
int argc;
char *argv[16];
int ret;
- mbchar *dir_copy;
+ char *dir_copy;
struct wim_lookup_table *joined_tab, *wim_tab_save;
struct wim_image_metadata *imd;
struct wimfs_context ctx;
* wimlib_mount_image().
*/
WIMLIBAPI int
-wimlib_unmount_image(const mbchar *dir, int unmount_flags,
+wimlib_unmount_image(const char *dir, int unmount_flags,
wimlib_progress_func_t progress_func)
{
int ret;
}
WIMLIBAPI int
-wimlib_unmount_image(const mbchar *dir, int unmount_flags,
+wimlib_unmount_image(const tchar *dir, int unmount_flags,
wimlib_progress_func_t progress_func)
{
return mount_unsupported_error();
}
WIMLIBAPI int
-wimlib_mount_image(WIMStruct *wim, int image, const mbchar *dir,
+wimlib_mount_image(WIMStruct *wim, int image, const tchar *dir,
int mount_flags, WIMStruct **additional_swms,
unsigned num_additional_swms,
- const mbchar *staging_dir)
+ const tchar *staging_dir)
{
return mount_unsupported_error();
}