chown: leave owner and group unchanged when values of -1 are passed

This commit is contained in:
Hamish Morrison 2015-06-02 16:38:28 +01:00
parent 12d3254274
commit 9afa331102

@ -14,61 +14,54 @@
#include <syscall_utils.h>
int
chown(const char *path, uid_t owner, gid_t group)
static int
common_chown(int fd, const char* path, bool followLinks, uid_t owner,
gid_t group)
{
struct stat stat;
status_t status;
stat.st_uid = owner;
stat.st_gid = group;
status = _kern_write_stat(-1, path, true, &stat, sizeof(struct stat),
B_STAT_UID | B_STAT_GID);
int mask = 0;
if (owner != (uid_t)-1) {
stat.st_uid = owner;
mask |= B_STAT_UID;
}
if (group != (gid_t)-1) {
stat.st_gid = group;
mask |= B_STAT_GID;
}
status = _kern_write_stat(fd, path, followLinks, &stat,
sizeof(struct stat), mask);
RETURN_AND_SET_ERRNO(status);
}
int
chown(const char *path, uid_t owner, gid_t group)
{
return common_chown(-1, path, true, owner, group);
}
int
lchown(const char *path, uid_t owner, gid_t group)
{
struct stat stat;
status_t status;
stat.st_uid = owner;
stat.st_gid = group;
status = _kern_write_stat(-1, path, false, &stat, sizeof(struct stat),
B_STAT_UID | B_STAT_GID);
RETURN_AND_SET_ERRNO(status);
return common_chown(-1, path, false, owner, group);
}
int
fchown(int fd, uid_t owner, gid_t group)
{
struct stat stat;
status_t status;
stat.st_uid = owner;
stat.st_gid = group;
status = _kern_write_stat(fd, NULL, false, &stat, sizeof(struct stat),
B_STAT_UID | B_STAT_GID);
RETURN_AND_SET_ERRNO(status);
return common_chown(fd, NULL, false, owner, group);
}
int
fchownat(int fd, const char* path, uid_t owner, gid_t group, int flag)
{
struct stat stat;
status_t status;
stat.st_uid = owner;
stat.st_gid = group;
status = _kern_write_stat(fd, path, (flag & AT_SYMLINK_NOFOLLOW) == 0, &stat,
sizeof(struct stat), B_STAT_UID | B_STAT_GID);
RETURN_AND_SET_ERRNO(status);
return common_chown(fd, path, (flag & AT_SYMLINK_NOFOLLOW) == 0, owner,
group);
}