#![allow(dead_code)]
use std::os::fd::{AsRawFd, BorrowedFd};
use std::process::{Command, Stdio};
pub fn run(cmd: &str, args: &[&str]) -> bool {
Command::new(cmd)
.args(args)
.stdout(Stdio::null())
.stderr(Stdio::null())
.status()
.map(|s| s.success())
.unwrap_or(false)
}
pub fn wait_readable(fd: BorrowedFd<'_>, ms: i32) -> bool {
let mut pfd = libc::pollfd { fd: fd.as_raw_fd(), events: libc::POLLIN, revents: 0 };
let rc = unsafe { libc::poll(&mut pfd, 1, ms) };
rc > 0 && pfd.revents & libc::POLLIN != 0
}
pub fn make_frame(payload: &[u8]) -> Vec<u8> {
let mut frame = Vec::new();
frame.extend_from_slice(&[0xff; 6]); frame.extend_from_slice(&[0x02, 0x00, 0x00, 0x00, 0x00, 0x01]); frame.extend_from_slice(&[0x88, 0xb5]); frame.extend_from_slice(payload);
frame
}
pub fn make_vlan_frame(vid: u16, payload: &[u8]) -> Vec<u8> {
let mut frame = Vec::new();
frame.extend_from_slice(&[0xff; 6]); frame.extend_from_slice(&[0x02, 0x00, 0x00, 0x00, 0x00, 0x01]); frame.extend_from_slice(&[0x81, 0x00]); frame.extend_from_slice(&(vid & 0x0fff).to_be_bytes()); frame.extend_from_slice(&[0x88, 0xb5]); frame.extend_from_slice(payload);
frame
}
pub fn contains(haystack: &[u8], needle: &[u8]) -> bool {
needle.len() <= haystack.len() && haystack.windows(needle.len()).any(|w| w == needle)
}
pub fn hw_ifaces() -> Option<(String, String)> {
let a = std::env::var("FERRANET_HW_IFACE_A").ok()?;
let b = std::env::var("FERRANET_HW_IFACE_B").ok()?;
Some((a, b))
}