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