1
1
//! Standard symbolic constants and types
2
2
//!
3
3
use { Errno , Error , Result , NixPath } ;
4
+ use null_terminated:: BorrowNullTerminatedSlice ;
4
5
use fcntl:: { fcntl, OFlag , O_NONBLOCK , O_CLOEXEC , FD_CLOEXEC } ;
5
6
use fcntl:: FcntlArg :: { F_SETFD , F_SETFL } ;
6
7
use libc:: { self , c_char, c_void, c_int, c_uint, size_t, pid_t, off_t, uid_t, gid_t} ;
7
8
use std:: mem;
8
- use std:: ffi:: CString ;
9
+ use std:: ffi:: CStr ;
9
10
use std:: os:: unix:: io:: RawFd ;
10
11
11
12
#[ 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<
120
121
Errno :: result ( res) . map ( drop)
121
122
}
122
123
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
-
132
124
#[ 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
+ } ;
139
130
140
- Err ( Error :: Sys ( Errno :: last ( ) ) )
131
+ Err ( Error :: Sys ( Errno :: last ( ) ) )
132
+ } )
141
133
}
142
134
143
135
#[ 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
+ } )
153
146
}
154
147
155
148
#[ 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
+ } ;
162
154
163
- Err ( Error :: Sys ( Errno :: last ( ) ) )
155
+ Err ( Error :: Sys ( Errno :: last ( ) ) )
156
+ } )
164
157
}
165
158
166
159
pub fn daemon ( nochdir : bool , noclose : bool ) -> Result < ( ) > {
@@ -378,9 +371,6 @@ mod linux {
378
371
use sys:: syscall:: { syscall, SYSPIVOTROOT } ;
379
372
use { Errno , Result , NixPath } ;
380
373
381
- #[ cfg( feature = "execvpe" ) ]
382
- use std:: ffi:: CString ;
383
-
384
374
pub fn pivot_root < P1 : ?Sized + NixPath , P2 : ?Sized + NixPath > (
385
375
new_root : & P1 , put_old : & P2 ) -> Result < ( ) > {
386
376
let res = try!( try!( new_root. with_nix_path ( |new_root| {
@@ -394,7 +384,6 @@ mod linux {
394
384
Errno :: result ( res) . map ( drop)
395
385
}
396
386
397
- #[ inline]
398
387
#[ cfg( feature = "execvpe" ) ]
399
388
pub fn execvpe ( filename : & CString , args : & [ CString ] , env : & [ CString ] ) -> Result < ( ) > {
400
389
use std:: ptr;
0 commit comments