ioctl-sys-0.8.0/.cargo_vcs_info.json0000644000000001470000000000100127710ustar { "git": { "sha1": "3436b6ed458ad52c3b6724098342b668ad9b0545" }, "path_in_vcs": "ioctl-sys" }ioctl-sys-0.8.0/Cargo.lock0000644000000002310000000000100107360ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "ioctl-sys" version = "0.8.0" ioctl-sys-0.8.0/Cargo.toml0000644000000015710000000000100107710ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] name = "ioctl-sys" version = "0.8.0" authors = ["Cody P Schafer ", "Corey Richardson "] include = ["Cargo.toml", "**/*.rs"] description = "IO Control for POSIX-and-beyond systems (core fn & macros, see `ioctls` for many ioctl definitions)" documentation = "https://docs.rs/ioctl-sys" license = "MIT OR Apache-2.0" repository = "https://github.com/jmesmon/ioctl" [dependencies] ioctl-sys-0.8.0/Cargo.toml.orig000064400000000000000000000006460072674642500145040ustar 00000000000000[package] name = "ioctl-sys" version = "0.8.0" authors = ["Cody P Schafer ", "Corey Richardson "] description = "IO Control for POSIX-and-beyond systems (core fn & macros, see `ioctls` for many ioctl definitions)" license = "MIT OR Apache-2.0" repository = "https://github.com/jmesmon/ioctl" documentation = "https://docs.rs/ioctl-sys" include = ["Cargo.toml", "**/*.rs"] [dependencies] ioctl-sys-0.8.0/examples/smoke.rs000064400000000000000000000014330072674642500151120ustar 00000000000000#[macro_use] extern crate ioctl_sys; ioctl!(bad kiocsound with 0x4B2F); ioctl!(none drm_ioctl_set_master with b'd', 0x1e); ioctl!(read ev_get_version with b'E', 0x01; u32); ioctl!(write ev_set_repeat with b'E', 0x03; [u32; 2]); ioctl!(try none drm_ioctl_set_master2 with b'd', 0x1e); ioctl!(try read ev_get_version2 with b'E', 0x01; u32); ioctl!(try read0 ev_get_version3 with b'E', 0x01; u32); ioctl!(try write ev_set_repeat2 with b'E', 0x03; [u32; 2]); fn main() { let mut x = 0; let ret = unsafe { ev_get_version(0, &mut x) }; println!("returned {}, x = {}", ret, x); let mut x2 = 0; let ret2 = unsafe { ev_get_version2(0, &mut x2) }; println!("returned {:?}, x = {}", ret2, x2); let ret3 = unsafe { ev_get_version3(0) }; println!("returned {:?}", ret3); } ioctl-sys-0.8.0/src/lib.rs000064400000000000000000000016060072674642500135150ustar 00000000000000use std::os::raw::{c_int, c_ulong}; #[cfg(any(target_os = "linux", target_os = "macos", target_os = "openbsd", target_os = "android"))] #[macro_use] mod platform; #[cfg(any(target_os = "linux", target_os = "macos", target_os = "openbsd", target_os = "android"))] pub use platform::*; extern "C" { #[doc(hidden)] pub fn ioctl(fd: c_int, req: c_ulong, ...) -> c_int; } #[doc(hidden)] pub fn check_res(res: c_int) -> std::io::Result<()> { if res < 0 { Err(std::io::Error::last_os_error()) } else { Ok(()) } } #[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "openbsd", target_os = "android")))] use platform_not_supported; #[cfg(doctest)] mod test_readme { macro_rules! external_doc_test { ($x:expr) => { #[doc = $x] extern "C" {} }; } external_doc_test!(include_str!("../../README.md")); } ioctl-sys-0.8.0/src/platform/linux.rs000064400000000000000000000024220072674642500157270ustar 00000000000000#[cfg(target_arch = "mips")] mod consts { #[doc(hidden)] pub const NONE: u8 = 1; #[doc(hidden)] pub const READ: u8 = 2; #[doc(hidden)] pub const WRITE: u8 = 4; #[doc(hidden)] pub const SIZEBITS: u8 = 13; #[doc(hidden)] pub const DIRBITS: u8 = 3; } #[cfg(target_arch = "powerpc")] mod consts { #[doc(hidden)] pub const NONE: u8 = 1; #[doc(hidden)] pub const READ: u8 = 2; #[doc(hidden)] pub const WRITE: u8 = 4; #[doc(hidden)] pub const SIZEBITS: u8 = 13; #[doc(hidden)] pub const DIRBITS: u8 = 3; } #[cfg(not(any( target_arch = "powerpc", target_arch = "mips", target_arch = "x86", target_arch = "arm", target_arch = "x86_64", target_arch = "aarch64", target_arch = "riscv64" )))] use this_arch_not_supported; // "Generic" ioctl protocol #[cfg(any( target_arch = "x86", target_arch = "arm", target_arch = "x86_64", target_arch = "aarch64", target_arch = "riscv64" ))] mod consts { #[doc(hidden)] pub const NONE: u8 = 0; #[doc(hidden)] pub const READ: u8 = 2; #[doc(hidden)] pub const WRITE: u8 = 1; #[doc(hidden)] pub const SIZEBITS: u8 = 14; #[doc(hidden)] pub const DIRBITS: u8 = 2; } #[doc(hidden)] pub use self::consts::*; ioctl-sys-0.8.0/src/platform/macos.rs000064400000000000000000000007110072674642500156710ustar 00000000000000#[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] mod consts { #[doc(hidden)] pub const NONE: u8 = 1; #[doc(hidden)] pub const READ: u8 = 2; #[doc(hidden)] pub const WRITE: u8 = 4; #[doc(hidden)] pub const SIZEBITS: u8 = 13; #[doc(hidden)] pub const DIRBITS: u8 = 3; } #[cfg(not(any(target_arch = "aarch64", target_arch = "x86_64")))] use this_arch_not_supported; #[doc(hidden)] pub use self::consts::*; ioctl-sys-0.8.0/src/platform/mod.rs000064400000000000000000000204400072674642500153470ustar 00000000000000#[doc(hidden)] pub const NRBITS: u32 = 8; #[doc(hidden)] pub const TYPEBITS: u32 = 8; #[cfg(any(target_os = "linux", target_os = "android"))] #[path = "linux.rs"] mod consts; #[cfg(target_os = "macos")] #[path = "macos.rs"] mod consts; #[cfg(target_os = "openbsd")] #[path = "openbsd.rs"] mod consts; #[doc(hidden)] pub use self::consts::*; #[doc(hidden)] pub const NRSHIFT: u32 = 0; #[doc(hidden)] pub const TYPESHIFT: u32 = NRSHIFT + NRBITS as u32; #[doc(hidden)] pub const SIZESHIFT: u32 = TYPESHIFT + TYPEBITS as u32; #[doc(hidden)] pub const DIRSHIFT: u32 = SIZESHIFT + SIZEBITS as u32; #[doc(hidden)] pub const NRMASK: u32 = (1 << NRBITS) - 1; #[doc(hidden)] pub const TYPEMASK: u32 = (1 << TYPEBITS) - 1; #[doc(hidden)] pub const SIZEMASK: u32 = (1 << SIZEBITS) - 1; #[doc(hidden)] pub const DIRMASK: u32 = (1 << DIRBITS) - 1; /// Encode an ioctl command. #[macro_export] macro_rules! ioc { ($dir:expr, $ty:expr, $nr:expr, $sz:expr) => { (($dir as u32) << $crate::DIRSHIFT) | (($ty as u32) << $crate::TYPESHIFT) | (($nr as u32) << $crate::NRSHIFT) | (($sz as u32) << $crate::SIZESHIFT) }; } /// Encode an ioctl command that has no associated data. #[macro_export] macro_rules! io { ($ty:expr, $nr:expr) => { $crate::ioc!($crate::NONE, $ty, $nr, 0) }; } /// Encode an ioctl command that reads. #[macro_export] macro_rules! ior { ($ty:expr, $nr:expr, $sz:expr) => { $crate::ioc!($crate::READ, $ty, $nr, $sz) }; } /// Encode an ioctl command that writes. #[macro_export] macro_rules! iow { ($ty:expr, $nr:expr, $sz:expr) => { $crate::ioc!($crate::WRITE, $ty, $nr, $sz) }; } /// Encode an ioctl command that both reads and writes. #[macro_export] macro_rules! iorw { ($ty:expr, $nr:expr, $sz:expr) => { $crate::ioc!($crate::READ | $crate::WRITE, $ty, $nr, $sz) }; } /// Declare a wrapper function around an ioctl. #[macro_export] macro_rules! ioctl { (bad $name:ident with $nr:expr) => { pub unsafe fn $name(fd: ::std::os::raw::c_int, data: *mut u8) -> ::std::os::raw::c_int { $crate::ioctl(fd, $nr as ::std::os::raw::c_ulong, data) } }; (bad read $name:ident with $nr:expr; $ty:ty) => { pub unsafe fn $name(fd: ::std::os::raw::c_int, data: *mut $ty) -> ::std::os::raw::c_int { $crate::ioctl(fd, $nr as ::std::os::raw::c_ulong, data) } }; (bad write $name:ident with $nr:expr; $ty:ty) => { pub unsafe fn $name(fd: ::std::os::raw::c_int, data: *const $ty) -> ::std::os::raw::c_int { $crate::ioctl(fd, $nr as ::std::os::raw::c_ulong, data) } }; (none $name:ident with $ioty:expr, $nr:expr) => { pub unsafe fn $name(fd: ::std::os::raw::c_int) -> ::std::os::raw::c_int { $crate::ioctl(fd, $crate::io!($ioty, $nr) as ::std::os::raw::c_ulong) } }; (try none $name:ident with $ioty:expr, $nr:expr) => { pub unsafe fn $name(fd: ::std::os::raw::c_int) -> std::result::Result<(), std::io::Error> { $crate::check_res($crate::ioctl( fd, $crate::io!($ioty, $nr) as ::std::os::raw::c_ulong, )) } }; (arg $name:ident with $ioty:expr, $nr:expr) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, arg: ::std::os::raw::c_ulong, ) -> ::std::os::raw::c_int { $crate::ioctl(fd, $crate::io!($ioty, $nr) as ::std::os::raw::c_ulong, arg) } }; (read $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name(fd: ::std::os::raw::c_int, val: *mut $ty) -> ::std::os::raw::c_int { $crate::ioctl( fd, $crate::ior!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, val, ) } }; (try read $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, val: *mut $ty, ) -> std::result::Result<(), std::io::Error> { $crate::check_res($crate::ioctl( fd, $crate::ior!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, val, )) } }; (try read0 $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name(fd: ::std::os::raw::c_int) -> std::result::Result<$ty, std::io::Error> { let mut val: $ty = std::mem::zeroed(); $crate::check_res($crate::ioctl( fd, $crate::ior!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, &mut val as *mut $ty, )) .map(|_| val) } }; (write $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name(fd: ::std::os::raw::c_int, val: *const $ty) -> ::std::os::raw::c_int { $crate::ioctl( fd, $crate::iow!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, val, ) } }; (try write $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, val: *const $ty, ) -> std::result::Result<(), std::io::Error> { $crate::check_res($crate::ioctl( fd, $crate::iow!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, val, )) } }; (readwrite $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name(fd: ::std::os::raw::c_int, val: *mut $ty) -> ::std::os::raw::c_int { $crate::ioctl( fd, $crate::iorw!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, val, ) } }; (try readwrite $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, val: *mut $ty, ) -> std::result::Result<(), std::io::Error> { $crate::check_res($crate::ioctl( fd, $crate::iorw!($ioty, $nr, ::std::mem::size_of::<$ty>()) as ::std::os::raw::c_ulong, val, )) } }; (read buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, val: *mut $ty, len: usize, ) -> ::std::os::raw::c_int { $crate::ioctl( fd, $crate::ior!($ioty, $nr, len) as ::std::os::raw::c_ulong, val, ) } }; (write buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, val: *const $ty, len: usize, ) -> ::std::os::raw::c_int { $crate::ioctl( fd, $crate::iow!($ioty, $nr, len) as ::std::os::raw::c_ulong, val, ) } }; (readwrite buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => { pub unsafe fn $name( fd: ::std::os::raw::c_int, val: *const $ty, len: usize, ) -> ::std::os::raw::c_int { $crate::ioctl( fd, $crate::iorw!($ioty, $nr, len) as ::std::os::raw::c_ulong, val, ) } }; } /// Extracts the "direction" (read/write/none) from an encoded ioctl command. #[inline(always)] pub fn ioc_dir(nr: u32) -> u8 { ((nr >> DIRSHIFT) & DIRMASK) as u8 } /// Extracts the type from an encoded ioctl command. #[inline(always)] pub fn ioc_type(nr: u32) -> u32 { (nr >> TYPESHIFT) & TYPEMASK } /// Extracts the ioctl number from an encoded ioctl command. #[inline(always)] pub fn ioc_nr(nr: u32) -> u32 { (nr >> NRSHIFT) & NRMASK } /// Extracts the size from an encoded ioctl command. #[inline(always)] pub fn ioc_size(nr: u32) -> u32 { ((nr >> SIZESHIFT) as u32) & SIZEMASK } #[doc(hidden)] pub const IN: u32 = (WRITE as u32) << DIRSHIFT; #[doc(hidden)] pub const OUT: u32 = (READ as u32) << DIRSHIFT; #[doc(hidden)] pub const INOUT: u32 = ((READ | WRITE) as u32) << DIRSHIFT; #[doc(hidden)] pub const SIZE_MASK: u32 = SIZEMASK << SIZESHIFT; ioctl-sys-0.8.0/src/platform/openbsd.rs000064400000000000000000000007110072674642500162210ustar 00000000000000#[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] mod consts { #[doc(hidden)] pub const NONE: u8 = 1; #[doc(hidden)] pub const READ: u8 = 2; #[doc(hidden)] pub const WRITE: u8 = 4; #[doc(hidden)] pub const SIZEBITS: u8 = 13; #[doc(hidden)] pub const DIRBITS: u8 = 3; } #[cfg(not(any(target_arch = "aarch64", target_arch = "x86_64")))] use this_arch_not_supported; #[doc(hidden)] pub use self::consts::*;