119907Sdist /* 2*40169Skarels * Copyright (c) 1980, 1989 Regents of the University of California. 319907Sdist * All rights reserved. The Berkeley software License Agreement 419907Sdist * specifies the terms and conditions for redistribution. 519907Sdist */ 619907Sdist 713073Ssam #ifndef lint 819907Sdist char copyright[] = 9*40169Skarels "@(#) Copyright (c) 1980, 1989 Regents of the University of California.\n\ 1019907Sdist All rights reserved.\n"; 1119907Sdist #endif not lint 1219907Sdist 1319907Sdist #ifndef lint 14*40169Skarels static char sccsid[] = "@(#)stty.c 5.8 (Berkeley) 02/20/90"; 1519907Sdist #endif not lint 1619907Sdist 171179Sbill /* 181179Sbill * set teletype modes 191179Sbill */ 201179Sbill 2138674Smarc #include <sys/types.h> 2238674Smarc #include <sys/stat.h> 2337609Sbostic #include <sys/ioctl.h> 2438674Smarc #include <sys/syslog.h> 2538674Smarc #define KERNEL 2638674Smarc #include <sys/tty.h> 2738674Smarc #undef KERNEL 2838674Smarc #include <sys/termios.h> 2938674Smarc #include <sys/file.h> 3038674Smarc #include <errno.h> 3138674Smarc #include <ctype.h> 321179Sbill #include <stdio.h> 331179Sbill 3438674Smarc #ifndef STATIC 35*40169Skarels #define STATIC /* ??? */ 369853Ssam #endif 3738674Smarc 3838674Smarc #define eq(s1, s2) (strcmp(s1, s2) == 0) 3938674Smarc #define WRAPCOL 65 4038674Smarc #define COMPAT_43 4138674Smarc 4238674Smarc STATIC struct modes { 4338674Smarc char *name; 4438674Smarc long set; 4538674Smarc long unset; 461179Sbill }; 471179Sbill 4838674Smarc STATIC struct modes imodes[] = { 4938674Smarc "ignbrk", IGNBRK, 0, 5038674Smarc "-ignbrk", 0, IGNBRK, 5138674Smarc "brkint", BRKINT, 0, 5238674Smarc "-brkint", 0, BRKINT, 5338674Smarc "ignpar", IGNPAR, 0, 5438674Smarc "-ignpar", 0, IGNPAR, 5538674Smarc "parmrk", PARMRK, 0, 5638674Smarc "-parmrk", 0, PARMRK, 5738674Smarc "inpck", INPCK, 0, 5838674Smarc "-inpck", 0, INPCK, 5938674Smarc "istrip", ISTRIP, 0, 6038674Smarc "-istrip", 0, ISTRIP, 6138674Smarc "inlcr", INLCR, 0, 6238674Smarc "-inlcr", 0, INLCR, 6338674Smarc "igncr", IGNCR, 0, 6438674Smarc "-igncr", 0, IGNCR, 6538674Smarc "icrnl", ICRNL, 0, 6638674Smarc "-icrnl", 0, ICRNL, 6738674Smarc "ixon", IXON, 0, 6838674Smarc "-ixon", 0, IXON, 6938674Smarc "flow", IXON, 0, 7038674Smarc "-flow", 0, IXON, 7138674Smarc "ixoff", IXOFF, 0, 7238674Smarc "-ixoff", 0, IXOFF, 7338674Smarc "tandem", IXOFF, 0, 7438674Smarc "-tandem", 0, IXOFF, 7538674Smarc "ixany", IXANY, 0, 7638674Smarc "-ixany", 0, IXANY, 7738674Smarc "decctlq", 0, IXANY, 7838674Smarc "-decctlq", IXANY, 0, 7938674Smarc "imaxbel", IMAXBEL, 0, 8038674Smarc "-imaxbel", 0, IMAXBEL, 8138674Smarc 0 8238674Smarc }; 831179Sbill 8438674Smarc STATIC struct modes omodes[] = { 8538674Smarc "opost", OPOST, 0, 8638674Smarc "-opost", 0, OPOST, 8738674Smarc "-litout", OPOST, 0, 8838674Smarc "litout", 0, OPOST, 8938674Smarc "onlcr", ONLCR, 0, 9038674Smarc "-onlcr", 0, ONLCR, 9138674Smarc "tabs", 0, OXTABS, /* "preserve" tabs */ 9238674Smarc "-tabs", OXTABS, 0, 93*40169Skarels "xtabs", OXTABS, 0, /* ??? */ 94*40169Skarels "-xtabs", 0, OXTABS, /* ??? */ 9538674Smarc "oxtabs", OXTABS, 0, 9638674Smarc "-oxtabs", 0, OXTABS, 971179Sbill 0 981179Sbill }; 991179Sbill 10038674Smarc STATIC struct modes cmodes[] = { 10138674Smarc "cs5", CS5, CSIZE, 10238674Smarc "cs6", CS6, CSIZE, 10338674Smarc "cs7", CS7, CSIZE, 10438674Smarc "cs8", CS8, CSIZE, 10538674Smarc "cstopb", CSTOPB, 0, 10638674Smarc "-cstopb", 0, CSTOPB, 10738674Smarc "cread", CREAD, 0, 10838674Smarc "-cread", 0, CREAD, 10938674Smarc "parenb", PARENB, 0, 11038674Smarc "-parenb", 0, PARENB, 11138674Smarc "parodd", PARODD, 0, 11238674Smarc "-parodd", 0, PARODD, 11338674Smarc "parity", PARENB | CS7, PARODD | CSIZE, 11438674Smarc "evenp", PARENB | CS7, PARODD | CSIZE, 11538674Smarc "oddp", PARENB | CS7 | PARODD, CSIZE, 11638674Smarc "-parity", CS8, PARODD | PARENB | CSIZE, 117*40169Skarels "pass8", CS8, PARODD | PARENB | CSIZE, 11838674Smarc "-evenp", CS8, PARODD | PARENB | CSIZE, 11938674Smarc "-oddp", CS8, PARODD | PARENB | CSIZE, 12038674Smarc "hupcl", HUPCL, 0, 12138674Smarc "-hupcl", 0, HUPCL, 12238674Smarc "hup", HUPCL, 0, 12338674Smarc "-hup", 0, HUPCL, 12438674Smarc "clocal", CLOCAL, 0, 12538674Smarc "-clocal", 0, CLOCAL, 12638674Smarc "crtscts", CRTSCTS, 0, 12738674Smarc "-crtscts", 0, CRTSCTS, 12838674Smarc 0 12938674Smarc }; 13038674Smarc 13138674Smarc STATIC struct modes lmodes[] = { 13238674Smarc "echo", ECHO, 0, 13338674Smarc "-echo", 0, ECHO, 13438674Smarc "echoe", ECHOE, 0, 13538674Smarc "-echoe", 0, ECHOE, 13638674Smarc "crterase", ECHOE, 0, 13738674Smarc "-crterase", 0, ECHOE, 13838674Smarc "crtbs", ECHOE, 0, /* crtbs not supported, close enough */ 13938674Smarc "-crtbs", 0, ECHOE, 14038674Smarc "echok", ECHOK, 0, 14138674Smarc "-echok", 0, ECHOK, 14238674Smarc "echoke", ECHOKE, 0, 14338674Smarc "-echoke", 0, ECHOKE, 14438674Smarc "crtkill", ECHOKE, 0, 14538674Smarc "-crtkill", 0, ECHOKE, 14638674Smarc "altwerase", ALTWERASE, 0, 14738674Smarc "-altwerase", 0, ALTWERASE, 14838674Smarc "iexten", IEXTEN, 0, 14938674Smarc "-iexten", 0, IEXTEN, 15038674Smarc "echonl", ECHONL, 0, 15138674Smarc "-echonl", 0, ECHONL, 15238674Smarc "echoctl", ECHOCTL, 0, 15338674Smarc "-echoctl", 0, ECHOCTL, 15438674Smarc "ctlecho", ECHOCTL, 0, 15538674Smarc "-ctlecho", 0, ECHOCTL, 15638674Smarc "echoprt", ECHOPRT, 0, 15738674Smarc "-echoprt", 0, ECHOPRT, 15838674Smarc "prterase", ECHOPRT, 0, 15938674Smarc "-prterase", 0, ECHOPRT, 16038674Smarc "isig", ISIG, 0, 16138674Smarc "-isig", 0, ISIG, 16238674Smarc "icanon", ICANON, 0, 16338674Smarc "-icanon", 0, ICANON, 16438674Smarc "noflsh", NOFLSH, 0, 16538674Smarc "-noflsh", 0, NOFLSH, 16638674Smarc "tostop", TOSTOP, 0, 16738674Smarc "-tostop", 0, TOSTOP, 16838674Smarc "mdmbuf", MDMBUF, 0, 16938674Smarc "-mdmbuf", 0, MDMBUF, 17038674Smarc "nohang", NOHANG, 0, 17138674Smarc "-nohang", 0, NOHANG, 17238674Smarc "flusho", FLUSHO, 0, 17338674Smarc "-flusho", 0, FLUSHO, 17438674Smarc "pendin", PENDIN, 0, 17538674Smarc "-pendin", 0, PENDIN, 17638674Smarc "crt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT, 17738674Smarc "-crt", ECHOK, ECHOE|ECHOKE|ECHOCTL, 17838674Smarc "newcrt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT, 17938674Smarc "-newcrt", ECHOK, ECHOE|ECHOKE|ECHOCTL, 18038674Smarc 0 18138674Smarc }; 18238674Smarc 18338674Smarc /* 18438674Smarc * Special control characters. 18538674Smarc * 18638674Smarc * Each entry has a list of names. The first is the primary name 18738674Smarc * and is used when printing the control character in the "name = val;" 18838674Smarc * form. The second is an abbreviation which is guaranteed to be less 18938674Smarc * than or equal to four characters in length and is primarily used 19038674Smarc * when printing the values in columunar form (guarantees all will 19138674Smarc * fit within 80 cols). The rest are optional aliases. 19238674Smarc * All names are recognized on the command line. 19338674Smarc */ 194*40169Skarels #define MAXNAMES 5 /* ??? */ 19538674Smarc STATIC struct { 196*40169Skarels char *names[MAXNAMES+1]; /* ??? */ 19738674Smarc int sub; 19838674Smarc u_char def; 19938674Smarc } cchars[] = { 20038674Smarc { "erase", "era" }, VERASE, CERASE, 20138674Smarc { "werase", "wera" }, VWERASE, CWERASE, 20238674Smarc { "kill", "kill" }, VKILL, CKILL, 20338674Smarc { "intr", "int" }, VINTR, CINTR, 20438674Smarc { "quit", "quit" }, VQUIT, CQUIT, 20538674Smarc { "susp", "susp" }, VSUSP, CSUSP, 20638674Smarc { "dsusp", "dsus" }, VDSUSP, CDSUSP, 20738674Smarc { "eof", "eof" }, VEOF, CEOF, 20838674Smarc { "eol", "eol", "brk" }, VEOL, CEOL, 20938674Smarc { "eol2", "eol2" }, VEOL2, CEOL, 21038674Smarc { "stop", "stop", "xoff" }, VSTOP, CSTOP, 21138674Smarc { "start", "star", "xon" }, VSTART, CSTART, 21238674Smarc { "lnext", "lnxt" }, VLNEXT, CLNEXT, 21338674Smarc { "flusho", "fls", "flush" }, VFLUSHO, CFLUSHO, 21438674Smarc { "reprint", "rpnt", "rprnt" }, VREPRINT, CREPRINT, 215*40169Skarels { "info", "info" }, VINFO, CINFO, 21638674Smarc 0 21738674Smarc }; 21838674Smarc 21938674Smarc STATIC struct winsize win; 22038674Smarc STATIC int ldisc; 22138674Smarc STATIC int dodisc; 22238674Smarc STATIC int debug = 0; 22338674Smarc STATIC int trace, dotrace; 22438674Smarc 22538674Smarc #define OUT stdout /* informational output stream */ 22638674Smarc #define ERR stderr /* error message stream */ 22738674Smarc #define CTL 0 /* default control descriptor */ 22838674Smarc STATIC int ctl = CTL; 22938674Smarc 23038674Smarc extern errno; 23138674Smarc extern char *sys_errlist[]; 23238674Smarc 23338674Smarc #define NORMAL 0 /* only print modes differing from defaults */ 23438674Smarc #define ALL 1 /* print all modes - POSIX standard format */ 23538674Smarc #define ALL_BSD 2 /* print all modes - using BSD shorthand for cc's */ 23638674Smarc #define GFMT 3 /* print modes in a form that can be re-input to stty */ 23738674Smarc 23838674Smarc STATIC 23938674Smarc main(argc, argv) 24038674Smarc char *argv[]; 2411179Sbill { 24238674Smarc struct termios t; 24338674Smarc int i, fmt = NORMAL; 24438674Smarc extern char *optarg; 24538674Smarc extern int optind; 24638674Smarc int ch; 2471179Sbill 24838674Smarc argc--, argv++; 24938674Smarc if (argc > 0 && eq(argv[0], "-a")) { 25038674Smarc fmt = ALL; 25138674Smarc argc--, argv++; 2521179Sbill } 25338674Smarc if (argc > 0 && eq(argv[0], "-f")) { 25438674Smarc argc--, argv++; 25538674Smarc if ((ctl = open(argv[0], O_RDONLY | O_NONBLOCK)) < 0) 25638674Smarc syserrexit(*argv); 25738674Smarc argc--, argv++; 2581179Sbill } 25938674Smarc #ifdef notyet 26038674Smarc while ((ch = getopt(argc, argv, "f:ga")) != EOF) 26138674Smarc switch((char)ch) { 26238674Smarc case 'f': 26338674Smarc if ((ctl = open(*optarg, O_RDONLY | O_NONBLOCK)) < 0) 26438674Smarc syserrexit(*argv); 26538674Smarc break; 26638674Smarc case 'a': 26738674Smarc fmt = ALL; 26838674Smarc break; 26938674Smarc case 'g': 27038674Smarc fmt = GFMT; 27138674Smarc break; 27238674Smarc case '?': 27338674Smarc default: 27438674Smarc fprintf(stderr, "usage: %s", *argv); 27538674Smarc exit(1); 27638674Smarc } 27738674Smarc argc -= optind; 27838674Smarc argv += optind; 27938674Smarc #endif 28038674Smarc 28138674Smarc if (ioctl(ctl, TIOCGETD, &ldisc) < 0) 28238674Smarc syserrexit("TIOCGETD"); 28338674Smarc if (tcgetattr(ctl, &t) < 0) 28438674Smarc syserrexit("tcgetattr"); 28538674Smarc if (ioctl(ctl, TIOCGWINSZ, &win) < 0) 28638674Smarc warning("TIOCGWINSZ: %s", sys_errlist[errno]); 28738674Smarc 28838674Smarc #ifdef COMPAT_43 28938674Smarc checkredirect(); /* conversion aid */ 29038674Smarc #endif 29138674Smarc 29238674Smarc if (argc == 0 || fmt) { 29338674Smarc prmode(&t, ldisc, fmt); 2941179Sbill exit(0); 29538674Smarc } else if (argc == 1 && strlen(argv[0]) > 2 && *(argv[0]+2) == ':') { 29638674Smarc gfmtset(argv[0]); 29738674Smarc goto setit; 2981179Sbill } 29938674Smarc 30038674Smarc while (*argv) { 30138674Smarc if (eq("everything", *argv)) { 30238674Smarc prmode(&t, ldisc, ALL_BSD); 30338674Smarc exit(0); 3041179Sbill } 30538674Smarc if (eq("all", *argv)) { 30638674Smarc prmode(&t, ldisc, ALL); 30738674Smarc exit(0); 3081179Sbill } 30938674Smarc if (eq("old", *argv)) { 31038674Smarc goto next; 3111179Sbill } 31238674Smarc if (eq("new", *argv)) { 31338674Smarc goto next; 3141179Sbill } 31538674Smarc if (eq("nl", *argv)) { 31638674Smarc t.c_iflag &= ~ICRNL; 31738674Smarc t.c_oflag &= ~ONLCR; 31838674Smarc goto next; 3191179Sbill } 32038674Smarc if (eq("-nl", *argv)) { 32138674Smarc t.c_iflag |= ICRNL; 32238674Smarc t.c_oflag |= ONLCR; 32338674Smarc goto next; 3243797Sroot } 32538674Smarc if (eq("dec", *argv)){ 32638674Smarc t.c_cc[VERASE] = (u_char)0177; 32738674Smarc t.c_cc[VKILL] = CTRL('u'); 32838674Smarc t.c_cc[VINTR] = CTRL('c'); 32938674Smarc t.c_lflag &= ~ECHOPRT; 33038674Smarc t.c_lflag |= ECHOE|ECHOKE|ECHOCTL; 33138674Smarc t.c_iflag &= ~IXANY; 33238674Smarc goto next; 3331179Sbill } 334*40169Skarels if (eq("raw", *argv)) { 335*40169Skarels cfmakeraw(&t); 336*40169Skarels t.c_cflag &= ~(CSIZE|PARENB); 337*40169Skarels t.c_cflag |= CS8; 338*40169Skarels goto next; 339*40169Skarels } 340*40169Skarels if (eq("cooked", *argv) || eq("-raw", *argv) || 341*40169Skarels eq("sane", *argv)) { 342*40169Skarels t.c_cflag = TTYDEF_CFLAG | (t.c_cflag & CLOCAL); 343*40169Skarels t.c_iflag = TTYDEF_IFLAG; 344*40169Skarels t.c_iflag |= ICRNL; 345*40169Skarels /* preserve user-preference flags in lflag */ 346*40169Skarels #define LKEEP (ECHOKE|ECHOE|ECHOK|ECHOPRT|ECHOCTL|ALTWERASE|TOSTOP|NOFLSH) 347*40169Skarels t.c_lflag = TTYDEF_LFLAG | (t.c_lflag & LKEEP); 348*40169Skarels t.c_oflag = TTYDEF_OFLAG; 349*40169Skarels t.c_oflag |= (OPOST|ONLCR); /* XXX */ 350*40169Skarels goto next; 351*40169Skarels } 35238674Smarc if (eq("rows", *argv)) { 35338674Smarc if (*(argv+1) == 0) 35438674Smarc goto setit; 35518023Sbloom win.ws_row = atoi(*++argv); 35638674Smarc goto next; 35718023Sbloom } 35838674Smarc if (eq("ispeed", *argv)) { 35938674Smarc int code; 36038674Smarc if (*(argv+1) == 0) 36138674Smarc errexit("missing ispeed"); 36238674Smarc cfsetispeed(&t, atoi(*++argv)); 36338674Smarc goto next; 36438674Smarc } 36538674Smarc if (eq("ospeed", *argv)) { 36638674Smarc int code; 36738674Smarc if (*(argv+1) == 0) 36838674Smarc errexit("missing ospeed"); 36938674Smarc cfsetospeed(&t, atoi(*++argv)); 37038674Smarc goto next; 37138674Smarc } 37238674Smarc if (eq("cols", *argv) || eq("columns", *argv)) { 37338674Smarc if (*(argv+1) == 0) 37438674Smarc goto setit; 37518023Sbloom win.ws_col = atoi(*++argv); 37638674Smarc goto next; 37718023Sbloom } 37838674Smarc if (eq("size", *argv)) { 37938674Smarc put("%d %d\n", win.ws_row, win.ws_col); 38025791Skarels exit(0); 38125791Skarels } 38238674Smarc if (eq("speed", *argv)) { 38338674Smarc put("%d\n", cfgetospeed(&t)); 38438674Smarc exit(0); 38538674Smarc } 38638674Smarc for (i=0; imodes[i].name; i++) 38738674Smarc if (eq(imodes[i].name, *argv)) { 38838674Smarc t.c_iflag &= ~imodes[i].unset; 38938674Smarc t.c_iflag |= imodes[i].set; 39038674Smarc goto next; 3911179Sbill } 39238674Smarc for (i=0; omodes[i].name; i++) 39338674Smarc if (eq(omodes[i].name, *argv)) { 39438674Smarc t.c_oflag &= ~omodes[i].unset; 39538674Smarc t.c_oflag |= omodes[i].set; 39638674Smarc goto next; 39738674Smarc } 39838674Smarc for (i=0; cmodes[i].name; i++) 39938674Smarc if (eq(cmodes[i].name, *argv)) { 40038674Smarc t.c_cflag &= ~cmodes[i].unset; 40138674Smarc t.c_cflag |= cmodes[i].set; 40238674Smarc goto next; 40338674Smarc } 40438674Smarc for (i=0; lmodes[i].name; i++) 40538674Smarc if (eq(lmodes[i].name, *argv)) { 40638674Smarc t.c_lflag &= ~lmodes[i].unset; 40738674Smarc t.c_lflag |= lmodes[i].set; 40838674Smarc goto next; 40938674Smarc } 41038674Smarc for (i=0; *cchars[i].names; i++) { 41138674Smarc char **cp = cchars[i].names; 41238674Smarc while (*cp) { 41338674Smarc if (eq(*cp, *argv)) { 41438674Smarc if (*++argv == 0) 41538674Smarc goto setit; 41638674Smarc if (eq(*argv, "undef") || 41738674Smarc eq(*argv, "disable")) 41838674Smarc t.c_cc[cchars[i].sub] = 41938674Smarc _POSIX_VDISABLE; 42038674Smarc else if (**argv == '^') 42138674Smarc t.c_cc[cchars[i].sub] = 42238674Smarc ((*argv)[1] == '?') ? 0177 : 42338674Smarc ((*argv)[1] == '-') ? 42438674Smarc _POSIX_VDISABLE : 42538674Smarc (*argv)[1] & 037; 42638674Smarc else 42738674Smarc t.c_cc[cchars[i].sub] = **argv; 42838674Smarc goto next; 4291179Sbill } 43038674Smarc cp++; 43138674Smarc } 4321179Sbill } 43338674Smarc if (isdigit(**argv)) { 43438674Smarc cfsetospeed(&t, atoi(*argv)); 43538674Smarc cfsetispeed(&t, atoi(*argv)); 43638674Smarc goto next; 43738674Smarc } 43838674Smarc /* didn't match anything */ 43938674Smarc errexit("unknown option: %s", *argv); 44038674Smarc exit(1); 44138674Smarc next: 44238674Smarc argv++; 4431179Sbill } 44438674Smarc setit: 44538674Smarc if (tcsetattr(ctl, 0, &t) < 0) 44638674Smarc syserrexit("tcsetattr"); 44738674Smarc if (ioctl(ctl, TIOCSWINSZ, &win) < 0) 44838674Smarc warning("can't set window size"); 44938674Smarc 45038674Smarc exit(0); 4511179Sbill } 4521179Sbill 45338674Smarc gfmtset() { 4541179Sbill } 4551179Sbill 45638674Smarc prmode(tp, ldisc, fmt) 45738674Smarc struct termios *tp; 4581179Sbill { 45938674Smarc long i = tp->c_iflag, 46038674Smarc o = tp->c_oflag, 46138674Smarc c = tp->c_cflag, 46238674Smarc l = tp->c_lflag; 46338674Smarc u_char *cc = tp->c_cc; 46438674Smarc int ispeed = cfgetispeed(tp), 46538674Smarc ospeed = cfgetospeed(tp); 46638674Smarc char unknown[32], 46738674Smarc *ld; 46838674Smarc char *ccval(); 46938674Smarc 4701179Sbill 47138674Smarc /* 47238674Smarc * line discipline 47338674Smarc */ 47438674Smarc if (ldisc != TTYDISC) { 47538674Smarc switch(ldisc) { 47638674Smarc case TABLDISC: 47738674Smarc ld = "tablet"; 4781179Sbill break; 47938674Smarc case SLIPDISC: 48038674Smarc ld = "slip(ed)"; 4811179Sbill break; 48238674Smarc default: 48338674Smarc sprintf(unknown, "#%d", ldisc); 48438674Smarc ld = unknown; 4851179Sbill } 48638674Smarc put("%s disc; ", ld); 48738674Smarc } 48838674Smarc /* 48938674Smarc * line speed 49038674Smarc */ 49138674Smarc if (ispeed != ospeed) 49238674Smarc put("ispeed %d baud; ospeed %d baud;", 49338674Smarc ispeed, ospeed); 49438674Smarc else 49538674Smarc put("speed %d baud;", ispeed); 49638674Smarc if (fmt) 49738674Smarc put(" %d rows; %d columns;", win.ws_row, win.ws_col); 49838674Smarc put("\n"); 49913817Ssam 50038674Smarc #define lput(n, f, d) if (fmt || on(f) != d) mdput(n+on(f)) 50138674Smarc /* 50238674Smarc * "local" flags 50338674Smarc */ 50438674Smarc #define on(f) ((l&f) != 0) 50538674Smarc if (debug) mdput("LFLAG: "); 50638674Smarc lput("-icanon ",ICANON, 1); 50738674Smarc lput("-isig ", ISIG, 1); 50838674Smarc lput("-iexten ", IEXTEN, 1); 50938674Smarc lput("-echo ",ECHO, 1); 51038674Smarc lput("-echoe ",ECHOE, 0); 51138674Smarc lput("-echok ",ECHOK, 0); 51238674Smarc lput("-echoke ",ECHOKE, 0); 51338674Smarc lput("-echonl ",ECHONL, 0); 51438674Smarc lput("-echoctl ",ECHOCTL, 0); 51538674Smarc lput("-echoprt ",ECHOPRT, 0); 51638674Smarc lput("-altwerase ",ALTWERASE, 0); 51738674Smarc lput("-noflsh ",NOFLSH, 0); 51838674Smarc lput("-tostop ",TOSTOP, 0); 51938674Smarc lput("-mdmbuf ",MDMBUF, 0); 52038674Smarc lput("-nohang ",NOHANG, 0); 52138674Smarc lput("-flusho ",FLUSHO, 0); 52238674Smarc lput("-pendin ",PENDIN, 0); 52338674Smarc /* 52438674Smarc * input flags 52538674Smarc */ 52638674Smarc #undef on 52738674Smarc #define on(f) ((i&f) != 0) 52838674Smarc mdput(0); 52938674Smarc if (debug) mdput("IFLAG: "); 53038674Smarc lput("-istrip ", ISTRIP, 0); 53138674Smarc lput("-icrnl ", ICRNL, 1); 53238674Smarc lput("-inlcr ", INLCR, 0); 53338674Smarc lput("-igncr ", IGNCR, 0); 53438674Smarc lput("-ixon ", IXON, 1); 53538674Smarc lput("-ixoff ", IXOFF, 0); 53638674Smarc lput("-ixany ", IXANY, 1); 53738674Smarc lput("-imaxbel ", IMAXBEL, 1); 53838674Smarc lput("-ignbrk ", IGNBRK, 0); 53938674Smarc lput("-brkint ", BRKINT, 1); 54038674Smarc lput("-inpck ", INPCK, 0); 54138674Smarc lput("-ignpar ", IGNPAR, 0); 54238674Smarc lput("-parmrk ", PARMRK, 0); 54338674Smarc #undef on 54438674Smarc /* 54538674Smarc * output flags 54638674Smarc */ 54738674Smarc #define on(f) ((o&f) != 0) 54838674Smarc mdput(0); 54938674Smarc if (debug) mdput("OFLAG: "); 55038674Smarc lput("-opost ", OPOST, 1); 55138674Smarc lput("-onlcr ", ONLCR, 1); 55238674Smarc lput("-oxtabs ", OXTABS, 1); 55338674Smarc #undef on 55438674Smarc /* 55538674Smarc * control flags (hardware state) 55638674Smarc */ 55738674Smarc #define on(f) ((c&f) != 0) 55838674Smarc mdput(0); 55938674Smarc if (debug) mdput("CFLAG: "); 56038674Smarc lput("-cread ", CREAD, 1); 56138674Smarc switch(c&CSIZE) { 56238674Smarc case CS5: mdput("cs5 "); break; 56338674Smarc case CS6: mdput("cs6 "); break; 56438674Smarc case CS7: mdput("cs7 "); break; 56538674Smarc case CS8: mdput("cs8 "); break; 56638674Smarc } 56738674Smarc mdput("-parenb "+on(PARENB)); 56838674Smarc lput("-parodd ", PARODD, 0); 56938674Smarc lput("-hupcl ", HUPCL, 1); 57038674Smarc lput("-clocal ", CLOCAL, 0); 57138674Smarc lput("-cstopb ", CSTOPB, 0); 57238674Smarc lput("-crtscts ", CRTSCTS, 0); 57338674Smarc mdput(0); 57438674Smarc #undef on 57538674Smarc /* 57638674Smarc * special control characters 57738674Smarc */ 57838674Smarc if (debug) mdput("CCHARS: "); 57938674Smarc if (fmt != 2) { 58038674Smarc for (i=0; *cchars[i].names; i++) { 58138674Smarc char temp[64]; 58238674Smarc 58338674Smarc if (fmt || cc[cchars[i].sub] != cchars[i].def) { 58438674Smarc sprintf(temp, "%s = %s; ", *cchars[i].names, 58538674Smarc ccval(cc[cchars[i].sub]), fmt); 58638674Smarc mdput(temp); 58738674Smarc } 5881179Sbill } 58938674Smarc mdput(0); 59038674Smarc } else { 59138674Smarc for (i=0; *cchars[i].names; i++) 59238674Smarc put("%*s", strlen(*(cchars[i].names+1)) + (i>0?1:0), 59338674Smarc *(cchars[i].names+1)); 59438674Smarc printf("\n"); 59538674Smarc for (i=0; *cchars[i].names; i++) 59638674Smarc put("%*s", strlen(*(cchars[i].names+1)) + (i>0?1:0), 59738674Smarc ccval(cc[cchars[i].sub], fmt)); 59838674Smarc printf("\n"); 5991179Sbill } 6001179Sbill } 6011179Sbill 60238674Smarc #ifdef COMPAT_43 60338674Smarc /* 60438674Smarc * gross, but since we're changing the control descriptor 60538674Smarc * from 1 to 0, most users will be probably be doing 60638674Smarc * "stty > /dev/sometty" by accident. If 1 and 2 are both ttys, 60738674Smarc * but not the same, assume that 1 was incorrectly redirected. 60838674Smarc */ 60938674Smarc checkredirect() { 61038674Smarc struct stat st1, st2; 61138674Smarc 61238674Smarc if (isatty(1) && isatty(2) && fstat(1, &st1) != -1 && 61338674Smarc fstat(2, &st2) != -1 && (st1.st_rdev != st2.st_rdev)) 61438674Smarc warning("stdout appears redirected, but stdin is the control descriptor"); 61538674Smarc } 61638674Smarc #endif 61738674Smarc 61838674Smarc STATIC char * 61938674Smarc ccval(c, fmt) 62038674Smarc unsigned char c; 6211179Sbill { 62238674Smarc static char buf[128]; 62338674Smarc char *bp; 6241179Sbill 62538674Smarc *buf = 0, bp = buf; 62638674Smarc if (c == _POSIX_VDISABLE) 62738674Smarc if (fmt == 2) 62838674Smarc return("<u>"); 62938674Smarc else 63038674Smarc return("<undef>"); 63138674Smarc if (c & 0200) { 63238674Smarc strcat(buf, "M-"); 63338674Smarc *bp++ = 'M'; 63438674Smarc *bp++ = '-'; 63538674Smarc c &= 0177; 6361179Sbill } 63738674Smarc if (c == 0177) { 63838674Smarc *bp++ = '^'; 63938674Smarc *bp++ = '?'; 6401179Sbill } 64138674Smarc else if (c < 040) { 64238674Smarc *bp++ = '^'; 64338674Smarc *bp++ = c + '@'; 64438674Smarc } 64538674Smarc else 64638674Smarc *bp++ = c; 64738674Smarc *bp = 0; 64838674Smarc return(buf); 6491179Sbill } 6501179Sbill 65138674Smarc STATIC 65238674Smarc mdput(s) 65338674Smarc char *s; 6541179Sbill { 65538674Smarc static int col = 0; 6561179Sbill 65738674Smarc if (s == (char *)0) { 65838674Smarc if (col) { 65938674Smarc put("\n"); 66038674Smarc col = 0; 66138674Smarc } 6621179Sbill return; 6631179Sbill } 66438674Smarc if ((col += strlen(s)) > WRAPCOL) { 66538674Smarc put("\n"); 66638674Smarc col = strlen(s); 6671179Sbill } 66838674Smarc put(s); 6691179Sbill } 6701179Sbill 67138674Smarc STATIC 672*40169Skarels put(f, a) /* ??? */ 67338674Smarc char *f; 6741179Sbill { 67538674Smarc _doprnt(f, &a, OUT); 67638674Smarc } 6771179Sbill 67838674Smarc STATIC 67938674Smarc warning(s, a) 68038674Smarc char *s; 68138674Smarc { 68238674Smarc fprintf(ERR, "stty: warning: "); 683*40169Skarels _doprnt(s, &a, ERR); /* ??? */ 68438674Smarc fprintf(ERR, "\n"); 6851179Sbill } 6861179Sbill 68738674Smarc STATIC 68838674Smarc errexit(s, a) 68938674Smarc char *s; 69038674Smarc { 69138674Smarc fprintf(ERR, "stty: "); 692*40169Skarels _doprnt(s, &a, ERR); /* ??? */ 69338674Smarc fprintf(ERR, "\n"); 69438674Smarc exit(1); 69538674Smarc } 6961179Sbill 69738674Smarc STATIC 698*40169Skarels syserrexit(s, a) /* ??? */ 69938674Smarc char *s; 7001179Sbill { 70138674Smarc fprintf(ERR, "stty: "); 70238674Smarc _doprnt(s, &a, ERR); 70338674Smarc fprintf(ERR, ": %s\n", sys_errlist[errno]); 70438674Smarc exit(1); 7051179Sbill } 706