1*f6a7372bSchristos /* $NetBSD: modes.c,v 1.7 2006/10/22 21:09:47 christos Exp $ */
28e41ca80Shpeyerl
38e41ca80Shpeyerl /*-
48e41ca80Shpeyerl * Copyright (c) 1991, 1993, 1994
58e41ca80Shpeyerl * The Regents of the University of California. All rights reserved.
68e41ca80Shpeyerl *
78e41ca80Shpeyerl * Redistribution and use in source and binary forms, with or without
88e41ca80Shpeyerl * modification, are permitted provided that the following conditions
98e41ca80Shpeyerl * are met:
108e41ca80Shpeyerl * 1. Redistributions of source code must retain the above copyright
118e41ca80Shpeyerl * notice, this list of conditions and the following disclaimer.
128e41ca80Shpeyerl * 2. Redistributions in binary form must reproduce the above copyright
138e41ca80Shpeyerl * notice, this list of conditions and the following disclaimer in the
148e41ca80Shpeyerl * documentation and/or other materials provided with the distribution.
15326b2259Sagc * 3. Neither the name of the University nor the names of its contributors
168e41ca80Shpeyerl * may be used to endorse or promote products derived from this software
178e41ca80Shpeyerl * without specific prior written permission.
188e41ca80Shpeyerl *
198e41ca80Shpeyerl * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
208e41ca80Shpeyerl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
218e41ca80Shpeyerl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
228e41ca80Shpeyerl * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
238e41ca80Shpeyerl * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
248e41ca80Shpeyerl * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
258e41ca80Shpeyerl * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
268e41ca80Shpeyerl * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
278e41ca80Shpeyerl * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
288e41ca80Shpeyerl * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
298e41ca80Shpeyerl * SUCH DAMAGE.
308e41ca80Shpeyerl */
318e41ca80Shpeyerl
32c27996f6Smikel #include <sys/cdefs.h>
338e41ca80Shpeyerl #ifndef lint
348e41ca80Shpeyerl #if 0
358e41ca80Shpeyerl static char sccsid[] = "@(#)modes.c 8.3 (Berkeley) 4/2/94";
368e41ca80Shpeyerl #else
37*f6a7372bSchristos __RCSID("$NetBSD: modes.c,v 1.7 2006/10/22 21:09:47 christos Exp $");
388e41ca80Shpeyerl #endif
398e41ca80Shpeyerl #endif /* not lint */
408e41ca80Shpeyerl
418e41ca80Shpeyerl #include <sys/param.h>
428e41ca80Shpeyerl #include <sys/types.h>
438e41ca80Shpeyerl #include <stddef.h>
448e41ca80Shpeyerl #include <string.h>
458e41ca80Shpeyerl #include <termios.h>
468e41ca80Shpeyerl #include "extern.h"
478e41ca80Shpeyerl
488e41ca80Shpeyerl struct modes {
4904723c3fSchristos const char *name;
508e41ca80Shpeyerl long set;
518e41ca80Shpeyerl long unset;
528e41ca80Shpeyerl };
538e41ca80Shpeyerl
548e41ca80Shpeyerl /*
558e41ca80Shpeyerl * The code in optlist() depends on minus options following regular
568e41ca80Shpeyerl * options, i.e. "foo" must immediately precede "-foo".
578e41ca80Shpeyerl */
58c903850dSmjl const struct modes cmodes[] = {
598e41ca80Shpeyerl { "cs5", CS5, CSIZE },
608e41ca80Shpeyerl { "cs6", CS6, CSIZE },
618e41ca80Shpeyerl { "cs7", CS7, CSIZE },
628e41ca80Shpeyerl { "cs8", CS8, CSIZE },
638e41ca80Shpeyerl { "cstopb", CSTOPB, 0 },
648e41ca80Shpeyerl { "-cstopb", 0, CSTOPB },
658e41ca80Shpeyerl { "cread", CREAD, 0 },
668e41ca80Shpeyerl { "-cread", 0, CREAD },
678e41ca80Shpeyerl { "parenb", PARENB, 0 },
688e41ca80Shpeyerl { "-parenb", 0, PARENB },
698e41ca80Shpeyerl { "parodd", PARODD, 0 },
708e41ca80Shpeyerl { "-parodd", 0, PARODD },
718e41ca80Shpeyerl { "parity", PARENB | CS7, PARODD | CSIZE },
728e41ca80Shpeyerl { "-parity", CS8, PARODD | PARENB | CSIZE },
738e41ca80Shpeyerl { "evenp", PARENB | CS7, PARODD | CSIZE },
748e41ca80Shpeyerl { "-evenp", CS8, PARODD | PARENB | CSIZE },
758e41ca80Shpeyerl { "oddp", PARENB | CS7 | PARODD, CSIZE },
768e41ca80Shpeyerl { "-oddp", CS8, PARODD | PARENB | CSIZE },
778e41ca80Shpeyerl { "pass8", CS8, PARODD | PARENB | CSIZE },
788e41ca80Shpeyerl { "-pass8", PARENB | CS7, PARODD | CSIZE },
798e41ca80Shpeyerl { "hupcl", HUPCL, 0 },
808e41ca80Shpeyerl { "-hupcl", 0, HUPCL },
818e41ca80Shpeyerl { "hup", HUPCL, 0 },
828e41ca80Shpeyerl { "-hup", 0, HUPCL },
838e41ca80Shpeyerl { "clocal", CLOCAL, 0 },
848e41ca80Shpeyerl { "-clocal", 0, CLOCAL },
858e41ca80Shpeyerl { "crtscts", CRTSCTS, 0 },
868e41ca80Shpeyerl { "-crtscts", 0, CRTSCTS },
8794cf4332Sscottr { "cdtrcts", CDTRCTS, 0 },
8894cf4332Sscottr { "-cdtrcts", 0, CDTRCTS },
898e41ca80Shpeyerl { "mdmbuf", MDMBUF, 0 },
908e41ca80Shpeyerl { "-mdmbuf", 0, MDMBUF },
91*f6a7372bSchristos { .name = NULL },
928e41ca80Shpeyerl };
938e41ca80Shpeyerl
94c903850dSmjl const struct modes imodes[] = {
958e41ca80Shpeyerl { "ignbrk", IGNBRK, 0 },
968e41ca80Shpeyerl { "-ignbrk", 0, IGNBRK },
978e41ca80Shpeyerl { "brkint", BRKINT, 0 },
988e41ca80Shpeyerl { "-brkint", 0, BRKINT },
998e41ca80Shpeyerl { "ignpar", IGNPAR, 0 },
1008e41ca80Shpeyerl { "-ignpar", 0, IGNPAR },
1018e41ca80Shpeyerl { "parmrk", PARMRK, 0 },
1028e41ca80Shpeyerl { "-parmrk", 0, PARMRK },
1038e41ca80Shpeyerl { "inpck", INPCK, 0 },
1048e41ca80Shpeyerl { "-inpck", 0, INPCK },
1058e41ca80Shpeyerl { "istrip", ISTRIP, 0 },
1068e41ca80Shpeyerl { "-istrip", 0, ISTRIP },
1078e41ca80Shpeyerl { "inlcr", INLCR, 0 },
1088e41ca80Shpeyerl { "-inlcr", 0, INLCR },
1098e41ca80Shpeyerl { "igncr", IGNCR, 0 },
1108e41ca80Shpeyerl { "-igncr", 0, IGNCR },
1118e41ca80Shpeyerl { "icrnl", ICRNL, 0 },
1128e41ca80Shpeyerl { "-icrnl", 0, ICRNL },
1138e41ca80Shpeyerl { "ixon", IXON, 0 },
1148e41ca80Shpeyerl { "-ixon", 0, IXON },
1158e41ca80Shpeyerl { "flow", IXON, 0 },
1168e41ca80Shpeyerl { "-flow", 0, IXON },
1178e41ca80Shpeyerl { "ixoff", IXOFF, 0 },
1188e41ca80Shpeyerl { "-ixoff", 0, IXOFF },
1198e41ca80Shpeyerl { "tandem", IXOFF, 0 },
1208e41ca80Shpeyerl { "-tandem", 0, IXOFF },
1218e41ca80Shpeyerl { "ixany", IXANY, 0 },
1228e41ca80Shpeyerl { "-ixany", 0, IXANY },
1238e41ca80Shpeyerl { "decctlq", 0, IXANY },
1248e41ca80Shpeyerl { "-decctlq", IXANY, 0 },
1258e41ca80Shpeyerl { "imaxbel", IMAXBEL, 0 },
1268e41ca80Shpeyerl { "-imaxbel", 0, IMAXBEL },
127*f6a7372bSchristos { .name = NULL },
1288e41ca80Shpeyerl };
1298e41ca80Shpeyerl
130c903850dSmjl const struct modes lmodes[] = {
1318e41ca80Shpeyerl { "echo", ECHO, 0 },
1328e41ca80Shpeyerl { "-echo", 0, ECHO },
1338e41ca80Shpeyerl { "echoe", ECHOE, 0 },
1348e41ca80Shpeyerl { "-echoe", 0, ECHOE },
1358e41ca80Shpeyerl { "crterase", ECHOE, 0 },
1368e41ca80Shpeyerl { "-crterase", 0, ECHOE },
1378e41ca80Shpeyerl { "crtbs", ECHOE, 0 }, /* crtbs not supported, close enough */
1388e41ca80Shpeyerl { "-crtbs", 0, ECHOE },
1398e41ca80Shpeyerl { "echok", ECHOK, 0 },
1408e41ca80Shpeyerl { "-echok", 0, ECHOK },
1418e41ca80Shpeyerl { "echoke", ECHOKE, 0 },
1428e41ca80Shpeyerl { "-echoke", 0, ECHOKE },
1438e41ca80Shpeyerl { "crtkill", ECHOKE, 0 },
1448e41ca80Shpeyerl { "-crtkill", 0, ECHOKE },
1458e41ca80Shpeyerl { "altwerase", ALTWERASE, 0 },
1468e41ca80Shpeyerl { "-altwerase", 0, ALTWERASE },
1478e41ca80Shpeyerl { "iexten", IEXTEN, 0 },
1488e41ca80Shpeyerl { "-iexten", 0, IEXTEN },
1498e41ca80Shpeyerl { "echonl", ECHONL, 0 },
1508e41ca80Shpeyerl { "-echonl", 0, ECHONL },
1518e41ca80Shpeyerl { "echoctl", ECHOCTL, 0 },
1528e41ca80Shpeyerl { "-echoctl", 0, ECHOCTL },
1538e41ca80Shpeyerl { "ctlecho", ECHOCTL, 0 },
1548e41ca80Shpeyerl { "-ctlecho", 0, ECHOCTL },
1558e41ca80Shpeyerl { "echoprt", ECHOPRT, 0 },
1568e41ca80Shpeyerl { "-echoprt", 0, ECHOPRT },
1578e41ca80Shpeyerl { "prterase", ECHOPRT, 0 },
1588e41ca80Shpeyerl { "-prterase", 0, ECHOPRT },
1598e41ca80Shpeyerl { "isig", ISIG, 0 },
1608e41ca80Shpeyerl { "-isig", 0, ISIG },
1618e41ca80Shpeyerl { "icanon", ICANON, 0 },
1628e41ca80Shpeyerl { "-icanon", 0, ICANON },
1638e41ca80Shpeyerl { "noflsh", NOFLSH, 0 },
1648e41ca80Shpeyerl { "-noflsh", 0, NOFLSH },
1658e41ca80Shpeyerl { "tostop", TOSTOP, 0 },
1668e41ca80Shpeyerl { "-tostop", 0, TOSTOP },
1678e41ca80Shpeyerl { "flusho", FLUSHO, 0 },
1688e41ca80Shpeyerl { "-flusho", 0, FLUSHO },
1698e41ca80Shpeyerl { "pendin", PENDIN, 0 },
1708e41ca80Shpeyerl { "-pendin", 0, PENDIN },
1718e41ca80Shpeyerl { "crt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT },
1728e41ca80Shpeyerl { "-crt", ECHOK, ECHOE|ECHOKE|ECHOCTL },
1738e41ca80Shpeyerl { "newcrt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT },
1748e41ca80Shpeyerl { "-newcrt", ECHOK, ECHOE|ECHOKE|ECHOCTL },
1758e41ca80Shpeyerl { "nokerninfo", NOKERNINFO, 0 },
1768e41ca80Shpeyerl { "-nokerninfo",0, NOKERNINFO },
1778e41ca80Shpeyerl { "kerninfo", 0, NOKERNINFO },
1788e41ca80Shpeyerl { "-kerninfo", NOKERNINFO, 0 },
179*f6a7372bSchristos { .name = NULL },
1808e41ca80Shpeyerl };
1818e41ca80Shpeyerl
182c903850dSmjl const struct modes omodes[] = {
1838e41ca80Shpeyerl { "opost", OPOST, 0 },
1848e41ca80Shpeyerl { "-opost", 0, OPOST },
1858e41ca80Shpeyerl { "litout", 0, OPOST },
1868e41ca80Shpeyerl { "-litout", OPOST, 0 },
1878e41ca80Shpeyerl { "onlcr", ONLCR, 0 },
1888e41ca80Shpeyerl { "-onlcr", 0, ONLCR },
1898e41ca80Shpeyerl { "tabs", 0, OXTABS }, /* "preserve" tabs */
1908e41ca80Shpeyerl { "-tabs", OXTABS, 0 },
1918e41ca80Shpeyerl { "oxtabs", OXTABS, 0 },
1928e41ca80Shpeyerl { "-oxtabs", 0, OXTABS },
193*f6a7372bSchristos { .name = NULL },
1948e41ca80Shpeyerl };
1958e41ca80Shpeyerl
1968e41ca80Shpeyerl #define CHK(s) (*name == s[0] && !strcmp(name, s))
1978e41ca80Shpeyerl
1988e41ca80Shpeyerl int
msearch(char *** argvp,struct info * ip)199c903850dSmjl msearch(char ***argvp, struct info *ip)
2008e41ca80Shpeyerl {
201c903850dSmjl const struct modes *mp;
2028e41ca80Shpeyerl char *name;
2038e41ca80Shpeyerl
2048e41ca80Shpeyerl name = **argvp;
2058e41ca80Shpeyerl
2068e41ca80Shpeyerl for (mp = cmodes; mp->name; ++mp)
2078e41ca80Shpeyerl if (CHK(mp->name)) {
2088e41ca80Shpeyerl ip->t.c_cflag &= ~mp->unset;
2098e41ca80Shpeyerl ip->t.c_cflag |= mp->set;
2108e41ca80Shpeyerl ip->set = 1;
2118e41ca80Shpeyerl return (1);
2128e41ca80Shpeyerl }
2138e41ca80Shpeyerl for (mp = imodes; mp->name; ++mp)
2148e41ca80Shpeyerl if (CHK(mp->name)) {
2158e41ca80Shpeyerl ip->t.c_iflag &= ~mp->unset;
2168e41ca80Shpeyerl ip->t.c_iflag |= mp->set;
2178e41ca80Shpeyerl ip->set = 1;
2188e41ca80Shpeyerl return (1);
2198e41ca80Shpeyerl }
2208e41ca80Shpeyerl for (mp = lmodes; mp->name; ++mp)
2218e41ca80Shpeyerl if (CHK(mp->name)) {
2228e41ca80Shpeyerl ip->t.c_lflag &= ~mp->unset;
2238e41ca80Shpeyerl ip->t.c_lflag |= mp->set;
2248e41ca80Shpeyerl ip->set = 1;
2258e41ca80Shpeyerl return (1);
2268e41ca80Shpeyerl }
2278e41ca80Shpeyerl for (mp = omodes; mp->name; ++mp)
2288e41ca80Shpeyerl if (CHK(mp->name)) {
2298e41ca80Shpeyerl ip->t.c_oflag &= ~mp->unset;
2308e41ca80Shpeyerl ip->t.c_oflag |= mp->set;
2318e41ca80Shpeyerl ip->set = 1;
2328e41ca80Shpeyerl return (1);
2338e41ca80Shpeyerl }
2348e41ca80Shpeyerl return (0);
2358e41ca80Shpeyerl }
236