Skip to content

Commit bfb9150

Browse files
author
Conrad Kramer
committed
Add ioctl support for BSD
1 parent cfcd249 commit bfb9150

File tree

12 files changed

+206
-136
lines changed

12 files changed

+206
-136
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
66
## [Unreleased]
77

88
### Added
9+
- Added support for `ioctl` calls on BSD platforms
10+
([#478](https://github.com/nix-rust/nix/pull/478))
911
- Added struct `TimeSpec`
1012
([#475](https://github.com/nix-rust/nix/pull/475))
1113
- Added complete definitions for all kqueue-related constants on all supported
@@ -24,6 +26,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
2426
([#457](https://github.com/nix-rust/nix/pull/457))
2527

2628
### Changed
29+
- Removed the `bad` keyword from the `ioctl!` macro
30+
([#478](https://github.com/nix-rust/nix/pull/478))
2731
- Changed `TimeVal` into an opaque Newtype
2832
([#475](https://github.com/nix-rust/nix/pull/475))
2933
- `kill`'s signature, defined in `::nix::sys::signal`, changed, so that the

src/sys/ioctl/mod.rs

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -104,33 +104,13 @@
104104
#[macro_use]
105105
mod platform;
106106

107-
#[cfg(target_os = "macos")]
108-
#[path = "platform/macos.rs"]
109-
#[macro_use]
110-
mod platform;
111-
112-
#[cfg(target_os = "ios")]
113-
#[path = "platform/ios.rs"]
114-
#[macro_use]
115-
mod platform;
116-
117-
#[cfg(target_os = "freebsd")]
118-
#[path = "platform/freebsd.rs"]
119-
#[macro_use]
120-
mod platform;
121-
122-
#[cfg(target_os = "netbsd")]
123-
#[path = "platform/netbsd.rs"]
124-
#[macro_use]
125-
mod platform;
126-
127-
#[cfg(target_os = "openbsd")]
128-
#[path = "platform/openbsd.rs"]
129-
#[macro_use]
130-
mod platform;
131-
132-
#[cfg(target_os = "dragonfly")]
133-
#[path = "platform/dragonfly.rs"]
107+
#[cfg(any(target_os = "macos",
108+
target_os = "ios",
109+
target_os = "netbsd",
110+
target_os = "openbsd",
111+
target_os = "freebsd",
112+
target_os = "dragonfly"))]
113+
#[path = "platform/bsd.rs"]
134114
#[macro_use]
135115
mod platform;
136116

@@ -145,3 +125,74 @@ extern "C" {
145125
/// A hack to get the macros to work nicely.
146126
#[doc(hidden)]
147127
pub use ::libc as libc;
128+
129+
/// Convert raw ioctl return value to a Nix result
130+
#[macro_export]
131+
macro_rules! convert_ioctl_res {
132+
($w:expr) => (
133+
{
134+
$crate::Errno::result($w)
135+
}
136+
);
137+
}
138+
139+
#[macro_export]
140+
macro_rules! ioctl {
141+
($name:ident with $nr:expr) => (
142+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
143+
data: *mut u8)
144+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
145+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, $nr as $crate::sys::ioctl::libc::c_ulong, data))
146+
}
147+
);
148+
(none $name:ident with $ioty:expr, $nr:expr) => (
149+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int)
150+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
151+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, io!($ioty, $nr) as $crate::sys::ioctl::libc::c_ulong))
152+
}
153+
);
154+
(read $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
155+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
156+
val: *mut $ty)
157+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
158+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, ior!($ioty, $nr, ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::libc::c_ulong, val))
159+
}
160+
);
161+
(write $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
162+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
163+
val: *const $ty)
164+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
165+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iow!($ioty, $nr, ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::libc::c_ulong, val))
166+
}
167+
);
168+
(readwrite $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
169+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
170+
val: *mut $ty)
171+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
172+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iorw!($ioty, $nr, ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::libc::c_ulong, val))
173+
}
174+
);
175+
(read buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
176+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
177+
val: *mut $ty,
178+
len: usize)
179+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
180+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, ior!($ioty, $nr, len) as $crate::sys::ioctl::libc::c_ulong, val))
181+
}
182+
);
183+
(write buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
184+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
185+
val: *const $ty,
186+
len: usize) -> $crate::Result<$crate::sys::ioctl::libc::c_int> {
187+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iow!($ioty, $nr, len) as $crate::sys::ioctl::libc::c_ulong, val))
188+
}
189+
);
190+
(readwrite buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
191+
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
192+
val: *mut $ty,
193+
len: usize)
194+
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
195+
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iorw!($ioty, $nr, len) as $crate::sys::ioctl::libc::c_ulong, val))
196+
}
197+
);
198+
}

