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()22 fn 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