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
use void:: Void ;
11
12
@@ -121,47 +122,39 @@ pub fn chown<P: ?Sized + NixPath>(path: &P, owner: Option<uid_t>, group: Option<
121
122
Errno :: result ( res) . map ( drop)
122
123
}
123
124
124
- fn to_exec_array ( args : & [ CString ] ) -> Vec < * const c_char > {
125
- use std:: ptr;
126
- use libc:: c_char;
127
-
128
- let mut args_p: Vec < * const c_char > = args. iter ( ) . map ( |s| s. as_ptr ( ) ) . collect ( ) ;
129
- args_p. push ( ptr:: null ( ) ) ;
130
- args_p
131
- }
132
-
133
125
#[ inline]
134
- pub fn execv ( path : & CString , argv : & [ CString ] ) -> Result < Void > {
135
- let args_p = to_exec_array ( argv) ;
136
-
137
- unsafe {
138
- libc:: execv ( path. as_ptr ( ) , args_p. as_ptr ( ) )
139
- } ;
126
+ pub fn execv < A : BorrowNullTerminatedSlice < c_char > > ( path : & CStr , argv : A ) -> Result < Void > {
127
+ argv. borrow_null_terminated_slice ( |args_p| {
128
+ unsafe {
129
+ libc:: execv ( path. as_ptr ( ) , args_p. as_ptr ( ) )
130
+ } ;
140
131
141
- Err ( Error :: Sys ( Errno :: last ( ) ) )
132
+ Err ( Error :: Sys ( Errno :: last ( ) ) )
133
+ } )
142
134
}
143
135
144
136
#[ inline]
145
- pub fn execve ( path : & CString , args : & [ CString ] , env : & [ CString ] ) -> Result < Void > {
146
- let args_p = to_exec_array ( args) ;
147
- let env_p = to_exec_array ( env) ;
148
-
149
- unsafe {
150
- libc:: execve ( path. as_ptr ( ) , args_p. as_ptr ( ) , env_p. as_ptr ( ) )
151
- } ;
152
-
153
- Err ( Error :: Sys ( Errno :: last ( ) ) )
137
+ pub fn execve < A : BorrowNullTerminatedSlice < c_char > , E : BorrowNullTerminatedSlice < c_char > > ( path : & CStr , args : A , env : E ) -> Result < Void > {
138
+ args. borrow_null_terminated_slice ( |args_p| {
139
+ env. borrow_null_terminated_slice ( |env_p| {
140
+ unsafe {
141
+ libc:: execve ( path. as_ptr ( ) , args_p. as_ptr ( ) , env_p. as_ptr ( ) )
142
+ } ;
143
+
144
+ Err ( Error :: Sys ( Errno :: last ( ) ) )
145
+ } )
146
+ } )
154
147
}
155
148
156
149
#[ inline]
157
- pub fn execvp ( filename : & CString , args : & [ CString ] ) -> Result < Void > {
158
- let args_p = to_exec_array ( args) ;
159
-
160
- unsafe {
161
- libc:: execvp ( filename. as_ptr ( ) , args_p. as_ptr ( ) )
162
- } ;
150
+ pub fn execvp < A : BorrowNullTerminatedSlice < c_char > > ( filename : & CStr , args : A ) -> Result < Void > {
151
+ args. borrow_null_terminated_slice ( |args_p| {
152
+ unsafe {
153
+ libc:: execvp ( filename. as_ptr ( ) , args_p. as_ptr ( ) )
154
+ } ;
163
155
164
- Err ( Error :: Sys ( Errno :: last ( ) ) )
156
+ Err ( Error :: Sys ( Errno :: last ( ) ) )
157
+ } )
165
158
}
166
159
167
160
pub fn daemon ( nochdir : bool , noclose : bool ) -> Result < ( ) > {
@@ -379,9 +372,6 @@ mod linux {
379
372
use sys:: syscall:: { syscall, SYSPIVOTROOT } ;
380
373
use { Errno , Result , NixPath } ;
381
374
382
- #[ cfg( feature = "execvpe" ) ]
383
- use std:: ffi:: CString ;
384
-
385
375
pub fn pivot_root < P1 : ?Sized + NixPath , P2 : ?Sized + NixPath > (
386
376
new_root : & P1 , put_old : & P2 ) -> Result < ( ) > {
387
377
let res = try!( try!( new_root. with_nix_path ( |new_root| {
@@ -395,7 +385,6 @@ mod linux {
395
385
Errno :: result ( res) . map ( drop)
396
386
}
397
387
398
- #[ inline]
399
388
#[ cfg( feature = "execvpe" ) ]
400
389
pub fn execvpe ( filename : & CString , args : & [ CString ] , env : & [ CString ] ) -> Result < ( ) > {
401
390
use std:: ptr;
0 commit comments