1e0048e96SSean Eric Fagan /*- 2e0048e96SSean Eric Fagan * Copyright (c) 1991, 1993, 1994 3e0048e96SSean Eric Fagan * The Regents of the University of California. All rights reserved. 4e0048e96SSean Eric Fagan * 5e0048e96SSean Eric Fagan * Redistribution and use in source and binary forms, with or without 6e0048e96SSean Eric Fagan * modification, are permitted provided that the following conditions 7e0048e96SSean Eric Fagan * are met: 8e0048e96SSean Eric Fagan * 1. Redistributions of source code must retain the above copyright 9e0048e96SSean Eric Fagan * notice, this list of conditions and the following disclaimer. 10e0048e96SSean Eric Fagan * 2. Redistributions in binary form must reproduce the above copyright 11e0048e96SSean Eric Fagan * notice, this list of conditions and the following disclaimer in the 12e0048e96SSean Eric Fagan * documentation and/or other materials provided with the distribution. 13e0048e96SSean Eric Fagan * 3. All advertising materials mentioning features or use of this software 14e0048e96SSean Eric Fagan * must display the following acknowledgement: 15e0048e96SSean Eric Fagan * This product includes software developed by the University of 16e0048e96SSean Eric Fagan * California, Berkeley and its contributors. 17e0048e96SSean Eric Fagan * 4. Neither the name of the University nor the names of its contributors 18e0048e96SSean Eric Fagan * may be used to endorse or promote products derived from this software 19e0048e96SSean Eric Fagan * without specific prior written permission. 20e0048e96SSean Eric Fagan * 21e0048e96SSean Eric Fagan * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22e0048e96SSean Eric Fagan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23e0048e96SSean Eric Fagan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24e0048e96SSean Eric Fagan * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25e0048e96SSean Eric Fagan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26e0048e96SSean Eric Fagan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27e0048e96SSean Eric Fagan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28e0048e96SSean Eric Fagan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29e0048e96SSean Eric Fagan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30e0048e96SSean Eric Fagan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31e0048e96SSean Eric Fagan * SUCH DAMAGE. 32e0048e96SSean Eric Fagan */ 33e0048e96SSean Eric Fagan 34e0048e96SSean Eric Fagan #ifndef lint 354a1a0dbeSGarrett Wollman /* 36e0048e96SSean Eric Fagan static char sccsid[] = "@(#)modes.c 8.3 (Berkeley) 4/2/94"; 374a1a0dbeSGarrett Wollman */ 384a1a0dbeSGarrett Wollman static const char rcsid[] = 3997d92980SPeter Wemm "$FreeBSD$"; 40e0048e96SSean Eric Fagan #endif /* not lint */ 41e0048e96SSean Eric Fagan 42e0048e96SSean Eric Fagan #include <stddef.h> 43e0048e96SSean Eric Fagan #include <string.h> 44e0048e96SSean Eric Fagan #include <termios.h> 4590cf373dSGarrett Wollman #include "lp.local.h" 4690cf373dSGarrett Wollman #include "extern.h" 47e0048e96SSean Eric Fagan 48e0048e96SSean Eric Fagan struct modes { 499c83e886SGarance A Drosehn const char *name; 509c83e886SGarance A Drosehn const long set; 519c83e886SGarance A Drosehn const long unset; 52e0048e96SSean Eric Fagan }; 53e0048e96SSean Eric Fagan 54e0048e96SSean Eric Fagan /* 55e0048e96SSean Eric Fagan * The code in optlist() depends on minus options following regular 56e0048e96SSean Eric Fagan * options, i.e. "foo" must immediately precede "-foo". 57e0048e96SSean Eric Fagan */ 58e0048e96SSean Eric Fagan struct modes cmodes[] = { 59e0048e96SSean Eric Fagan { "cs5", CS5, CSIZE }, 60e0048e96SSean Eric Fagan { "cs6", CS6, CSIZE }, 61e0048e96SSean Eric Fagan { "cs7", CS7, CSIZE }, 62e0048e96SSean Eric Fagan { "cs8", CS8, CSIZE }, 63e0048e96SSean Eric Fagan { "cstopb", CSTOPB, 0 }, 64e0048e96SSean Eric Fagan { "-cstopb", 0, CSTOPB }, 65e0048e96SSean Eric Fagan { "cread", CREAD, 0 }, 66e0048e96SSean Eric Fagan { "-cread", 0, CREAD }, 67e0048e96SSean Eric Fagan { "parenb", PARENB, 0 }, 68e0048e96SSean Eric Fagan { "-parenb", 0, PARENB }, 69e0048e96SSean Eric Fagan { "parodd", PARODD, 0 }, 70e0048e96SSean Eric Fagan { "-parodd", 0, PARODD }, 71e0048e96SSean Eric Fagan { "parity", PARENB | CS7, PARODD | CSIZE }, 72e0048e96SSean Eric Fagan { "-parity", CS8, PARODD | PARENB | CSIZE }, 73e0048e96SSean Eric Fagan { "evenp", PARENB | CS7, PARODD | CSIZE }, 74e0048e96SSean Eric Fagan { "-evenp", CS8, PARODD | PARENB | CSIZE }, 75e0048e96SSean Eric Fagan { "oddp", PARENB | CS7 | PARODD, CSIZE }, 76e0048e96SSean Eric Fagan { "-oddp", CS8, PARODD | PARENB | CSIZE }, 77e0048e96SSean Eric Fagan { "pass8", CS8, PARODD | PARENB | CSIZE }, 78e0048e96SSean Eric Fagan { "-pass8", PARENB | CS7, PARODD | CSIZE }, 79e0048e96SSean Eric Fagan { "hupcl", HUPCL, 0 }, 80e0048e96SSean Eric Fagan { "-hupcl", 0, HUPCL }, 81e0048e96SSean Eric Fagan { "hup", HUPCL, 0 }, 82e0048e96SSean Eric Fagan { "-hup", 0, HUPCL }, 83e0048e96SSean Eric Fagan { "clocal", CLOCAL, 0 }, 84e0048e96SSean Eric Fagan { "-clocal", 0, CLOCAL }, 85e0048e96SSean Eric Fagan { "crtscts", CRTSCTS, 0 }, 86e0048e96SSean Eric Fagan { "-crtscts", 0, CRTSCTS }, 87e0048e96SSean Eric Fagan { "ctsflow", CCTS_OFLOW, 0 }, 88e0048e96SSean Eric Fagan { "-ctsflow", 0, CCTS_OFLOW }, 89e0048e96SSean Eric Fagan { "dsrflow", CDSR_OFLOW, 0 }, 90e0048e96SSean Eric Fagan { "-dsrflow", 0, CDSR_OFLOW }, 91e0048e96SSean Eric Fagan { "dtrflow", CDTR_IFLOW, 0 }, 92e0048e96SSean Eric Fagan { "-dtrflow", 0, CDTR_IFLOW }, 93e0048e96SSean Eric Fagan { "rtsflow", CRTS_IFLOW, 0 }, 94e0048e96SSean Eric Fagan { "-rtsflow", 0, CRTS_IFLOW }, 95e0048e96SSean Eric Fagan { "mdmbuf", MDMBUF, 0 }, 96e0048e96SSean Eric Fagan { "-mdmbuf", 0, MDMBUF }, 979c83e886SGarance A Drosehn { NULL, 0, 0}, 98e0048e96SSean Eric Fagan }; 99e0048e96SSean Eric Fagan 100e0048e96SSean Eric Fagan struct modes imodes[] = { 101e0048e96SSean Eric Fagan { "ignbrk", IGNBRK, 0 }, 102e0048e96SSean Eric Fagan { "-ignbrk", 0, IGNBRK }, 103e0048e96SSean Eric Fagan { "brkint", BRKINT, 0 }, 104e0048e96SSean Eric Fagan { "-brkint", 0, BRKINT }, 105e0048e96SSean Eric Fagan { "ignpar", IGNPAR, 0 }, 106e0048e96SSean Eric Fagan { "-ignpar", 0, IGNPAR }, 107e0048e96SSean Eric Fagan { "parmrk", PARMRK, 0 }, 108e0048e96SSean Eric Fagan { "-parmrk", 0, PARMRK }, 109e0048e96SSean Eric Fagan { "inpck", INPCK, 0 }, 110e0048e96SSean Eric Fagan { "-inpck", 0, INPCK }, 111e0048e96SSean Eric Fagan { "istrip", ISTRIP, 0 }, 112e0048e96SSean Eric Fagan { "-istrip", 0, ISTRIP }, 113e0048e96SSean Eric Fagan { "inlcr", INLCR, 0 }, 114e0048e96SSean Eric Fagan { "-inlcr", 0, INLCR }, 115e0048e96SSean Eric Fagan { "igncr", IGNCR, 0 }, 116e0048e96SSean Eric Fagan { "-igncr", 0, IGNCR }, 117e0048e96SSean Eric Fagan { "icrnl", ICRNL, 0 }, 118e0048e96SSean Eric Fagan { "-icrnl", 0, ICRNL }, 119e0048e96SSean Eric Fagan { "ixon", IXON, 0 }, 120e0048e96SSean Eric Fagan { "-ixon", 0, IXON }, 121e0048e96SSean Eric Fagan { "flow", IXON, 0 }, 122e0048e96SSean Eric Fagan { "-flow", 0, IXON }, 123e0048e96SSean Eric Fagan { "ixoff", IXOFF, 0 }, 124e0048e96SSean Eric Fagan { "-ixoff", 0, IXOFF }, 125e0048e96SSean Eric Fagan { "tandem", IXOFF, 0 }, 126e0048e96SSean Eric Fagan { "-tandem", 0, IXOFF }, 127e0048e96SSean Eric Fagan { "ixany", IXANY, 0 }, 128e0048e96SSean Eric Fagan { "-ixany", 0, IXANY }, 129e0048e96SSean Eric Fagan { "decctlq", 0, IXANY }, 130e0048e96SSean Eric Fagan { "-decctlq", IXANY, 0 }, 131e0048e96SSean Eric Fagan { "imaxbel", IMAXBEL, 0 }, 132e0048e96SSean Eric Fagan { "-imaxbel", 0, IMAXBEL }, 1339c83e886SGarance A Drosehn { NULL, 0, 0}, 134e0048e96SSean Eric Fagan }; 135e0048e96SSean Eric Fagan 136e0048e96SSean Eric Fagan struct modes lmodes[] = { 137e0048e96SSean Eric Fagan { "echo", ECHO, 0 }, 138e0048e96SSean Eric Fagan { "-echo", 0, ECHO }, 139e0048e96SSean Eric Fagan { "echoe", ECHOE, 0 }, 140e0048e96SSean Eric Fagan { "-echoe", 0, ECHOE }, 141e0048e96SSean Eric Fagan { "crterase", ECHOE, 0 }, 142e0048e96SSean Eric Fagan { "-crterase", 0, ECHOE }, 143e0048e96SSean Eric Fagan { "crtbs", ECHOE, 0 }, /* crtbs not supported, close enough */ 144e0048e96SSean Eric Fagan { "-crtbs", 0, ECHOE }, 145e0048e96SSean Eric Fagan { "echok", ECHOK, 0 }, 146e0048e96SSean Eric Fagan { "-echok", 0, ECHOK }, 147e0048e96SSean Eric Fagan { "echoke", ECHOKE, 0 }, 148e0048e96SSean Eric Fagan { "-echoke", 0, ECHOKE }, 149e0048e96SSean Eric Fagan { "crtkill", ECHOKE, 0 }, 150e0048e96SSean Eric Fagan { "-crtkill", 0, ECHOKE }, 151e0048e96SSean Eric Fagan { "altwerase", ALTWERASE, 0 }, 152e0048e96SSean Eric Fagan { "-altwerase", 0, ALTWERASE }, 153e0048e96SSean Eric Fagan { "iexten", IEXTEN, 0 }, 154e0048e96SSean Eric Fagan { "-iexten", 0, IEXTEN }, 155e0048e96SSean Eric Fagan { "echonl", ECHONL, 0 }, 156e0048e96SSean Eric Fagan { "-echonl", 0, ECHONL }, 157e0048e96SSean Eric Fagan { "echoctl", ECHOCTL, 0 }, 158e0048e96SSean Eric Fagan { "-echoctl", 0, ECHOCTL }, 159e0048e96SSean Eric Fagan { "ctlecho", ECHOCTL, 0 }, 160e0048e96SSean Eric Fagan { "-ctlecho", 0, ECHOCTL }, 161e0048e96SSean Eric Fagan { "echoprt", ECHOPRT, 0 }, 162e0048e96SSean Eric Fagan { "-echoprt", 0, ECHOPRT }, 163e0048e96SSean Eric Fagan { "prterase", ECHOPRT, 0 }, 164e0048e96SSean Eric Fagan { "-prterase", 0, ECHOPRT }, 165e0048e96SSean Eric Fagan { "isig", ISIG, 0 }, 166e0048e96SSean Eric Fagan { "-isig", 0, ISIG }, 167e0048e96SSean Eric Fagan { "icanon", ICANON, 0 }, 168e0048e96SSean Eric Fagan { "-icanon", 0, ICANON }, 169e0048e96SSean Eric Fagan { "noflsh", NOFLSH, 0 }, 170e0048e96SSean Eric Fagan { "-noflsh", 0, NOFLSH }, 171e0048e96SSean Eric Fagan { "tostop", TOSTOP, 0 }, 172e0048e96SSean Eric Fagan { "-tostop", 0, TOSTOP }, 173e0048e96SSean Eric Fagan { "flusho", FLUSHO, 0 }, 174e0048e96SSean Eric Fagan { "-flusho", 0, FLUSHO }, 175e0048e96SSean Eric Fagan { "pendin", PENDIN, 0 }, 176e0048e96SSean Eric Fagan { "-pendin", 0, PENDIN }, 177e0048e96SSean Eric Fagan { "crt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT }, 178e0048e96SSean Eric Fagan { "-crt", ECHOK, ECHOE|ECHOKE|ECHOCTL }, 179e0048e96SSean Eric Fagan { "newcrt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT }, 180e0048e96SSean Eric Fagan { "-newcrt", ECHOK, ECHOE|ECHOKE|ECHOCTL }, 181e0048e96SSean Eric Fagan { "nokerninfo", NOKERNINFO, 0 }, 182e0048e96SSean Eric Fagan { "-nokerninfo",0, NOKERNINFO }, 183e0048e96SSean Eric Fagan { "kerninfo", 0, NOKERNINFO }, 184e0048e96SSean Eric Fagan { "-kerninfo", NOKERNINFO, 0 }, 1859c83e886SGarance A Drosehn { NULL, 0, 0}, 186e0048e96SSean Eric Fagan }; 187e0048e96SSean Eric Fagan 188e0048e96SSean Eric Fagan struct modes omodes[] = { 189e0048e96SSean Eric Fagan { "opost", OPOST, 0 }, 190e0048e96SSean Eric Fagan { "-opost", 0, OPOST }, 191e0048e96SSean Eric Fagan { "litout", 0, OPOST }, 192e0048e96SSean Eric Fagan { "-litout", OPOST, 0 }, 193e0048e96SSean Eric Fagan { "onlcr", ONLCR, 0 }, 194e0048e96SSean Eric Fagan { "-onlcr", 0, ONLCR }, 195e0048e96SSean Eric Fagan { "tabs", 0, OXTABS }, /* "preserve" tabs */ 196e0048e96SSean Eric Fagan { "-tabs", OXTABS, 0 }, 197e0048e96SSean Eric Fagan { "oxtabs", OXTABS, 0 }, 198e0048e96SSean Eric Fagan { "-oxtabs", 0, OXTABS }, 1999c83e886SGarance A Drosehn { NULL, 0, 0}, 200e0048e96SSean Eric Fagan }; 201e0048e96SSean Eric Fagan 202e0048e96SSean Eric Fagan #define CHK(name, s) (*name == s[0] && !strcmp(name, s)) 203e0048e96SSean Eric Fagan 204e0048e96SSean Eric Fagan int 205e0048e96SSean Eric Fagan msearch(str, ip) 206e0048e96SSean Eric Fagan char *str; 207e0048e96SSean Eric Fagan struct termios *ip; 208e0048e96SSean Eric Fagan { 209e0048e96SSean Eric Fagan struct modes *mp; 210e0048e96SSean Eric Fagan 211e0048e96SSean Eric Fagan for (mp = cmodes; mp->name; ++mp) 212e0048e96SSean Eric Fagan if (CHK(str, mp->name)) { 213e0048e96SSean Eric Fagan ip->c_cflag &= ~mp->unset; 214e0048e96SSean Eric Fagan ip->c_cflag |= mp->set; 215e0048e96SSean Eric Fagan return (1); 216e0048e96SSean Eric Fagan } 217e0048e96SSean Eric Fagan for (mp = imodes; mp->name; ++mp) 218e0048e96SSean Eric Fagan if (CHK(str, mp->name)) { 219e0048e96SSean Eric Fagan ip->c_iflag &= ~mp->unset; 220e0048e96SSean Eric Fagan ip->c_iflag |= mp->set; 221e0048e96SSean Eric Fagan return (1); 222e0048e96SSean Eric Fagan } 223e0048e96SSean Eric Fagan for (mp = lmodes; mp->name; ++mp) 224e0048e96SSean Eric Fagan if (CHK(str, mp->name)) { 225e0048e96SSean Eric Fagan ip->c_lflag &= ~mp->unset; 226e0048e96SSean Eric Fagan ip->c_lflag |= mp->set; 227e0048e96SSean Eric Fagan return (1); 228e0048e96SSean Eric Fagan } 229e0048e96SSean Eric Fagan for (mp = omodes; mp->name; ++mp) 230e0048e96SSean Eric Fagan if (CHK(str, mp->name)) { 231e0048e96SSean Eric Fagan ip->c_oflag &= ~mp->unset; 232e0048e96SSean Eric Fagan ip->c_oflag |= mp->set; 233e0048e96SSean Eric Fagan return (1); 234e0048e96SSean Eric Fagan } 235e0048e96SSean Eric Fagan return (0); 236e0048e96SSean Eric Fagan } 237