X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmount_image.c;h=37bc68ce0f56efa74d3e29601e516412a19179c6;hb=efe0c3f69a5d3c7c226a66c004b5bf6ef8a02d11;hp=12b193e3ad1081f6ba2f73bfbd9f12e8b1004361;hpb=3d84c998673ba7acf82ec5c26769a41e28a2cc7b;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index 12b193e3..37bc68ce 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" @@ -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; @@ -865,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) @@ -1540,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; @@ -1561,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; @@ -1622,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); @@ -1646,7 +1646,7 @@ wimfs_getxattr(const char *path, const char *name, char *value, if (!(ctx->mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR)) return -ENOTSUP; - if (strlen(name) < 5 || memcmp(name, "user.", 5) != 0) + if (strlen(name) <= 5 || memcmp(name, "user.", 5) != 0) return -ENOATTR; name += 5; @@ -1740,6 +1740,10 @@ wimfs_listxattr(const char *path, char *list, size_t size) p = list; for (i = 0; i < inode->i_num_ads; i++) { + + if (!ads_entry_is_named_stream(&inode->i_ads_entries[i])) + continue; + char *stream_name_mbs; size_t stream_name_mbs_nbytes; int ret; @@ -1829,8 +1833,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; @@ -2120,7 +2124,7 @@ wimfs_setxattr(const char *path, const char *name, if (!(ctx->mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR)) return -ENOTSUP; - if (strlen(name) < 5 || memcmp(name, "user.", 5) != 0) + if (strlen(name) <= 5 || memcmp(name, "user.", 5) != 0) return -ENOATTR; name += 5; @@ -2187,8 +2191,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; @@ -2232,8 +2236,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; @@ -2259,7 +2263,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; @@ -2286,7 +2290,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; @@ -2390,9 +2394,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]; @@ -2405,27 +2407,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); @@ -2434,21 +2427,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 */ @@ -2572,10 +2563,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; } @@ -2652,9 +2639,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(); }