1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use libc;
use fcntl::Fd;
use {Result, from_ffi};

pub use self::ffi::Winsize;
pub use self::IoctlArg::*;

mod ffi {
    use libc::c_ushort;

    #[derive(Clone, Copy, Debug)]
    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(any(target_os = "linux",
              all(target_os = "android", not(target_arch = "mips"))))]
    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) -> Result<()> {
    match arg {
        TIOCGWINSZ(&mut ref winsize) => {
            from_ffi(unsafe {
                libc::funcs::bsd44::ioctl(fd, ffi::os::TIOCGWINSZ, winsize)
            })
        }
    }
}