use crate::ioctl;
use crate::Media;
use rustix::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, OwnedFd, RawFd};
use rustix::io::Result;
#[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> {
let fd = unsafe {
let fd = ioctl::request_alloc(media.as_fd())?;
OwnedFd::from_raw_fd(fd)
};
Ok(Request { fd })
}
pub fn queue(&self) -> Result<()> {
unsafe { ioctl::request_queue(self.as_fd()) }?;
Ok(())
}
pub fn reinit(&self) -> Result<()> {
unsafe { ioctl::request_reinit(self.as_fd()) }?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! assert_size (
($t:ty, $sz:expr) => (
assert_eq!(core::mem::size_of::<$t>(), $sz);
);
);
#[test]
fn size() {
assert_size!(Request, 4);
}
}