use std::path::PathBuf;
use std::os::unix::io::RawFd;
const IOCTL_IOSSIOSPEED: u64 = 0x80045402;
pub fn ioctl_iossiospeed(fd: RawFd, baud_rate: libc::speed_t) -> Result<(), std::io::Error> {
unsafe {
super::check(libc::ioctl(fd, IOCTL_IOSSIOSPEED, &baud_rate))?;
Ok(())
}
}
pub fn enumerate() -> std::io::Result<Vec<PathBuf>> {
use std::os::unix::ffi::OsStrExt;
use std::os::unix::fs::FileTypeExt;
let serial_ports = std::fs::read_dir("/dev")?
.filter_map(|entry| {
let entry = entry.ok()?;
let kind = entry.metadata().ok()?.file_type();
if kind.is_char_device() && is_tty_name(entry.file_name().as_bytes()) {
Some(entry.path())
} else {
None
}
})
.collect();
Ok(serial_ports)
}
fn is_tty_name(name: &[u8]) -> bool {
name.starts_with(b"tty.") || name.starts_with(b"cu.")
}