chown: leave owner and group unchanged when values of -1 are passed
This commit is contained in:
@@ -14,61 +14,54 @@
|
|||||||
#include <syscall_utils.h>
|
#include <syscall_utils.h>
|
||||||
|
|
||||||
|
|
||||||
int
|
static int
|
||||||
chown(const char *path, uid_t owner, gid_t group)
|
common_chown(int fd, const char* path, bool followLinks, uid_t owner,
|
||||||
|
gid_t group)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
struct stat stat;
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
stat.st_uid = owner;
|
int mask = 0;
|
||||||
stat.st_gid = group;
|
if (owner != (uid_t)-1) {
|
||||||
status = _kern_write_stat(-1, path, true, &stat, sizeof(struct stat),
|
stat.st_uid = owner;
|
||||||
B_STAT_UID | B_STAT_GID);
|
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);
|
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
|
int
|
||||||
lchown(const char *path, uid_t owner, gid_t group)
|
lchown(const char *path, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
return common_chown(-1, path, false, owner, group);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
fchown(int fd, uid_t owner, gid_t group)
|
fchown(int fd, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
return common_chown(fd, NULL, false, owner, group);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
fchownat(int fd, const char* path, uid_t owner, gid_t group, int flag)
|
fchownat(int fd, const char* path, uid_t owner, gid_t group, int flag)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
return common_chown(fd, path, (flag & AT_SYMLINK_NOFOLLOW) == 0, owner,
|
||||||
status_t status;
|
group);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user