X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmount_image.c;h=cc1c57dc90f8def293b3d186cb39703be54441e7;hb=d5984b47ca93ee5fa96a3d49aa5017b10e10e399;hp=2f9f440efb86eab662780cca5d16fb2b39e9d582;hpb=61db93f82eca3fe9f7676355c709c58cc425a6ad;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index 2f9f440e..cc1c57dc 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -46,7 +46,6 @@ #include "wimlib/paths.h" #include "wimlib/reparse.h" #include "wimlib/resource.h" -#include "wimlib/swm.h" #include "wimlib/timestamp.h" #include "wimlib/version.h" #include "wimlib/write.h" @@ -116,9 +115,9 @@ struct wimfs_context { /* Name and message queue descriptors for message queues between the * filesystem daemon process and the unmount process. These are used * when the filesystem is unmounted and the process running - * 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 */ + * wimlib_unmount_image() needs to communicate with the filesystem + * daemon running fuse_main() (i.e. the process created by a call to + * wimlib_mount_image(). */ char *unmount_to_daemon_mq_name; char *daemon_to_unmount_mq_name; mqd_t unmount_to_daemon_mq; @@ -483,7 +482,7 @@ create_staging_file(char **name_ret, struct wimfs_context *ctx) static const size_t STAGING_FILE_NAME_LEN = 20; name_len = ctx->staging_dir_name_len + 1 + STAGING_FILE_NAME_LEN; - name = MALLOC(name_len + 1); + name = MALLOC(name_len + 1); if (!name) { errno = ENOMEM; return -1; @@ -567,7 +566,8 @@ extract_resource_to_staging_dir(struct wim_inode *inode, /* Extract the stream to the staging file (possibly truncated) */ if (old_lte) { - struct filedes wimlib_fd = {.fd = fd}; + struct filedes wimlib_fd; + filedes_init(&wimlib_fd, fd); extract_size = min(wim_resource_size(old_lte), size); ret = extract_wim_resource_to_fd(old_lte, &wimlib_fd, extract_size); @@ -864,7 +864,7 @@ set_message_queue_names(struct wimfs_context *ctx, const char *mount_dir) char *p; int ret; - dir_path = realpath(mount_dir, NULL); + dir_path = realpath(mount_dir, NULL); if (!dir_path) { ERROR_WITH_ERRNO("Failed to resolve path \"%s\"", mount_dir); if (errno == ENOMEM) @@ -1539,8 +1539,8 @@ wimfs_chmod(const char *path, mode_t mask) if (!(ctx->mount_flags & WIMLIB_MOUNT_FLAG_UNIX_DATA)) return -EPERM; - ret = lookup_resource(ctx->wim, path, LOOKUP_FLAG_DIRECTORY_OK, - &dentry, NULL, NULL); + ret = wim_pathname_to_stream(ctx->wim, path, LOOKUP_FLAG_DIRECTORY_OK, + &dentry, NULL, NULL); if (ret) return ret; @@ -1560,8 +1560,8 @@ wimfs_chown(const char *path, uid_t uid, gid_t gid) if (!(ctx->mount_flags & WIMLIB_MOUNT_FLAG_UNIX_DATA)) return -EPERM; - ret = lookup_resource(ctx->wim, path, LOOKUP_FLAG_DIRECTORY_OK, - &dentry, NULL, NULL); + ret = wim_pathname_to_stream(ctx->wim, path, LOOKUP_FLAG_DIRECTORY_OK, + &dentry, NULL, NULL); if (ret) return ret; @@ -1621,9 +1621,10 @@ wimfs_getattr(const char *path, struct stat *stbuf) int ret; struct wimfs_context *ctx = wimfs_get_context(); - ret = lookup_resource(ctx->wim, path, - get_lookup_flags(ctx) | LOOKUP_FLAG_DIRECTORY_OK, - &dentry, <e, NULL); + ret = wim_pathname_to_stream(ctx->wim, path, + get_lookup_flags(ctx) | + LOOKUP_FLAG_DIRECTORY_OK, + &dentry, <e, NULL); if (ret != 0) return ret; return inode_to_stbuf(dentry->d_inode, lte, stbuf); @@ -1667,9 +1668,12 @@ wimfs_getxattr(const char *path, const char *name, char *value, return -ERANGE; ret = read_full_resource_into_buf(lte, value); - if (ret) - return -errno; - + if (ret) { + if (errno) + return -errno; + else + return -EIO; + } return res_size; } #endif @@ -1825,8 +1829,8 @@ wimfs_open(const char *path, struct fuse_file_info *fi) struct wimfs_context *ctx = wimfs_get_context(); struct wim_lookup_table_entry **back_ptr; - ret = lookup_resource(ctx->wim, path, get_lookup_flags(ctx), - &dentry, <e, &stream_idx); + ret = wim_pathname_to_stream(ctx->wim, path, get_lookup_flags(ctx), + &dentry, <e, &stream_idx); if (ret) return ret; @@ -2183,8 +2187,8 @@ wimfs_truncate(const char *path, off_t size) struct wim_inode *inode; struct wimfs_context *ctx = wimfs_get_context(); - ret = lookup_resource(ctx->wim, path, get_lookup_flags(ctx), - &dentry, <e, &stream_idx); + ret = wim_pathname_to_stream(ctx->wim, path, get_lookup_flags(ctx), + &dentry, <e, &stream_idx); if (ret != 0) return ret; @@ -2192,7 +2196,7 @@ wimfs_truncate(const char *path, off_t size) if (lte == NULL && size == 0) return 0; - if (lte->resource_location == RESOURCE_IN_STAGING_FILE) { + if (lte != NULL && lte->resource_location == RESOURCE_IN_STAGING_FILE) { ret = truncate(lte->staging_file_name, size); if (ret) ret = -errno; @@ -2228,8 +2232,8 @@ wimfs_unlink(const char *path) u16 stream_idx; struct wimfs_context *ctx = wimfs_get_context(); - ret = lookup_resource(ctx->wim, path, get_lookup_flags(ctx), - &dentry, <e, &stream_idx); + ret = wim_pathname_to_stream(ctx->wim, path, get_lookup_flags(ctx), + &dentry, <e, &stream_idx); if (ret != 0) return ret; @@ -2255,7 +2259,7 @@ wimfs_utimens(const char *path, const struct timespec tv[2]) struct wim_inode *inode; WIMStruct *wim = wimfs_get_WIMStruct(); - dentry = get_dentry(wim, path); + dentry = get_dentry(wim, path); if (!dentry) return -errno; inode = dentry->d_inode; @@ -2282,7 +2286,7 @@ wimfs_utime(const char *path, struct utimbuf *times) struct wim_inode *inode; WIMStruct *wim = wimfs_get_WIMStruct(); - dentry = get_dentry(wim, path); + dentry = get_dentry(wim, path); if (!dentry) return -errno; inode = dentry->d_inode; @@ -2386,9 +2390,7 @@ static struct fuse_operations wimfs_operations = { /* API function documented in wimlib.h */ WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const char *dir, - int mount_flags, WIMStruct **additional_swms, - unsigned num_additional_swms, - const char *staging_dir) + int mount_flags, const char *staging_dir) { int argc; char *argv[16]; @@ -2401,27 +2403,18 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, DEBUG("Mount: wim = %p, image = %d, dir = %s, flags = %d, ", wim, image, dir, mount_flags); - if (!wim || !dir) { - ret = WIMLIB_ERR_INVALID_PARAM; - goto out; - } - - ret = verify_swm_set(wim, additional_swms, num_additional_swms); - if (ret) - goto out; + if (!wim || !dir) + return WIMLIB_ERR_INVALID_PARAM; if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { ret = can_delete_from_wim(wim); if (ret) - goto out; + return ret; } - if (num_additional_swms) - merge_lookup_tables(wim, additional_swms, num_additional_swms); - ret = select_wim_image(wim, image); if (ret) - goto out_restore_lookup_table; + return ret; DEBUG("Selected image %d", image); @@ -2430,21 +2423,19 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, if (imd->refcnt != 1) { ERROR("Cannot mount image that was just exported with " "wimlib_export_image()"); - ret = WIMLIB_ERR_INVALID_PARAM; - goto out_restore_lookup_table; + return WIMLIB_ERR_INVALID_PARAM; } if (imd->modified) { ERROR("Cannot mount image that was added " "with wimlib_add_image()"); - ret = WIMLIB_ERR_INVALID_PARAM; - goto out_restore_lookup_table; + return WIMLIB_ERR_INVALID_PARAM; } if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { ret = lock_wim(wim, wim->in_fd.fd); if (ret) - goto out_restore_lookup_table; + return ret; } /* Use default stream interface if one was not specified */ @@ -2478,7 +2469,7 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, goto out_free_message_queue_names; argc = 0; - argv[argc++] = IMAGEX_PROGNAME; + argv[argc++] = "wimlib"; argv[argc++] = dir_copy; /* disable multi-threaded operation */ @@ -2568,10 +2559,6 @@ out_unlock: wim->wim_locked = 0; out_free_message_queue_names: free_message_queue_names(&ctx); -out_restore_lookup_table: - if (num_additional_swms) - unmerge_lookup_table(wim); -out: return ret; } @@ -2648,9 +2635,7 @@ wimlib_unmount_image(const tchar *dir, int unmount_flags, WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const tchar *dir, - int mount_flags, WIMStruct **additional_swms, - unsigned num_additional_swms, - const tchar *staging_dir) + int mount_flags, const tchar *staging_dir) { return mount_unsupported_error(); }