diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs
index 4ac3347f1880cd8d0384312971f3737f5ef114cf..6989ee525c6c37814f73731f1411cf18df13431f 100644
--- a/src/header/unistd/mod.rs
+++ b/src/header/unistd/mod.rs
@@ -657,7 +657,7 @@ pub unsafe extern "C" fn rmdir(path: *const c_char) -> c_int {
 
 #[no_mangle]
 pub extern "C" fn setgid(gid: gid_t) -> c_int {
-    Sys::setregid(gid, gid)
+    Sys::setresgid(gid, gid, -1)
 }
 
 #[no_mangle]
@@ -677,12 +677,16 @@ pub extern "C" fn setpgrp() -> pid_t {
 
 #[no_mangle]
 pub extern "C" fn setregid(rgid: gid_t, egid: gid_t) -> c_int {
-    Sys::setregid(rgid, egid)
+    Sys::setresgid(rgid, egid, -1)
+}
+#[no_mangle]
+pub extern "C" fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int {
+    Sys::setresgid(rgid, egid, sgid)
 }
 
 #[no_mangle]
 pub extern "C" fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
-    Sys::setreuid(ruid, euid)
+    Sys::setresuid(ruid, euid, -1)
 }
 
 #[no_mangle]
@@ -692,7 +696,11 @@ pub extern "C" fn setsid() -> pid_t {
 
 #[no_mangle]
 pub extern "C" fn setuid(uid: uid_t) -> c_int {
-    Sys::setreuid(uid, uid)
+    Sys::setresuid(uid, uid, -1)
+}
+#[no_mangle]
+pub extern "C" fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int {
+    Sys::setresuid(ruid, euid, suid)
 }
 
 #[no_mangle]
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 1c645386a76758aa73601dbe5ed6aa9db6728fc5..1a03cfb79e046620342d593349346b17116ffa4e 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -568,12 +568,12 @@ impl Pal for Sys {
         e(unsafe { syscall!(SETPRIORITY, which, who, prio) }) as c_int
     }
 
-    fn setregid(rgid: gid_t, egid: gid_t) -> c_int {
-        e(unsafe { syscall!(SETREGID, rgid, egid) }) as c_int
+    fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int {
+        e(unsafe { syscall!(SETRESGID, rgid, egid, sgid) }) as c_int
     }
 
-    fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
-        e(unsafe { syscall!(SETREUID, ruid, euid) }) as c_int
+    fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int {
+        e(unsafe { syscall!(SETRESUID, ruid, euid, suid) }) as c_int
     }
 
     fn setsid() -> c_int {
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index 8b30339e9e79eef1bafd1a2a4cdeb852b10658fd..fb9d2dfc359118a64aef9796bfed56b97dea5e89 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -207,9 +207,9 @@ pub trait Pal {
 
     fn setpriority(which: c_int, who: id_t, prio: c_int) -> c_int;
 
-    fn setregid(rgid: gid_t, egid: gid_t) -> c_int;
+    fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int;
 
-    fn setreuid(ruid: uid_t, euid: uid_t) -> c_int;
+    fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int;
 
     fn setsid() -> c_int;
 
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index e1b1351f35ae0d8e556373aa5aea7cc266d28fe0..3986842193c03a566653410705845aa3ce7a5192 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -930,11 +930,17 @@ impl Pal for Sys {
         }
     }
 
-    fn setregid(rgid: gid_t, egid: gid_t) -> c_int {
+    fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int {
+        if sgid != -1 {
+            println!("TODO: suid");
+        }
         e(syscall::setregid(rgid as usize, egid as usize)) as c_int
     }
 
-    fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
+    fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int {
+        if suid != -1 {
+            println!("TODO: suid");
+        }
         e(syscall::setreuid(ruid as usize, euid as usize)) as c_int
     }