X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fmount.c;h=e10287a6f58aa918aaa06852ba31b9a3ab1d5e25;hp=b9da36e172f5f1e5e11702a56325db4f57941409;hb=45c3ad86e44a05a169bfb1fa8ff318861bbf9fbf;hpb=eb8d4725743de9b18d739dc436251f2c529cdfcb diff --git a/src/mount.c b/src/mount.c index b9da36e1..e10287a6 100644 --- a/src/mount.c +++ b/src/mount.c @@ -746,6 +746,28 @@ static int wimfs_access(const char *path, int mask) return 0; } +static int wimfs_chmod(const char *path, mode_t mask) +{ + struct dentry *dentry; + struct wimfs_context *ctx = wimfs_get_context(); + struct inode *inode; + struct stat stbuf; + int ret; + + ret = lookup_resource(ctx->wim, path, + get_lookup_flags(ctx) | LOOKUP_FLAG_DIRECTORY_OK, + &dentry, NULL, NULL); + if (ret != 0) + return ret; + inode = dentry->d_inode; + inode_to_stbuf(inode, NULL, &stbuf); + if (mask == stbuf.st_mode) + return 0; + else + return -EPERM; + +} + static void inode_update_lte_ptr(struct inode *inode, struct lookup_table_entry *old_lte, struct lookup_table_entry *new_lte) @@ -1064,7 +1086,7 @@ static int wimfs_link(const char *to, const char *from) lte->refcnt++; } - link_dentry(from_dentry, from_dentry_parent); + dentry_add_child(from_dentry_parent, from_dentry); return 0; } @@ -1130,7 +1152,7 @@ static int wimfs_mkdir(const char *path, mode_t mode) newdir->d_inode->attributes |= FILE_ATTRIBUTE_DIRECTORY; newdir->d_inode->resolved = true; newdir->d_inode->ino = ctx->next_ino++; - link_dentry(newdir, parent); + dentry_add_child(parent, newdir); return 0; } @@ -1182,7 +1204,7 @@ static int wimfs_mknod(const char *path, mode_t mode, dev_t rdev) return -ENOMEM; dentry->d_inode->resolved = true; dentry->d_inode->ino = ctx->next_ino++; - link_dentry(dentry, parent); + dentry_add_child(parent, dentry); } return 0; } @@ -1469,7 +1491,7 @@ static int wimfs_rename(const char *from, const char *to) src->file_name_utf8_len = file_name_utf8_len; unlink_dentry(src); - link_dentry(src, parent_of_dst); + dentry_add_child(parent_of_dst, src); return 0; } @@ -1589,7 +1611,7 @@ static int wimfs_symlink(const char *to, const char *from) if (inode_set_symlink(inode, to, ctx->wim->lookup_table, NULL) != 0) goto out_free_dentry; - link_dentry(dentry, dentry_parent); + dentry_add_child(dentry_parent, dentry); return 0; out_free_dentry: free_dentry(dentry); @@ -1747,6 +1769,7 @@ static int wimfs_write(const char *path, const char *buf, size_t size, static struct fuse_operations wimfs_operations = { .access = wimfs_access, + .chmod = wimfs_chmod, .destroy = wimfs_destroy, #if 0 .fallocate = wimfs_fallocate,