xref: /netbsd-src/usr.sbin/lpr/lpd/modes.c (revision f6a7372b6097fd95fc056644419fa0f0bda53900)
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