about summary refs log tree commit diff
path: root/src/libstd/sys
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2017-03-02 14:53:49 -0500
committerGitHub <noreply@github.com>2017-03-02 14:53:49 -0500
commit05e0d740a22b327f607dd695b43f7547e0d14864 (patch)
tree04aa6d483e26feb534ec08aa2d7d996de49aefe1 /src/libstd/sys
parentc883f4f584bf55ec3c3d0bbd22957a7e6654e3b9 (diff)
parent2123d6a2785799fc3f32e972a0e548d37f883521 (diff)
downloadrust-05e0d740a22b327f607dd695b43f7547e0d14864.tar.gz
rust-05e0d740a22b327f607dd695b43f7547e0d14864.zip
Rollup merge of #40139 - tedsta:fuchsia_std_process_fix, r=alexcrichton
std::process for fuchsia: updated to latest liblaunchpad

Our liblaunchpad changed a bit and so fuchsia's std::process impl needs to change a bit.

@raphlinus
Diffstat (limited to 'src/libstd/sys')
-rw-r--r--src/libstd/sys/unix/process/magenta.rs22
-rw-r--r--src/libstd/sys/unix/process/process_fuchsia.rs36
2 files changed, 31 insertions, 27 deletions
diff --git a/src/libstd/sys/unix/process/magenta.rs b/src/libstd/sys/unix/process/magenta.rs
index 08a827ce081..07f29784df6 100644
--- a/src/libstd/sys/unix/process/magenta.rs
+++ b/src/libstd/sys/unix/process/magenta.rs
@@ -156,18 +156,18 @@ extern {
     pub fn launchpad_create(job: mx_handle_t, name: *const c_char,
                             lp: *mut *mut launchpad_t) -> mx_status_t;
 
-    pub fn launchpad_start(lp: *mut launchpad_t) -> mx_status_t;
+    pub fn launchpad_go(lp: *mut launchpad_t,
+                        proc_handle: *mut mx_handle_t,
+                        err_msg: *mut *const c_char) -> mx_status_t;
 
     pub fn launchpad_destroy(lp: *mut launchpad_t);
 
-    pub fn launchpad_arguments(lp: *mut launchpad_t, argc: c_int,
+    pub fn launchpad_set_args(lp: *mut launchpad_t, argc: c_int,
                                argv: *const *const c_char) -> mx_status_t;
 
-    pub fn launchpad_environ(lp: *mut launchpad_t, envp: *const *const c_char) -> mx_status_t;
+    pub fn launchpad_set_environ(lp: *mut launchpad_t, envp: *const *const c_char) -> mx_status_t;
 
-    pub fn launchpad_clone_mxio_root(lp: *mut launchpad_t) -> mx_status_t;
-
-    pub fn launchpad_clone_mxio_cwd(lp: *mut launchpad_t) -> mx_status_t;
+    pub fn launchpad_clone(lp: *mut launchpad_t, what: u32) -> mx_status_t;
 
     pub fn launchpad_clone_fd(lp: *mut launchpad_t, fd: c_int, target_fd: c_int) -> mx_status_t;
 
@@ -182,6 +182,16 @@ extern {
     pub fn launchpad_vmo_from_file(filename: *const c_char) -> mx_handle_t;
 }
 
+// Launchpad clone constants
+
+pub const LP_CLONE_MXIO_ROOT: u32 = 0x0001;
+pub const LP_CLONE_MXIO_CWD: u32 = 0x0002;
+// LP_CLONE_MXIO_STDIO = 0x0004
+// LP_CLONE_MXIO_ALL = 0x00FF
+// LP_CLONE_ENVIRON = 0x0100
+// LP_CLONE_DEFAULT_JOB = 0x0200
+// LP_CLONE_ALL = 0xFFFF
+
 // Errors
 
 #[allow(unused)] pub const ERR_INTERNAL: mx_status_t = -1;
diff --git a/src/libstd/sys/unix/process/process_fuchsia.rs b/src/libstd/sys/unix/process/process_fuchsia.rs
index 608e44ca9e8..7d583cb3dfc 100644
--- a/src/libstd/sys/unix/process/process_fuchsia.rs
+++ b/src/libstd/sys/unix/process/process_fuchsia.rs
@@ -13,7 +13,7 @@ use libc;
 use mem;
 use ptr;
 
-use sys::process::magenta::{Handle, launchpad_t, mx_handle_t};
+use sys::process::magenta::{Handle, mx_handle_t};
 use sys::process::process_common::*;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -30,9 +30,9 @@ impl Command {
 
         let (ours, theirs) = self.setup_io(default, needs_stdin)?;
 
-        let (launchpad, process_handle) = unsafe { self.do_exec(theirs)? };
+        let process_handle = unsafe { self.do_exec(theirs)? };
 
-        Ok((Process { launchpad: launchpad, handle: Handle::new(process_handle) }, ours))
+        Ok((Process { handle: Handle::new(process_handle) }, ours))
     }
 
     pub fn exec(&mut self, default: Stdio) -> io::Error {
@@ -51,7 +51,7 @@ impl Command {
     }
 
     unsafe fn do_exec(&mut self, stdio: ChildPipes)
-                      -> io::Result<(*mut launchpad_t, mx_handle_t)> {
+                      -> io::Result<mx_handle_t> {
         use sys::process::magenta::*;
 
         let job_handle = mx_job_default();
@@ -75,16 +75,15 @@ impl Command {
         let launchpad_destructor = LaunchpadDestructor(launchpad);
 
         // Set the process argv
-        mx_cvt(launchpad_arguments(launchpad, self.get_argv().len() as i32 - 1,
-                                   self.get_argv().as_ptr()))?;
+        mx_cvt(launchpad_set_args(launchpad, self.get_argv().len() as i32 - 1,
+                                  self.get_argv().as_ptr()))?;
         // Setup the environment vars
-        mx_cvt(launchpad_environ(launchpad, envp))?;
+        mx_cvt(launchpad_set_environ(launchpad, envp))?;
         mx_cvt(launchpad_add_vdso_vmo(launchpad))?;
-        mx_cvt(launchpad_clone_mxio_root(launchpad))?;
         // Load the executable
         mx_cvt(launchpad_elf_load(launchpad, launchpad_vmo_from_file(self.get_argv()[0])))?;
         mx_cvt(launchpad_load_vdso(launchpad, MX_HANDLE_INVALID))?;
-        mx_cvt(launchpad_clone_mxio_cwd(launchpad))?;
+        mx_cvt(launchpad_clone(launchpad, LP_CLONE_MXIO_ROOT | LP_CLONE_MXIO_CWD))?;
 
         // Clone stdin, stdout, and stderr
         if let Some(fd) = stdio.stdin.fd() {
@@ -111,12 +110,15 @@ impl Command {
             callback()?;
         }
 
-        let process_handle = mx_cvt(launchpad_start(launchpad))?;
-
-        // Successfully started the launchpad
+        // `launchpad_go` destroys the launchpad, so we must not
         mem::forget(launchpad_destructor);
 
-        Ok((launchpad, process_handle))
+        let mut process_handle: mx_handle_t = 0;
+        let mut err_msg: *const libc::c_char = ptr::null();
+        mx_cvt(launchpad_go(launchpad, &mut process_handle, &mut err_msg))?;
+        // FIXME: See if we want to do something with that err_msg
+
+        Ok(process_handle)
     }
 }
 
@@ -125,7 +127,6 @@ impl Command {
 ////////////////////////////////////////////////////////////////////////////////
 
 pub struct Process {
-    launchpad: *mut launchpad_t,
     handle: Handle,
 }
 
@@ -195,10 +196,3 @@ impl Process {
         Ok(Some(ExitStatus::new(proc_info.rec.return_code)))
     }
 }
-
-impl Drop for Process {
-    fn drop(&mut self) {
-        use sys::process::magenta::launchpad_destroy;
-        unsafe { launchpad_destroy(self.launchpad); }
-    }
-}