Skip to content

Commit b30c537

Browse files
committed
Allow to read pcap data from stdin
1 parent 1d97da3 commit b30c537

File tree

4 files changed

+23
-11
lines changed

4 files changed

+23
-11
lines changed

src/main.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,22 @@ fn run_proxy(
133133
}
134134

135135
fn run_pcap(path: &Path, mut mapi_state: mapi::State, renderer: &mut Renderer) -> AResult<()> {
136-
let Ok(r) = File::open(path) else {
137-
bail!("Could not open pcap file {}", path.display());
136+
let mut owned_file;
137+
let mut owned_stdin;
138+
139+
let reader: &mut dyn io::Read = if path == Path::new("-") {
140+
owned_stdin = Some(io::stdin().lock());
141+
owned_stdin.as_mut().unwrap()
142+
} else {
143+
let file = File::open(path)
144+
.with_context(|| format!("Could not open pcap file {}", path.display()))?;
145+
owned_file = Some(file);
146+
owned_file.as_mut().unwrap()
138147
};
148+
139149
let handler = |ev: MapiEvent| mapi_state.handle(&ev, renderer);
140150
let mut tracker = Tracker::new(handler);
141-
pcap::parse_pcap_file(r, &mut tracker)
151+
pcap::parse_pcap_file(reader, &mut tracker)
142152
}
143153

144154
fn install_ctrl_c_handler(trigger: Box<dyn Fn() + Send + Sync>) -> AResult<()> {

src/pcap/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use pcap_file::{
1515
use self::mybufread::MyBufReader;
1616
pub use self::tracker::Tracker;
1717

18-
pub fn parse_pcap_file(mut rd: impl io::Read + 'static, tracker: &mut Tracker) -> AResult<()> {
18+
pub fn parse_pcap_file(mut rd: impl io::Read, tracker: &mut Tracker) -> AResult<()> {
1919
// read ahead to inspect the file header
2020
let mut signature = [0u8; 4];
2121
rd.read_exact(&mut signature)?;

src/pcap/mybufread.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use std::io::{self, BufRead, Read};
22

3-
pub struct MyBufReader {
4-
inner: Box<dyn io::Read>,
3+
pub struct MyBufReader<'a> {
4+
inner: Box<dyn io::Read + 'a>,
55
buffer: Vec<u8>,
66
data: usize,
77
free: usize,
88
}
99

10-
impl MyBufReader {
11-
pub fn new(reader: impl io::Read + 'static, mut buffer: Vec<u8>) -> Self {
10+
impl<'a> MyBufReader<'a> {
11+
pub fn new(reader: impl io::Read + 'a, mut buffer: Vec<u8>) -> Self {
1212
let inner = Box::new(reader);
1313
let data = 0;
1414
let free = buffer.len();
@@ -22,7 +22,7 @@ impl MyBufReader {
2222
}
2323
}
2424

25-
impl Read for MyBufReader {
25+
impl<'a> Read for MyBufReader<'a> {
2626
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
2727
let data = self.fill_buf()?;
2828
let n = data.len().min(buf.len());
@@ -32,7 +32,7 @@ impl Read for MyBufReader {
3232
}
3333
}
3434

35-
impl BufRead for MyBufReader {
35+
impl<'a> BufRead for MyBufReader<'a> {
3636
fn fill_buf(&mut self) -> io::Result<&[u8]> {
3737
assert_eq!(self.buffer.len(), self.buffer.capacity());
3838
if self.data == self.free {

src/usage.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Options:
1212
-r --raw Dump bytes as they come in
1313
-B --binary Force dumping as binary
1414
--color=WHEN Colorize output, one of 'always', 'auto' or 'never'
15-
--pcap=file Read network capture data from FILE (Experimental!)
1615
--help This help
1716
--version Version info
17+
18+
Experimental options:
19+
--pcap=FILE Read network capture data from FILE, use - for stdin

0 commit comments

Comments
 (0)