This repository has been archived on 2023-09-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
rust-opensmtpd/src/io.rs
2020-12-20 11:52:56 +01:00

47 lines
1.5 KiB
Rust

use std::io::{self, ErrorKind, Read};
use std::sync::mpsc::Sender;
pub(crate) fn read_stdin(tx: &Sender<Vec<u8>>) {
if let Err(e) = do_read_stdin(tx) {
log::error!("{}", e);
}
}
fn do_read_stdin(tx: &Sender<Vec<u8>>) -> Result<(), String> {
let mut read_buffer: [u8; crate::BUFFER_SIZE] = [0; crate::BUFFER_SIZE];
let mut line_buffer: Vec<u8> = Vec::with_capacity(crate::BUFFER_SIZE);
let mut stdin = io::stdin();
loop {
read_buffer.copy_from_slice(&[0; crate::BUFFER_SIZE]);
let len = match stdin.read(&mut read_buffer) {
Ok(n) => n,
Err(e) => match e.kind() {
ErrorKind::Interrupted => {
continue;
}
_ => {
return Err(e.to_string());
}
},
};
if len == 0 {
return Err(String::from("unable to read on stdin"));
}
line_buffer.extend_from_slice(&read_buffer);
loop {
match line_buffer.iter().position(|i| *i == b'\n') {
Some(id) => {
let pos = id + 1;
let mut line = Vec::with_capacity(pos);
line.extend_from_slice(&line_buffer[..pos]);
log::trace!("new line: {:?}", &line);
tx.send(line).unwrap();
line_buffer.drain(..pos);
}
None => {
break;
}
};
}
}
}