11//! Standard symbolic constants and types
22//!
33use { Errno , Error , Result , NixPath } ;
4+ use null_terminated:: BorrowNullTerminatedSlice ;
45use fcntl:: { fcntl, OFlag , O_NONBLOCK , O_CLOEXEC , FD_CLOEXEC } ;
56use fcntl:: FcntlArg :: { F_SETFD , F_SETFL } ;
67use libc:: { self , c_char, c_void, c_int, c_uint, size_t, pid_t, off_t, uid_t, gid_t} ;
78use std:: mem;
8- use std:: ffi:: CString ;
9+ use std:: ffi:: CStr ;
910use std:: os:: unix:: io:: RawFd ;
1011
1112#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
@@ -120,47 +121,39 @@ pub fn chown<P: ?Sized + NixPath>(path: &P, owner: Option<uid_t>, group: Option<
120121 Errno :: result ( res) . map ( drop)
121122}
122123
123- fn to_exec_array ( args : & [ CString ] ) -> Vec < * const c_char > {
124- use std:: ptr;
125- use libc:: c_char;
126-
127- let mut args_p: Vec < * const c_char > = args. iter ( ) . map ( |s| s. as_ptr ( ) ) . collect ( ) ;
128- args_p. push ( ptr:: null ( ) ) ;
129- args_p
130- }
131-
132124#[ inline]
133- pub fn execv ( path : & CString , argv : & [ CString ] ) -> Result < ( ) > {
134- let args_p = to_exec_array ( argv) ;
135-
136- unsafe {
137- libc:: execv ( path. as_ptr ( ) , args_p. as_ptr ( ) )
138- } ;
125+ pub fn execv < A : BorrowNullTerminatedSlice < c_char > > ( path : & CStr , argv : A ) -> Result < ( ) > {
126+ argv. borrow_null_terminated_slice ( |args_p| {
127+ unsafe {
128+ libc:: execv ( path. as_ptr ( ) , args_p. as_ptr ( ) )
129+ } ;
139130
140- Err ( Error :: Sys ( Errno :: last ( ) ) )
131+ Err ( Error :: Sys ( Errno :: last ( ) ) )
132+ } )
141133}
142134
143135#[ inline]
144- pub fn execve ( path : & CString , args : & [ CString ] , env : & [ CString ] ) -> Result < ( ) > {
145- let args_p = to_exec_array ( args) ;
146- let env_p = to_exec_array ( env) ;
147-
148- unsafe {
149- libc:: execve ( path. as_ptr ( ) , args_p. as_ptr ( ) , env_p. as_ptr ( ) )
150- } ;
151-
152- Err ( Error :: Sys ( Errno :: last ( ) ) )
136+ pub fn execve < A : BorrowNullTerminatedSlice < c_char > , E : BorrowNullTerminatedSlice < c_char > > ( path : & CStr , args : A , env : E ) -> Result < ( ) > {
137+ args. borrow_null_terminated_slice ( |args_p| {
138+ env. borrow_null_terminated_slice ( |env_p| {
139+ unsafe {
140+ libc:: execve ( path. as_ptr ( ) , args_p. as_ptr ( ) , env_p. as_ptr ( ) )
141+ } ;
142+
143+ Err ( Error :: Sys ( Errno :: last ( ) ) )
144+ } )
145+ } )
153146}
154147
155148#[ inline]
156- pub fn execvp ( filename : & CString , args : & [ CString ] ) -> Result < ( ) > {
157- let args_p = to_exec_array ( args) ;
158-
159- unsafe {
160- libc:: execvp ( filename. as_ptr ( ) , args_p. as_ptr ( ) )
161- } ;
149+ pub fn execvp < A : BorrowNullTerminatedSlice < c_char > > ( filename : & CStr , args : A ) -> Result < ( ) > {
150+ args. borrow_null_terminated_slice ( |args_p| {
151+ unsafe {
152+ libc:: execvp ( filename. as_ptr ( ) , args_p. as_ptr ( ) )
153+ } ;
162154
163- Err ( Error :: Sys ( Errno :: last ( ) ) )
155+ Err ( Error :: Sys ( Errno :: last ( ) ) )
156+ } )
164157}
165158
166159pub fn daemon ( nochdir : bool , noclose : bool ) -> Result < ( ) > {
@@ -378,9 +371,6 @@ mod linux {
378371 use sys:: syscall:: { syscall, SYSPIVOTROOT } ;
379372 use { Errno , Result , NixPath } ;
380373
381- #[ cfg( feature = "execvpe" ) ]
382- use std:: ffi:: CString ;
383-
384374 pub fn pivot_root < P1 : ?Sized + NixPath , P2 : ?Sized + NixPath > (
385375 new_root : & P1 , put_old : & P2 ) -> Result < ( ) > {
386376 let res = try!( try!( new_root. with_nix_path ( |new_root| {
@@ -394,7 +384,6 @@ mod linux {
394384 Errno :: result ( res) . map ( drop)
395385 }
396386
397- #[ inline]
398387 #[ cfg( feature = "execvpe" ) ]
399388 pub fn execvpe ( filename : & CString , args : & [ CString ] , env : & [ CString ] ) -> Result < ( ) > {
400389 use std:: ptr;
0 commit comments