blob: b1c904502bd623c3a9211beec08865f6e4d2c52e [file] [log] [blame]
#![allow(non_camel_case_types)]
#![no_std]
extern crate syscall;
use core::{mem, slice};
use core::ops::{Deref, DerefMut};
pub type tcflag_t = u32;
pub type cc_t = u8;
/* c_cc { */
pub const VEOF: usize = 0;
pub const VEOL: usize = 1;
pub const VEOL2: usize = 2;
pub const VERASE: usize = 3;
pub const VWERASE: usize = 4;
pub const VKILL: usize = 5;
pub const VREPRINT: usize = 6;
pub const VSWTC: usize = 7;
pub const VINTR: usize = 8;
pub const VQUIT: usize = 9;
pub const VSUSP: usize = 10;
pub const VSTART: usize = 12;
pub const VSTOP: usize = 13;
pub const VLNEXT: usize = 14;
pub const VDISCARD: usize = 15;
pub const VMIN: usize = 16;
pub const VTIME: usize = 17;
pub const NCCS: usize = 32;
/* } c_cc */
/* c_iflag { */
pub const IGNBRK: tcflag_t = 0o000001;
pub const BRKINT: tcflag_t = 0o000002;
pub const IGNPAR: tcflag_t = 0o000004;
pub const PARMRK: tcflag_t = 0o000010;
pub const INPCK: tcflag_t = 0o000020;
pub const ISTRIP: tcflag_t = 0o000040;
pub const INLCR: tcflag_t = 0o000100;
pub const IGNCR: tcflag_t = 0o000200;
pub const ICRNL: tcflag_t = 0o000400;
pub const IXON: tcflag_t = 0o001000;
pub const IXOFF: tcflag_t = 0o002000;
/* } c_iflag */
/* c_oflag { */
pub const OPOST: tcflag_t = 0o000001;
pub const ONLCR: tcflag_t = 0o000002;
pub const OLCUC: tcflag_t = 0o000004;
pub const OCRNL: tcflag_t = 0o000010;
pub const ONOCR: tcflag_t = 0o000020;
pub const ONLRET: tcflag_t = 0o000040;
pub const OFILL: tcflag_t = 0o0000100;
pub const OFDEL: tcflag_t = 0o0000200;
/* } c_oflag */
/* c_cflag { */
pub const B0: tcflag_t = 0o000000;
pub const B50: tcflag_t = 0o000001;
pub const B75: tcflag_t = 0o000002;
pub const B110: tcflag_t = 0o000003;
pub const B134: tcflag_t = 0o000004;
pub const B150: tcflag_t = 0o000005;
pub const B200: tcflag_t = 0o000006;
pub const B300: tcflag_t = 0o000007;
pub const B600: tcflag_t = 0o000010;
pub const B1200: tcflag_t = 0o000011;
pub const B1800: tcflag_t = 0o000012;
pub const B2400: tcflag_t = 0o000013;
pub const B4800: tcflag_t = 0o000014;
pub const B9600: tcflag_t = 0o000015;
pub const B19200: tcflag_t = 0o000016;
pub const B38400: tcflag_t = 0o000017;
pub const B57600: tcflag_t = 0o0020;
pub const B115200: tcflag_t = 0o0021;
pub const B230400: tcflag_t = 0o0022;
pub const B460800: tcflag_t = 0o0023;
pub const B500000: tcflag_t = 0o0024;
pub const B576000: tcflag_t = 0o0025;
pub const B921600: tcflag_t = 0o0026;
pub const B1000000: tcflag_t = 0o0027;
pub const B1152000: tcflag_t = 0o0030;
pub const B1500000: tcflag_t = 0o0031;
pub const B2000000: tcflag_t = 0o0032;
pub const B2500000: tcflag_t = 0o0033;
pub const B3000000: tcflag_t = 0o0034;
pub const B3500000: tcflag_t = 0o0035;
pub const B4000000: tcflag_t = 0o0036;
pub const __MAX_BAUD: tcflag_t = B4000000;
pub const CSIZE: tcflag_t = 0o0001400;
pub const CS5: tcflag_t = 0o0000000;
pub const CS6: tcflag_t = 0o0000400;
pub const CS7: tcflag_t = 0o0001000;
pub const CS8: tcflag_t = 0o0001400;
pub const CSTOPB: tcflag_t = 0o0002000;
pub const CREAD: tcflag_t = 0o0004000;
pub const PARENB: tcflag_t = 0o0010000;
pub const PARODD: tcflag_t = 0o0020000;
pub const HUPCL: tcflag_t = 0o0040000;
pub const CLOCAL: tcflag_t = 0o0100000;
/* } c_clfag */
/* c_lflag { */
pub const ISIG: tcflag_t = 0x00000080;
pub const ICANON: tcflag_t = 0x00000100;
pub const ECHO: tcflag_t = 0x00000008;
pub const ECHOE: tcflag_t = 0x00000002;
pub const ECHOK: tcflag_t = 0x00000004;
pub const ECHONL: tcflag_t = 0x00000010;
pub const NOFLSH: tcflag_t = 0x80000000;
pub const TOSTOP: tcflag_t = 0x00400000;
pub const IEXTEN: tcflag_t = 0x00000400;
/* } c_lflag */
#[derive(Clone, Copy, Debug)]
#[repr(C)]
pub struct Termios {
pub c_iflag: tcflag_t,
pub c_oflag: tcflag_t,
pub c_cflag: tcflag_t,
pub c_lflag: tcflag_t,
pub c_cc: [cc_t; 32]
}
impl Default for Termios {
fn default() -> Termios {
let mut termios = Termios {
c_iflag: ICRNL | IXON,
c_oflag: OPOST | ONLCR,
c_cflag: B38400 | CS8 | CREAD | HUPCL,
c_lflag: ISIG | ICANON | ECHO | ECHOE | ECHOK | IEXTEN,
c_cc: [0; 32]
};
{
let mut cc = |i: usize, b: cc_t| {
termios.c_cc[i] = b;
};
cc(VEOF, 0o004); // CTRL-D
cc(VEOL, 0o000); // NUL
cc(VEOL2, 0o000); // NUL
cc(VERASE, 0o177); // DEL
cc(VWERASE, 0o027); // CTRL-W
cc(VKILL, 0o025); // CTRL-U
cc(VREPRINT, 0o022);// CTRL-R
cc(VINTR, 0o003); // CTRL-C
cc(VQUIT, 0o034); // CTRL-\
cc(VSUSP, 0o032); // CTRL-Z
cc(VSTART, 0o021); // CTRL-Q
cc(VSTOP, 0o023); // CTRL-S
cc(VLNEXT, 0o026); // CTRL-V
cc(VDISCARD, 0o017);// CTRL-U
cc(VMIN, 1);
cc(VTIME, 0);
}
termios
}
}
impl Termios {
pub fn make_raw(&mut self) {
self.c_iflag &= !(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
self.c_oflag &= !OPOST;
self.c_cflag &= !(CSIZE | PARENB);
self.c_cflag |= CS8;
self.c_lflag &= !(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
}
}
impl Deref for Termios {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(self as *const Termios as *const u8, mem::size_of::<Termios>()) as &[u8]
}
}
}
impl DerefMut for Termios {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(self as *mut Termios as *mut u8, mem::size_of::<Termios>()) as &mut [u8]
}
}
}
#[derive(Clone, Copy, Debug, Default)]
#[repr(C)]
pub struct Winsize {
pub ws_row: u16,
pub ws_col: u16
}
impl Deref for Winsize {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(self as *const Winsize as *const u8, mem::size_of::<Winsize>()) as &[u8]
}
}
}
impl DerefMut for Winsize {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(self as *mut Winsize as *mut u8, mem::size_of::<Winsize>()) as &mut [u8]
}
}
}