ioctl_macro/linux/
mod.rs

1#![allow(non_snake_case)]
2
3#[cfg(feature = "extern_fn")]
4use core::ffi::c_int;
5#[cfg(all(feature = "extern_fn", ioctl = "c_ulong"))]
6use core::ffi::c_ulong;
7
8#[cfg(any(
9	target_arch = "aarch64",
10	target_arch = "arm",
11	target_arch = "riscv32",
12	target_arch = "riscv64",
13	target_arch = "s390x",
14	target_arch = "x86",
15	target_arch = "x86_64",
16))]
17mod generic;
18#[cfg(any(target_arch = "mips", target_arch = "mips64"))]
19mod mips;
20#[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))]
21mod powerpc;
22#[cfg(any(target_arch = "sparc", target_arch = "sparc64"))]
23mod sparc;
24
25#[cfg(feature = "extern_fn")]
26extern "C" {
27	#[cfg(ioctl = "c_int")]
28	pub fn ioctl(fd: c_int, request: c_int, ...) -> c_int;
29	#[cfg(ioctl = "c_ulong")]
30	pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int;
31}
32
33#[macro_export]
34macro_rules! _IOC_NRBITS {
35	() => {
36		8
37	};
38}
39#[macro_export]
40macro_rules! _IOC_TYPEBITS {
41	() => {
42		8
43	};
44}
45
46#[macro_export]
47macro_rules! _IOC_NRMASK {
48	() => {
49		((1 << $crate::_IOC_NRBITS!()) - 1)
50	};
51}
52#[macro_export]
53macro_rules! _IOC_TYPEMASK {
54	() => {
55		((1 << $crate::_IOC_TYPEBITS!()) - 1)
56	};
57}
58#[macro_export]
59macro_rules! _IOC_SIZEMASK {
60	() => {
61		((1 << $crate::_IOC_SIZEBITS!()) - 1)
62	};
63}
64#[macro_export]
65macro_rules! _IOC_DIRMASK {
66	() => {
67		((1 << $crate::_IOC_DIRBITS!()) - 1)
68	};
69}
70
71#[macro_export]
72macro_rules! _IOC_NRSHIFT {
73	() => {
74		0
75	};
76}
77#[macro_export]
78macro_rules! _IOC_TYPESHIFT {
79	() => {
80		($crate::_IOC_NRSHIFT!() + $crate::_IOC_NRBITS!())
81	};
82}
83#[macro_export]
84macro_rules! _IOC_SIZESHIFT {
85	() => {
86		($crate::_IOC_TYPESHIFT!() + $crate::_IOC_TYPEBITS!())
87	};
88}
89#[macro_export]
90macro_rules! _IOC_DIRSHIFT {
91	() => {
92		($crate::_IOC_SIZESHIFT!() + $crate::_IOC_SIZEBITS!())
93	};
94}
95
96#[cfg(ioctl = "c_int")]
97#[macro_export]
98macro_rules! _IOC {
99	($dir:expr, $type:expr, $nr:expr, $size:expr) => {
100		((($dir as core::ffi::c_int) << $crate::_IOC_DIRSHIFT!())
101			| (($type as core::ffi::c_int) << $crate::_IOC_TYPESHIFT!())
102			| (($nr as core::ffi::c_int) << $crate::_IOC_NRSHIFT!())
103			| (($size as core::ffi::c_int) << $crate::_IOC_SIZESHIFT!()))
104	};
105}
106#[cfg(ioctl = "c_ulong")]
107#[macro_export]
108macro_rules! _IOC {
109	($dir:expr, $type:expr, $nr:expr, $size:expr) => {
110		((($dir as core::ffi::c_ulong) << $crate::_IOC_DIRSHIFT!())
111			| (($type as core::ffi::c_ulong) << $crate::_IOC_TYPESHIFT!())
112			| (($nr as core::ffi::c_ulong) << $crate::_IOC_NRSHIFT!())
113			| (($size as core::ffi::c_ulong) << $crate::_IOC_SIZESHIFT!()))
114	};
115}
116
117#[macro_export]
118macro_rules! _IOC_TYPECHECK {
119	($t:ty) => {
120		(core::mem::size_of::<$t>())
121	};
122}
123
124#[macro_export]
125macro_rules! _IO {
126	($type:expr, $nr:expr, $size:ty) => {
127		$crate::_IOC!($crate::_IOC_NONE!(), ($type), ($nr), 0)
128	};
129}
130#[macro_export]
131macro_rules! _IOR {
132	($type:expr, $nr:expr, $size:ty) => {
133		$crate::_IOC!($crate::_IOC_READ!(), ($type), ($nr), ($crate::_IOC_TYPECHECK!($size)))
134	};
135}
136#[macro_export]
137macro_rules! _IOW {
138	($type:expr, $nr:expr, $size:ty) => {
139		$crate::_IOC!($crate::_IOC_WRITE!(), ($type), ($nr), ($crate::_IOC_TYPECHECK!($size)))
140	};
141}
142#[macro_export]
143macro_rules! _IOWR {
144	($type:expr, $nr:expr, $size:ty) => {
145		$crate::_IOC!(
146			$crate::_IOC_WRITE!() | $crate::_IOC_READ!(),
147			($type),
148			($nr),
149			($crate::_IOC_TYPECHECK!($size))
150		)
151	};
152}
153#[macro_export]
154macro_rules! _IOR_BAD {
155	($type:expr, $nr:expr, $size:ty) => {
156		$crate::_IOC!($crate::_IOC_READ!(), ($type), ($nr), core::mem::sizeof::<$size>())
157	};
158}
159#[macro_export]
160macro_rules! _IOW_BAD {
161	($type:expr, $nr:expr, $size:ty) => {
162		$crate::_IOC!($crate::_IOC_WRITE!(), ($type), ($nr), core::mem::sizeof::<$size>())
163	};
164}
165#[macro_export]
166macro_rules! _IOWR_BAD {
167	($type:expr, $nr:expr, $size:ty) => {
168		$crate::_IOC!(
169			$crate::_IOC_WRITE!() | $crate::_IOC_READ!(),
170			($type),
171			($nr),
172			core::mem::sizeof::<$size>()
173		)
174	};
175}
176
177#[macro_export]
178macro_rules! _IOC_DIR {
179	($nr:expr) => {
180		((($nr) >> $crate::_IOC_DIRSHIFT!()) & $crate::_IOC_DIRMASK!())
181	};
182}
183#[macro_export]
184macro_rules! _IOC_TYPE {
185	($nr:expr) => {
186		((($nr) >> $crate::_IOC_TYPESHIFT!()) & $crate::_IOC_TYPEMASK!())
187	};
188}
189#[macro_export]
190macro_rules! _IOC_NR {
191	($nr:expr) => {
192		((($nr) >> $crate::_IOC_NRSHIFT!()) & $crate::_IOC_NRMASK!())
193	};
194}
195#[macro_export]
196macro_rules! _IOC_SIZE {
197	($nr:expr) => {
198		((($nr) >> $crate::_IOC_SIZESHIFT!()) & $crate::_IOC_SIZEMASK!())
199	};
200}
201
202#[macro_export]
203macro_rules! IOC_IN {
204	() => {
205		($crate::_IOC_WRITE!() << $crate::_IOC_DIRSHIFT!())
206	};
207}
208#[macro_export]
209macro_rules! IOC_OUT {
210	() => {
211		($crate::_IOC_READ!() << $crate::_IOC_DIRSHIFT!())
212	};
213}
214#[macro_export]
215macro_rules! IOC_INOUT {
216	() => {
217		(($crate::_IOC_WRITE!() | $crate::_IOC_READ!()) << $crate::_IOC_DIRSHIFT!())
218	};
219}
220#[macro_export]
221macro_rules! IOCSIZE_MASK {
222	() => {
223		($crate::_IOC_SIZEMASK!() << $crate::_IOC_SIZESHIFT!())
224	};
225}
226#[macro_export]
227macro_rules! IOCSIZE_SHIFT {
228	() => {
229		($crate::_IOC_SIZESHIFT!())
230	};
231}