1 /* source: xio-termios.c */
2 /* Copyright Gerhard Rieger and contributors (see file CHANGES) */
3 /* Published under the GNU General Public License V.2, see file COPYING */
5 /* this file contains the source for terminal I/O options */
7 #include "xiosysincludes.h"
10 #include "xio-termios.h"
12 /****** TERMIOS addresses ******/
15 const struct optdesc opt_tiocsctty
={ "tiocsctty", "ctty",OPT_TIOCSCTTY
, GROUP_TERMIOS
, PH_LATE2
, TYPE_BOOL
, OFUNC_SPEC
};
17 /* it is important for handling of these options that they have PH_FD */
18 const struct optdesc opt_brkint
= { "brkint", NULL
, OPT_BRKINT
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, BRKINT
};
19 const struct optdesc opt_icrnl
= { "icrnl", NULL
, OPT_ICRNL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, ICRNL
};
20 const struct optdesc opt_ignbrk
= { "ignbrk", NULL
, OPT_IGNBRK
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IGNBRK
};
21 const struct optdesc opt_igncr
= { "igncr", NULL
, OPT_IGNCR
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IGNCR
};
22 const struct optdesc opt_ignpar
= { "ignpar", NULL
, OPT_IGNPAR
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IGNPAR
};
23 const struct optdesc opt_imaxbel
= { "imaxbel", NULL
, OPT_IMAXBEL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IMAXBEL
};
24 const struct optdesc opt_inlcr
= { "inlcr", NULL
, OPT_INLCR
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, INLCR
};
25 const struct optdesc opt_inpck
= { "inpck", NULL
, OPT_INPCK
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, INPCK
};
26 const struct optdesc opt_istrip
= { "istrip", NULL
, OPT_ISTRIP
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, ISTRIP
};
28 const struct optdesc opt_iuclc
= { "iuclc", NULL
, OPT_IUCLC
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IUCLC
};
30 const struct optdesc opt_ixany
= { "ixany", NULL
, OPT_IXANY
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IXANY
};
31 const struct optdesc opt_ixoff
= { "ixoff", NULL
, OPT_IXOFF
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IXOFF
};
32 const struct optdesc opt_ixon
= { "ixon", NULL
, OPT_IXON
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, IXON
};
33 const struct optdesc opt_parmrk
= { "parmrk", NULL
, OPT_PARMRK
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 0, PARMRK
};
37 const struct optdesc opt_cr0
= { "cr0", NULL
, OPT_CR0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, CR0
, CRDLY
};
40 const struct optdesc opt_cr1
= { "cr1", NULL
, OPT_CR1
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, CR1
, CRDLY
};
43 const struct optdesc opt_cr2
= { "cr2", NULL
, OPT_CR2
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, CR2
, CRDLY
};
46 const struct optdesc opt_cr3
= { "cr3", NULL
, OPT_CR3
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, CR3
, CRDLY
};
49 const struct optdesc opt_crdly
= { "crdly", NULL
, OPT_CRDLY
, GROUP_TERMIOS
, PH_FD
, TYPE_UINT
, OFUNC_TERMIOS_VALUE
, 1, CRDLY
, CRDLY_SHIFT
};
51 #endif /* defined(CRDLY) */
54 const struct optdesc opt_nl0
= { "nl0", NULL
, OPT_NL0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, NL0
, NLDLY
};
57 const struct optdesc opt_nl1
= { "nl1", NULL
, OPT_NL1
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, NL1
, NLDLY
};
59 const struct optdesc opt_nldly
= { "nldly", NULL
, OPT_NLDLY
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, NLDLY
};
60 #endif /* defined(NLDLY) */
62 const struct optdesc opt_ocrnl
= { "ocrnl", NULL
, OPT_OCRNL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, OCRNL
};
65 const struct optdesc opt_ofdel
= { "ofdel", NULL
, OPT_OFDEL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, OFDEL
};
68 const struct optdesc opt_ofill
= { "ofill", NULL
, OPT_OFILL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, OFILL
};
70 const struct optdesc opt_opost
= { "opost", NULL
, OPT_OPOST
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, OPOST
};
72 const struct optdesc opt_olcuc
= { "olcuc", NULL
, OPT_OLCUC
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, OLCUC
};
74 const struct optdesc opt_onlcr
= { "onlcr", NULL
, OPT_ONLCR
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, ONLCR
};
76 const struct optdesc opt_onlret
= { "onlret", NULL
, OPT_ONLRET
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, ONLRET
};
79 const struct optdesc opt_onocr
= { "onocr", NULL
, OPT_ONOCR
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, ONOCR
};
83 const struct optdesc opt_tab0
= { "tab0", NULL
, OPT_TAB0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, TAB0
, TABDLY
};
86 const struct optdesc opt_tab1
= { "tab1", NULL
, OPT_TAB1
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, TAB1
, TABDLY
};
89 const struct optdesc opt_tab2
= { "tab2", NULL
, OPT_TAB2
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, TAB2
, TABDLY
};
92 const struct optdesc opt_tab3
= { "tab3", NULL
, OPT_TAB3
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, TAB3
, TABDLY
};
95 const struct optdesc opt_xtabs
= { "xtabs", NULL
, OPT_XTABS
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, XTABS
, TABDLY
};
97 # if TABDLY_SHIFT >= 0
98 const struct optdesc opt_tabdly
= { "tabdly", NULL
, OPT_TABDLY
, GROUP_TERMIOS
, PH_FD
, TYPE_UINT
, OFUNC_TERMIOS_VALUE
, 1, TABDLY
, TABDLY_SHIFT
};
100 #endif /* defined(TABDLY) */
103 const struct optdesc opt_bs0
= { "bs0", NULL
, OPT_BS0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, BS0
, BSDLY
};
106 const struct optdesc opt_bs1
= { "bs1", NULL
, OPT_BS1
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, BS1
, BSDLY
};
108 const struct optdesc opt_bsdly
= { "bsdly", NULL
, OPT_BSDLY
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, BSDLY
};
112 const struct optdesc opt_vt0
= { "vt0", NULL
, OPT_VT0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, VT0
, VTDLY
};
115 const struct optdesc opt_vt1
= { "vt1", NULL
, OPT_VT1
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, VT1
, VTDLY
};
117 const struct optdesc opt_vtdly
= { "vtdly", NULL
, OPT_VTDLY
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, VTDLY
};
121 const struct optdesc opt_ff0
= { "ff0", NULL
, OPT_FF0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, FF0
, FFDLY
};
124 const struct optdesc opt_ff1
= { "ff1", NULL
, OPT_FF1
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 1, FF1
, FFDLY
};
126 const struct optdesc opt_ffdly
= { "ffdly", NULL
, OPT_FFDLY
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 1, FFDLY
};
130 const struct optdesc opt_b0
= { "b0", NULL
, OPT_B0
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B0
, CBAUD
};
131 const struct optdesc opt_b50
= { "b50", NULL
, OPT_B50
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B50
, CBAUD
};
132 const struct optdesc opt_b75
= { "b75", NULL
, OPT_B75
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B75
, CBAUD
};
133 const struct optdesc opt_b110
= { "b110", NULL
, OPT_B110
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B110
, CBAUD
};
134 const struct optdesc opt_b134
= { "b134", NULL
, OPT_B134
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B134
, CBAUD
};
135 const struct optdesc opt_b150
= { "b150", NULL
, OPT_B150
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B150
, CBAUD
};
136 const struct optdesc opt_b200
= { "b200", NULL
, OPT_B200
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B200
, CBAUD
};
137 const struct optdesc opt_b300
= { "b300", NULL
, OPT_B300
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B300
, CBAUD
};
138 const struct optdesc opt_b600
= { "b600", NULL
, OPT_B600
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B600
, CBAUD
};
139 #ifdef B900 /* HP-UX */
140 const struct optdesc opt_b900
= { "b900", NULL
, OPT_B900
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B900
, CBAUD
};
142 const struct optdesc opt_b1200
= { "b1200", NULL
, OPT_B1200
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B1200
, CBAUD
};
143 const struct optdesc opt_b1800
= { "b1800", NULL
, OPT_B1800
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B1800
, CBAUD
};
144 const struct optdesc opt_b2400
= { "b2400", NULL
, OPT_B2400
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B2400
, CBAUD
};
145 #ifdef B3600 /* HP-UX */
146 const struct optdesc opt_b3600
= { "b3600", NULL
, OPT_B3600
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B3600
, CBAUD
};
148 const struct optdesc opt_b4800
= { "b4800", NULL
, OPT_B4800
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B4800
, CBAUD
};
149 #ifdef B7200 /* HP-UX */
150 const struct optdesc opt_b7200
= { "b7200", NULL
, OPT_B7200
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B7200
, CBAUD
};
152 const struct optdesc opt_b9600
= { "b9600", NULL
, OPT_B9600
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B9600
, CBAUD
};
153 const struct optdesc opt_b19200
= { "b19200", NULL
, OPT_B19200
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B19200
, CBAUD
};
154 const struct optdesc opt_b38400
= { "b38400", NULL
, OPT_B38400
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B38400
, CBAUD
};
156 const struct optdesc opt_b57600
= { "b57600", NULL
, OPT_B57600
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B57600
, CBAUD
};
159 const struct optdesc opt_b115200
= { "b115200", NULL
, OPT_B115200
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B115200
, CBAUD
};
162 const struct optdesc opt_b230400
= { "b230400", NULL
, OPT_B230400
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B230400
, CBAUD
};
165 const struct optdesc opt_b460800
= { "b460800", NULL
, OPT_B460800
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B460800
, CBAUD
};
168 const struct optdesc opt_b500000
= { "b500000", NULL
, OPT_B500000
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B500000
, CBAUD
};
171 const struct optdesc opt_b576000
= { "b576000", NULL
, OPT_B576000
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B576000
, CBAUD
};
174 const struct optdesc opt_b921600
= { "b921600", NULL
, OPT_B921600
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B921600
, CBAUD
};
177 const struct optdesc opt_b1000000
= { "b1000000",NULL
, OPT_B1000000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B1000000
, CBAUD
};
180 const struct optdesc opt_b1152000
= { "b1152000",NULL
, OPT_B1152000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B1152000
, CBAUD
};
183 const struct optdesc opt_b1500000
= { "b1500000",NULL
, OPT_B1500000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B1500000
, CBAUD
};
186 const struct optdesc opt_b2000000
= { "b2000000",NULL
, OPT_B2000000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B2000000
, CBAUD
};
189 const struct optdesc opt_b2500000
= { "b2500000",NULL
, OPT_B2500000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B2500000
, CBAUD
};
192 const struct optdesc opt_b3000000
= { "b3000000",NULL
, OPT_B3000000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B3000000
, CBAUD
};
195 const struct optdesc opt_b3500000
= { "b3500000",NULL
, OPT_B3500000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B3500000
, CBAUD
};
198 const struct optdesc opt_b4000000
= { "b4000000",NULL
, OPT_B4000000
,GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, B4000000
, CBAUD
};
200 #endif /* defined(CBAUD) */
201 const struct optdesc opt_cs5
= { "cs5", NULL
, OPT_CS5
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, CS5
, CSIZE
};
202 const struct optdesc opt_cs6
= { "cs6", NULL
, OPT_CS6
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, CS6
, CSIZE
};
203 const struct optdesc opt_cs7
= { "cs7", NULL
, OPT_CS7
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, CS7
, CSIZE
};
204 const struct optdesc opt_cs8
= { "cs8", NULL
, OPT_CS8
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_PATTERN
, 2, CS8
, CSIZE
};
206 const struct optdesc opt_csize
= { "csize", NULL
, OPT_CSIZE
, GROUP_TERMIOS
, PH_FD
, TYPE_UINT
, OFUNC_TERMIOS_VALUE
, 2, CSIZE
, CSIZE_SHIFT
};
208 const struct optdesc opt_cstopb
= { "cstopb", NULL
, OPT_CSTOPB
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, CSTOPB
};
209 const struct optdesc opt_cread
= { "cread", NULL
, OPT_CREAD
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, CREAD
};
210 const struct optdesc opt_parenb
= { "parenb", NULL
, OPT_PARENB
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, PARENB
};
211 const struct optdesc opt_parodd
= { "parodd", NULL
, OPT_PARODD
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, PARODD
};
212 const struct optdesc opt_hupcl
= { "hupcl", NULL
, OPT_HUPCL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, HUPCL
};
213 const struct optdesc opt_clocal
= { "clocal", NULL
, OPT_CLOCAL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, CLOCAL
};
214 /*const struct optdesc opt_cibaud = { "cibaud",NULL, OPT_CIBAUD, GROUP_TERMIOS, PH_FD, TYPE_BOOL, OFUNC_TERMIOS_FLAG, 2, CIBAUD };*/
216 const struct optdesc opt_crtscts
= { "crtscts", NULL
, OPT_CRTSCTS
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 2, CRTSCTS
};
219 const struct optdesc opt_isig
= { "isig", NULL
, OPT_ISIG
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ISIG
};
220 const struct optdesc opt_icanon
= { "icanon", NULL
, OPT_ICANON
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ICANON
};
222 const struct optdesc opt_xcase
= { "xcase", NULL
, OPT_XCASE
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, XCASE
};
224 const struct optdesc opt_echo
= { "echo", NULL
, OPT_ECHO
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHO
};
225 const struct optdesc opt_echoe
= { "echoe", NULL
, OPT_ECHOE
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHOE
};
226 const struct optdesc opt_echok
= { "echok", NULL
, OPT_ECHOK
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHOK
};
227 const struct optdesc opt_echonl
= { "echonl", NULL
, OPT_ECHONL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHONL
};
228 const struct optdesc opt_echoctl
= { "echoctl", NULL
, OPT_ECHOCTL
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHOCTL
};
230 const struct optdesc opt_echoprt
= { "echoprt", NULL
, OPT_ECHOPRT
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHOPRT
};
232 const struct optdesc opt_echoke
= { "echoke", NULL
, OPT_ECHOKE
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, ECHOKE
};
233 const struct optdesc opt_flusho
= { "flusho", NULL
, OPT_FLUSHO
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, FLUSHO
};
234 const struct optdesc opt_noflsh
= { "noflsh", NULL
, OPT_NOFLSH
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, NOFLSH
};
235 const struct optdesc opt_tostop
= { "tostop", NULL
, OPT_TOSTOP
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, TOSTOP
};
237 const struct optdesc opt_pendin
= { "pendin", NULL
, OPT_PENDIN
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, PENDIN
};
239 const struct optdesc opt_iexten
= { "iexten", NULL
, OPT_IEXTEN
, GROUP_TERMIOS
, PH_FD
, TYPE_BOOL
, OFUNC_TERMIOS_FLAG
, 3, IEXTEN
};
241 const struct optdesc opt_vintr
= { "vintr", "intr", OPT_VINTR
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VINTR
};
242 const struct optdesc opt_vquit
= { "vquit", "quit", OPT_VQUIT
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VQUIT
};
243 const struct optdesc opt_verase
= { "verase", "erase", OPT_VERASE
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VERASE
};
244 const struct optdesc opt_vkill
= { "vkill", "kill", OPT_VKILL
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VKILL
};
245 const struct optdesc opt_veof
= { "veof", "eof", OPT_VEOF
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VEOF
};
246 const struct optdesc opt_vtime
= { "vtime", "time", OPT_VTIME
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VTIME
};
247 const struct optdesc opt_vmin
= { "vmin", "min", OPT_VMIN
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VMIN
};
249 const struct optdesc opt_vswtc
= { "vswtc", "swtc", OPT_VSWTC
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VSWTC
};
251 const struct optdesc opt_vstart
= { "vstart", "start", OPT_VSTART
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VSTART
};
252 const struct optdesc opt_vstop
= { "vstop", "stop", OPT_VSTOP
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VSTOP
};
253 const struct optdesc opt_vsusp
= { "vsusp", "susp", OPT_VSUSP
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VSUSP
};
254 #ifdef VDSUSP /* HP-UX */
255 const struct optdesc opt_vdsusp
= { "vdsusp", "dsusp", OPT_VDSUSP
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VDSUSP
};
257 const struct optdesc opt_veol
= { "veol", "eol", OPT_VEOL
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VEOL
};
259 const struct optdesc opt_vreprint
= { "vreprint","reprint",OPT_VREPRINT
,GROUP_TERMIOS
,PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VREPRINT
};
262 const struct optdesc opt_vdiscard
= { "vdiscard","discard",OPT_VDISCARD
,GROUP_TERMIOS
,PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VDISCARD
};
265 const struct optdesc opt_vwerase
= { "vwerase","werase",OPT_VWERASE
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VWERASE
};
267 const struct optdesc opt_vlnext
= { "vlnext", "lnext", OPT_VLNEXT
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VLNEXT
};
268 const struct optdesc opt_veol2
= { "veol2", "eol2", OPT_VEOL2
, GROUP_TERMIOS
, PH_FD
, TYPE_BYTE
, OFUNC_TERMIOS_CHAR
, VEOL2
};
270 const struct optdesc opt_raw
= { "raw", NULL
, OPT_RAW
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_SPEC
};
271 const struct optdesc opt_sane
= { "sane", NULL
, OPT_SANE
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_SPEC
};
272 const struct optdesc opt_termios_cfmakeraw
= { "termios-cfmakeraw", "cfmakeraw", OPT_TERMIOS_CFMAKERAW
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_SPEC
};
273 const struct optdesc opt_termios_rawer
= { "termios-rawer", "rawer", OPT_TERMIOS_RAWER
, GROUP_TERMIOS
, PH_FD
, TYPE_CONST
, OFUNC_TERMIOS_SPEC
};
275 #if HAVE_TERMIOS_ISPEED
276 const struct optdesc opt_ispeed
= { "ispeed", NULL
, OPT_ISPEED
, GROUP_TERMIOS
, PH_FD
, TYPE_UINT
, OFUNC_TERMIOS_SPEED
, 0/*in*/ };
278 #if HAVE_TERMIOS_OSPEED
279 const struct optdesc opt_ospeed
= { "ospeed", NULL
, OPT_OSPEED
, GROUP_TERMIOS
, PH_FD
, TYPE_UINT
, OFUNC_TERMIOS_SPEED
, 1/*out*/ };
283 int xiotermiosflag_applyopt(int fd
, struct opt
*opt
) {
285 if (opt
->value
.u_bool
) {
286 result
= xiotermios_setflag(fd
, opt
->desc
->major
, opt
->desc
->minor
);
288 result
= xiotermios_clrflag(fd
, opt
->desc
->major
, opt
->desc
->minor
);
291 opt
->desc
= ODESC_ERROR
;
297 #endif /* WITH_TERMIOS */
299 bool _xiotermios_doit
= false; /* _data has been retrieved and manipulated, set it later */
301 struct termios termarg
;
305 int xiotermios_setflag(int fd
, int word
, tcflag_t mask
) {
306 if (!_xiotermios_doit
) {
307 if (Tcgetattr(fd
, &_xiotermios_data
.termarg
) < 0) {
308 Error3("tcgetattr(%d, %p): %s",
309 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
312 _xiotermios_doit
= true;
314 _xiotermios_data
.flags
[word
] |= mask
;
318 int xiotermios_clrflag(int fd
, int word
, tcflag_t mask
) {
319 if (!_xiotermios_doit
) {
320 if (Tcgetattr(fd
, &_xiotermios_data
.termarg
) < 0) {
321 Error3("tcgetattr(%d, %p): %s",
322 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
325 _xiotermios_doit
= true;
327 _xiotermios_data
.flags
[word
] &= ~mask
;
331 int xiotermios_value(int fd
, int word
, tcflag_t mask
, tcflag_t value
) {
332 if (!_xiotermios_doit
) {
333 if (Tcgetattr(fd
, &_xiotermios_data
.termarg
) < 0) {
334 Error3("tcgetattr(%d, %p): %s",
335 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
338 _xiotermios_doit
= true;
340 _xiotermios_data
.flags
[word
] &= ~mask
;
341 _xiotermios_data
.flags
[word
] |= value
;
345 int xiotermios_char(int fd
, int n
, unsigned char c
) {
346 if (!_xiotermios_doit
) {
347 if (Tcgetattr(fd
, &_xiotermios_data
.termarg
) < 0) {
348 Error3("tcgetattr(%d, %p): %s",
349 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
352 _xiotermios_doit
= true;
354 _xiotermios_data
.termarg
.c_cc
[n
] = c
;
358 #if HAVE_TERMIOS_ISPEED || HAVE_TERMIOS_OSPEED
359 int xiotermios_speed(int fd
, int n
, speed_t speed
) {
360 if (!_xiotermios_doit
) {
361 if (Tcgetattr(fd
, &_xiotermios_data
.termarg
) < 0) {
362 Error3("tcgetattr(%d, %p): %s",
363 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
366 _xiotermios_doit
= true;
369 if (cfsetispeed(&_xiotermios_data
.termarg
, speed
) < 0) {
370 Error3("cfsetispeed(%p, "F_speed
"): %s",
371 &_xiotermios_data
.termarg
, speed
, strerror(errno
));
374 if (cfsetospeed(&_xiotermios_data
.termarg
, speed
) < 0) {
375 Error3("cfsetospeed(%p, "F_speed
"): %s",
376 &_xiotermios_data
.termarg
, speed
, strerror(errno
));
379 // Tcgetattr(fd, &_xiotermios_data.termarg);
382 #endif /* HAVE_TERMIOS_ISPEED */
384 /* those termios parameters that are undefined (system dependent) we define
385 to a neutral form so we may use them in the complex patterns */
451 int xiotermios_spec(int fd
, int optcode
) {
452 if (!_xiotermios_doit
) {
453 if (Tcgetattr(fd
, &_xiotermios_data
.termarg
) < 0) {
454 Error3("tcgetattr(%d, %p): %s",
455 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
458 _xiotermios_doit
= true;
462 _xiotermios_data
.termarg
.c_iflag
&=
463 ~(IGNBRK
|BRKINT
|IGNPAR
|PARMRK
|INPCK
|ISTRIP
|INLCR
|IGNCR
|ICRNL
|IXON
|IXOFF
|IUCLC
|IXANY
|IMAXBEL
);
464 _xiotermios_data
.termarg
.c_iflag
|= (0);
465 _xiotermios_data
.termarg
.c_oflag
&= ~(OPOST
);
466 _xiotermios_data
.termarg
.c_oflag
|= (0);
467 _xiotermios_data
.termarg
.c_cflag
&= ~(0);
468 _xiotermios_data
.termarg
.c_cflag
|= (0);
469 _xiotermios_data
.termarg
.c_lflag
&= ~(ISIG
|ICANON
|XCASE
);
470 _xiotermios_data
.termarg
.c_lflag
|= (0);
471 _xiotermios_data
.termarg
.c_cc
[VMIN
] = 1;
472 _xiotermios_data
.termarg
.c_cc
[VTIME
] = 0;
474 case OPT_TERMIOS_RAWER
:
475 _xiotermios_data
.termarg
.c_iflag
= 0;
476 _xiotermios_data
.termarg
.c_oflag
= 0;
477 _xiotermios_data
.termarg
.c_lflag
= 0;
478 _xiotermios_data
.termarg
.c_cflag
= (CS8
);
479 _xiotermios_data
.termarg
.c_cc
[VMIN
] = 1;
480 _xiotermios_data
.termarg
.c_cc
[VTIME
] = 0;
483 /* cread -ignbrk brkint -inlcr -igncr icrnl
484 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl
485 onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0
486 vt0 ff0 isig icanon iexten echo echoe echok -echonl
487 -noflsh -xcase -tostop -echoprt echoctl echoke, and
488 also sets all special characters to their default
491 _xiotermios_data
.termarg
.c_iflag
&= ~(IGNBRK
|INLCR
|IGNCR
|IXOFF
|IUCLC
|IXANY
);
492 _xiotermios_data
.termarg
.c_iflag
|= (BRKINT
|ICRNL
|IMAXBEL
);
493 _xiotermios_data
.termarg
.c_oflag
&= ~(OLCUC
|OCRNL
|ONOCR
|ONLRET
|OFILL
|OFDEL
|NLDLY
|CRDLY
|TABDLY
|BSDLY
|VTDLY
|FFDLY
);
494 _xiotermios_data
.termarg
.c_oflag
|= (OPOST
|ONLCR
|NL0
|CR0
|TAB0
|BS0
|VT0
|FF0
);
495 _xiotermios_data
.termarg
.c_cflag
&= ~(0);
496 _xiotermios_data
.termarg
.c_cflag
|= (CREAD
);
497 _xiotermios_data
.termarg
.c_lflag
&= ~(ECHONL
|NOFLSH
|XCASE
|TOSTOP
|ECHOPRT
);
498 _xiotermios_data
.termarg
.c_lflag
|= (ISIG
|ICANON
|IEXTEN
|ECHO
|ECHOE
|ECHOK
|ECHOCTL
|ECHOKE
);
499 /*! "sets characters to their default values... - which? */
501 case OPT_TERMIOS_CFMAKERAW
:
503 cfmakeraw(&_xiotermios_data
.termarg
);
505 /* these setting follow the Linux documenation of cfmakeraw */
506 _xiotermios_data
.termarg
.c_iflag
&=
507 ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
|INLCR
|IGNCR
|ICRNL
|IXON
);
508 _xiotermios_data
.termarg
.c_oflag
&= ~(OPOST
);
509 _xiotermios_data
.termarg
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|ISIG
|IEXTEN
);
510 _xiotermios_data
.termarg
.c_cflag
&= ~(CSIZE
|PARENB
);
511 _xiotermios_data
.termarg
.c_cflag
|= (CS8
);
515 Error("TERMIOS option not handled - internal error?");
521 int xiotermios_flush(int fd
) {
522 if (_xiotermios_doit
) {
523 if (Tcsetattr(fd
, TCSADRAIN
, &_xiotermios_data
.termarg
) < 0) {
524 Error3("tcsetattr(%d, TCSADRAIN, %p): %s",
525 fd
, &_xiotermios_data
.termarg
, strerror(errno
));
528 _xiotermios_doit
= false;
533 #endif /* _WITH_TERMIOS */