ttcompat.c revision 1.2 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.1 hpeyerl struct termios *tp;
63 1.1 hpeyerl long flags;
64 1.1 hpeyerl {
65 1.1 hpeyerl register long iflag = tp->c_iflag;
66 1.1 hpeyerl register long oflag = tp->c_oflag;
67 1.1 hpeyerl register long lflag = tp->c_lflag;
68 1.1 hpeyerl register long 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.2 mycroft switch (ISSET(flags, ANYP)) {
92 1.1 hpeyerl case EVENP:
93 1.2 mycroft SET(iflag, INPCK);
94 1.2 mycroft SET(cflag, PARODD);
95 1.1 hpeyerl break;
96 1.1 hpeyerl case ODDP:
97 1.2 mycroft SET(iflag, INPCK);
98 1.2 mycroft CLR(cflag, PARODD);
99 1.1 hpeyerl break;
100 1.1 hpeyerl }
101 1.1 hpeyerl
102 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
103 1.2 mycroft CLR(cflag, CSIZE);
104 1.2 mycroft SET(cflag, CS7|PARENB);
105 1.2 mycroft SET(iflag, ISTRIP);
106 1.2 mycroft SET(oflag, OPOST);
107 1.1 hpeyerl }
108 1.1 hpeyerl
109 1.1 hpeyerl tp->c_iflag = iflag;
110 1.1 hpeyerl tp->c_oflag = oflag;
111 1.1 hpeyerl tp->c_lflag = lflag;
112 1.1 hpeyerl tp->c_cflag = cflag;
113 1.1 hpeyerl }
114 1.1 hpeyerl
115 1.1 hpeyerl void
116 1.1 hpeyerl sttysetflags(tp, flags)
117 1.1 hpeyerl struct termios *tp;
118 1.1 hpeyerl long flags;
119 1.1 hpeyerl {
120 1.1 hpeyerl register long iflag = tp->c_iflag;
121 1.1 hpeyerl register long oflag = tp->c_oflag;
122 1.1 hpeyerl register long lflag = tp->c_lflag;
123 1.1 hpeyerl register long cflag = tp->c_cflag;
124 1.1 hpeyerl
125 1.2 mycroft if (ISSET(flags, TANDEM))
126 1.2 mycroft SET(iflag, IXOFF);
127 1.2 mycroft if (ISSET(flags, ECHO))
128 1.2 mycroft SET(lflag, ECHO);
129 1.2 mycroft if (ISSET(flags, CRMOD)) {
130 1.2 mycroft SET(iflag, ICRNL);
131 1.2 mycroft SET(oflag, ONLCR);
132 1.2 mycroft }
133 1.2 mycroft if (ISSET(flags, XTABS))
134 1.2 mycroft SET(oflag, OXTABS);
135 1.2 mycroft
136 1.2 mycroft if (ISSET(flags, RAW)) {
137 1.2 mycroft CLR(iflag, XOFF);
138 1.2 mycroft CLR(lflag, ISIG|ICANON|IEXTEN);
139 1.1 hpeyerl }
140 1.1 hpeyerl
141 1.2 mycroft switch (ISSET(flags, ANYP)) {
142 1.1 hpeyerl case EVENP:
143 1.2 mycroft SET(iflag, INPCK);
144 1.2 mycroft CLR(cflag, PARODD);
145 1.1 hpeyerl break;
146 1.1 hpeyerl case ODDP:
147 1.2 mycroft SET(iflag, INPCK);
148 1.2 mycroft SET(cflag, PARODD);
149 1.1 hpeyerl break;
150 1.1 hpeyerl }
151 1.1 hpeyerl
152 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
153 1.2 mycroft CLR(cflag, CSIZE|PARENB);
154 1.2 mycroft SET(cflag, CS8);
155 1.2 mycroft if (!ISSET(flags, RAW|PASS8))
156 1.2 mycroft SET(iflag, ISTRIP);
157 1.1 hpeyerl else
158 1.2 mycroft CLR(iflag, ISTRIP);
159 1.2 mycroft if (!ISSET(flags, RAW|LITOUT))
160 1.2 mycroft SET(oflag, OPOST);
161 1.1 hpeyerl else
162 1.2 mycroft CLR(oflag, OPOST);
163 1.1 hpeyerl }
164 1.1 hpeyerl
165 1.1 hpeyerl tp->c_iflag = iflag;
166 1.1 hpeyerl tp->c_oflag = oflag;
167 1.1 hpeyerl tp->c_lflag = lflag;
168 1.1 hpeyerl tp->c_cflag = cflag;
169 1.1 hpeyerl }
170 1.1 hpeyerl
171 1.1 hpeyerl void
172 1.1 hpeyerl sttyclearlflags(tp, flags)
173 1.1 hpeyerl struct termios *tp;
174 1.1 hpeyerl long flags;
175 1.1 hpeyerl {
176 1.1 hpeyerl register long iflag = tp->c_iflag;
177 1.1 hpeyerl register long oflag = tp->c_oflag;
178 1.1 hpeyerl register long lflag = tp->c_lflag;
179 1.1 hpeyerl register long cflag = tp->c_cflag;
180 1.1 hpeyerl
181 1.1 hpeyerl /* Nothing we can do with CRTBS. */
182 1.2 mycroft if (ISSET(flags, PRTERA))
183 1.2 mycroft CLR(lflag, ECHOPRT);
184 1.2 mycroft if (ISSET(flags, CRTERA))
185 1.2 mycroft CLR(lflag, ECHOE);
186 1.1 hpeyerl /* Nothing we can do with TILDE. */
187 1.2 mycroft if (ISSET(flags, MDMBUF))
188 1.2 mycroft CLR(cflag, MDMBUF);
189 1.2 mycroft if (ISSET(flags, NOHANG))
190 1.2 mycroft SET(cflag, HUPCL);
191 1.2 mycroft if (ISSET(flags, CRTKIL))
192 1.2 mycroft CLR(lflag, ECHOKE);
193 1.2 mycroft if (ISSET(flags, CTLECH))
194 1.2 mycroft CLR(lflag, ECHOCTL);
195 1.2 mycroft if (!ISSET(flags, DECCTQ))
196 1.2 mycroft CLR(iflag, IXANY);
197 1.2 mycroft CLR(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
198 1.2 mycroft
199 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
200 1.2 mycroft CLR(cflag, CSIZE);
201 1.2 mycroft SET(cflag, CS7|PARENB);
202 1.2 mycroft SET(iflag, ISTRIP);
203 1.2 mycroft SET(oflag, OPOST);
204 1.1 hpeyerl }
205 1.1 hpeyerl
206 1.1 hpeyerl tp->c_iflag = iflag;
207 1.1 hpeyerl tp->c_oflag = oflag;
208 1.1 hpeyerl tp->c_lflag = lflag;
209 1.1 hpeyerl tp->c_cflag = cflag;
210 1.1 hpeyerl }
211 1.1 hpeyerl
212 1.1 hpeyerl void
213 1.1 hpeyerl sttysetlflags(tp, flags)
214 1.1 hpeyerl struct termios *tp;
215 1.1 hpeyerl long flags;
216 1.1 hpeyerl {
217 1.1 hpeyerl register long iflag = tp->c_iflag;
218 1.1 hpeyerl register long oflag = tp->c_oflag;
219 1.1 hpeyerl register long lflag = tp->c_lflag;
220 1.1 hpeyerl register long cflag = tp->c_cflag;
221 1.1 hpeyerl
222 1.1 hpeyerl /* Nothing we can do with CRTBS. */
223 1.2 mycroft if (ISSET(flags, PRTERA))
224 1.2 mycroft SET(lflag, ECHOPRT);
225 1.2 mycroft if (ISSET(flags, CRTERA))
226 1.2 mycroft SET(lflag, ECHOE);
227 1.1 hpeyerl /* Nothing we can do with TILDE. */
228 1.2 mycroft if (ISSET(flags, MDMBUF))
229 1.2 mycroft SET(cflag, MDMBUF);
230 1.2 mycroft if (ISSET(flags, NOHANG))
231 1.2 mycroft CLR(cflag, HUPCL);
232 1.2 mycroft if (ISSET(flags, CRTKIL))
233 1.2 mycroft SET(lflag, ECHOKE);
234 1.2 mycroft if (ISSET(flags, CTLECH))
235 1.2 mycroft SET(lflag, ECHOCTL);
236 1.2 mycroft if (!ISSET(flags, DECCTQ))
237 1.2 mycroft SET(iflag, IXANY);
238 1.2 mycroft CLR(lflag, TOSTOP|FLUSHO|PENDIN|NOFLSH);
239 1.2 mycroft SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
240 1.2 mycroft
241 1.2 mycroft if (ISSET(flags, RAW|LITOUT|PASS8)) {
242 1.2 mycroft CLR(cflag, CSIZE|PARENB);
243 1.2 mycroft SET(cflag, CS8);
244 1.2 mycroft if (!ISSET(flags, RAW|PASS8))
245 1.2 mycroft SET(iflag, ISTRIP);
246 1.1 hpeyerl else
247 1.2 mycroft CLR(iflag, ISTRIP);
248 1.2 mycroft if (!ISSET(flags, RAW|LITOUT))
249 1.2 mycroft SET(oflag, OPOST);
250 1.1 hpeyerl else
251 1.2 mycroft CLR(oflag, OPOST);
252 1.1 hpeyerl }
253 1.1 hpeyerl
254 1.1 hpeyerl tp->c_iflag = iflag;
255 1.1 hpeyerl tp->c_oflag = oflag;
256 1.1 hpeyerl tp->c_lflag = lflag;
257 1.1 hpeyerl tp->c_cflag = cflag;
258 1.1 hpeyerl }
259