1 #![allow(non_camel_case_types)] 2 #![no_std] 3 4 extern crate syscall; 5 6 use core::{mem, slice}; 7 use core::ops::{Deref, DerefMut}; 8 9 pub type tcflag_t = u32; 10 pub type cc_t = u8; 11 12 /* c_cc { */ 13 pub const VEOF: usize = 0; 14 pub const VEOL: usize = 1; 15 pub const VEOL2: usize = 2; 16 pub const VERASE: usize = 3; 17 pub const VWERASE: usize = 4; 18 pub const VKILL: usize = 5; 19 pub const VREPRINT: usize = 6; 20 pub const VSWTC: usize = 7; 21 pub const VINTR: usize = 8; 22 pub const VQUIT: usize = 9; 23 pub const VSUSP: usize = 10; 24 pub const VSTART: usize = 12; 25 pub const VSTOP: usize = 13; 26 pub const VLNEXT: usize = 14; 27 pub const VDISCARD: usize = 15; 28 pub const VMIN: usize = 16; 29 pub const VTIME: usize = 17; 30 pub const NCCS: usize = 32; 31 /* } c_cc */ 32 33 /* c_iflag { */ 34 pub const IGNBRK: tcflag_t = 0o000001; 35 pub const BRKINT: tcflag_t = 0o000002; 36 pub const IGNPAR: tcflag_t = 0o000004; 37 pub const PARMRK: tcflag_t = 0o000010; 38 pub const INPCK: tcflag_t = 0o000020; 39 pub const ISTRIP: tcflag_t = 0o000040; 40 pub const INLCR: tcflag_t = 0o000100; 41 pub const IGNCR: tcflag_t = 0o000200; 42 pub const ICRNL: tcflag_t = 0o000400; 43 pub const IXON: tcflag_t = 0o001000; 44 pub const IXOFF: tcflag_t = 0o002000; 45 /* } c_iflag */ 46 47 /* c_oflag { */ 48 pub const OPOST: tcflag_t = 0o000001; 49 pub const ONLCR: tcflag_t = 0o000002; 50 pub const OLCUC: tcflag_t = 0o000004; 51 52 pub const OCRNL: tcflag_t = 0o000010; 53 pub const ONOCR: tcflag_t = 0o000020; 54 pub const ONLRET: tcflag_t = 0o000040; 55 56 pub const OFILL: tcflag_t = 0o0000100; 57 pub const OFDEL: tcflag_t = 0o0000200; 58 /* } c_oflag */ 59 60 /* c_cflag { */ 61 pub const B0: tcflag_t = 0o000000; 62 pub const B50: tcflag_t = 0o000001; 63 pub const B75: tcflag_t = 0o000002; 64 pub const B110: tcflag_t = 0o000003; 65 pub const B134: tcflag_t = 0o000004; 66 pub const B150: tcflag_t = 0o000005; 67 pub const B200: tcflag_t = 0o000006; 68 pub const B300: tcflag_t = 0o000007; 69 pub const B600: tcflag_t = 0o000010; 70 pub const B1200: tcflag_t = 0o000011; 71 pub const B1800: tcflag_t = 0o000012; 72 pub const B2400: tcflag_t = 0o000013; 73 pub const B4800: tcflag_t = 0o000014; 74 pub const B9600: tcflag_t = 0o000015; 75 pub const B19200: tcflag_t = 0o000016; 76 pub const B38400: tcflag_t = 0o000017; 77 pub const B57600: tcflag_t = 0o0020; 78 pub const B115200: tcflag_t = 0o0021; 79 pub const B230400: tcflag_t = 0o0022; 80 pub const B460800: tcflag_t = 0o0023; 81 pub const B500000: tcflag_t = 0o0024; 82 pub const B576000: tcflag_t = 0o0025; 83 pub const B921600: tcflag_t = 0o0026; 84 pub const B1000000: tcflag_t = 0o0027; 85 pub const B1152000: tcflag_t = 0o0030; 86 pub const B1500000: tcflag_t = 0o0031; 87 pub const B2000000: tcflag_t = 0o0032; 88 pub const B2500000: tcflag_t = 0o0033; 89 pub const B3000000: tcflag_t = 0o0034; 90 pub const B3500000: tcflag_t = 0o0035; 91 pub const B4000000: tcflag_t = 0o0036; 92 93 pub const __MAX_BAUD: tcflag_t = B4000000; 94 95 pub const CSIZE: tcflag_t = 0o0001400; 96 pub const CS5: tcflag_t = 0o0000000; 97 pub const CS6: tcflag_t = 0o0000400; 98 pub const CS7: tcflag_t = 0o0001000; 99 pub const CS8: tcflag_t = 0o0001400; 100 101 pub const CSTOPB: tcflag_t = 0o0002000; 102 pub const CREAD: tcflag_t = 0o0004000; 103 pub const PARENB: tcflag_t = 0o0010000; 104 pub const PARODD: tcflag_t = 0o0020000; 105 pub const HUPCL: tcflag_t = 0o0040000; 106 107 pub const CLOCAL: tcflag_t = 0o0100000; 108 /* } c_clfag */ 109 110 /* c_lflag { */ 111 pub const ISIG: tcflag_t = 0x00000080; 112 pub const ICANON: tcflag_t = 0x00000100; 113 pub const ECHO: tcflag_t = 0x00000008; 114 pub const ECHOE: tcflag_t = 0x00000002; 115 pub const ECHOK: tcflag_t = 0x00000004; 116 pub const ECHONL: tcflag_t = 0x00000010; 117 pub const NOFLSH: tcflag_t = 0x80000000; 118 pub const TOSTOP: tcflag_t = 0x00400000; 119 pub const IEXTEN: tcflag_t = 0x00000400; 120 /* } c_lflag */ 121 122 #[derive(Clone, Copy, Debug)] 123 #[repr(C)] 124 pub struct Termios { 125 pub c_iflag: tcflag_t, 126 pub c_oflag: tcflag_t, 127 pub c_cflag: tcflag_t, 128 pub c_lflag: tcflag_t, 129 pub c_cc: [cc_t; 32] 130 } 131 132 impl Default for Termios { default() -> Termios133 fn default() -> Termios { 134 let mut termios = Termios { 135 c_iflag: ICRNL | IXON, 136 c_oflag: OPOST | ONLCR, 137 c_cflag: B38400 | CS8 | CREAD | HUPCL, 138 c_lflag: ISIG | ICANON | ECHO | ECHOE | ECHOK | IEXTEN, 139 c_cc: [0; 32] 140 }; 141 142 { 143 let mut cc = |i: usize, b: cc_t| { 144 termios.c_cc[i] = b; 145 }; 146 147 cc(VEOF, 0o004); // CTRL-D 148 cc(VEOL, 0o000); // NUL 149 cc(VEOL2, 0o000); // NUL 150 cc(VERASE, 0o177); // DEL 151 cc(VWERASE, 0o027); // CTRL-W 152 cc(VKILL, 0o025); // CTRL-U 153 cc(VREPRINT, 0o022);// CTRL-R 154 cc(VINTR, 0o003); // CTRL-C 155 cc(VQUIT, 0o034); // CTRL-\ 156 cc(VSUSP, 0o032); // CTRL-Z 157 cc(VSTART, 0o021); // CTRL-Q 158 cc(VSTOP, 0o023); // CTRL-S 159 cc(VLNEXT, 0o026); // CTRL-V 160 cc(VDISCARD, 0o017);// CTRL-U 161 cc(VMIN, 1); 162 cc(VTIME, 0); 163 } 164 165 termios 166 } 167 } 168 169 impl Termios { make_raw(&mut self)170 pub fn make_raw(&mut self) { 171 self.c_iflag &= !(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); 172 self.c_oflag &= !OPOST; 173 self.c_cflag &= !(CSIZE | PARENB); 174 self.c_cflag |= CS8; 175 self.c_lflag &= !(ECHO | ECHONL | ICANON | ISIG | IEXTEN); 176 } 177 } 178 179 impl Deref for Termios { 180 type Target = [u8]; deref(&self) -> &[u8]181 fn deref(&self) -> &[u8] { 182 unsafe { 183 slice::from_raw_parts(self as *const Termios as *const u8, mem::size_of::<Termios>()) as &[u8] 184 } 185 } 186 } 187 188 impl DerefMut for Termios { deref_mut(&mut self) -> &mut [u8]189 fn deref_mut(&mut self) -> &mut [u8] { 190 unsafe { 191 slice::from_raw_parts_mut(self as *mut Termios as *mut u8, mem::size_of::<Termios>()) as &mut [u8] 192 } 193 } 194 } 195 196 #[derive(Clone, Copy, Debug, Default)] 197 #[repr(C)] 198 pub struct Winsize { 199 pub ws_row: u16, 200 pub ws_col: u16 201 } 202 203 impl Deref for Winsize { 204 type Target = [u8]; deref(&self) -> &[u8]205 fn deref(&self) -> &[u8] { 206 unsafe { 207 slice::from_raw_parts(self as *const Winsize as *const u8, mem::size_of::<Winsize>()) as &[u8] 208 } 209 } 210 } 211 212 impl DerefMut for Winsize { deref_mut(&mut self) -> &mut [u8]213 fn deref_mut(&mut self) -> &mut [u8] { 214 unsafe { 215 slice::from_raw_parts_mut(self as *mut Winsize as *mut u8, mem::size_of::<Winsize>()) as &mut [u8] 216 } 217 } 218 } 219