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