pub unsafe trait Ioctl {
type Output;
const IS_MUTATING: bool;
// Required methods
fn opcode(&self) -> Opcode;
fn as_ptr(&mut self) -> *mut c_void;
unsafe fn output_from_ptr(
out: IoctlOutput,
extract_output: *mut c_void,
) -> Result<Self::Output>;
}Expand description
A trait defining the properties of an ioctl command.
Objects implementing this trait can be passed to ioctl to make an
ioctl call. The contents of the object represent the inputs to the
ioctl call. The inputs must be convertible to a pointer through the
as_ptr method. In most cases, this involves either casting a number to a
pointer, or creating a pointer to the actual data. The latter case is
necessary for ioctl calls that modify userspace data.
§Safety
This trait is unsafe to implement because it is impossible to guarantee
that the ioctl call is safe. The ioctl call may be proprietary, or it
may be unsafe to call in certain circumstances.
By implementing this trait, you guarantee that:
- The
ioctlcall expects the input provided byas_ptrand produces the output as indicated byoutput. - That
output_from_ptrcan safely take the pointer fromas_ptrand cast it to the correct type, only after theioctlcall. - That the return value of
opcodeuniquely identifies theioctlcall. - That, for whatever platforms you are targeting, the
ioctlcall is safe to make. - If
IS_MUTATINGis false, that no userspace data will be modified by theioctlcall.
Required Associated Constants§
Sourceconst IS_MUTATING: bool
const IS_MUTATING: bool
Does the ioctl mutate any data in the userspace?
If the ioctl call does not mutate any data in the userspace, then
making this false enables optimizations that can make the call
faster. When in doubt, set this to true.
§Safety
This should only be set to false if the ioctl call does not mutate
any data in the userspace. Undefined behavior may occur if this is set
to false when it should be true.
Required Associated Types§
Required Methods§
Sourcefn opcode(&self) -> Opcode
fn opcode(&self) -> Opcode
Get the opcode used by this ioctl command.
There are different types of opcode depending on the operation. See
documentation for opcode for more information.
Sourcefn as_ptr(&mut self) -> *mut c_void
fn as_ptr(&mut self) -> *mut c_void
Get a pointer to the data to be passed to the ioctl command.
See trait-level documentation for more information.
Sourceunsafe fn output_from_ptr(
out: IoctlOutput,
extract_output: *mut c_void,
) -> Result<Self::Output>
unsafe fn output_from_ptr( out: IoctlOutput, extract_output: *mut c_void, ) -> Result<Self::Output>
Cast the output data to the correct type.
§Safety
The extract_output value must be the resulting value after a
successful ioctl call, and out is the direct return value of an
ioctl call that did not fail. In this case extract_output is the
pointer that was passed to the ioctl call.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.