From acf4a04b7452b6dd2e69064b4f85144b8445bbe9 Mon Sep 17 00:00:00 2001 From: Matias Linares Date: Sun, 8 Nov 2015 23:02:00 -0300 Subject: Initial commit This initial commit has the following: * We can spawn a terminal. * Given a new window, we can move it around the screen, but only the window that was created, all the other windows disappear on the void, so.. :( and that's it --- src/command.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/command.rs (limited to 'src/command.rs') diff --git a/src/command.rs b/src/command.rs new file mode 100644 index 0000000..ddfa269 --- /dev/null +++ b/src/command.rs @@ -0,0 +1,47 @@ +//! Command execution module. +//! +use std::ffi::OsStr; +use std::process::{Command,Child}; +use std::io::{Result, Error, ErrorKind}; + +use libc::c_int; +use libc::types::os::arch::posix88::pid_t; + +const WNOHANG: c_int = 0x00000001; + +extern { + /// wait for a child process to stop or terminate. + pub fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t; +} + +/// Extension to the Child struct that allows to check the status without block the +/// current thread. +pub trait ChildExt { + fn wait_nohang(&mut self) -> Result; +} + +impl ChildExt for Child { + /// Checks if the calling child is a zombie and try to kill it, returning + /// if it was killed or not. + fn wait_nohang(&mut self) -> Result { + let mut stat = 0i32; + let pid = unsafe { waitpid(self.id() as i32, &mut stat, WNOHANG) }; + if pid < 0 { + Err(Error::new(ErrorKind::NotFound, format!("pid not found {}", pid))) + } else { + if pid > 0 { + Ok(self.wait() + .map(|x| { + x.success() + }).unwrap_or(false)) + } else { + Ok(false) + } + } + } +} + +/// Executes the given command. +pub fn exec_cmd>(program: S, args: &[S]) -> Result { + Command::new(program).args(args).spawn() +} -- cgit v1.2.3-70-g09d2