src/sys/ioctl/platform/bsd.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
mod consts {
2+
pub const VOID: u32 = 0x20000000;
3+
pub const OUT: u32 = 0x40000000;
4+
pub const IN: u32 = 0x80000000;
5+
pub const INOUT: u32 = (IN|OUT);
6+
pub const IOCPARM_MASK: u32 = 0x1fff;
7+
}
8+
9+
pub use self::consts::*;
10+
11+
#[macro_export]
12+
macro_rules! ioc {
13+
($inout:expr, $group:expr, $num:expr, $len:expr) => (
14+
$inout | (($len as u32 & $crate::sys::ioctl::IOCPARM_MASK) << 16) | (($group as u32) << 8) | ($num as u32)
15+
)
16+
}
17+
18+
#[macro_export]
19+
macro_rules! io {
20+
($g:expr, $n:expr) => (ioc!($crate::sys::ioctl::VOID, $g, $n, 0))
21+
}
22+
23+
#[macro_export]
24+
macro_rules! ior {
25+
($g:expr, $n:expr, $len:expr) => (ioc!($crate::sys::ioctl::OUT, $g, $n, $len))
26+
}
27+
28+
#[macro_export]
29+
macro_rules! iow {
30+
($g:expr, $n:expr, $len:expr) => (ioc!($crate::sys::ioctl::IN, $g, $n, $len))
31+
}
32+
33+
#[macro_export]
34+
macro_rules! iorw {
35+
($g:expr, $n:expr, $len:expr) => (ioc!($crate::sys::ioctl::INOUT, $g, $n, $len))
36+
}

src/sys/ioctl/platform/dragonfly.rs

Whitespace-only changes.

src/sys/ioctl/platform/freebsd.rs

Whitespace-only changes.

src/sys/ioctl/platform/ios.rs

Whitespace-only changes.

src/sys/ioctl/platform/linux.rs

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -77,78 +77,6 @@ macro_rules! iorw {
7777
($ty:expr, $nr:expr, $sz:expr) => (ioc!($crate::sys::ioctl::READ | $crate::sys::ioctl::WRITE, $ty, $nr, $sz))
7878
}
7979

80-
/// Convert raw ioctl return value to a Nix result
81-
#[macro_export]
82-
macro_rules! convert_ioctl_res {
83-
($w:expr) => (
84-
{
85-
$crate::Errno::result($w)
86-
}
87-
);
88-
}
89-
90-
/// Declare a wrapper function around an ioctl.
91-
#[macro_export]
92-
macro_rules! ioctl {
93-
(bad $name:ident with $nr:expr) => (
94-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
95-
data: *mut u8)
96-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
97-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, $nr as $crate::sys::ioctl::libc::c_ulong, data))
98-
}
99-
);
100-
(none $name:ident with $ioty:expr, $nr:expr) => (
101-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int)
102-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
103-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, io!($ioty, $nr) as $crate::sys::ioctl::libc::c_ulong))
104-
}
105-
);
106-
(read $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
107-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
108-
val: *mut $ty)
109-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
110-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, ior!($ioty, $nr, ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::libc::c_ulong, val))
111-
}
112-
);
113-
(write $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
114-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
115-
val: *const $ty)
116-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
117-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iow!($ioty, $nr, ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::libc::c_ulong, val))
118-
}
119-
);
120-
(readwrite $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
121-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
122-
val: *mut $ty)
123-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
124-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iorw!($ioty, $nr, ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::libc::c_ulong, val))
125-
}
126-
);
127-
(read buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
128-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
129-
val: *mut $ty,
130-
len: usize)
131-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
132-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, ior!($ioty, $nr, len) as $crate::sys::ioctl::libc::c_ulong, val))
133-
}
134-
);
135-
(write buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
136-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
137-
val: *const $ty,
138-
len: usize) -> $crate::Result<$crate::sys::ioctl::libc::c_int> {
139-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iow!($ioty, $nr, len) as $crate::sys::ioctl::libc::c_ulong, val))
140-
}
141-
);
142-
(readwrite buf $name:ident with $ioty:expr, $nr:expr; $ty:ty) => (
143-
pub unsafe fn $name(fd: $crate::sys::ioctl::libc::c_int,
144-
val: *mut $ty,
145-
len: usize)
146-
-> $crate::Result<$crate::sys::ioctl::libc::c_int> {
147-
convert_ioctl_res!($crate::sys::ioctl::ioctl(fd, iorw!($ioty, $nr, len) as $crate::sys::ioctl::libc::c_ulong, val))
148-
}
149-
);
150-
}
151-
15280
/// Extracts the "direction" (read/write/none) from an encoded ioctl command.
15381
#[inline(always)]
15482
pub fn ioc_dir(nr: u32) -> u8 {

src/sys/ioctl/platform/macos.rs

Whitespace-only changes.

src/sys/ioctl/platform/netbsd.rs

Whitespace-only changes.

src/sys/ioctl/platform/openbsd.rs

Whitespace-only changes.

0 commit comments

Comments
 (0)