#![allow(unsafe_code)]
use std::io;
use std::mem::MaybeUninit;
use std::os::fd::RawFd;
#[repr(C)]
#[allow(dead_code)]
struct SerialStruct {
type_: libc::c_int,
line: libc::c_int,
port: libc::c_uint,
irq: libc::c_int,
flags: libc::c_int,
xmit_fifo_size: libc::c_int,
custom_divisor: libc::c_int,
baud_base: libc::c_int,
close_delay: libc::c_ushort,
io_type: libc::c_char,
reserved_char: [libc::c_char; 1],
hub6: libc::c_int,
closing_wait: libc::c_ushort,
closing_wait2: libc::c_ushort,
iomem_base: *mut libc::c_uchar,
iomem_reg_shift: libc::c_ushort,
port_high: libc::c_uint,
iomap_base: libc::c_ulong,
}
const ASYNC_LOW_LATENCY: libc::c_int = 1 << 13;
pub(crate) fn enable(fd: RawFd) -> io::Result<()> {
let mut info = MaybeUninit::<SerialStruct>::uninit();
if unsafe { libc::ioctl(fd, libc::TIOCGSERIAL as _, info.as_mut_ptr()) } != 0 {
return Err(io::Error::last_os_error());
}
let mut info = unsafe { info.assume_init() };
if info.flags & ASYNC_LOW_LATENCY != 0 {
return Ok(());
}
info.flags |= ASYNC_LOW_LATENCY;
if unsafe { libc::ioctl(fd, libc::TIOCSSERIAL as _, &info) } != 0 {
return Err(io::Error::last_os_error());
}
Ok(())
}