diff --git a/src/fe/mod.rs b/src/fe/mod.rs index 4bee543..92e3b53 100644 --- a/src/fe/mod.rs +++ b/src/fe/mod.rs @@ -33,7 +33,6 @@ use { Context, Result, }, - libc, thiserror::Error, crate::ioctl::{ @@ -201,8 +200,8 @@ impl FeDevice { let mut feinfo = FeInfo::default(); self.ioctl(FE_GET_INFO, feinfo.as_mut_ptr()).context("fe get info")?; - let len = unsafe { libc::strnlen(feinfo.name.as_ptr() as *const _, feinfo.name.len()) }; - if let Ok(name) = CStr::from_bytes_with_nul(&feinfo.name[.. len + 1]) { + if let Some(len) = feinfo.name.iter().position(|&b| b == 0) { + let name = unsafe { CStr::from_ptr(feinfo.name[.. len + 1].as_ptr()) }; if let Ok(name) = name.to_str() { self.name = name.to_owned(); } @@ -370,25 +369,23 @@ impl FeDevice { pub fn ioctl_set_property(&self, cmdseq: &[DtvProperty]) -> Result<()> { self.check_cmdseq(cmdseq).context("fe property check")?; - let cmd = DtvProperties::new(cmdseq); + let cmd = DtvProperties { + num: cmdseq.len() as u32, + props: cmdseq.as_ptr(), + }; + self.ioctl(FE_SET_PROPERTY, cmd.as_ptr()) } /// Gets properties from frontend device pub fn ioctl_get_property(&self, cmdseq: &mut [DtvProperty]) -> Result<()> { - // same as DtvProperties but with mut props - #[repr(C)] - struct DtvPropertiesMut { - num: u32, - props: *mut DtvProperty, - } let mut cmd = DtvPropertiesMut { num: cmdseq.len() as u32, props: cmdseq.as_mut_ptr(), }; - self.ioctl(FE_GET_PROPERTY, &mut cmd as *mut _) + self.ioctl(FE_GET_PROPERTY, cmd.as_mut_ptr()) } /// Sets DiSEqC master command diff --git a/src/fe/sys.rs b/src/fe/sys.rs index 3256fd9..5feab62 100644 --- a/src/fe/sys.rs +++ b/src/fe/sys.rs @@ -118,7 +118,7 @@ mod fe_type { #[derive(Debug)] pub struct FeInfo { /// Name of the frontend - pub name: [u8; 128], + pub name: [std::os::raw::c_char; 128], /// DEPRECATED: frontend delivery system pub fe_type: u32, /// Minimal frequency supported by the frontend @@ -710,7 +710,6 @@ pub const DTV_IOCTL_MAX_MSGS: usize = 64; /// a set of command/value pairs for FE_SET_PROPERTY #[repr(C)] -#[derive(Debug)] pub struct DtvProperties { pub num: u32, pub props: *const DtvProperty, @@ -718,19 +717,26 @@ pub struct DtvProperties { impl DtvProperties { - #[inline] - pub fn new(props: &[DtvProperty]) -> DtvProperties { - DtvProperties { - num: props.len() as u32, - props: props.as_ptr(), - } - } - #[inline] pub fn as_ptr(&self) -> *const DtvProperties { self as *const _ } } +// a set of command/value pairs for FE_GET_PROPERTY +#[repr(C)] +#[derive(Debug)] +pub struct DtvPropertiesMut { + pub num: u32, + pub props: *mut DtvProperty, +} + + +impl DtvPropertiesMut { + #[inline] + pub fn as_mut_ptr(&mut self) -> *mut DtvPropertiesMut { self as *mut _ } +} + + #[repr(C)] #[derive(Debug)] pub struct FeParameters { @@ -770,7 +776,7 @@ pub const FE_GET_INFO: IoctlInt = io_read::(b'o', 61); pub const FE_DISEQC_RESET_OVERLOAD: IoctlInt = io_none(b'o', 62); pub const FE_DISEQC_SEND_MASTER_CMD: IoctlInt = io_write::(b'o', 63); -pub const FE_DISEQC_RECV_SLAVE_REPLY: IoctlInt = io_read::(b'0', 64); +pub const FE_DISEQC_RECV_SLAVE_REPLY: IoctlInt = io_read::(b'o', 64); pub const FE_DISEQC_SEND_BURST: IoctlInt = io_none(b'o', 65); pub const FE_SET_TONE: IoctlInt = io_none(b'o', 66); @@ -787,4 +793,4 @@ pub const FE_GET_EVENT: IoctlInt = io_read::(b'o', 78); pub const FE_SET_FRONTEND_TUNE_MODE: IoctlInt = io_none(b'o', 81); pub const FE_SET_PROPERTY: IoctlInt = io_write::(b'o', 82); -pub const FE_GET_PROPERTY: IoctlInt = io_read::(b'o', 83); +pub const FE_GET_PROPERTY: IoctlInt = io_read::(b'o', 83);