From 2123d6a2785799fc3f32e972a0e548d37f883521 Mon Sep 17 00:00:00 2001 From: Theodore DeRego Date: Mon, 27 Feb 2017 20:26:55 -0800 Subject: [PATCH] std::process for fuchsia: updated to latest liblaunchpad --- src/libstd/sys/unix/process/magenta.rs | 22 ++++++++---- .../sys/unix/process/process_fuchsia.rs | 36 ++++++++----------- 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 08a827ce08142..07f29784df607 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 608e44ca9e86e..7d583cb3dfce3 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 { 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); } - } -}