1 /*
2 * Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include <errno.h>
8 #include <unistd.h>
9
10 #include <NodeMonitor.h>
11
12 #include <errno_private.h>
13 #include <syscalls.h>
14 #include <syscall_utils.h>
15
16
17 static int
common_chown(int fd,const char * path,bool followLinks,uid_t owner,gid_t group)18 common_chown(int fd, const char* path, bool followLinks, uid_t owner,
19 gid_t group)
20 {
21 struct stat stat;
22 status_t status;
23
24 int mask = 0;
25 if (owner != (uid_t)-1) {
26 stat.st_uid = owner;
27 mask |= B_STAT_UID;
28 }
29 if (group != (gid_t)-1) {
30 stat.st_gid = group;
31 mask |= B_STAT_GID;
32 }
33
34 status = _kern_write_stat(fd, path, followLinks, &stat,
35 sizeof(struct stat), mask);
36
37 RETURN_AND_SET_ERRNO(status);
38 }
39
40
41 int
chown(const char * path,uid_t owner,gid_t group)42 chown(const char *path, uid_t owner, gid_t group)
43 {
44 return common_chown(AT_FDCWD, path, true, owner, group);
45 }
46
47
48 int
lchown(const char * path,uid_t owner,gid_t group)49 lchown(const char *path, uid_t owner, gid_t group)
50 {
51 return common_chown(AT_FDCWD, path, false, owner, group);
52 }
53
54
55 int
fchown(int fd,uid_t owner,gid_t group)56 fchown(int fd, uid_t owner, gid_t group)
57 {
58 return common_chown(fd, NULL, false, owner, group);
59 }
60
61
62 int
fchownat(int fd,const char * path,uid_t owner,gid_t group,int flag)63 fchownat(int fd, const char* path, uid_t owner, gid_t group, int flag)
64 {
65 return common_chown(fd, path, (flag & AT_SYMLINK_NOFOLLOW) == 0, owner,
66 group);
67 }
68