Home | History | Annotate | Download | only in stty
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 1995 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     28 /*	  All Rights Reserved  	*/
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 
     33 #include <stdio.h>
     34 #include <ctype.h>
     35 #include <sys/types.h>
     36 #include <termio.h>
     37 #include <sys/stermio.h>
     38 #include <sys/termiox.h>
     39 #include "stty.h"
     40 
     41 extern char *getenv();
     42 extern void exit();
     43 extern void perror();
     44 
     45 static char	*STTY="stty: ";
     46 static char	*USAGE="usage: stty [-agh] [modes]\n";
     47 static int	pitt = 0;
     48 static struct termios cb;
     49 static struct termio ocb; /* for non-streams devices */
     50 static struct stio stio;
     51 static struct termiox termiox;
     52 static struct winsize winsize, owinsize;
     53 static int term;
     54 
     55 void prmodes(int);
     56 void pramodes(int);
     57 void prachars(void);
     58 void pcol(int, int);
     59 void pit(unsigned char, char *, char *);
     60 void delay(int, char *s);
     61 void prspeed(char *, int);
     62 void prencode(void);
     63 
     64 #define ioctl_desc	1
     65 #define output		stderr
     66 
     67 int
     68 main(int argc, char *argv[])
     69 {
     70 
     71 	int i;
     72 	char	*s_arg, *sttyparse();			/* s_arg: ptr to mode to be set */
     73 	extern const struct	speeds	speeds[];
     74 
     75 	if (argc == 2) {
     76 		/*
     77 		 * "stty size", "stty speed" and "stty -g" are intended for
     78 		 * use within backquotes; thus, they do the "fetch" "ioctl"
     79 		 * from "/dev/tty" and always print their result on the
     80 		 * standard output.
     81 		 * Since their standard output is likely to be a pipe, they
     82 		 * should not try to read the modes from the standard output.
     83 		 */
     84 		if (strcmp(argv[1], "size") == 0) {
     85 			if ((i = open("/dev/tty", 0)) < 0) {
     86 				perror("stty: Cannot open /dev/tty");
     87 				exit(2);
     88 			}
     89 			if (ioctl(i, TIOCGWINSZ, &winsize) < 0) {
     90 				perror("stty: TIOCGWINSZ");
     91 				exit(2);
     92 			}
     93 			(void) printf("%d %d\n",winsize.ws_row,winsize.ws_col);
     94 			exit(0);
     95 		}
     96 		else if (strcmp(argv[1], "speed") == 0) {
     97 			if ((i = open("/dev/tty", 0)) < 0) {
     98 				perror("stty: Cannot open /dev/tty");
     99 				exit(2);
    100 			}
    101 			if((term = get_ttymode(i, &ocb, &cb, &stio, &termiox,
    102 					&winsize)) < 0) {
    103 				perror(STTY);
    104 				exit(2);
    105 			}
    106 			if (term & TERMIOS) {
    107 			    for(i=0; speeds[i].string; i++)
    108 				if (cfgetospeed(&cb) == speeds[i].speed) {
    109 					(void) printf("%s\n", speeds[i].string);
    110 					exit(0);
    111 				}
    112 			} else {
    113 			    for(i=0; speeds[i].string; i++)
    114 				if ((cb.c_cflag&CBAUD) == speeds[i].speed) {
    115 					(void) printf("%s\n", speeds[i].string);
    116 					exit(0);
    117 				}
    118 			}
    119 			(void) printf("unknown\n");
    120 			exit(1);
    121 		}
    122                 else if (strcmp(argv[1], "-g") == 0) {
    123 			if ((i = open("/dev/tty", 0)) < 0) {
    124 				perror("stty: Cannot open /dev/tty");
    125 				exit(2);
    126 			}
    127 			if((term = get_ttymode(i, &ocb, &cb, &stio, &termiox,
    128 					&winsize)) < 0) {
    129 				perror(STTY);
    130 				exit(2);
    131 			}
    132 			prencode();
    133 			exit(0);
    134 		}
    135 	}
    136 
    137 	if((term = get_ttymode(ioctl_desc, &ocb, &cb, &stio, &termiox, &winsize)) < 0) {
    138 		perror(STTY);
    139 		exit(2);
    140 	}
    141 	owinsize = winsize;
    142 	if (argc == 1) {
    143 		prmodes(0);
    144 		exit(0);
    145 	}
    146 	if ((argc ==2) && strcmp(argv[1], "all") ==0) {
    147 		prmodes(1);
    148 		exit(0);
    149 	}
    150 	if ((argc ==2) && strcmp(argv[1], "everything") ==0) {
    151 		pramodes(1);
    152 		exit(0);
    153 	}
    154 	if ((argc == 2) && (argv[1][0] == '-') && (argv[1][2] == '\0'))
    155 	switch(argv[1][1]) {
    156 		case 'a':
    157 			pramodes(0);
    158 			exit(0);
    159 		case 'h':
    160 			pramodes(1);
    161 			exit(0);
    162 		default:
    163 			(void) fprintf(stderr, "%s", USAGE);
    164 			exit(2);
    165 	}
    166 	if (s_arg = sttyparse(argc, argv, term, &ocb, &cb, &termiox, &winsize)) {
    167 		(void) fprintf(stderr, "unknown mode: %s\n", s_arg);
    168 		exit(2);
    169 	}
    170 
    171 	if(set_ttymode(ioctl_desc, term, &ocb, &cb, &stio, &termiox, &winsize, &owinsize) == -1) {
    172 		perror(STTY);
    173 		exit(2);
    174 	}
    175 	return (0);	/*NOTREACHED*/
    176 }
    177 
    178 void
    179 prmodes(int moremodes)
    180 /* print modes, no options, argc is 1 */
    181 {
    182 	int m;
    183 
    184 	if (!(term & ASYNC)) {
    185 		m = stio.imode;
    186 		if (m & IUCLC) (void) fprintf(output, "iuclc ");
    187 		else (void) fprintf(output, "-iuclc ");
    188 		m = stio.omode;
    189 		if (m & OLCUC) (void) fprintf(output, "olcuc ");
    190 		else (void) fprintf(output, "-olcuc ");
    191 		if (m & TAB3) (void) fprintf(output, "tab3 ");
    192 		m = stio.lmode;
    193 		if (m & XCASE) (void) fprintf(output, "xcase ");
    194 		else (void) fprintf(output, "-xcase ");
    195 		if (m & STFLUSH) (void) fprintf(output, "stflush ");
    196 		else (void) fprintf(output, "-stflush ");
    197 		if (m & STWRAP) (void)fprintf(output, "stwrap ");
    198 		else (void) fprintf(output, "-stwrap ");
    199 		if (m & STAPPL) (void) fprintf(output, "stappl ");
    200 		else (void) fprintf(output, "-stappl ");
    201 		(void) fprintf(output, "\n");
    202 	}
    203 	if (term & ASYNC) {
    204 		m = cb.c_cflag;
    205 		if ((term & TERMIOS) && cfgetispeed(&cb) != 0 &&
    206 		    cfgetispeed(&cb) != cfgetospeed(&cb)) {
    207 			prspeed("ispeed ", cfgetispeed(&cb));
    208 			prspeed("ospeed ", cfgetospeed(&cb));
    209 		} else
    210 			prspeed("speed ", cfgetospeed(&cb));
    211 		if (m&PARENB) {
    212 			if((m&PAREXT) && (term & TERMIOS)) {
    213 				if (m&PARODD)
    214 					(void) fprintf(output,"markp ");
    215 				else
    216 					(void) fprintf(output,"spacep ");
    217 			} else {
    218 				if (m&PARODD)
    219 					(void) fprintf(output,"oddp ");
    220 				else
    221 					(void) fprintf(output,"evenp ");
    222 			}
    223 		} else
    224 			(void) fprintf(output,"-parity ");
    225 		if(((m&PARENB) && !(m&CS7)) || (!(m&PARENB) && !(m&CS8)))
    226 			(void) fprintf(output,"cs%c ",'5'+(m&CSIZE)/CS6);
    227 		if (m&CSTOPB)
    228 			(void) fprintf(output,"cstopb ");
    229 		if (m&HUPCL)
    230 			(void) fprintf(output,"hupcl ");
    231 		if (!(m&CREAD))
    232 			(void) fprintf(output,"-cread ");
    233 		if (m&CLOCAL)
    234 			(void) fprintf(output,"clocal ");
    235 		if (m&LOBLK)
    236 			(void) fprintf(output,"loblk ");
    237 		(void) fprintf(output,"\n");
    238 		if(ocb.c_line != 0)
    239 			(void) fprintf(output,"line = %d; ", ocb.c_line);
    240 		if(term & WINDOW) {
    241 			(void)fprintf(output,"rows = %d; columns = %d;", winsize.ws_row, winsize.ws_col);
    242 			(void)fprintf(output," ypixels = %d; xpixels = %d;\n", winsize.ws_ypixel, winsize.ws_xpixel);
    243 		}
    244 		if((cb.c_lflag&ICANON)== 0)
    245 			(void) fprintf(output,"min = %d; time = %d;\n",
    246 			cb.c_cc[VMIN], cb.c_cc[VTIME]);
    247 		if (!moremodes) {
    248 			if(cb.c_cc[VINTR] != CINTR)
    249 				pit(cb.c_cc[VINTR], "intr", "; ");
    250 			if(cb.c_cc[VQUIT] != CQUIT)
    251 				pit(cb.c_cc[VQUIT], "quit", "; ");
    252 			if(cb.c_cc[VERASE] != CERASE)
    253 				pit(cb.c_cc[VERASE], "erase", "; ");
    254 			if(cb.c_cc[VKILL] != CKILL)
    255 				pit(cb.c_cc[VKILL], "kill", "; ");
    256 			if(cb.c_cc[VEOF] != CEOF)
    257 				pit(cb.c_cc[VEOF], "eof", "; ");
    258 			if(cb.c_cc[VEOL] != CNUL)
    259 				pit(cb.c_cc[VEOL], "eol", "; ");
    260 			if(cb.c_cc[VEOL2] != CNUL)
    261 				pit(cb.c_cc[VEOL2], "eol2", "; ");
    262 			if(cb.c_cc[VSWTCH] != CSWTCH)
    263 				pit(cb.c_cc[VSWTCH], "swtch", "; ");
    264 			if(term & TERMIOS) {
    265 				if(cb.c_cc[VSTART] != CSTART)
    266 					pit(cb.c_cc[VSTART], "start", "; ");
    267 				if(cb.c_cc[VSTOP] != CSTOP)
    268 					pit(cb.c_cc[VSTOP], "stop", "; ");
    269 				if(cb.c_cc[VSUSP] != CSUSP)
    270 					pit(cb.c_cc[VSUSP], "susp", "; ");
    271 				if(cb.c_cc[VDSUSP] != CDSUSP)
    272 					pit(cb.c_cc[VDSUSP], "dsusp", "; ");
    273 				if(cb.c_cc[VREPRINT] != CRPRNT)
    274 					pit(cb.c_cc[VREPRINT], "rprnt", "; ");
    275 				if(cb.c_cc[VDISCARD] != CFLUSH)
    276 					pit(cb.c_cc[VDISCARD], "flush", "; ");
    277 				if(cb.c_cc[VWERASE] != CWERASE)
    278 					pit(cb.c_cc[VWERASE], "werase", "; ");
    279 				if(cb.c_cc[VLNEXT] != CLNEXT)
    280 					pit(cb.c_cc[VLNEXT], "lnext", "; ");
    281 			}
    282 		}
    283 		if(pitt) (void) fprintf(output,"\n");
    284 		m = cb.c_iflag;
    285 		if (m&IGNBRK)
    286 			(void) fprintf(output,"ignbrk ");
    287 		else if (!(m&BRKINT))
    288 			(void) fprintf(output,"-brkint ");
    289 		if (!(m&INPCK))
    290 			(void) fprintf(output,"-inpck ");
    291 		else if (!(m&IGNPAR))
    292 			(void) fprintf(output,"-ignpar ");
    293 		if (m&PARMRK)
    294 			(void) fprintf(output,"parmrk ");
    295 		if (!(m&ISTRIP))
    296 			(void) fprintf(output,"-istrip ");
    297 		if (m&INLCR)
    298 			(void) fprintf(output,"inlcr ");
    299 		if (m&IGNCR)
    300 			(void) fprintf(output,"igncr ");
    301 		if (!(m&ICRNL))
    302 			(void) fprintf(output,"-icrnl ");
    303 		if (m&IUCLC)
    304 			(void) fprintf(output,"iuclc ");
    305 		if (!(m&IXON))
    306 			(void) fprintf(output,"-ixon ");
    307 		else if (m&IXANY)
    308 			(void) fprintf(output,"ixany ");
    309 		if (m&IXOFF)
    310 			(void) fprintf(output,"ixoff ");
    311 		if ((term & TERMIOS) && (m&IMAXBEL))
    312 			(void) fprintf(output,"imaxbel ");
    313 		m = cb.c_oflag;
    314 		if (!(m&OPOST))
    315 			(void) fprintf(output,"-opost ");
    316 		else {
    317 		if (m&OLCUC)
    318 			(void) fprintf(output,"olcuc ");
    319 		if (!(m&ONLCR))
    320 			(void) fprintf(output,"-onlcr ");
    321 		if (m&OCRNL)
    322 			(void) fprintf(output,"ocrnl ");
    323 		if (m&ONOCR)
    324 			(void) fprintf(output,"onocr ");
    325 		if (m&ONLRET)
    326 			(void) fprintf(output,"onlret ");
    327 		if (m&OFILL)
    328 			if (m&OFDEL)
    329 				(void) fprintf(output,"del-fill ");
    330 			else
    331 				(void) fprintf(output,"nul-fill ");
    332 		delay((m&CRDLY)/CR1, "cr");
    333 		delay((m&NLDLY)/NL1, "nl");
    334 		if ((m&TABDLY) == XTABS)
    335 			(void) fprintf(output,"-tabs ");
    336 		else
    337 			delay((m&TABDLY)/TAB1, "tab");
    338 		delay((m&BSDLY)/BS1, "bs");
    339 		delay((m&VTDLY)/VT1, "vt");
    340 		delay((m&FFDLY)/FF1, "ff");
    341 		}
    342 		(void) fprintf(output,"\n");
    343 		m = cb.c_lflag;
    344 		if (!(m&ISIG))
    345 			(void) fprintf(output,"-isig ");
    346 		if (!(m&ICANON))
    347 			(void) fprintf(output,"-icanon ");
    348 		if (m&XCASE)
    349 			(void) fprintf(output,"xcase ");
    350 		if (!(m&ECHO))
    351 			(void) fprintf(output,"-echo ");
    352 		if (m&ECHOE) {
    353 			if (m&ECHOKE)
    354 				(void) fprintf(output,"crt ");
    355 			else
    356 				(void) fprintf(output,"echoe -echoke ");
    357 		} else {
    358 			if (!(m&ECHOPRT))
    359 				(void) fprintf(output,"-echoprt ");
    360 		}
    361 		if (!(m&ECHOK))
    362 			(void) fprintf(output,"-echok ");
    363 		if (m&ECHONL)
    364 			(void) fprintf(output,"echonl ");
    365 		if (m&NOFLSH)
    366 			(void) fprintf(output,"noflsh ");
    367 		if (m&TOSTOP)
    368 			(void) fprintf(output,"tostop ");
    369 		if (!(m&ECHOCTL))
    370 			(void) fprintf(output,"-echoctl ");
    371 		if (m&DEFECHO)
    372 			(void) fprintf(output,"defecho ");
    373 		if (m&FLUSHO)
    374 			(void) fprintf(output,"flusho ");
    375 		if (m&PENDIN)
    376 			(void) fprintf(output,"pendin ");
    377 		if (m&IEXTEN)
    378 			(void) fprintf(output,"iexten ");
    379 		(void) fprintf(output,"\n");
    380 	}
    381 	if(term & FLOW) {
    382 		m = termiox.x_hflag;
    383 		if(m & RTSXOFF)
    384 			(void) fprintf(output,"rtsxoff ");
    385 		if(m & CTSXON)
    386 			(void) fprintf(output,"ctsxon ");
    387 		if(m & DTRXOFF)
    388 			(void) fprintf(output,"dterxoff ");
    389 		if(m & CDXON)
    390 			(void) fprintf(output,"rlsdxon ");
    391 		if(m & ISXOFF)
    392 			(void) fprintf(output,"isxoff ");
    393 		m = termiox.x_cflag;
    394 		switch(m & XMTCLK)
    395 		{
    396 			case XCIBRG: (void)fprintf(output,"xcibrg ");
    397 				     break;
    398 			case XCTSET: (void)fprintf(output,"xctset ");
    399 				     break;
    400 			case XCRSET: (void)fprintf(output,"xcrset ");
    401 		}
    402 
    403 		switch(m & RCVCLK)
    404 		{
    405 			case RCIBRG: (void)fprintf(output,"rcibrg ");
    406 				     break;
    407 			case RCTSET: (void)fprintf(output,"rctset ");
    408 				     break;
    409 			case RCRSET: (void)fprintf(output,"rcrset ");
    410 		}
    411 
    412 		switch(m & TSETCLK)
    413 		{
    414 			case TSETCOFF: (void)fprintf(output,"tsetcoff ");
    415 				     break;
    416 			case TSETCRBRG: (void)fprintf(output,"tsetcrc ");
    417 				     break;
    418 			case TSETCTBRG: (void)fprintf(output,"tsetcxc ");
    419 		}
    420 
    421 		switch(m & RSETCLK)
    422 		{
    423 			case RSETCOFF: (void)fprintf(output,"rsetcoff ");
    424 				     break;
    425 			case RSETCRBRG: (void)fprintf(output,"rsetcrc ");
    426 				     break;
    427 			case RSETCTBRG: (void)fprintf(output,"rsetcxc ");
    428 		}
    429 		(void) fprintf(output,"\n");
    430 	}
    431 	if(moremodes)
    432 		prachars();
    433 }
    434 
    435 void
    436 pramodes(int tabform)
    437 /* print all modes, -a option */
    438 {
    439 	int m;
    440 
    441 	m = cb.c_cflag;
    442 	if(term & ASYNC) {
    443 		if ((term & TERMIOS) && cfgetispeed(&cb) != 0 &&
    444 		    cfgetispeed(&cb) != cfgetospeed(&cb)) {
    445 			prspeed("ispeed ", cfgetispeed(&cb));
    446 			prspeed("ospeed ", cfgetospeed(&cb));
    447 		} else
    448 			prspeed("speed ", cfgetospeed(&cb));
    449 		if(!(term & TERMIOS))
    450 			(void) fprintf(output,"line = %d; ", ocb.c_line);
    451 		(void) fprintf(output,"\n");
    452 		if(term & WINDOW) {
    453 			(void)fprintf(output,"rows = %d columns = %d; ", winsize.ws_row, winsize.ws_col);
    454 			(void)fprintf(output,"ypixels = %d xpixels = %d\n", winsize.ws_ypixel, winsize.ws_xpixel);
    455 		}
    456 		if((cb.c_lflag&ICANON)== 0)
    457 			(void) fprintf(output,"min = %d; time = %d;\n", cb.c_cc[VMIN],
    458 			cb.c_cc[VTIME]);
    459 		if (!tabform) {
    460 			pit(cb.c_cc[VINTR], "intr", "; ");
    461 			pit(cb.c_cc[VQUIT], "quit", "; ");
    462 			pit(cb.c_cc[VERASE], "erase", "; ");
    463 			pit(cb.c_cc[VKILL], "kill", ";\n");
    464 			pit(cb.c_cc[VEOF], "eof", "; ");
    465 			pit(cb.c_cc[VEOL], "eol", "; ");
    466 			pit(cb.c_cc[VEOL2], "eol2", "; ");
    467 			pit(cb.c_cc[VSWTCH], "swtch", ";\n");
    468 			if(term & TERMIOS) {
    469 				pit(cb.c_cc[VSTART], "start", "; ");
    470 				pit(cb.c_cc[VSTOP], "stop", "; ");
    471 				pit(cb.c_cc[VSUSP], "susp", "; ");
    472 				pit(cb.c_cc[VDSUSP], "dsusp", ";\n");
    473 				pit(cb.c_cc[VREPRINT], "rprnt", "; ");
    474 				pit(cb.c_cc[VDISCARD], "flush", "; ");
    475 				pit(cb.c_cc[VWERASE], "werase", "; ");
    476 				pit(cb.c_cc[VLNEXT], "lnext", ";\n");
    477 			}
    478 		}
    479 	} else
    480 		pit((unsigned)stio.tab, "ctab", "\n");
    481 	m = cb.c_cflag;
    482 	(void) fprintf(output,"-parenb "+((m&PARENB)!=0));
    483 	(void) fprintf(output,"-parodd "+((m&PARODD)!=0));
    484 	(void) fprintf(output,"cs%c ",'5'+(m&CSIZE)/CS6);
    485 	(void) fprintf(output,"-cstopb "+((m&CSTOPB)!=0));
    486 	(void) fprintf(output,"-hupcl "+((m&HUPCL)!=0));
    487 	(void) fprintf(output,"-cread "+((m&CREAD)!=0));
    488 	(void) fprintf(output,"-clocal "+((m&CLOCAL)!=0));
    489 
    490 	(void) fprintf(output,"-loblk "+((m&LOBLK)!=0));
    491 	if(term & TERMIOS)
    492 		(void) fprintf(output,"-parext "+((m&PAREXT)!=0));
    493 
    494 	(void) fprintf(output,"\n");
    495 	m = cb.c_iflag;
    496 	(void) fprintf(output,"-ignbrk "+((m&IGNBRK)!=0));
    497 	(void) fprintf(output,"-brkint "+((m&BRKINT)!=0));
    498 	(void) fprintf(output,"-ignpar "+((m&IGNPAR)!=0));
    499 	(void) fprintf(output,"-parmrk "+((m&PARMRK)!=0));
    500 	(void) fprintf(output,"-inpck "+((m&INPCK)!=0));
    501 	(void) fprintf(output,"-istrip "+((m&ISTRIP)!=0));
    502 	(void) fprintf(output,"-inlcr "+((m&INLCR)!=0));
    503 	(void) fprintf(output,"-igncr "+((m&IGNCR)!=0));
    504 	(void) fprintf(output,"-icrnl "+((m&ICRNL)!=0));
    505 	(void) fprintf(output,"-iuclc "+((m&IUCLC)!=0));
    506 	(void) fprintf(output,"\n");
    507 	(void) fprintf(output,"-ixon "+((m&IXON)!=0));
    508 	(void) fprintf(output,"-ixany "+((m&IXANY)!=0));
    509 	(void) fprintf(output,"-ixoff "+((m&IXOFF)!=0));
    510 	if(term & TERMIOS)
    511 		(void) fprintf(output,"-imaxbel "+((m&IMAXBEL)!=0));
    512 	(void) fprintf(output,"\n");
    513 	m = cb.c_lflag;
    514 	(void) fprintf(output,"-isig "+((m&ISIG)!=0));
    515 	(void) fprintf(output,"-icanon "+((m&ICANON)!=0));
    516 	(void) fprintf(output,"-xcase "+((m&XCASE)!=0));
    517 	(void) fprintf(output,"-echo "+((m&ECHO)!=0));
    518 	(void) fprintf(output,"-echoe "+((m&ECHOE)!=0));
    519 	(void) fprintf(output,"-echok "+((m&ECHOK)!=0));
    520 	(void) fprintf(output,"-echonl "+((m&ECHONL)!=0));
    521 	(void) fprintf(output,"-noflsh "+((m&NOFLSH)!=0));
    522 	if(term & TERMIOS) {
    523 		(void) fprintf(output,"\n");
    524 		(void) fprintf(output,"-tostop "+((m&TOSTOP)!=0));
    525 		(void) fprintf(output,"-echoctl "+((m&ECHOCTL)!=0));
    526 		(void) fprintf(output,"-echoprt "+((m&ECHOPRT)!=0));
    527 		(void) fprintf(output,"-echoke "+((m&ECHOKE)!=0));
    528 		(void) fprintf(output,"-defecho "+((m&DEFECHO)!=0));
    529 		(void) fprintf(output,"-flusho "+((m&FLUSHO)!=0));
    530 		(void) fprintf(output,"-pendin "+((m&PENDIN)!=0));
    531 		(void) fprintf(output,"-iexten "+((m&IEXTEN)!=0));
    532 	}
    533 	if(!(term & ASYNC)) {
    534 		(void) fprintf(output,"-stflush "+((m&STFLUSH)!=0));
    535 		(void) fprintf(output,"-stwrap "+((m&STWRAP)!=0));
    536 		(void) fprintf(output,"-stappl "+((m&STAPPL)!=0));
    537 	}
    538 	(void) fprintf(output,"\n");
    539 	m = cb.c_oflag;
    540 	(void) fprintf(output,"-opost "+((m&OPOST)!=0));
    541 	(void) fprintf(output,"-olcuc "+((m&OLCUC)!=0));
    542 	(void) fprintf(output,"-onlcr "+((m&ONLCR)!=0));
    543 	(void) fprintf(output,"-ocrnl "+((m&OCRNL)!=0));
    544 	(void) fprintf(output,"-onocr "+((m&ONOCR)!=0));
    545 	(void) fprintf(output,"-onlret "+((m&ONLRET)!=0));
    546 	(void) fprintf(output,"-ofill "+((m&OFILL)!=0));
    547 	(void) fprintf(output,"-ofdel "+((m&OFDEL)!=0));
    548 	delay((m&CRDLY)/CR1, "cr");
    549 	delay((m&NLDLY)/NL1, "nl");
    550 	if ((m&TABDLY) == XTABS)
    551 		(void) fprintf(output,"-tabs ");
    552 	else
    553 		delay((m&TABDLY)/TAB1, "tab");
    554 	delay((m&BSDLY)/BS1, "bs");
    555 	delay((m&VTDLY)/VT1, "vt");
    556 	delay((m&FFDLY)/FF1, "ff");
    557 	(void) fprintf(output,"\n");
    558 	if(term & FLOW) {
    559 		m = termiox.x_hflag;
    560 		(void) fprintf(output,"-rtsxoff "+((m&RTSXOFF)!=0));
    561 		(void) fprintf(output,"-ctsxon "+((m&CTSXON)!=0));
    562 		(void) fprintf(output,"-dterxoff "+((m&DTRXOFF)!=0));
    563 		(void) fprintf(output,"-rlsdxon "+((m&CDXON)!=0));
    564 		(void) fprintf(output,"-isxoff "+((m&ISXOFF)!=0));
    565 		m = termiox.x_cflag;
    566 		switch(m & XMTCLK)
    567 		{
    568 			case XCIBRG: (void)fprintf(output,"xcibrg ");
    569 				     break;
    570 			case XCTSET: (void)fprintf(output,"xctset ");
    571 				     break;
    572 			case XCRSET: (void)fprintf(output,"xcrset ");
    573 		}
    574 
    575 		switch(m & RCVCLK)
    576 		{
    577 			case RCIBRG: (void)fprintf(output,"rcibrg ");
    578 				     break;
    579 			case RCTSET: (void)fprintf(output,"rctset ");
    580 				     break;
    581 			case RCRSET: (void)fprintf(output,"rcrset ");
    582 		}
    583 
    584 		switch(m & TSETCLK)
    585 		{
    586 			case TSETCOFF: (void)fprintf(output,"tsetcoff ");
    587 				     break;
    588 			case TSETCRBRG: (void)fprintf(output,"tsetcrc ");
    589 				     break;
    590 			case TSETCTBRG: (void)fprintf(output,"tsetcxc ");
    591 		}
    592 
    593 		switch(m & RSETCLK)
    594 		{
    595 			case RSETCOFF: (void)fprintf(output,"rsetcoff ");
    596 				     break;
    597 			case RSETCRBRG: (void)fprintf(output,"rsetcrc ");
    598 				     break;
    599 			case RSETCTBRG: (void)fprintf(output,"rsetcxc ");
    600 		}
    601 		(void) fprintf(output,"\n");
    602 	}
    603 	if (tabform)
    604 		prachars();
    605 }
    606 
    607 void
    608 prachars(void)
    609 {
    610 	if ((cb.c_lflag&ICANON)==0)
    611 		(void) fprintf(output,"min %d, time %d\n", cb.c_cc[VMIN],
    612 		    cb.c_cc[VTIME]);
    613 	(void) fprintf(output,"\
    614 erase  kill   werase rprnt  flush  lnext  susp   intr   quit   stop   eof\
    615 \n");
    616 	pcol(cb.c_cc[VERASE], 0);
    617 	pcol(cb.c_cc[VKILL], 0);
    618 	pcol(cb.c_cc[VWERASE], 0);
    619 	pcol(cb.c_cc[VREPRINT], 0);
    620 	pcol(cb.c_cc[VDISCARD], 0);
    621 	pcol(cb.c_cc[VLNEXT], 0);
    622 	pcol(cb.c_cc[VSUSP], cb.c_cc[VDSUSP]);
    623 	pcol(cb.c_cc[VINTR], 0);
    624 	pcol(cb.c_cc[VQUIT], 0);
    625 	pcol(cb.c_cc[VSTOP], cb.c_cc[VSTART]);
    626 	if (cb.c_lflag&ICANON)
    627 		pcol(cb.c_cc[VEOF], cb.c_cc[VEOL]);
    628 	(void) fprintf(output,"\n");
    629 	if (cb.c_cc[VEOL2] != 0 || cb.c_cc[VSWTCH] != 0) {
    630 		(void) fprintf(output,"\
    631 eol2  swtch\
    632 \n");
    633 		pcol(cb.c_cc[VEOL2], 0);
    634 		pcol(cb.c_cc[VSWTCH], 0);
    635 		(void) fprintf(output,"\n");
    636 	}
    637 }
    638 
    639 void
    640 pcol(int ch1, int ch2)
    641 {
    642 	int nout = 0;
    643 
    644 	ch1 &= 0377;
    645 	ch2 &= 0377;
    646 	if (ch1 == ch2)
    647 		ch2 = 0;
    648 	for (; ch1 != 0 || ch2 != 0; ch1 = ch2, ch2 = 0) {
    649 		if (ch1 == 0)
    650 			continue;
    651 		if (ch1 & 0200 && !isprint(ch1)) {
    652 			(void) fprintf(output,"M-");
    653 			nout += 2;
    654 			ch1 &= ~ 0200;
    655 		}
    656 		if (ch1 == 0177) {
    657 			(void) fprintf(output,"^");
    658 			nout++;
    659 			ch1 = '?';
    660 		} else if (ch1 < ' ') {
    661 			(void) fprintf(output,"^");
    662 			nout++;
    663 			ch1 += '@';
    664 		}
    665 		(void) fprintf(output,"%c", ch1);
    666 		nout++;
    667 		if (ch2 != 0) {
    668 			(void) fprintf(output,"/");
    669 			nout++;
    670 		}
    671 	}
    672 	while (nout < 7) {
    673 		(void) fprintf(output," ");
    674 		nout++;
    675 	}
    676 }
    677 
    678 void
    679 pit(unsigned char what, char *itsname, char *sep)
    680 /* print function for prmodes() and pramodes() */
    681 {
    682 
    683 	pitt++;
    684 	(void) fprintf(output,"%s", itsname);
    685 	if ((term & TERMIOS) && what == _POSIX_VDISABLE || !(term & TERMIOS) && what == 0200) {
    686 		(void) fprintf(output," = <undef>%s", sep);
    687 		return;
    688 	}
    689 	(void) fprintf(output," = ");
    690 	if (what & 0200 && !isprint(what)) {
    691 		(void) fprintf(output,"-");
    692 		what &= ~ 0200;
    693 	}
    694 	if (what == 0177) {
    695 		(void) fprintf(output,"^?%s", sep);
    696 		return;
    697 	} else if (what < ' ') {
    698 		(void) fprintf(output,"^");
    699 		what += '`';
    700 	}
    701 	(void) fprintf(output,"%c%s", what, sep);
    702 }
    703 
    704 void
    705 delay(int m, char *s)
    706 {
    707 	if(m)
    708 		(void) fprintf(output,"%s%d ", s, m);
    709 }
    710 
    711 long	speed[] = {
    712 	0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,
    713 	57600,76800,115200,153600,230400,307200,460800
    714 };
    715 
    716 void
    717 prspeed(char *c, int s)
    718 {
    719 
    720 	(void) fprintf(output,"%s%d baud; ", c, speed[s]);
    721 }
    722 
    723 /*
    724  * print current settings for use with
    725  * another stty cmd, used for -g option
    726  */
    727 void
    728 prencode(void)
    729 {
    730 	int i, last;
    731 
    732 	/* Since the -g option is mostly used for redirecting to a file */
    733 	/* We must print to stdout here, not stderr */
    734 
    735 	(void) printf("%x:%x:%x:%x:",cb.c_iflag,cb.c_oflag,cb.c_cflag,cb.c_lflag);
    736 
    737 	if(term & TERMIOS)
    738 	/* last control slot is unused */
    739 		last = NCCS - 2;
    740 	else
    741 		last = NCC - 1;
    742 	for(i = 0; i < last; i++)
    743 		(void) printf("%x:", cb.c_cc[i]);
    744 	(void) printf("%x\n", cb.c_cc[last]);
    745 }
    746