diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2003-01-24 15:23:15 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2003-01-24 15:23:15 +0000 |
commit | 7d33eefa7b3535e37ab3948e8c1d740c1eb17d44 (patch) | |
tree | cc3139a0c6cd50e0c86692775cc1b67fb7df5e23 /winsup/cygwin/syscalls.cc | |
parent | ac4133746eeaad61b2bb2f71bd8861615b052427 (diff) | |
download | cygnal-7d33eefa7b3535e37ab3948e8c1d740c1eb17d44.tar.gz cygnal-7d33eefa7b3535e37ab3948e8c1d740c1eb17d44.tar.bz2 cygnal-7d33eefa7b3535e37ab3948e8c1d740c1eb17d44.zip |
* cygwin.din: Export setreuid32, setreuid, setregid32, setregid.
* syscalls.cc (setreuid32): New function.
(setreuid): Ditto.
(setregid32): Ditto.
(setregid): Ditto.
* include/cygwin/version.h: Bump API minor number.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r-- | winsup/cygwin/syscalls.cc | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 5f5a1e05c..b844a7717 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -2131,6 +2131,31 @@ setuid (__uid16_t uid) return setuid32 (uid16touid32 (uid)); } +extern "C" int +setreuid32 (__uid32_t ruid, __uid32_t euid) +{ + int ret = 0; + bool tried = false; + __uid32_t old_euid = myself->uid; + + if (ruid != ILLEGAL_UID && cygheap->user.real_uid != ruid && euid != ruid) + tried = !(ret = seteuid32 (ruid)); + if (!ret && euid != ILLEGAL_UID) + ret = seteuid32 (euid); + if (tried && (ret || euid == ILLEGAL_UID) && seteuid32 (old_euid)) + system_printf ("Cannot restore original euid %u", old_euid); + if (!ret && ruid != ILLEGAL_UID) + cygheap->user.real_uid = ruid; + debug_printf ("real: %u, effective: %u", cygheap->user.real_uid, myself->uid); + return ret; +} + +extern "C" int +setreuid (__uid16_t ruid, __uid16_t euid) +{ + return setreuid32 (uid16touid32 (ruid), uid16touid32 (euid)); +} + /* setegid: from System V. */ extern "C" int setegid32 (__gid32_t gid) @@ -2209,6 +2234,31 @@ setgid (__gid16_t gid) return ret; } +extern "C" int +setregid32 (__gid32_t rgid, __gid32_t egid) +{ + int ret = 0; + bool tried = false; + __gid32_t old_egid = myself->gid; + + if (rgid != ILLEGAL_GID && cygheap->user.real_gid != rgid && egid != rgid) + tried = !(ret = setegid32 (rgid)); + if (!ret && egid != ILLEGAL_GID) + ret = setegid32 (egid); + if (tried && (ret || egid == ILLEGAL_GID) && setegid32 (old_egid)) + system_printf ("Cannot restore original egid %u", old_egid); + if (!ret && rgid != ILLEGAL_GID) + cygheap->user.real_gid = rgid; + debug_printf ("real: %u, effective: %u", cygheap->user.real_gid, myself->gid); + return ret; +} + +extern "C" int +setregid (__gid16_t rgid, __gid16_t egid) +{ + return setregid32 (gid16togid32 (rgid), gid16togid32 (egid)); +} + /* chroot: privileged Unix system call. */ /* FIXME: Not privileged here. How should this be done? */ extern "C" int |