crafter 0.3.2

Packet-level network interaction for Rust tools and agents.
Documentation
mod common;

use common::{
    arg_value, default_target_path, print_help_if_requested, write_example_pcap, ExampleResult,
};
use crafter::prelude::*;

fn print_record(label: &str, index: usize, record: &PacketRecord) {
    let metadata = record.metadata();
    let timestamp = metadata.timestamp();
    println!(
        "{label}[{index}] ts_sec={} ts_fractional={} captured_len={:?} original_len={:?} link_type={:?} file={} summary={}",
        timestamp.map(|ts| ts.seconds()).unwrap_or(0),
        timestamp.map(|ts| ts.fractional()).unwrap_or(0),
        metadata.captured_len(),
        metadata.original_len(),
        metadata.link_type(),
        metadata.file().map(|path| path.display().to_string()).unwrap_or_else(|| "-".to_string()),
        record.packet().summary()
    );
}

fn main() -> ExampleResult<()> {
    if print_help_if_requested(
        "usage: cargo run --example pcap_read -- [--in FILE]\n\nRead an offline pcap through PacketWire and Sniffer.",
    ) {
        return Ok(());
    }

    let path = arg_value("--in")
        .map(Into::into)
        .unwrap_or_else(|| default_target_path("examples/pcap-read.pcap"));

    if !path.exists() {
        let generated = write_example_pcap(&path, 3)?;
        println!("created: {} packets at {}", generated.len(), path.display());
    }

    println!("example: pcap_read");
    println!("mode: offline");
    println!("pcap: {}", path.display());

    let source = PacketWire::pcap_file(&path).open()?.source()?;
    let records = Sniffer::new(source).collect_records()?;
    println!("collected records: {}", records.len());
    for (index, record) in records.iter().enumerate() {
        print_record("record", index, record);
    }

    Ok(())
}