summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/syscalls.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-01-24 15:23:15 +0000
committerCorinna Vinschen <corinna@vinschen.de>2003-01-24 15:23:15 +0000
commit7d33eefa7b3535e37ab3948e8c1d740c1eb17d44 (patch)
treecc3139a0c6cd50e0c86692775cc1b67fb7df5e23 /winsup/cygwin/syscalls.cc
parentac4133746eeaad61b2bb2f71bd8861615b052427 (diff)
downloadcygnal-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.cc50
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