summaryrefslogtreecommitdiffstats
path: root/src/backends/clang.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/clang.rs')
-rw-r--r--src/backends/clang.rs48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/backends/clang.rs b/src/backends/clang.rs
index a174af6..b732ed5 100644
--- a/src/backends/clang.rs
+++ b/src/backends/clang.rs
@@ -1,4 +1,5 @@
use serde_derive::{ Serialize, Deserialize };
+use crate::backends::{ Backend, mk_tmp_dir, RunStatus };
use std::path::{ Path, PathBuf };
use std::io::{ Result, Error, ErrorKind };
use std::process::Command;
@@ -6,7 +7,6 @@ use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use log::trace;
-type Result<T> = std::io::Result<T>;
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct ClangBackend {
@@ -75,14 +75,46 @@ impl Backend for ClangBackend {
}
}
- fn run(&self, fname: &Path) -> std::io::Result<()> {
+ fn run(&self, fname: &Path) -> Result<RunStatus> {
let binary_fname = self.build(fname)?;
- Command::new(&binary_fname)
- .status()
- .map(|status| {
- trace!("{:#?}", status);
- ()
- })
+ let binary_proc = Command::new(&binary_fname).spawn()?;
+ get_status(binary_proc)
}
}
+
+use nix::sys::wait;
+
+#[cfg(unix)]
+fn get_status(proc: std::process::Child) -> Result<RunStatus> {
+ let id = proc.id() as i32; // for fuck sake, why this emits u32?
+
+ loop {
+ let status_result = wait::waitpid(Some(nix::unistd::Pid::from_raw(id)), None)
+ .map_err(|err| Error::new(ErrorKind::Other, err));
+
+ let status = status_result?;
+ match status {
+ wait::WaitStatus::Exited(pid, code) => {
+ assert_eq!(pid.as_raw(), id);
+
+ if code == 0 {
+ return Ok(RunStatus::Success);
+ } else {
+ return Ok(RunStatus::ErrorCode(code));
+ }
+ },
+ wait::WaitStatus::Signaled(pid, sig, coredump) => {
+ assert_eq!(pid.as_raw(), id);
+
+ return Ok(RunStatus::Signal(sig, coredump));
+ }
+ _ => continue,
+ }
+ }
+}
+
+#[cfg(not(unix))]
+fn get_status(proc: std::process::Child) -> Result<RunStatus> {
+ compile_error!("currently only unix supported");
+} \ No newline at end of file