socketcan-alt 0.2.1

Rust binding for SocketCAN
Documentation
use socketcan_alt::{Cmsg, Socket, Timestamping};
use std::ffi::CString;
use std::io::Result;
use structopt::StructOpt;

#[derive(StructOpt)]
struct Opt {
    ifname: String,
}

fn main() -> Result<()> {
    let opt = Opt::from_args();

    let socket = Socket::bind(CString::new(opt.ifname)?)?;
    socket.set_timestamping(Timestamping::RX_SOFTWARE | Timestamping::SOFTWARE)?;
    socket.set_fd_frames(true)?;

    let mut cmsg_buf = vec![0; Cmsg::space()];
    loop {
        let (frame, cmsgs) = socket.recv_msg(&mut cmsg_buf)?;
        let timestamp = cmsgs.into_iter().flatten().find_map(|cmsg| match cmsg {
            Cmsg::Timestamping(ts) => Some(ts[0]),
            _ => None,
        });
        if let Some(timestamp) = timestamp {
            println!(
                "{:.9} {:?}",
                timestamp.tv_sec as f64 + timestamp.tv_nsec as f64 / 1_000_000_000.,
                frame
            );
        } else {
            println!("{:?}", frame);
        }
    }
}