diff --git a/src/pcap.rs b/src/pcap.rs index 66cf7ba..2f90bd3 100644 --- a/src/pcap.rs +++ b/src/pcap.rs @@ -1,9 +1,8 @@ use crate::gsmtap::GsmtapMessage; use crate::diag::Timestamp; -use std::fs::File; +use std::io::Write; use std::borrow::Cow; -use std::path::Path; use chrono::prelude::*; use deku::prelude::*; use pcap_file::pcapng::blocks::enhanced_packet::EnhancedPacketBlock; @@ -13,7 +12,7 @@ use pcap_file::PcapError; use thiserror::Error; #[derive(Error, Debug)] -pub enum PcapFileError { +pub enum GsmtapPcapError { #[error("IO error: {0}")] Io(#[from] std::io::Error), #[error("Pcap error: {0}")] @@ -22,8 +21,8 @@ pub enum PcapFileError { Deku(#[from] DekuError), } -pub struct PcapFile { - writer: PcapNgWriter, +pub struct GsmtapPcapWriter where T: Write { + writer: PcapNgWriter, ip_id: u16, } @@ -55,17 +54,13 @@ struct UdpHeader { checksum: u16, } -impl PcapFile { - pub fn new

(path: P) -> Result where P: AsRef { - let file = std::fs::File::options() - .create(true) - .write(true) - .open(path)?; - let writer = PcapNgWriter::new(file)?; - Ok(PcapFile { writer, ip_id: 0 }) +impl GsmtapPcapWriter where T: Write { + pub fn new(writer: T) -> Result { + let writer = PcapNgWriter::new(writer)?; + Ok(GsmtapPcapWriter { writer, ip_id: 0 }) } - pub fn write_iface_header(&mut self) -> Result<(), PcapFileError> { + pub fn write_iface_header(&mut self) -> Result<(), GsmtapPcapError> { let interface = InterfaceDescriptionBlock { linktype: pcap_file::DataLink::IPV4, snaplen: 0xffff, @@ -75,7 +70,7 @@ impl PcapFile { Ok(()) } - pub fn write_gsmtap_message(&mut self, msg: GsmtapMessage, timestamp: Timestamp) -> Result<(), PcapFileError> { + pub fn write_gsmtap_message(&mut self, msg: GsmtapMessage, timestamp: Timestamp) -> Result<(), GsmtapPcapError> { let time_since_epoch = timestamp.to_datetime().signed_duration_since(DateTime::UNIX_EPOCH); let secs_since_epoch = time_since_epoch.num_seconds() as u64; let nsecs_since_epoch = time_since_epoch.num_nanoseconds().unwrap_or(0) as u32;