1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker //! Macros and wrapper functions for dealing with ioctls.
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Worker // Allow missing safety comments because this file provides just thin helper functions for
8*bb4ee6a4SAndroid Build Coastguard Worker // `libc::ioctl`. Their safety follows `libc::ioctl`'s safety.
9*bb4ee6a4SAndroid Build Coastguard Worker #![allow(clippy::missing_safety_doc)]
10*bb4ee6a4SAndroid Build Coastguard Worker
11*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_int;
12*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_uint;
13*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_ulong;
14*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_void;
15*bb4ee6a4SAndroid Build Coastguard Worker
16*bb4ee6a4SAndroid Build Coastguard Worker use crate::descriptor::AsRawDescriptor;
17*bb4ee6a4SAndroid Build Coastguard Worker
18*bb4ee6a4SAndroid Build Coastguard Worker /// Raw macro to declare the expression that calculates an ioctl number
19*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
20*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! ioctl_expr {
21*bb4ee6a4SAndroid Build Coastguard Worker ($dir:expr, $ty:expr, $nr:expr, $size:expr) => {
22*bb4ee6a4SAndroid Build Coastguard Worker ((($dir as $crate::linux::IoctlNr) << $crate::linux::ioctl::_IOC_DIRSHIFT)
23*bb4ee6a4SAndroid Build Coastguard Worker | (($ty as $crate::linux::IoctlNr) << $crate::linux::ioctl::_IOC_TYPESHIFT)
24*bb4ee6a4SAndroid Build Coastguard Worker | (($nr as $crate::linux::IoctlNr) << $crate::linux::ioctl::_IOC_NRSHIFT)
25*bb4ee6a4SAndroid Build Coastguard Worker | (($size as $crate::linux::IoctlNr) << $crate::linux::ioctl::_IOC_SIZESHIFT))
26*bb4ee6a4SAndroid Build Coastguard Worker };
27*bb4ee6a4SAndroid Build Coastguard Worker }
28*bb4ee6a4SAndroid Build Coastguard Worker
29*bb4ee6a4SAndroid Build Coastguard Worker /// Raw macro to declare a constant or a function that returns an ioctl number.
30*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
31*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! ioctl_ioc_nr {
32*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $dir:expr, $ty:expr, $nr:expr, $size:expr) => {
33*bb4ee6a4SAndroid Build Coastguard Worker #[allow(non_snake_case)]
34*bb4ee6a4SAndroid Build Coastguard Worker /// Constant ioctl request number.
35*bb4ee6a4SAndroid Build Coastguard Worker pub const $name: $crate::linux::IoctlNr = $crate::ioctl_expr!($dir, $ty, $nr, $size);
36*bb4ee6a4SAndroid Build Coastguard Worker };
37*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $dir:expr, $ty:expr, $nr:expr, $size:expr, $($v:ident),+) => {
38*bb4ee6a4SAndroid Build Coastguard Worker #[allow(non_snake_case)]
39*bb4ee6a4SAndroid Build Coastguard Worker /// Generates ioctl request number.
40*bb4ee6a4SAndroid Build Coastguard Worker pub const fn $name($($v: ::std::os::raw::c_uint),+) -> $crate::linux::IoctlNr {
41*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_expr!($dir, $ty, $nr, $size)
42*bb4ee6a4SAndroid Build Coastguard Worker }
43*bb4ee6a4SAndroid Build Coastguard Worker };
44*bb4ee6a4SAndroid Build Coastguard Worker }
45*bb4ee6a4SAndroid Build Coastguard Worker
46*bb4ee6a4SAndroid Build Coastguard Worker /// Declare an ioctl that transfers no data.
47*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
48*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! ioctl_io_nr {
49*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr) => {
50*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!($name, $crate::linux::ioctl::_IOC_NONE, $ty, $nr, 0);
51*bb4ee6a4SAndroid Build Coastguard Worker };
52*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $($v:ident),+) => {
53*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!($name, $crate::linux::ioctl::_IOC_NONE, $ty, $nr, 0, $($v),+);
54*bb4ee6a4SAndroid Build Coastguard Worker };
55*bb4ee6a4SAndroid Build Coastguard Worker }
56*bb4ee6a4SAndroid Build Coastguard Worker
57*bb4ee6a4SAndroid Build Coastguard Worker /// Declare an ioctl that reads data.
58*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
59*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! ioctl_ior_nr {
60*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $size:ty) => {
61*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!(
62*bb4ee6a4SAndroid Build Coastguard Worker $name,
63*bb4ee6a4SAndroid Build Coastguard Worker $crate::linux::ioctl::_IOC_READ,
64*bb4ee6a4SAndroid Build Coastguard Worker $ty,
65*bb4ee6a4SAndroid Build Coastguard Worker $nr,
66*bb4ee6a4SAndroid Build Coastguard Worker ::std::mem::size_of::<$size>() as u32
67*bb4ee6a4SAndroid Build Coastguard Worker );
68*bb4ee6a4SAndroid Build Coastguard Worker };
69*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $size:ty, $($v:ident),+) => {
70*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!(
71*bb4ee6a4SAndroid Build Coastguard Worker $name,
72*bb4ee6a4SAndroid Build Coastguard Worker $crate::linux::ioctl::_IOC_READ,
73*bb4ee6a4SAndroid Build Coastguard Worker $ty,
74*bb4ee6a4SAndroid Build Coastguard Worker $nr,
75*bb4ee6a4SAndroid Build Coastguard Worker ::std::mem::size_of::<$size>() as u32,
76*bb4ee6a4SAndroid Build Coastguard Worker $($v),+
77*bb4ee6a4SAndroid Build Coastguard Worker );
78*bb4ee6a4SAndroid Build Coastguard Worker };
79*bb4ee6a4SAndroid Build Coastguard Worker }
80*bb4ee6a4SAndroid Build Coastguard Worker
81*bb4ee6a4SAndroid Build Coastguard Worker /// Declare an ioctl that writes data.
82*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
83*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! ioctl_iow_nr {
84*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $size:ty) => {
85*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!(
86*bb4ee6a4SAndroid Build Coastguard Worker $name,
87*bb4ee6a4SAndroid Build Coastguard Worker $crate::linux::ioctl::_IOC_WRITE,
88*bb4ee6a4SAndroid Build Coastguard Worker $ty,
89*bb4ee6a4SAndroid Build Coastguard Worker $nr,
90*bb4ee6a4SAndroid Build Coastguard Worker ::std::mem::size_of::<$size>() as u32
91*bb4ee6a4SAndroid Build Coastguard Worker );
92*bb4ee6a4SAndroid Build Coastguard Worker };
93*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $size:ty, $($v:ident),+) => {
94*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!(
95*bb4ee6a4SAndroid Build Coastguard Worker $name,
96*bb4ee6a4SAndroid Build Coastguard Worker $crate::linux::ioctl::_IOC_WRITE,
97*bb4ee6a4SAndroid Build Coastguard Worker $ty,
98*bb4ee6a4SAndroid Build Coastguard Worker $nr,
99*bb4ee6a4SAndroid Build Coastguard Worker ::std::mem::size_of::<$size>() as u32,
100*bb4ee6a4SAndroid Build Coastguard Worker $($v),+
101*bb4ee6a4SAndroid Build Coastguard Worker );
102*bb4ee6a4SAndroid Build Coastguard Worker };
103*bb4ee6a4SAndroid Build Coastguard Worker }
104*bb4ee6a4SAndroid Build Coastguard Worker
105*bb4ee6a4SAndroid Build Coastguard Worker /// Declare an ioctl that reads and writes data.
106*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
107*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! ioctl_iowr_nr {
108*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $size:ty) => {
109*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!(
110*bb4ee6a4SAndroid Build Coastguard Worker $name,
111*bb4ee6a4SAndroid Build Coastguard Worker $crate::linux::ioctl::_IOC_READ | $crate::linux::ioctl::_IOC_WRITE,
112*bb4ee6a4SAndroid Build Coastguard Worker $ty,
113*bb4ee6a4SAndroid Build Coastguard Worker $nr,
114*bb4ee6a4SAndroid Build Coastguard Worker ::std::mem::size_of::<$size>() as u32
115*bb4ee6a4SAndroid Build Coastguard Worker );
116*bb4ee6a4SAndroid Build Coastguard Worker };
117*bb4ee6a4SAndroid Build Coastguard Worker ($name:ident, $ty:expr, $nr:expr, $size:ty, $($v:ident),+) => {
118*bb4ee6a4SAndroid Build Coastguard Worker $crate::ioctl_ioc_nr!(
119*bb4ee6a4SAndroid Build Coastguard Worker $name,
120*bb4ee6a4SAndroid Build Coastguard Worker $crate::linux::ioctl::_IOC_READ | $crate::linux::ioctl::_IOC_WRITE,
121*bb4ee6a4SAndroid Build Coastguard Worker $ty,
122*bb4ee6a4SAndroid Build Coastguard Worker $nr,
123*bb4ee6a4SAndroid Build Coastguard Worker ::std::mem::size_of::<$size>() as u32,
124*bb4ee6a4SAndroid Build Coastguard Worker $($v),+
125*bb4ee6a4SAndroid Build Coastguard Worker );
126*bb4ee6a4SAndroid Build Coastguard Worker };
127*bb4ee6a4SAndroid Build Coastguard Worker }
128*bb4ee6a4SAndroid Build Coastguard Worker
129*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_NRBITS: c_uint = 8;
130*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_TYPEBITS: c_uint = 8;
131*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_SIZEBITS: c_uint = 14;
132*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_DIRBITS: c_uint = 2;
133*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_NRMASK: c_uint = 255;
134*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_TYPEMASK: c_uint = 255;
135*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_SIZEMASK: c_uint = 16383;
136*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_DIRMASK: c_uint = 3;
137*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_NRSHIFT: c_uint = 0;
138*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_TYPESHIFT: c_uint = 8;
139*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_SIZESHIFT: c_uint = 16;
140*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_DIRSHIFT: c_uint = 30;
141*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_NONE: c_uint = 0;
142*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_WRITE: c_uint = 1;
143*bb4ee6a4SAndroid Build Coastguard Worker pub const _IOC_READ: c_uint = 2;
144*bb4ee6a4SAndroid Build Coastguard Worker pub const IOC_IN: c_uint = 1_073_741_824;
145*bb4ee6a4SAndroid Build Coastguard Worker pub const IOC_OUT: c_uint = 2_147_483_648;
146*bb4ee6a4SAndroid Build Coastguard Worker pub const IOC_INOUT: c_uint = 3_221_225_472;
147*bb4ee6a4SAndroid Build Coastguard Worker pub const IOCSIZE_MASK: c_uint = 1_073_676_288;
148*bb4ee6a4SAndroid Build Coastguard Worker pub const IOCSIZE_SHIFT: c_uint = 16;
149*bb4ee6a4SAndroid Build Coastguard Worker
150*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_env = "musl"))]
151*bb4ee6a4SAndroid Build Coastguard Worker pub type IoctlNr = c_int;
152*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(not(any(target_os = "android", target_env = "musl")))]
153*bb4ee6a4SAndroid Build Coastguard Worker pub type IoctlNr = c_ulong;
154*bb4ee6a4SAndroid Build Coastguard Worker
155*bb4ee6a4SAndroid Build Coastguard Worker /// Run an ioctl with no arguments.
156*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety
157*bb4ee6a4SAndroid Build Coastguard Worker /// The caller is responsible for determining the safety of the particular ioctl.
ioctl<F: AsRawDescriptor>(descriptor: &F, nr: IoctlNr) -> c_int158*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe fn ioctl<F: AsRawDescriptor>(descriptor: &F, nr: IoctlNr) -> c_int {
159*bb4ee6a4SAndroid Build Coastguard Worker libc::ioctl(descriptor.as_raw_descriptor(), nr, 0)
160*bb4ee6a4SAndroid Build Coastguard Worker }
161*bb4ee6a4SAndroid Build Coastguard Worker
162*bb4ee6a4SAndroid Build Coastguard Worker /// Run an ioctl with a single value argument.
163*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety
164*bb4ee6a4SAndroid Build Coastguard Worker /// The caller is responsible for determining the safety of the particular ioctl.
ioctl_with_val(descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: c_ulong) -> c_int165*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe fn ioctl_with_val(descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: c_ulong) -> c_int {
166*bb4ee6a4SAndroid Build Coastguard Worker libc::ioctl(descriptor.as_raw_descriptor(), nr, arg)
167*bb4ee6a4SAndroid Build Coastguard Worker }
168*bb4ee6a4SAndroid Build Coastguard Worker
169*bb4ee6a4SAndroid Build Coastguard Worker /// Run an ioctl with an immutable reference.
170*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety
171*bb4ee6a4SAndroid Build Coastguard Worker ///
172*bb4ee6a4SAndroid Build Coastguard Worker /// The caller is responsible for determining the safety of the particular ioctl.
ioctl_with_ref<T>(descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: &T) -> c_int173*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe fn ioctl_with_ref<T>(descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: &T) -> c_int {
174*bb4ee6a4SAndroid Build Coastguard Worker libc::ioctl(
175*bb4ee6a4SAndroid Build Coastguard Worker descriptor.as_raw_descriptor(),
176*bb4ee6a4SAndroid Build Coastguard Worker nr,
177*bb4ee6a4SAndroid Build Coastguard Worker arg as *const T as *const c_void,
178*bb4ee6a4SAndroid Build Coastguard Worker )
179*bb4ee6a4SAndroid Build Coastguard Worker }
180*bb4ee6a4SAndroid Build Coastguard Worker
181*bb4ee6a4SAndroid Build Coastguard Worker /// Run an ioctl with a mutable reference.
182*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety
183*bb4ee6a4SAndroid Build Coastguard Worker ///
184*bb4ee6a4SAndroid Build Coastguard Worker /// The caller is responsible for determining the safety of the particular ioctl.
ioctl_with_mut_ref<T>( descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: &mut T, ) -> c_int185*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe fn ioctl_with_mut_ref<T>(
186*bb4ee6a4SAndroid Build Coastguard Worker descriptor: &dyn AsRawDescriptor,
187*bb4ee6a4SAndroid Build Coastguard Worker nr: IoctlNr,
188*bb4ee6a4SAndroid Build Coastguard Worker arg: &mut T,
189*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
190*bb4ee6a4SAndroid Build Coastguard Worker libc::ioctl(
191*bb4ee6a4SAndroid Build Coastguard Worker descriptor.as_raw_descriptor(),
192*bb4ee6a4SAndroid Build Coastguard Worker nr,
193*bb4ee6a4SAndroid Build Coastguard Worker arg as *mut T as *mut c_void,
194*bb4ee6a4SAndroid Build Coastguard Worker )
195*bb4ee6a4SAndroid Build Coastguard Worker }
196*bb4ee6a4SAndroid Build Coastguard Worker
197*bb4ee6a4SAndroid Build Coastguard Worker /// Run an ioctl with a raw pointer.
198*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety
199*bb4ee6a4SAndroid Build Coastguard Worker /// The caller is responsible for determining the safety of the particular ioctl.
ioctl_with_ptr<T>( descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: *const T, ) -> c_int200*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe fn ioctl_with_ptr<T>(
201*bb4ee6a4SAndroid Build Coastguard Worker descriptor: &dyn AsRawDescriptor,
202*bb4ee6a4SAndroid Build Coastguard Worker nr: IoctlNr,
203*bb4ee6a4SAndroid Build Coastguard Worker arg: *const T,
204*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
205*bb4ee6a4SAndroid Build Coastguard Worker libc::ioctl(descriptor.as_raw_descriptor(), nr, arg as *const c_void)
206*bb4ee6a4SAndroid Build Coastguard Worker }
207*bb4ee6a4SAndroid Build Coastguard Worker
208*bb4ee6a4SAndroid Build Coastguard Worker /// Run an ioctl with a mutable raw pointer.
209*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety
210*bb4ee6a4SAndroid Build Coastguard Worker /// The caller is responsible for determining the safety of the particular ioctl.
ioctl_with_mut_ptr<T>( descriptor: &dyn AsRawDescriptor, nr: IoctlNr, arg: *mut T, ) -> c_int211*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe fn ioctl_with_mut_ptr<T>(
212*bb4ee6a4SAndroid Build Coastguard Worker descriptor: &dyn AsRawDescriptor,
213*bb4ee6a4SAndroid Build Coastguard Worker nr: IoctlNr,
214*bb4ee6a4SAndroid Build Coastguard Worker arg: *mut T,
215*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
216*bb4ee6a4SAndroid Build Coastguard Worker libc::ioctl(descriptor.as_raw_descriptor(), nr, arg as *mut c_void)
217*bb4ee6a4SAndroid Build Coastguard Worker }
218*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(test)]
219*bb4ee6a4SAndroid Build Coastguard Worker mod tests {
220*bb4ee6a4SAndroid Build Coastguard Worker const TUNTAP: ::std::os::raw::c_uint = 0x54;
221*bb4ee6a4SAndroid Build Coastguard Worker const VHOST: ::std::os::raw::c_uint = 0xaf;
222*bb4ee6a4SAndroid Build Coastguard Worker const EVDEV: ::std::os::raw::c_uint = 0x45;
223*bb4ee6a4SAndroid Build Coastguard Worker
224*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(VHOST_SET_OWNER, VHOST, 0x01);
225*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(TUNGETFEATURES, TUNTAP, 0xcf, ::std::os::raw::c_uint);
226*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(TUNSETQUEUE, TUNTAP, 0xd9, ::std::os::raw::c_int);
227*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(VHOST_GET_VRING_BASE, VHOST, 0x12, ::std::os::raw::c_int);
228*bb4ee6a4SAndroid Build Coastguard Worker
229*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(EVIOCGBIT, EVDEV, 0x20 + evt, [u8; 128], evt);
230*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(FAKE_IOCTL_2_ARG, EVDEV, 0x01 + x + y, x, y);
231*bb4ee6a4SAndroid Build Coastguard Worker
232*bb4ee6a4SAndroid Build Coastguard Worker #[test]
ioctl_macros()233*bb4ee6a4SAndroid Build Coastguard Worker fn ioctl_macros() {
234*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(0x0000af01, VHOST_SET_OWNER);
235*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(0x800454cf, TUNGETFEATURES);
236*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(0x400454d9, TUNSETQUEUE);
237*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(0xc004af12, VHOST_GET_VRING_BASE);
238*bb4ee6a4SAndroid Build Coastguard Worker
239*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(0x80804522, EVIOCGBIT(2));
240*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(0x00004509, FAKE_IOCTL_2_ARG(3, 5));
241*bb4ee6a4SAndroid Build Coastguard Worker }
242*bb4ee6a4SAndroid Build Coastguard Worker }
243