1/*
2 * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. All rights reserved.
3 * Copyright 2002-2006, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include <syscalls.h>
9
10#include <ctype.h>
11#include <errno.h>
12#include <fcntl.h>
13#include <limits.h>
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
17#include <unistd.h>
18#include <pwd.h>
19
20#include <errno_private.h>
21
22
23template<typename T>
24static inline T
25set_errno_if_necessary(const T& result)
26{
27	if (result < 0) {
28		__set_errno(result);
29		return -1;
30	}
31
32	return result;
33}
34
35
36//	#pragma mark -
37
38
39gid_t
40getegid(void)
41{
42	return _kern_getgid(true);
43}
44
45
46uid_t
47geteuid(void)
48{
49	return _kern_getuid(true);
50}
51
52
53gid_t
54getgid(void)
55{
56	return _kern_getgid(false);
57}
58
59
60uid_t
61getuid(void)
62{
63	return _kern_getuid(false);
64}
65
66
67int
68setgid(gid_t gid)
69{
70	return set_errno_if_necessary(_kern_setregid(gid, (gid_t)-1, true));
71}
72
73
74int
75setuid(uid_t uid)
76{
77	return set_errno_if_necessary(_kern_setreuid(uid, (uid_t)-1, true));
78}
79
80
81int
82setegid(gid_t gid)
83{
84	return set_errno_if_necessary(_kern_setregid((gid_t)-1, gid, false));
85}
86
87
88int
89seteuid(uid_t uid)
90{
91	return set_errno_if_necessary(_kern_setreuid((uid_t)-1, uid, false));
92}
93
94
95int
96setregid(gid_t rgid, gid_t egid)
97{
98	return set_errno_if_necessary(_kern_setregid(rgid, egid, false));
99}
100
101
102int
103setreuid(uid_t ruid, uid_t euid)
104{
105	return set_errno_if_necessary(_kern_setreuid(ruid, euid, false));
106}
107
108
109int
110getgroups(int groupCount, gid_t groupList[])
111{
112	return set_errno_if_necessary(_kern_getgroups(groupCount, groupList));
113}
114
115
116int
117setgroups(int groupCount, const gid_t* groupList)
118{
119	return set_errno_if_necessary(_kern_setgroups(groupCount, groupList));
120}
121
122// NOTE: getgrouplist() and initgroups() are implemented in grp.cpp.
123