termios_sys/
lib.rs

1#![feature(libc)]
2
3extern crate libc;
4use self::libc::{c_int, c_uint, c_uchar};
5
6
7#[allow(non_camel_case_types)]
8pub type cc_t     = c_uchar;
9
10#[allow(non_camel_case_types)]
11pub type speed_t  = c_uint;
12
13#[allow(non_camel_case_types)]
14pub type tcflag_t = c_uint;
15
16
17#[cfg(target_os = "linux")]
18pub const NCCS: usize = 32; // per bits/termios.h
19
20
21#[cfg(target_os = "linux")]
22#[repr(C)]
23#[derive(Clone, PartialEq, Eq)]
24pub struct termios {
25    pub c_iflag: tcflag_t, // input mode flags
26    pub c_oflag: tcflag_t, // output mode flags
27    pub c_cflag: tcflag_t, // control mode flags
28    pub c_lflag: tcflag_t, // local mode flags
29
30    pub c_line: cc_t,       // line discipline
31    pub c_cc: [cc_t; NCCS], // control characters
32
33    pub c_ispeed: speed_t, // input speed
34    pub c_ospeed: speed_t, // output speed
35}
36
37impl termios {
38    pub fn new() -> termios {
39        use std::mem;
40        unsafe { mem::zeroed() }
41    }
42}
43
44
45// c_cc characters
46pub const VINTR:    usize = 0;
47pub const VQUIT:    usize = 1;
48pub const VERASE:   usize = 2;
49pub const VKILL:    usize = 3;
50pub const VEOF:     usize = 4;
51pub const VTIME:    usize = 5;
52pub const VMIN:     usize = 6;
53pub const VSWTC:    usize = 7;
54pub const VSTART:   usize = 8;
55pub const VSTOP:    usize = 9;
56pub const VSUSP:    usize = 10;
57pub const VEOL:     usize = 11;
58pub const VREPRINT: usize = 12;
59pub const VDISCARD: usize = 13;
60pub const VWERASE:  usize = 14;
61pub const VLNEXT:   usize = 15;
62pub const VEOL2:    usize = 16;
63
64
65// c_iflag bits
66pub const IGNBRK:  tcflag_t = 0000001;
67pub const BRKINT:  tcflag_t = 0000002;
68pub const IGNPAR:  tcflag_t = 0000004;
69pub const PARMRK:  tcflag_t = 0000010;
70pub const INPCK:   tcflag_t = 0000020;
71pub const ISTRIP:  tcflag_t = 0000040;
72pub const INLCR:   tcflag_t = 0000100;
73pub const IGNCR:   tcflag_t = 0000200;
74pub const ICRNL:   tcflag_t = 0000400;
75pub const IUCLC:   tcflag_t = 0001000;
76pub const IXON:    tcflag_t = 0002000;
77pub const IXANY:   tcflag_t = 0004000;
78pub const IXOFF:   tcflag_t = 0010000;
79pub const IMAXBEL: tcflag_t = 0020000;
80pub const IUTF8:   tcflag_t = 0040000;
81
82
83// c_oflag bits
84pub const OPOST:  tcflag_t = 0000001;
85pub const OLCUC:  tcflag_t = 0000002;
86pub const ONLCR:  tcflag_t = 0000004;
87pub const OCRNL:  tcflag_t = 0000010;
88pub const ONOCR:  tcflag_t = 0000020;
89pub const ONLRET: tcflag_t = 0000040;
90pub const OFILL:  tcflag_t = 0000100;
91pub const OFDEL:  tcflag_t = 0000200;
92pub const NLDLY:  tcflag_t = 0000400;
93pub const   NL0:  tcflag_t = 0000000;
94pub const   NL1:  tcflag_t = 0000400;
95pub const CRDLY:  tcflag_t = 0003000;
96pub const   CR0:  tcflag_t = 0000000;
97pub const   CR1:  tcflag_t = 0001000;
98pub const   CR2:  tcflag_t = 0002000;
99pub const   CR3:  tcflag_t = 0003000;
100pub const TABDLY: tcflag_t = 0014000;
101pub const   TAB0: tcflag_t = 0000000;
102pub const   TAB1: tcflag_t = 0004000;
103pub const   TAB2: tcflag_t = 0010000;
104pub const   TAB3: tcflag_t = 0014000;
105pub const BSDLY:  tcflag_t = 0020000;
106pub const   BS0:  tcflag_t = 0000000;
107pub const   BS1:  tcflag_t = 0020000;
108pub const FFDLY:  tcflag_t = 0100000;
109pub const   FF0:  tcflag_t = 0000000;
110pub const   FF1:  tcflag_t = 0100000;
111pub const VTDLY:  tcflag_t = 0040000;
112pub const   VT0:  tcflag_t = 0000000;
113pub const   VT1:  tcflag_t = 0040000;
114pub const XTABS:  tcflag_t = 0014000;
115
116
117// c_cflag bit meaning
118pub const CBAUD:      tcflag_t = 0010017;
119pub const  B0:        tcflag_t = 0000000; // hang up
120pub const  B50:       tcflag_t = 0000001;
121pub const  B75:       tcflag_t = 0000002;
122pub const  B110:      tcflag_t = 0000003;
123pub const  B134:      tcflag_t = 0000004;
124pub const  B150:      tcflag_t = 0000005;
125pub const  B200:      tcflag_t = 0000006;
126pub const  B300:      tcflag_t = 0000007;
127pub const  B600:      tcflag_t = 0000010;
128pub const  B1200:     tcflag_t = 0000011;
129pub const  B1800:     tcflag_t = 0000012;
130pub const  B2400:     tcflag_t = 0000013;
131pub const  B4800:     tcflag_t = 0000014;
132pub const  B9600:     tcflag_t = 0000015;
133pub const  B19200:    tcflag_t = 0000016;
134pub const  B38400:    tcflag_t = 0000017;
135pub const EXTA:       tcflag_t = B19200;
136pub const EXTB:       tcflag_t = B38400;
137pub const CSIZE:      tcflag_t = 0000060;
138pub const   CS5:      tcflag_t = 0000000;
139pub const   CS6:      tcflag_t = 0000020;
140pub const   CS7:      tcflag_t = 0000040;
141pub const   CS8:      tcflag_t = 0000060;
142pub const CSTOPB:     tcflag_t = 0000100;
143pub const CREAD:      tcflag_t = 0000200;
144pub const PARENB:     tcflag_t = 0000400;
145pub const PARODD:     tcflag_t = 0001000;
146pub const HUPCL:      tcflag_t = 0002000;
147pub const CLOCAL:     tcflag_t = 0004000;
148pub const CBAUDEX:    tcflag_t = 0010000;
149pub const  B57600:    tcflag_t = 0010001;
150pub const  B115200:   tcflag_t = 0010002;
151pub const  B230400:   tcflag_t = 0010003;
152pub const  B460800:   tcflag_t = 0010004;
153pub const  B500000:   tcflag_t = 0010005;
154pub const  B576000:   tcflag_t = 0010006;
155pub const  B921600:   tcflag_t = 0010007;
156pub const  B1000000:  tcflag_t = 0010010;
157pub const  B1152000:  tcflag_t = 0010011;
158pub const  B1500000:  tcflag_t = 0010012;
159pub const  B2000000:  tcflag_t = 0010013;
160pub const  B2500000:  tcflag_t = 0010014;
161pub const  B3000000:  tcflag_t = 0010015;
162pub const  B3500000:  tcflag_t = 0010016;
163pub const  B4000000:  tcflag_t = 0010017;
164pub const __MAX_BAUD: tcflag_t = B4000000;
165
166// TODO(bas): overflow is a bit conspicuous, but this is
167// the value defined in my bits/termios.h...
168
169#[allow(overflowing_literals)]
170pub const CIBAUD:     tcflag_t = 002003600000; // input baud rate (not used)
171#[allow(overflowing_literals)]
172pub const CMSPAR:     tcflag_t = 010000000000; // mark or space (stick) parity
173#[allow(overflowing_literals)]
174pub const CRTSCTS:    tcflag_t = 020000000000; // flow control
175
176
177// c_lflag bits
178pub const ISIG:    tcflag_t = 0000001;
179pub const ICANON:  tcflag_t = 0000002;
180pub const XCASE:   tcflag_t = 0000004;
181pub const ECHO:    tcflag_t = 0000010;
182pub const ECHOE:   tcflag_t = 0000020;
183pub const ECHOK:   tcflag_t = 0000040;
184pub const ECHONL:  tcflag_t = 0000100;
185pub const NOFLSH:  tcflag_t = 0000200;
186pub const TOSTOP:  tcflag_t = 0000400;
187pub const ECHOCTL: tcflag_t = 0001000;
188pub const ECHOPRT: tcflag_t = 0002000;
189pub const ECHOKE:  tcflag_t = 0004000;
190pub const FLUSHO:  tcflag_t = 0010000;
191pub const PENDIN:  tcflag_t = 0040000;
192pub const IEXTEN:  tcflag_t = 0100000;
193pub const EXTPROC: tcflag_t = 0200000;
194
195
196// tcflow() and TCXONC use these
197pub const TCOOFF:    c_int = 0;
198pub const TCOON:     c_int = 1;
199pub const TCIOFF:    c_int = 2;
200pub const TCION:     c_int = 3;
201
202
203// tcflush() and TCFLSH use these
204pub const TCIFLUSH:  c_int = 0;
205pub const TCOFLUSH:  c_int = 1;
206pub const TCIOFLUSH: c_int = 2;
207
208
209// tcsetattr uses these
210pub const TCSANOW:   c_int = 0;
211pub const TCSADRAIN: c_int = 1;
212pub const TCSAFLUSH: c_int = 2;
213
214
215extern "C" {
216    pub fn tcgetattr(fd: c_int, tio: *mut termios) -> c_int;
217    pub fn tcsetattr(fd: c_int, optional_actions: c_int,
218                     tio: *const termios) -> c_int;
219
220    pub fn tcsendbreak(fd: c_int, duration: c_int) -> c_int;
221    pub fn tcdrain(fd: c_int) -> c_int;
222    pub fn tcflush(fd: c_int, queue_selector: c_int) -> c_int;
223    pub fn tcflow(fd: c_int, action: c_int) -> c_int;
224
225    pub fn cfmakeraw(tio: *mut termios);
226
227    pub fn cfgetispeed(tio: *const termios) -> speed_t;
228    pub fn cfgetospeed(tio: *const termios) -> speed_t;
229    pub fn cfsetispeed(tio: *mut termios, speed: speed_t) -> c_int;
230    pub fn cfsetospeed(tio: *mut termios, speed: speed_t) -> c_int;
231    pub fn cfsetspeed(tio: *mut termios, speed: speed_t) -> c_int;
232}