|  | @@ -9,6 +9,7 @@ extern crate sys_utsname;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  pub use platform::types::*;
 | 
	
		
			
				|  |  |  pub use getopt::*;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  use core::ptr;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  mod getopt;
 | 
	
	
		
			
				|  | @@ -31,6 +32,9 @@ pub const STDIN_FILENO: c_int = 0;
 | 
	
		
			
				|  |  |  pub const STDOUT_FILENO: c_int = 1;
 | 
	
		
			
				|  |  |  pub const STDERR_FILENO: c_int = 2;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#[no_mangle]
 | 
	
		
			
				|  |  | +pub static mut environ: *const *mut c_char = 0 as *const *mut c_char;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
		
			
				|  |  |  pub extern "C" fn _exit(status: c_int) {
 | 
	
		
			
				|  |  |      platform::exit(status)
 | 
	
	
		
			
				|  | @@ -97,23 +101,27 @@ pub extern "C" fn encrypt(block: [c_char; 64], edflag: c_int) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // #[no_mangle]
 | 
	
		
			
				|  |  | -// pub extern "C" fn execl(path: *const c_char, arg0: *const c_char /* TODO: , mut args: ... */) -> c_int {
 | 
	
		
			
				|  |  | +// pub extern "C" fn execl(path: *const c_char, args: *const *mut c_char) -> c_int {
 | 
	
		
			
				|  |  |  //     unimplemented!();
 | 
	
		
			
				|  |  |  // }
 | 
	
		
			
				|  |  | -//
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // #[no_mangle]
 | 
	
		
			
				|  |  | -// pub extern "C" fn execle(path: *const c_char, arg0: *const c_char /* TODO: , mut args: ... */) -> c_int {
 | 
	
		
			
				|  |  | +// pub extern "C" fn execle(
 | 
	
		
			
				|  |  | +//   path: *const c_char,
 | 
	
		
			
				|  |  | +//   args: *const *mut c_char,
 | 
	
		
			
				|  |  | +//   envp: *const *mut c_char,
 | 
	
		
			
				|  |  | +// ) -> c_int {
 | 
	
		
			
				|  |  |  //     unimplemented!();
 | 
	
		
			
				|  |  |  // }
 | 
	
		
			
				|  |  | -//
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // #[no_mangle]
 | 
	
		
			
				|  |  | -// pub extern "C" fn execlp(file: *const c_char, arg0: *const c_char /* TODO: , mut args: ... */) -> c_int {
 | 
	
		
			
				|  |  | +// pub extern "C" fn execlp(file: *const c_char, args: *const *mut c_char) -> c_int {
 | 
	
		
			
				|  |  |  //     unimplemented!();
 | 
	
		
			
				|  |  |  // }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
		
			
				|  |  |  pub extern "C" fn execv(path: *const c_char, argv: *const *mut c_char) -> c_int {
 | 
	
		
			
				|  |  | -    unimplemented!();
 | 
	
		
			
				|  |  | +    unsafe { execve(path, argv, environ) }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
	
		
			
				|  | @@ -122,7 +130,7 @@ pub extern "C" fn execve(
 | 
	
		
			
				|  |  |      argv: *const *mut c_char,
 | 
	
		
			
				|  |  |      envp: *const *mut c_char,
 | 
	
		
			
				|  |  |  ) -> c_int {
 | 
	
		
			
				|  |  | -    unimplemented!();
 | 
	
		
			
				|  |  | +    platform::execve(path, argv, envp)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
	
		
			
				|  | @@ -396,7 +404,7 @@ pub extern "C" fn sbrk(incr: intptr_t) -> *mut c_void {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
		
			
				|  |  |  pub extern "C" fn setgid(gid: gid_t) -> c_int {
 | 
	
		
			
				|  |  | -    unimplemented!();
 | 
	
		
			
				|  |  | +    platform::setregid(gid, gid)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
	
		
			
				|  | @@ -426,7 +434,7 @@ pub extern "C" fn setsid() -> pid_t {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 | 
	
		
			
				|  |  |  pub extern "C" fn setuid(uid: uid_t) -> c_int {
 | 
	
		
			
				|  |  | -    unimplemented!();
 | 
	
		
			
				|  |  | +    platform::setreuid(uid, uid)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[no_mangle]
 |