14b88c807SRodney W. Grimes /*- 24b88c807SRodney W. Grimes * Copyright (c) 1989, 1991, 1993, 1994 34b88c807SRodney W. Grimes * The Regents of the University of California. All rights reserved. 44b88c807SRodney W. Grimes * 54b88c807SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 64b88c807SRodney W. Grimes * modification, are permitted provided that the following conditions 74b88c807SRodney W. Grimes * are met: 84b88c807SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 94b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 104b88c807SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 114b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 124b88c807SRodney W. Grimes * documentation and/or other materials provided with the distribution. 134b88c807SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 144b88c807SRodney W. Grimes * must display the following acknowledgement: 154b88c807SRodney W. Grimes * This product includes software developed by the University of 164b88c807SRodney W. Grimes * California, Berkeley and its contributors. 174b88c807SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 184b88c807SRodney W. Grimes * may be used to endorse or promote products derived from this software 194b88c807SRodney W. Grimes * without specific prior written permission. 204b88c807SRodney W. Grimes * 214b88c807SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 224b88c807SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 234b88c807SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 244b88c807SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 254b88c807SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 264b88c807SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 274b88c807SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 284b88c807SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 294b88c807SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 304b88c807SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 314b88c807SRodney W. Grimes * SUCH DAMAGE. 3289730b29SDavid Greenman * 33a7a41dbaSBruce Evans * $Id: stty.c,v 1.5 1995/07/02 08:54:27 joerg Exp $ 344b88c807SRodney W. Grimes */ 354b88c807SRodney W. Grimes 364b88c807SRodney W. Grimes #ifndef lint 374b88c807SRodney W. Grimes static char copyright[] = 384b88c807SRodney W. Grimes "@(#) Copyright (c) 1989, 1991, 1993, 1994\n\ 394b88c807SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 404b88c807SRodney W. Grimes #endif /* not lint */ 414b88c807SRodney W. Grimes 424b88c807SRodney W. Grimes #ifndef lint 434b88c807SRodney W. Grimes static char sccsid[] = "@(#)stty.c 8.3 (Berkeley) 4/2/94"; 444b88c807SRodney W. Grimes #endif /* not lint */ 454b88c807SRodney W. Grimes 464b88c807SRodney W. Grimes #include <sys/types.h> 474b88c807SRodney W. Grimes 484b88c807SRodney W. Grimes #include <ctype.h> 494b88c807SRodney W. Grimes #include <err.h> 504b88c807SRodney W. Grimes #include <errno.h> 514b88c807SRodney W. Grimes #include <fcntl.h> 524b88c807SRodney W. Grimes #include <stdio.h> 534b88c807SRodney W. Grimes #include <stdlib.h> 544b88c807SRodney W. Grimes #include <string.h> 554b88c807SRodney W. Grimes #include <unistd.h> 564b88c807SRodney W. Grimes 574b88c807SRodney W. Grimes #include "stty.h" 584b88c807SRodney W. Grimes #include "extern.h" 594b88c807SRodney W. Grimes 604b88c807SRodney W. Grimes int 614b88c807SRodney W. Grimes main(argc, argv) 624b88c807SRodney W. Grimes int argc; 634b88c807SRodney W. Grimes char *argv[]; 644b88c807SRodney W. Grimes { 654b88c807SRodney W. Grimes struct info i; 664b88c807SRodney W. Grimes enum FMT fmt; 674b88c807SRodney W. Grimes int ch; 684b88c807SRodney W. Grimes 694b88c807SRodney W. Grimes fmt = NOTSET; 704b88c807SRodney W. Grimes i.fd = STDIN_FILENO; 714b88c807SRodney W. Grimes 724b88c807SRodney W. Grimes opterr = 0; 734b88c807SRodney W. Grimes while (optind < argc && 744b88c807SRodney W. Grimes strspn(argv[optind], "-aefg") == strlen(argv[optind]) && 754b88c807SRodney W. Grimes (ch = getopt(argc, argv, "aef:g")) != EOF) 764b88c807SRodney W. Grimes switch(ch) { 774b88c807SRodney W. Grimes case 'a': /* undocumented: POSIX compatibility */ 784b88c807SRodney W. Grimes fmt = POSIX; 794b88c807SRodney W. Grimes break; 804b88c807SRodney W. Grimes case 'e': 814b88c807SRodney W. Grimes fmt = BSD; 824b88c807SRodney W. Grimes break; 834b88c807SRodney W. Grimes case 'f': 844b88c807SRodney W. Grimes if ((i.fd = open(optarg, O_RDONLY | O_NONBLOCK)) < 0) 854b88c807SRodney W. Grimes err(1, "%s", optarg); 864b88c807SRodney W. Grimes break; 874b88c807SRodney W. Grimes case 'g': 884b88c807SRodney W. Grimes fmt = GFLAG; 894b88c807SRodney W. Grimes break; 904b88c807SRodney W. Grimes case '?': 914b88c807SRodney W. Grimes default: 924b88c807SRodney W. Grimes goto args; 934b88c807SRodney W. Grimes } 944b88c807SRodney W. Grimes 954b88c807SRodney W. Grimes args: argc -= optind; 964b88c807SRodney W. Grimes argv += optind; 974b88c807SRodney W. Grimes 98a7a41dbaSBruce Evans if (tcgetattr(i.fd, &i.t) < 0) 99a7a41dbaSBruce Evans errx(1, "stdin isn't a terminal"); 1004b88c807SRodney W. Grimes if (ioctl(i.fd, TIOCGETD, &i.ldisc) < 0) 1014b88c807SRodney W. Grimes err(1, "TIOCGETD"); 1024b88c807SRodney W. Grimes if (ioctl(i.fd, TIOCGWINSZ, &i.win) < 0) 1034b88c807SRodney W. Grimes warn("TIOCGWINSZ: %s\n", strerror(errno)); 1044b88c807SRodney W. Grimes 1054b88c807SRodney W. Grimes checkredirect(); /* conversion aid */ 1064b88c807SRodney W. Grimes 1074b88c807SRodney W. Grimes switch(fmt) { 1084b88c807SRodney W. Grimes case NOTSET: 1094b88c807SRodney W. Grimes if (*argv) 1104b88c807SRodney W. Grimes break; 1114b88c807SRodney W. Grimes /* FALLTHROUGH */ 1124b88c807SRodney W. Grimes case BSD: 1134b88c807SRodney W. Grimes case POSIX: 1144b88c807SRodney W. Grimes print(&i.t, &i.win, i.ldisc, fmt); 1154b88c807SRodney W. Grimes break; 1164b88c807SRodney W. Grimes case GFLAG: 1174b88c807SRodney W. Grimes gprint(&i.t, &i.win, i.ldisc); 1184b88c807SRodney W. Grimes break; 1194b88c807SRodney W. Grimes } 1204b88c807SRodney W. Grimes 1214b88c807SRodney W. Grimes for (i.set = i.wset = 0; *argv; ++argv) { 1224b88c807SRodney W. Grimes if (ksearch(&argv, &i)) 1234b88c807SRodney W. Grimes continue; 1244b88c807SRodney W. Grimes 1254b88c807SRodney W. Grimes if (csearch(&argv, &i)) 1264b88c807SRodney W. Grimes continue; 1274b88c807SRodney W. Grimes 1284b88c807SRodney W. Grimes if (msearch(&argv, &i)) 1294b88c807SRodney W. Grimes continue; 1304b88c807SRodney W. Grimes 1314b88c807SRodney W. Grimes if (isdigit(**argv)) { 1324b88c807SRodney W. Grimes int speed; 1334b88c807SRodney W. Grimes 1344b88c807SRodney W. Grimes speed = atoi(*argv); 1354b88c807SRodney W. Grimes cfsetospeed(&i.t, speed); 1364b88c807SRodney W. Grimes cfsetispeed(&i.t, speed); 1374b88c807SRodney W. Grimes i.set = 1; 1384b88c807SRodney W. Grimes continue; 1394b88c807SRodney W. Grimes } 1404b88c807SRodney W. Grimes 1414b88c807SRodney W. Grimes if (!strncmp(*argv, "gfmt1", sizeof("gfmt1") - 1)) { 1424b88c807SRodney W. Grimes gread(&i.t, *argv + sizeof("gfmt1") - 1); 143d54024a1SBruce Evans i.set = 1; 1444b88c807SRodney W. Grimes continue; 1454b88c807SRodney W. Grimes } 1464b88c807SRodney W. Grimes 1474b88c807SRodney W. Grimes warnx("illegal option -- %s", *argv); 1484b88c807SRodney W. Grimes usage(); 1494b88c807SRodney W. Grimes } 1504b88c807SRodney W. Grimes 1514b88c807SRodney W. Grimes if (i.set && tcsetattr(i.fd, 0, &i.t) < 0) 1524b88c807SRodney W. Grimes err(1, "tcsetattr"); 1534b88c807SRodney W. Grimes if (i.wset && ioctl(i.fd, TIOCSWINSZ, &i.win) < 0) 1544b88c807SRodney W. Grimes warn("TIOCSWINSZ"); 1554b88c807SRodney W. Grimes exit(0); 1564b88c807SRodney W. Grimes } 1574b88c807SRodney W. Grimes 1584b88c807SRodney W. Grimes void 1594b88c807SRodney W. Grimes usage() 1604b88c807SRodney W. Grimes { 1614b88c807SRodney W. Grimes 1624b88c807SRodney W. Grimes (void)fprintf(stderr, "usage: stty: [-a|-e|-g] [-f file] [options]\n"); 1634b88c807SRodney W. Grimes exit (1); 1644b88c807SRodney W. Grimes } 165