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}