1 // run-pass 2 // Ignore this test on Android, because it segfaults there. 3 4 // ignore-android 5 // ignore-windows 6 // ignore-emscripten no execve 7 // ignore-sgx no execve 8 // ignore-vxworks no execve 9 // no-prefer-dynamic 10 11 #![feature(rustc_private)] 12 13 extern crate libc; 14 15 use libc::c_char; 16 use libc::execve; 17 use std::env; 18 use std::ffi::CString; 19 use std::os::unix::prelude::*; 20 use std::ptr; 21 main()22fn main() { 23 if env::args_os().count() == 2 { 24 for (key, value) in env::vars_os() { 25 panic!("found env value {:?} {:?}", key, value); 26 } 27 return; 28 } 29 30 let current_exe = CString::new(env::current_exe() 31 .unwrap() 32 .as_os_str() 33 .as_bytes()).unwrap(); 34 let new_env_var = CString::new("FOOBAR").unwrap(); 35 let filename: *const c_char = current_exe.as_ptr(); 36 let argv: &[*const c_char] = &[filename, filename, ptr::null()]; 37 let envp: &[*const c_char] = &[new_env_var.as_ptr(), ptr::null()]; 38 unsafe { 39 execve(filename, &argv[0], &envp[0]); 40 } 41 panic!("execve failed"); 42 } 43