/*- * Copyright (c) 1991, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include #include #include #ifndef __USE_MISC #define __USE_MISC 1 #endif #include #include #include "stty_print.h" #define LINELENGTH 80 struct cchar { const char *name; int sub; unsigned char def; }; static void binit(const char *); static void bput(const char *); static const char *ccval(struct cchar *, int); /* * Special control characters. * * Cchars1 are the standard names, cchars2 are the old aliases. * The first are displayed, but both are recognized on the * command line. */ struct cchar cchars1[] = { { "discard", VDISCARD, CDISCARD }, // { "dsusp", VDSUSP, CDSUSP }, { "eof", VEOF, CEOF }, { "eol", VEOL, CEOL }, { "eol2", VEOL2, CEOL }, { "erase", VERASE, CERASE }, { "intr", VINTR, CINTR }, { "kill", VKILL, CKILL }, { "lnext", VLNEXT, CLNEXT }, { "min", VMIN, CMIN }, { "quit", VQUIT, CQUIT }, { "reprint", VREPRINT, CREPRINT }, { "start", VSTART, CSTART }, // { "status", VSTATUS, CSTATUS }, { "stop", VSTOP, CSTOP }, // { "susp", VSUSP, CSUSP }, { "time", VTIME, CTIME }, { "werase", VWERASE, CWERASE }, { NULL, 0, 0}, }; struct cchar cchars2[] = { { "brk", VEOL, CEOL }, { "flush", VDISCARD, CDISCARD }, { "rprnt", VREPRINT, CREPRINT }, { NULL, 0, 0 }, }; void stty_print(struct termios *tp, struct winsize *wp) { struct cchar *p; long tmp; unsigned char *cc; int cnt, ispeed, ospeed; char buf1[100]; cnt = 0; /* Line speed. */ ispeed = cfgetispeed(tp); ospeed = cfgetospeed(tp); if (ispeed != ospeed) cnt += printf("ispeed %d baud; ospeed %d baud;", ispeed, ospeed); else cnt += printf("speed %d baud;", ispeed); cnt += printf(" %d rows; %d columns;", wp->ws_row, wp->ws_col); if (cnt) (void)printf("\n"); #define on(f) ((tmp & (f)) != 0) #define put(n, f, d) \ if (0 || on(f) != (d)) \ bput((n) + on(f)); /* "local" flags */ tmp = tp->c_lflag; binit("lflags"); put("-icanon", ICANON, 1); put("-isig", ISIG, 1); put("-iexten", IEXTEN, 1); put("-echo", ECHO, 1); put("-echoe", ECHOE, 0); put("-echok", ECHOK, 0); // put("-echoke", ECHOKE, 0); put("-echonl", ECHONL, 0); // put("-echoctl", ECHOCTL, 0); // put("-echoprt", ECHOPRT, 0); // put("-altwerase", ALTWERASE, 0); put("-noflsh", NOFLSH, 0); put("-tostop", TOSTOP, 0); // put("-flusho", FLUSHO, 0); // put("-pendin", PENDIN, 0); // put("-nokerninfo", NOKERNINFO, 0); // put("-extproc", EXTPROC, 0); /* input flags */ tmp = tp->c_iflag; binit("iflags"); put("-istrip", ISTRIP, 0); put("-icrnl", ICRNL, 1); put("-inlcr", INLCR, 0); put("-igncr", IGNCR, 0); put("-ixon", IXON, 1); put("-ixoff", IXOFF, 0); put("-ixany", IXANY, 1); put("-imaxbel", IMAXBEL, 1); put("-ignbrk", IGNBRK, 0); put("-brkint", BRKINT, 1); put("-inpck", INPCK, 0); put("-ignpar", IGNPAR, 0); put("-parmrk", PARMRK, 0); /* output flags */ tmp = tp->c_oflag; binit("oflags"); put("-opost", OPOST, 1); put("-onlcr", ONLCR, 1); put("-ocrnl", OCRNL, 0); // put("-oxtabs", OXTABS, 1); // put("-onocr", OXTABS, 0); // put("-onlret", OXTABS, 0); /* control flags (hardware state) */ tmp = tp->c_cflag; binit("cflags"); put("-cread", CREAD, 1); switch(tmp&CSIZE) { case CS5: bput("cs5"); break; case CS6: bput("cs6"); break; case CS7: bput("cs7"); break; case CS8: bput("cs8"); break; } bput("-parenb" + on(PARENB)); put("-parodd", PARODD, 0); put("-hupcl", HUPCL, 1); put("-clocal", CLOCAL, 0); put("-cstopb", CSTOPB, 0); // switch(tmp & (CCTS_OFLOW | CRTS_IFLOW)) { // case CCTS_OFLOW: // bput("ctsflow"); // break; // case CRTS_IFLOW: // bput("rtsflow"); // break; // default: // put("-crtscts", CCTS_OFLOW | CRTS_IFLOW, 0); // break; // } // put("-dsrflow", CDSR_OFLOW, 0); // put("-dtrflow", CDTR_IFLOW, 0); // put("-mdmbuf", MDMBUF, 0); /* XXX mdmbuf == dtrflow */ /* special control characters */ cc = tp->c_cc; binit("cchars"); for (p = cchars1; p->name; ++p) { (void)snprintf(buf1, sizeof(buf1), "%s = %s;", p->name, ccval(p, cc[p->sub])); bput(buf1); } binit(NULL); } static int col; static const char *label; static void binit(const char *lb) { if (col) { (void)printf("\n"); col = 0; } label = lb; } static void bput(const char *s) { if (col == 0) { col = printf("%s: %s", label, s); return; } if ((col + strlen(s)) > LINELENGTH) { (void)printf("\n\t"); col = printf("%s", s) + 8; return; } col += printf(" %s", s); } static const char * ccval(struct cchar *p, int c) { static char buf[5]; char *bp; if (p->sub == VMIN || p->sub == VTIME) { (void)snprintf(buf, sizeof(buf), "%d", c); return (buf); } if (c == _POSIX_VDISABLE) return (""); bp = buf; if (c & 0200) { *bp++ = 'M'; *bp++ = '-'; c &= 0177; } if (c == 0177) { *bp++ = '^'; *bp++ = '?'; } else if (c < 040) { *bp++ = '^'; *bp++ = c + '@'; } else *bp++ = c; *bp = '\0'; return (buf); }