|  | //@ run-pass | 
|  | //@ ignore-android | 
|  | //@ ignore-fuchsia no '/bin/sh', '/bin/ls' | 
|  | //@ ignore-tvos `Command::uid/gid` requires fork, which is prohibited | 
|  | //@ ignore-watchos `Command::uid/gid` requires fork, which is prohibited | 
|  | //@ needs-subprocess | 
|  |  | 
|  | #![feature(rustc_private)] | 
|  |  | 
|  | fn main() { | 
|  | #[cfg(unix)] | 
|  | run() | 
|  | } | 
|  |  | 
|  | #[cfg(unix)] | 
|  | fn run() { | 
|  | extern crate libc; | 
|  | use std::process::Command; | 
|  | use std::os::unix::prelude::*; | 
|  |  | 
|  | let mut p = Command::new("/bin/sh") | 
|  | .arg("-c").arg("true") | 
|  | .uid(unsafe { libc::getuid() }) | 
|  | .gid(unsafe { libc::getgid() }) | 
|  | .spawn().unwrap(); | 
|  | assert!(p.wait().unwrap().success()); | 
|  |  | 
|  | // if we're already root, this isn't a valid test. Most of the bots run | 
|  | // as non-root though (android is an exception). | 
|  | if unsafe { libc::getuid() != 0 } { | 
|  | assert!(Command::new("/bin/ls").uid(0).gid(0).spawn().is_err()); | 
|  | } | 
|  | } |