Compare commits
3 Commits
50a0e9abcb
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 200eadf9a1 | |||
| f9671f9408 | |||
| 250dcd8d6f |
40
src/main.rs
40
src/main.rs
@@ -1,7 +1,7 @@
|
|||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use std::{
|
use std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
io,
|
io::{self, IsTerminal},
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::mpsc::{channel, Sender},
|
sync::mpsc::{channel, Sender},
|
||||||
thread,
|
thread,
|
||||||
@@ -10,7 +10,7 @@ use std::{
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use ax25::frame::Ax25Frame;
|
use ax25::frame::Ax25Frame;
|
||||||
use pcap_file::{
|
use pcap_file::{
|
||||||
pcap::{PcapHeader, PcapPacket, PcapWriter},
|
pcap::{PcapHeader, PcapPacket, PcapReader, PcapWriter},
|
||||||
DataLink,
|
DataLink,
|
||||||
};
|
};
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
@@ -28,6 +28,18 @@ struct KissPkt {
|
|||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pcap_loop<T: Read>(tx: Sender<KissPkt>, stream: T) -> Result<()> {
|
||||||
|
let mut reader = PcapReader::new(stream)?;
|
||||||
|
|
||||||
|
while let Some(Ok(pkt)) = reader.next_packet() {
|
||||||
|
tx.send(KissPkt {
|
||||||
|
timestamp: pkt.timestamp,
|
||||||
|
orig_len: pkt.orig_len,
|
||||||
|
data: pkt.data.into(),
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
fn tnc_loop<T: Read>(tx: Sender<KissPkt>, mut stream: T) -> Result<()> {
|
fn tnc_loop<T: Read>(tx: Sender<KissPkt>, mut stream: T) -> Result<()> {
|
||||||
let mut buffer = [0_u8; 4096];
|
let mut buffer = [0_u8; 4096];
|
||||||
let mut frame = vec![];
|
let mut frame = vec![];
|
||||||
@@ -110,8 +122,14 @@ fn main() -> Result<()> {
|
|||||||
thread::spawn(move || tnc_loop(tx, file).unwrap());
|
thread::spawn(move || tnc_loop(tx, file).unwrap());
|
||||||
}
|
}
|
||||||
path if Path::new(path).exists() => {
|
path if Path::new(path).exists() => {
|
||||||
let file = io::BufReader::new(File::open(path)?);
|
let file = File::open(path)?;
|
||||||
thread::spawn(move || tnc_loop(tx, file).unwrap());
|
let is_tty = file.is_terminal();
|
||||||
|
let mut filebuf = io::BufReader::new(file);
|
||||||
|
if !is_tty && has_pcap_magic(&mut filebuf) {
|
||||||
|
thread::spawn(move || pcap_loop(tx, filebuf).unwrap());
|
||||||
|
} else {
|
||||||
|
thread::spawn(move || tnc_loop(tx, filebuf).unwrap());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
addr => {
|
addr => {
|
||||||
let stream = TcpStream::connect(addr)?;
|
let stream = TcpStream::connect(addr)?;
|
||||||
@@ -155,3 +173,17 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
fn has_pcap_magic(filebuf: &mut io::BufReader<File>) -> bool {
|
||||||
|
const PCAP_MAGIC_MS: u32 = 0xA1B2C3D4;
|
||||||
|
const PCAP_MAGIC_NS: u32 = 0xA1B23C4D;
|
||||||
|
match io::BufRead::fill_buf(filebuf) {
|
||||||
|
Ok(buf) if buf.len() >= 4 => {
|
||||||
|
let mut tmp = [0_u8; 4];
|
||||||
|
tmp.copy_from_slice(&buf[..4]);
|
||||||
|
let be = u32::from_be_bytes(tmp);
|
||||||
|
let le = u32::from_le_bytes(tmp);
|
||||||
|
be == PCAP_MAGIC_MS || be == PCAP_MAGIC_NS || le == PCAP_MAGIC_MS || le == PCAP_MAGIC_NS
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user