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