Skip to content

Commit

Permalink
Read pipes in a safer way.
Browse files Browse the repository at this point in the history
Do not close the input pipe file after reading. Instead, read it, empty
it, then close it.
  • Loading branch information
sayanarijit committed May 8, 2021
1 parent 3aa349f commit 0270fec
Showing 1 changed file with 38 additions and 19 deletions.
57 changes: 38 additions & 19 deletions src/pipe_reader.rs
Original file line number Diff line number Diff line change
@@ -1,33 +1,52 @@
use crate::app::{ExternalMsg, MsgIn, Task};
use std::fs;
use std::io::prelude::*;
use std::sync::mpsc::Sender;
use std::thread;
use std::time::Duration;

pub fn keep_reading(pipe: String, tx: Sender<Task>) {
thread::spawn(move || loop {
let in_str = fs::read_to_string(&pipe).unwrap_or_default();
if let Ok(mut file) = fs::OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(&pipe)
{
let mut in_str = String::new();
file.read_to_string(&mut in_str).unwrap_or_default();
file.set_len(0).unwrap_or_default();

if !in_str.is_empty() {
let msgs = in_str
.lines()
.map(|s| serde_yaml::from_str::<ExternalMsg>(s.trim()));
if !in_str.is_empty() {
let msgs = in_str
.lines()
.map(|s| serde_yaml::from_str::<ExternalMsg>(s.trim()));

msgs.for_each(|msg| match msg {
Ok(m) => {
tx.send(Task::new(MsgIn::External(m), None)).unwrap();
}
Err(e) => {
tx.send(Task::new(
MsgIn::External(ExternalMsg::LogError(e.to_string())),
None,
))
.unwrap();
}
});
fs::write(&pipe, "").unwrap();
msgs.for_each(|msg| match msg {
Ok(m) => {
tx.send(Task::new(MsgIn::External(m), None)).unwrap();
}
Err(e) => {
tx.send(Task::new(
MsgIn::External(ExternalMsg::LogError(e.to_string())),
None,
))
.unwrap();
}
});
} else {
thread::sleep(Duration::from_millis(50));
}
} else {
thread::sleep(Duration::from_millis(50));
tx.send(Task::new(
MsgIn::External(ExternalMsg::LogError(format!(
"Failed to open input pipe: {}",
&pipe
))),
None,
))
.unwrap();
thread::sleep(Duration::from_secs(3));
}
});
}

0 comments on commit 0270fec

Please sign in to comment.