xref: /openbsd-src/bin/stty/stty.c (revision 81b6a0224fb31d67c429a7578a28e370d1555ae2)
1*81b6a022Smestre /*	$OpenBSD: stty.c,v 1.22 2021/10/23 16:45:32 mestre Exp $	*/
2df930be7Sderaadt /*	$NetBSD: stty.c,v 1.11 1995/03/21 09:11:30 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*-
5df930be7Sderaadt  * Copyright (c) 1989, 1991, 1993, 1994
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
1629295d1cSmillert  * 3. Neither the name of the University nor the names of its contributors
17df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
18df930be7Sderaadt  *    without specific prior written permission.
19df930be7Sderaadt  *
20df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30df930be7Sderaadt  * SUCH DAMAGE.
31df930be7Sderaadt  */
32df930be7Sderaadt 
33df930be7Sderaadt #include <sys/types.h>
342076f375Smmcc #include <sys/ioctl.h>
35df930be7Sderaadt 
36df930be7Sderaadt #include <ctype.h>
37df930be7Sderaadt #include <err.h>
38df930be7Sderaadt #include <errno.h>
39df930be7Sderaadt #include <fcntl.h>
402076f375Smmcc #include <limits.h>
41df930be7Sderaadt #include <stdio.h>
42df930be7Sderaadt #include <stdlib.h>
43df930be7Sderaadt #include <string.h>
442076f375Smmcc #include <termios.h>
45df930be7Sderaadt #include <unistd.h>
46df930be7Sderaadt 
47df930be7Sderaadt #include "stty.h"
48df930be7Sderaadt #include "extern.h"
49df930be7Sderaadt 
50df930be7Sderaadt int
main(int argc,char * argv[])5128416801Sderaadt main(int argc, char *argv[])
52df930be7Sderaadt {
53df930be7Sderaadt 	struct info i;
54df930be7Sderaadt 	enum FMT fmt;
55df930be7Sderaadt 	int ch;
56df930be7Sderaadt 
57df930be7Sderaadt 	fmt = NOTSET;
58df930be7Sderaadt 	i.fd = STDIN_FILENO;
59df930be7Sderaadt 
60df930be7Sderaadt 	opterr = 0;
61df930be7Sderaadt 	while (optind < argc &&
62df930be7Sderaadt 	    strspn(argv[optind], "-aefg") == strlen(argv[optind]) &&
63df930be7Sderaadt 	    (ch = getopt(argc, argv, "aef:g")) != -1)
64df930be7Sderaadt 		switch(ch) {
65fe760091Stedu 		case 'a':
66df930be7Sderaadt 			fmt = POSIX;
67df930be7Sderaadt 			break;
68df930be7Sderaadt 		case 'e':
69df930be7Sderaadt 			fmt = BSD;
70df930be7Sderaadt 			break;
71df930be7Sderaadt 		case 'f':
723aaa63ebSderaadt 			if ((i.fd = open(optarg, O_RDONLY | O_NONBLOCK)) == -1)
73df930be7Sderaadt 				err(1, "%s", optarg);
74df930be7Sderaadt 			break;
75df930be7Sderaadt 		case 'g':
76df930be7Sderaadt 			fmt = GFLAG;
77df930be7Sderaadt 			break;
78df930be7Sderaadt 		default:
79df930be7Sderaadt 			goto args;
80df930be7Sderaadt 		}
81df930be7Sderaadt 
82df930be7Sderaadt args:	argc -= optind;
83df930be7Sderaadt 	argv += optind;
84df930be7Sderaadt 
85*81b6a022Smestre 	if (unveil("/", "") == -1)
86*81b6a022Smestre 		err(1, "unveil /");
87*81b6a022Smestre 	if (unveil(NULL, NULL) == -1)
88*81b6a022Smestre 		err(1, "unveil");
89*81b6a022Smestre 
903aaa63ebSderaadt 	if (ioctl(i.fd, TIOCGETD, &i.ldisc) == -1)
91df930be7Sderaadt 		err(1, "TIOCGETD");
923f8aab89Sderaadt 
933aaa63ebSderaadt 	if (tcgetattr(i.fd, &i.t) == -1)
943f8aab89Sderaadt 		errx(1, "not a terminal");
953aaa63ebSderaadt 	if (ioctl(i.fd, TIOCGWINSZ, &i.win) == -1)
96df930be7Sderaadt 		warn("TIOCGWINSZ");
97df930be7Sderaadt 
98df930be7Sderaadt 	switch(fmt) {
99df930be7Sderaadt 	case NOTSET:
100df930be7Sderaadt 		if (*argv)
101df930be7Sderaadt 			break;
102df930be7Sderaadt 		/* FALLTHROUGH */
103df930be7Sderaadt 	case BSD:
104df930be7Sderaadt 	case POSIX:
105f752bed1Sbluhm 		if (*argv)
106f752bed1Sbluhm 			errx(1, "either display or modify");
1073f8aab89Sderaadt 		if (pledge("stdio", NULL) == -1)
1083f8aab89Sderaadt 			err(1, "pledge");
109df930be7Sderaadt 		print(&i.t, &i.win, i.ldisc, fmt);
110df930be7Sderaadt 		break;
111df930be7Sderaadt 	case GFLAG:
112f752bed1Sbluhm 		if (*argv)
113f752bed1Sbluhm 			errx(1, "either display or modify");
1143f8aab89Sderaadt 		if (pledge("stdio", NULL) == -1)
1153f8aab89Sderaadt 			err(1, "pledge");
116df930be7Sderaadt 		gprint(&i.t, &i.win, i.ldisc);
117df930be7Sderaadt 		break;
118df930be7Sderaadt 	}
119df930be7Sderaadt 
120b464ce29Sderaadt 	/*
121b464ce29Sderaadt 	 * Cannot pledge, because of "extproc", "ostart" and "ostop"
122b464ce29Sderaadt 	 */
123b464ce29Sderaadt 
124df930be7Sderaadt 	for (i.set = i.wset = 0; *argv; ++argv) {
125df930be7Sderaadt 		if (ksearch(&argv, &i))
126df930be7Sderaadt 			continue;
127df930be7Sderaadt 
128df930be7Sderaadt 		if (csearch(&argv, &i))
129df930be7Sderaadt 			continue;
130df930be7Sderaadt 
131df930be7Sderaadt 		if (msearch(&argv, &i))
132df930be7Sderaadt 			continue;
133df930be7Sderaadt 
134cd3e3e8cSderaadt 		if (isdigit((unsigned char)**argv)) {
135848c799eSderaadt 			const char *error;
136df930be7Sderaadt 			int speed;
137df930be7Sderaadt 
138848c799eSderaadt 			speed = strtonum(*argv, 0, INT_MAX, &error);
139848c799eSderaadt 			if (error)
140848c799eSderaadt 				err(1, "%s", *argv);
141df930be7Sderaadt 			cfsetospeed(&i.t, speed);
142df930be7Sderaadt 			cfsetispeed(&i.t, speed);
143df930be7Sderaadt 			i.set = 1;
144df930be7Sderaadt 			continue;
145df930be7Sderaadt 		}
146df930be7Sderaadt 
147df930be7Sderaadt 		if (!strncmp(*argv, "gfmt1", sizeof("gfmt1") - 1)) {
148df930be7Sderaadt 			gread(&i.t, *argv + sizeof("gfmt1") - 1);
149df930be7Sderaadt 			i.set = 1;
150df930be7Sderaadt 			continue;
151df930be7Sderaadt 		}
152df930be7Sderaadt 
153df930be7Sderaadt 		warnx("illegal option -- %s", *argv);
154df930be7Sderaadt 		usage();
155df930be7Sderaadt 	}
156df930be7Sderaadt 
1573aaa63ebSderaadt 	if (i.set && tcsetattr(i.fd, 0, &i.t) == -1)
158df930be7Sderaadt 		err(1, "tcsetattr");
1593aaa63ebSderaadt 	if (i.wset && ioctl(i.fd, TIOCSWINSZ, &i.win) == -1)
160df930be7Sderaadt 		warn("TIOCSWINSZ");
161db29666dSmickey 	return (0);
162df930be7Sderaadt }
163df930be7Sderaadt 
164df930be7Sderaadt void
usage(void)16528416801Sderaadt usage(void)
166df930be7Sderaadt {
167db29666dSmickey 	fprintf(stderr, "usage: %s [-a | -e | -g] [-f file] [operands]\n",
168db29666dSmickey 	    __progname);
169df930be7Sderaadt 	exit (1);
170df930be7Sderaadt }
171