summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUtkarsh Kukreti <utkarshkukreti@gmail.com>2015-01-19 16:12:45 +0530
committerUtkarsh Kukreti <utkarshkukreti@gmail.com>2015-01-21 21:27:06 +0530
commit819f0e9196d4ea1be81a33ec6d2b5ed8294dfaa0 (patch)
treec28501d4b746c16bd445b22551229c21dac9b8eb
parentda900c6932254fa5e3b2a44b3ac9160fd275d261 (diff)
downloadnix-819f0e9196d4ea1be81a33ec6d2b5ed8294dfaa0.zip
Add `ioctl`. Only supports the `TIOCGWINSZ` request right now.
-rw-r--r--src/sys/ioctl.rs44
-rw-r--r--src/sys/mod.rs2
2 files changed, 46 insertions, 0 deletions
diff --git a/src/sys/ioctl.rs b/src/sys/ioctl.rs
new file mode 100644
index 00000000..9cb47bda
--- /dev/null
+++ b/src/sys/ioctl.rs
@@ -0,0 +1,44 @@
+use libc;
+use errno::{SysResult, from_ffi};
+use fcntl::Fd;
+
+pub use self::ffi::Winsize;
+pub use self::IoctlArg::*;
+
+mod ffi {
+ use libc::c_ushort;
+
+ #[derive(Copy, Show)]
+ pub struct Winsize {
+ pub ws_row: c_ushort,
+ pub ws_col: c_ushort,
+ pub ws_xpixel: c_ushort,
+ pub ws_ypixel: c_ushort,
+ }
+
+ #[cfg(target_os = "macos")]
+ pub mod os {
+ use libc::c_ulong;
+ pub const TIOCGWINSZ: c_ulong = 0x40087468;
+ }
+
+ #[cfg(target_os = "linux")]
+ pub mod os {
+ use libc::c_int;
+ pub const TIOCGWINSZ: c_int = 0x5413;
+ }
+}
+
+pub enum IoctlArg<'a> {
+ TIOCGWINSZ(&'a mut Winsize)
+}
+
+pub fn ioctl(fd: Fd, arg: IoctlArg) -> SysResult<()> {
+ match arg {
+ TIOCGWINSZ(&mut ref winsize) => {
+ from_ffi(unsafe {
+ libc::funcs::bsd44::ioctl(fd, ffi::os::TIOCGWINSZ, winsize)
+ })
+ }
+ }
+}
diff --git a/src/sys/mod.rs b/src/sys/mod.rs
index cd87124a..56104834 100644
--- a/src/sys/mod.rs
+++ b/src/sys/mod.rs
@@ -8,6 +8,8 @@ pub mod event;
#[cfg(target_os = "linux")]
pub mod eventfd;
+pub mod ioctl;
+
pub mod signal;
pub mod socket;