ttcompat.c revision 1.5 1 1.1 hpeyerl /*
2 1.1 hpeyerl * Copyright (c) 1995
3 1.1 hpeyerl * The Regents of the University of California. All rights reserved.
4 1.1 hpeyerl *
5 1.1 hpeyerl *
6 1.1 hpeyerl * Redistribution and use in source and binary forms, with or without
7 1.1 hpeyerl * modification, are permitted provided that the following conditions
8 1.1 hpeyerl * are met:
9 1.1 hpeyerl * 1. Redistributions of source code must retain the above copyright
10 1.1 hpeyerl * notice, this list of conditions and the following disclaimer.
11 1.1 hpeyerl * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 hpeyerl * notice, this list of conditions and the following disclaimer in the
13 1.1 hpeyerl * documentation and/or other materials provided with the distribution.
14 1.1 hpeyerl * 3. All advertising materials mentioning features or use of this software
15 1.1 hpeyerl * must display the following acknowledgement:
16 1.1 hpeyerl * This product includes software developed by the University of
17 1.1 hpeyerl * California, Berkeley and its contributors.
18 1.1 hpeyerl * 4. Neither the name of the University nor the names of its contributors
19 1.1 hpeyerl * may be used to endorse or promote products derived from this software
20 1.1 hpeyerl * without specific prior written permission.
21 1.1 hpeyerl *
22 1.1 hpeyerl * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1 hpeyerl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 hpeyerl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 hpeyerl * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1 hpeyerl * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 hpeyerl * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 hpeyerl * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 hpeyerl * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 hpeyerl * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 hpeyerl * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 hpeyerl * SUCH DAMAGE.
33 1.1 hpeyerl */
34 1.1 hpeyerl
35 1.1 hpeyerl /*
36 1.1 hpeyerl * ttcompat.c -- convert sgtty flags to termios
37 1.1 hpeyerl * originally from /sys/kern/tty_compat.c
38 1.1 hpeyerl */
39 1.1 hpeyerl
40 1.1 hpeyerl #include <sys/param.h>
41 1.1 hpeyerl #include <sys/types.h>
42 1.1 hpeyerl
43 1.1 hpeyerl #include <unistd.h>
44 1.1 hpeyerl #include <sys/ioctl_compat.h>
45 1.1 hpeyerl #include <termios.h>
46 1.1 hpeyerl #include <syslog.h>
47 1.1 hpeyerl #include <fcntl.h>
48 1.1 hpeyerl #include <dirent.h>
49 1.1 hpeyerl #include <errno.h>
50 1.1 hpeyerl #include <stdio.h>
51 1.1 hpeyerl #include <string.h>
52 1.1 hpeyerl #include <stdlib.h>
53 1.1 hpeyerl #include "extern.h"
54 1.1 hpeyerl
55 1.2 mycroft /* Macros to clear/set/test flags. */
56 1.2 mycroft #define SET(t, f) (t) |= (f)
57 1.2 mycroft #define CLR(t, f) (t) &= ~(f)
58 1.2 mycroft #define ISSET(t, f) ((t) & (f))
59 1.2 mycroft
60 1.1 hpeyerl void
61 1.1 hpeyerl sttyclearflags(tp, flags)
62 1.4 mycroft struct termios *tp;
63 1.4 mycroft int flags;
64 1.1 hpeyerl {
65 1.4 mycroft register tcflag_t iflag = tp->c_iflag;
66 1.4 mycroft register tcflag_t oflag = tp->c_oflag;
67 1.4 mycroft register tcflag_t lflag = tp->c_lflag;
68 1.4 mycroft register tcflag_t cflag = tp->c_cflag;
69 1.1 hpeyerl
70 1.2 mycroft if (ISSET(flags, TANDEM))
71 1.2 mycroft CLR(iflag, IXOFF);
72 1.2 mycroft if (ISSET(flags, ECHO))
73 1.2 mycroft CLR(lflag, ECHO);
74 1.2 mycroft if (ISSET(flags, CRMOD)) {
75 1.2 mycroft CLR(iflag, ICRNL);
76 1.2 mycroft CLR(oflag, ONLCR);
77 1.2 mycroft }
78 1.2 mycroft if (ISSET(flags, XTABS))
79 1.2 mycroft CLR(oflag, OXTABS);
80 1.2 mycroft
81 1.2 mycroft
82 1.2 mycroft if (ISSET(flags, RAW)) {
83 1.2 mycroft SET(iflag, BRKINT|IXON|IMAXBEL);
84 1.2 mycroft SET(lflag, ISIG|IEXTEN);
85 1.2 mycroft if (ISSET(flags, CBREAK))
86 1.2 mycroft CLR(lflag, ICANON);
87 1.1 hpeyerl else
88 1.2 mycroft SET(lflag, ICANON);
89 1.1 hpeyerl }
90 1.1 hpeyerl
91 1.5 mycroft /* XXX */
92 1.2 mycroft switch (ISSET(flags, ANYP)) {
93 1.1 hpeyerl case EVENP:
94 1.2 mycroft SET(iflag, INPCK);
95 1.2 mycroft SET(cflag, PARODD);
96 1.1 hpeyerl break;
97 1.1 hpeyerl case ODDP:
98 1.2 mycroft SET(iflag, INPCK);
99 1.2 mycroft CLR(cflag, PARODD);
100 1.1 hpeyerl break;
101 1.1 hpeyerl }
102 1.1 hpeyerl
103 1.5 mycroft /* XXX */
104 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
105 1.2 mycroft CLR(cflag, CSIZE);
106 1.2 mycroft SET(cflag, CS7|PARENB);
107 1.2 mycroft SET(iflag, ISTRIP);
108 1.2 mycroft SET(oflag, OPOST);
109 1.1 hpeyerl }
110 1.1 hpeyerl
111 1.1 hpeyerl tp->c_iflag = iflag;
112 1.1 hpeyerl tp->c_oflag = oflag;
113 1.1 hpeyerl tp->c_lflag = lflag;
114 1.1 hpeyerl tp->c_cflag = cflag;
115 1.1 hpeyerl }
116 1.1 hpeyerl
117 1.1 hpeyerl void
118 1.1 hpeyerl sttysetflags(tp, flags)
119 1.4 mycroft struct termios *tp;
120 1.4 mycroft int flags;
121 1.1 hpeyerl {
122 1.4 mycroft register tcflag_t iflag = tp->c_iflag;
123 1.4 mycroft register tcflag_t oflag = tp->c_oflag;
124 1.4 mycroft register tcflag_t lflag = tp->c_lflag;
125 1.4 mycroft register tcflag_t cflag = tp->c_cflag;
126 1.1 hpeyerl
127 1.2 mycroft if (ISSET(flags, TANDEM))
128 1.2 mycroft SET(iflag, IXOFF);
129 1.2 mycroft if (ISSET(flags, ECHO))
130 1.2 mycroft SET(lflag, ECHO);
131 1.2 mycroft if (ISSET(flags, CRMOD)) {
132 1.2 mycroft SET(iflag, ICRNL);
133 1.2 mycroft SET(oflag, ONLCR);
134 1.2 mycroft }
135 1.2 mycroft if (ISSET(flags, XTABS))
136 1.2 mycroft SET(oflag, OXTABS);
137 1.2 mycroft
138 1.2 mycroft if (ISSET(flags, RAW)) {
139 1.3 mycroft iflag &= IXOFF;
140 1.2 mycroft CLR(lflag, ISIG|ICANON|IEXTEN);
141 1.1 hpeyerl }
142 1.1 hpeyerl
143 1.5 mycroft /* XXX */
144 1.2 mycroft switch (ISSET(flags, ANYP)) {
145 1.1 hpeyerl case EVENP:
146 1.2 mycroft SET(iflag, INPCK);
147 1.2 mycroft CLR(cflag, PARODD);
148 1.1 hpeyerl break;
149 1.1 hpeyerl case ODDP:
150 1.2 mycroft SET(iflag, INPCK);
151 1.2 mycroft SET(cflag, PARODD);
152 1.1 hpeyerl break;
153 1.1 hpeyerl }
154 1.1 hpeyerl
155 1.5 mycroft /* XXX */
156 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
157 1.2 mycroft CLR(cflag, CSIZE|PARENB);
158 1.2 mycroft SET(cflag, CS8);
159 1.2 mycroft if (!ISSET(flags, RAW|PASS8))
160 1.2 mycroft SET(iflag, ISTRIP);
161 1.1 hpeyerl else
162 1.2 mycroft CLR(iflag, ISTRIP);
163 1.2 mycroft if (!ISSET(flags, RAW|LITOUT))
164 1.2 mycroft SET(oflag, OPOST);
165 1.1 hpeyerl else
166 1.2 mycroft CLR(oflag, OPOST);
167 1.1 hpeyerl }
168 1.1 hpeyerl
169 1.1 hpeyerl tp->c_iflag = iflag;
170 1.1 hpeyerl tp->c_oflag = oflag;
171 1.1 hpeyerl tp->c_lflag = lflag;
172 1.1 hpeyerl tp->c_cflag = cflag;
173 1.1 hpeyerl }
174 1.1 hpeyerl
175 1.1 hpeyerl void
176 1.1 hpeyerl sttyclearlflags(tp, flags)
177 1.4 mycroft struct termios *tp;
178 1.4 mycroft int flags;
179 1.1 hpeyerl {
180 1.4 mycroft register tcflag_t iflag = tp->c_iflag;
181 1.4 mycroft register tcflag_t oflag = tp->c_oflag;
182 1.4 mycroft register tcflag_t lflag = tp->c_lflag;
183 1.4 mycroft register tcflag_t cflag = tp->c_cflag;
184 1.1 hpeyerl
185 1.1 hpeyerl /* Nothing we can do with CRTBS. */
186 1.2 mycroft if (ISSET(flags, PRTERA))
187 1.2 mycroft CLR(lflag, ECHOPRT);
188 1.2 mycroft if (ISSET(flags, CRTERA))
189 1.2 mycroft CLR(lflag, ECHOE);
190 1.1 hpeyerl /* Nothing we can do with TILDE. */
191 1.2 mycroft if (ISSET(flags, MDMBUF))
192 1.2 mycroft CLR(cflag, MDMBUF);
193 1.2 mycroft if (ISSET(flags, NOHANG))
194 1.2 mycroft SET(cflag, HUPCL);
195 1.2 mycroft if (ISSET(flags, CRTKIL))
196 1.2 mycroft CLR(lflag, ECHOKE);
197 1.2 mycroft if (ISSET(flags, CTLECH))
198 1.2 mycroft CLR(lflag, ECHOCTL);
199 1.5 mycroft if (ISSET(flags, DECCTQ))
200 1.5 mycroft SET(iflag, IXANY);
201 1.2 mycroft CLR(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
202 1.2 mycroft
203 1.5 mycroft /* XXX */
204 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
205 1.2 mycroft CLR(cflag, CSIZE);
206 1.2 mycroft SET(cflag, CS7|PARENB);
207 1.2 mycroft SET(iflag, ISTRIP);
208 1.2 mycroft SET(oflag, OPOST);
209 1.1 hpeyerl }
210 1.1 hpeyerl
211 1.1 hpeyerl tp->c_iflag = iflag;
212 1.1 hpeyerl tp->c_oflag = oflag;
213 1.1 hpeyerl tp->c_lflag = lflag;
214 1.1 hpeyerl tp->c_cflag = cflag;
215 1.1 hpeyerl }
216 1.1 hpeyerl
217 1.1 hpeyerl void
218 1.1 hpeyerl sttysetlflags(tp, flags)
219 1.4 mycroft struct termios *tp;
220 1.4 mycroft int flags;
221 1.1 hpeyerl {
222 1.4 mycroft register tcflag_t iflag = tp->c_iflag;
223 1.4 mycroft register tcflag_t oflag = tp->c_oflag;
224 1.4 mycroft register tcflag_t lflag = tp->c_lflag;
225 1.4 mycroft register tcflag_t cflag = tp->c_cflag;
226 1.1 hpeyerl
227 1.1 hpeyerl /* Nothing we can do with CRTBS. */
228 1.2 mycroft if (ISSET(flags, PRTERA))
229 1.2 mycroft SET(lflag, ECHOPRT);
230 1.2 mycroft if (ISSET(flags, CRTERA))
231 1.2 mycroft SET(lflag, ECHOE);
232 1.1 hpeyerl /* Nothing we can do with TILDE. */
233 1.2 mycroft if (ISSET(flags, MDMBUF))
234 1.2 mycroft SET(cflag, MDMBUF);
235 1.2 mycroft if (ISSET(flags, NOHANG))
236 1.2 mycroft CLR(cflag, HUPCL);
237 1.2 mycroft if (ISSET(flags, CRTKIL))
238 1.2 mycroft SET(lflag, ECHOKE);
239 1.2 mycroft if (ISSET(flags, CTLECH))
240 1.2 mycroft SET(lflag, ECHOCTL);
241 1.5 mycroft if (ISSET(flags, DECCTQ))
242 1.5 mycroft CLR(iflag, IXANY);
243 1.2 mycroft SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
244 1.2 mycroft
245 1.5 mycroft /* XXX */
246 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
247 1.2 mycroft CLR(cflag, CSIZE|PARENB);
248 1.2 mycroft SET(cflag, CS8);
249 1.2 mycroft if (!ISSET(flags, RAW|PASS8))
250 1.2 mycroft SET(iflag, ISTRIP);
251 1.1 hpeyerl else
252 1.2 mycroft CLR(iflag, ISTRIP);
253 1.2 mycroft if (!ISSET(flags, RAW|LITOUT))
254 1.2 mycroft SET(oflag, OPOST);
255 1.1 hpeyerl else
256 1.2 mycroft CLR(oflag, OPOST);
257 1.1 hpeyerl }
258 1.1 hpeyerl
259 1.1 hpeyerl tp->c_iflag = iflag;
260 1.1 hpeyerl tp->c_oflag = oflag;
261 1.1 hpeyerl tp->c_lflag = lflag;
262 1.1 hpeyerl tp->c_cflag = cflag;
263 1.1 hpeyerl }
264