diff --git a/src/ssdv.rs b/src/ssdv.rs index 63784d3fc4026b94d2a7f54a3175f9a6245fec53..f8e75907b1620032d9e4a5980bbe5e5ddce3de0a 100644 --- a/src/ssdv.rs +++ b/src/ssdv.rs @@ -1,12 +1,14 @@ use anyhow::{bail, Context}; +use subprocess::{Popen, PopenConfig, Redirection}; use crate::packet::RawPacket; // TODO eventually rewrite Ssdv in Rust? // Don't want to use FFI because then segfaults can hurt us pub fn ssdv_encode(callsign: &str, img: &[u8], img_idx: u8) -> anyhow::Result<Vec<RawPacket>> { - let (stdout, stderr) = subprocess::Exec::cmd("ssdv") - .args(&[ + let mut p = Popen::create( + &[ + "ssdv", "-e", "-c", callsign, @@ -15,10 +17,16 @@ pub fn ssdv_encode(callsign: &str, img: &[u8], img_idx: u8) -> anyhow::Result<Ve "6", "-i", &format!("{}", img_idx), - ]) - .stdin(img.to_vec()) - .communicate()? - .read()?; + ], + PopenConfig { + stdin: Redirection::Pipe, + stdout: Redirection::Pipe, + stderr: Redirection::Pipe, + ..Default::default() + }, + )?; + + let (stdout, stderr) = p.communicate_bytes(Some(img))?; if let Some(stderr) = stderr { if !stderr.is_empty() {