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