use crate::ioctl;
use crate::Media;
use nix::errno::Errno;
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, OwnedFd, RawFd};
#[derive(Debug)]
#[repr(C)]
pub struct Request {
fd: OwnedFd,
}
impl AsFd for Request {
fn as_fd(&self) -> BorrowedFd {
self.fd.as_fd()
}
}
impl AsRawFd for Request {
fn as_raw_fd(&self) -> RawFd {
self.fd.as_raw_fd()
}
}
impl Request {
pub(crate) fn from_media(media: &Media) -> Result<Request, Errno> {
let mut fd = -1;
let fd = unsafe {
ioctl::request_alloc(media.as_raw_fd(), &mut fd)?;
OwnedFd::from_raw_fd(fd)
};
Ok(Request { fd })
}
pub fn queue(&self) -> Result<(), Errno> {
unsafe { ioctl::request_queue(self.fd.as_raw_fd()) }?;
Ok(())
}
pub fn reinit(&self) -> Result<(), Errno> {
unsafe { ioctl::request_reinit(self.fd.as_raw_fd()) }?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! assert_size (
($t:ty, $sz:expr) => (
assert_eq!(::std::mem::size_of::<$t>(), $sz);
);
);
#[test]
fn size() {
assert_size!(Request, 4);
}
}