/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Example
///
/// ```
/// let args = [""];
/// let env = [""];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;
syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}