//! Implements typical patterns for `ioctl` usage.
usesuper::{Ioctl, IoctlOutput, Opcode};
usecrate::backend::c; usecrate::io::Result;
use core::ptr::addr_of_mut; use core::{fmt, mem};
/// Implements an `ioctl` with no real arguments. /// /// To compute a value for the `OPCODE` argument, see the functions in the /// [`opcode`] module. /// /// [`opcode`]: crate::ioctl::opcode pubstruct NoArg<const OPCODE: Opcode> {}
/// Implements the traditional “getter” pattern for `ioctl`s. /// /// Some `ioctl`s just read data into the userspace. As this is a popular /// pattern, this structure implements it. /// /// To compute a value for the `OPCODE` argument, see the functions in the /// [`opcode`] module. /// /// [`opcode`]: crate::ioctl::opcode pubstruct Getter<const OPCODE: Opcode, Output> { /// The output data.
output: mem::MaybeUninit<Output>,
}
impl<const OPCODE: Opcode, Output> Getter<OPCODE, Output> { /// Create a new getter-style `ioctl` object. /// /// # Safety /// /// - `OPCODE` must provide a valid opcode. /// - For this opcode, `Output` must be the type that the kernel expects /// to write into. #[inline] pubconstunsafefn new() -> Self { Self {
output: mem::MaybeUninit::uninit(),
}
}
}
unsafeimpl<const OPCODE: Opcode, Output> Ioctl for Getter<OPCODE, Output> { type Output = Output;
/// Implements the pattern for `ioctl`s where a pointer argument is given to /// the `ioctl`. /// /// The opcode must be read-only. /// /// To compute a value for the `OPCODE` argument, see the functions in the /// [`opcode`] module. /// /// [`opcode`]: crate::ioctl::opcode pubstruct Setter<const OPCODE: Opcode, Input> { /// The input data.
input: Input,
}
impl<const OPCODE: Opcode, Input> Setter<OPCODE, Input> { /// Create a new pointer setter-style `ioctl` object. /// /// # Safety /// /// - `OPCODE` must provide a valid opcode. /// - For this opcode, `Input` must be the type that the kernel expects to /// get. #[inline] pubconstunsafefn new(input: Input) -> Self { Self { input }
}
}
unsafeimpl<const OPCODE: Opcode, Input> Ioctl for Setter<OPCODE, Input> { type Output = ();
/// Implements an “updater” pattern for `ioctl`s. /// /// The ioctl takes a reference to a struct that it reads its input from, /// then writes output to the same struct. /// /// To compute a value for the `OPCODE` argument, see the functions in the /// [`opcode`] module. /// /// [`opcode`]: crate::ioctl::opcode pubstruct Updater<'a, const OPCODE: Opcode, Value> { /// Reference to input/output data.
value: &'a mut Value,
}
impl<'a, const OPCODE: Opcode, Value> Updater<'a, OPCODE, Value> { /// Create a new pointer updater-style `ioctl` object. /// /// # Safety /// /// - `OPCODE` must provide a valid opcode. /// - For this opcode, `Value` must be the type that the kernel expects to /// get. #[inline] pubunsafefn new(value: &'a mut Value) -> Self { Self { value }
}
}
unsafeimpl<'a, const OPCODE: Opcode, T> Ioctl for Updater<'a, OPCODE, T> { type Output = ();
/// Implements an `ioctl` that passes an integer into the `ioctl`. /// /// To compute a value for the `OPCODE` argument, see the functions in the /// [`opcode`] module. /// /// [`opcode`]: crate::ioctl::opcode pubstruct IntegerSetter<const OPCODE: Opcode> { /// The value to pass in. /// /// For strict provenance preservation, this is a pointer.
value: *mut c::c_void,
}
impl<const OPCODE: Opcode> IntegerSetter<OPCODE> { /// Create a new integer `Ioctl` helper containing a `usize`. /// /// # Safety /// /// - `OPCODE` must provide a valid opcode. /// - For this opcode, it must expect an integer. /// - The integer is in the valid range for this opcode. #[inline] pubconstunsafefn new_usize(value: usize) -> Self { Self { value: value as _ }
}
/// Create a new integer `Ioctl` helper containing a `*mut c_void`. /// /// # Safety /// /// - `OPCODE` must provide a valid opcode. /// - For this opcode, it must expect an integer. /// - The integer is in the valid range for this opcode. #[inline] pubconstunsafefn new_pointer(value: *mut c::c_void) -> Self { Self { value }
}
}
unsafeimpl<const OPCODE: Opcode> Ioctl for IntegerSetter<OPCODE> { type Output = ();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.