da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * stty.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Written by David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Tue Apr 4 10:46:00 EDT 1995
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[-?@(#)$Id: stty (AT&T Research) 2008-11-10 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE_LICENSE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?stty - set or get terminal modes]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?\bstty\b sets certain terminal I/O modes for the device "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "that is the current standard input; without arguments, it writes "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "the settings of certain modes to standard output.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[a:all?Writes to standard output all of the mode settings.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[g:save?Writes the current settings to standard output in a form that can "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "be used as an argument to another \bstty\b command. The \brows\b "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "and \bcolumns\b values are not included.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[t:terminal-group?Print the terminal group id of the device, -1 if unknown.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n[mode ...]\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+EXTENDED DESCRIPTION?Modes are specified either as a single name or "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "as a name followed by a value. As indicated below, many of the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "mode names can be preceded by a \b-\b to negate its meaning. "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "Modes are listed by group corresponding to field in the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "\btermios\b structure defined in \b<termios.h>\b. Modes "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "in the last group are implemented using options in the previous "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "groups. Note that many combinations of modes make no sense, but "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "no sanity checking is performed. The modes are selected from the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "following:]{\fabc\f}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+EXIT STATUS?]{"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "[+0?All modes reported or set successfully.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "[+>0?Standard input not a terminaol or one or more modes failed.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\btegetattr\b(2), \btcsetattr\b(2), \bioctl\b(2)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <cmd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ccode.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ctype.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast_tty.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_ioctl
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/ioctl.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C(x) ERROR_catalog(x)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef _POSIX_VDISABLE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define _POSIX_VDISABLE 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef NCCS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef NCC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define NCCS NCC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define NCCS elementsof(((struct termio*)0)->c_cc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* command options */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_FLAG 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define G_FLAG 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define T_FLAG 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* termios fields */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_FLAG 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_LINE 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_SPEED 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define I_FLAG 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_FLAG 5
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define L_FLAG 6
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_CHAR 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define W_SIZE 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BIT 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BITS 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NUM 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CHAR 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SPEED 5
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SIZE 6
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MIXED 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SANE 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COOKED 9
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CASE 10
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TABS 11
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define WIND 12
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SS /* who co-opted this namespace? */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define IG 0x0001 /* ignore display */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NL 0x0002 /* entry ends line of display */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SS 0x0004 /* set in sane mode */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define US 0x0010 /* unset in sane mode */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct tty_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char name[8];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char type;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char field;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned long mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned long val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char description[76];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Tty_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const Tty_t Ttable[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef CBAUD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ispeed", NUM, C_SPEED,0, CBAUD, 0, C("\an\a is the input baud rate") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ospeed", NUM, C_SPEED,0, CBAUD, 0, C("\an\a is the output baud rate") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "speed", NUM, C_SPEED,IG, CBAUD },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "0", SPEED, C_FLAG, 0, B0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "50", SPEED, C_FLAG, 0, B50 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "75", SPEED, C_FLAG, 0, B75 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "110", SPEED, C_FLAG, 0, B110 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "134", SPEED, C_FLAG, 0, B134 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "150", SPEED, C_FLAG, 0, B150 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "200", SPEED, C_FLAG, 0, B200 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "300", SPEED, C_FLAG, 0, B300 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "600", SPEED, C_FLAG, 0, B600 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "1200", SPEED, C_FLAG, 0, B1200 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "1800", SPEED, C_FLAG, 0, B1800 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "2400", SPEED, C_FLAG, 0, B2400 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "4800", SPEED, C_FLAG, 0, B4800 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "9600", SPEED, C_FLAG, 0, B9600 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "19200", SPEED, C_FLAG, 0, B19200 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "38400", SPEED, C_FLAG, 0, B38400 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef TIOCSWINSZ
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "rows", WIND, W_SIZE, IG, 0, 24, C("\an\a is the number of lines for display") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cols", WIND, W_SIZE, IG, 1, 80, C("\an\a is the number of columns for display") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "columns", WIND, W_SIZE, IG, 1, 80, C("Same as \bcols\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "intr", CHAR, T_CHAR, SS, VINTR, 'C', C("Send an interrupt signal") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "quit", CHAR, T_CHAR, SS, VQUIT, '|', C("Send a quit signal") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "erase", CHAR, T_CHAR, SS, VERASE, 'H', C("Erase the last character entered") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "kill", CHAR, T_CHAR, NL|SS, VKILL, 'U', C("Erase the current line") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "eof", CHAR, T_CHAR, SS, VEOF, 'D', C("Send an end of file") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VEOL2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "eol2", CHAR, T_CHAR, US, VEOL2, _POSIX_VDISABLE, C("Alternate character to end the line") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VEOL2 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VSWTCH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "swtch", CHAR, T_CHAR, US, VSWTCH, _POSIX_VDISABLE, C("Switch to a different shell layer") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VSWTCH */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "eol", CHAR, T_CHAR, NL|US, VEOL, _POSIX_VDISABLE, C("End the line") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VSTART
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "start", CHAR, T_CHAR, SS, VSTART, 'Q', C("Restart the output after stopping it") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VSTART */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VSTOP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "stop", CHAR, T_CHAR, SS, VSTOP, 'S', C("Stop the output") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VSTOP */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VDSUSP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "dsusp", CHAR, T_CHAR, SS, VDSUSP, 'Y', C("Send a terminal stop signal after flushing the input") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VDSUSP */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VSUSP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "susp", CHAR, T_CHAR, NL|SS, VSUSP, 'Z', C("Send a terminal stop signal") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VSUSP */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VREPRINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "rprnt", CHAR, T_CHAR, SS, VREPRINT, 'R', C("Redraw the current line") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VREPRINT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VDISCARD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "flush", CHAR, T_CHAR, SS, VDISCARD, 'O', C("Discard output") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VDISCARD */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VWERASE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "werase", CHAR, T_CHAR, SS, VWERASE, 'W', C("Erase the last word entered") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VWERASE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VLNEXT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "lnext", CHAR, T_CHAR, NL|SS, VLNEXT, 'V', C("Enter the next input character literally") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* VLNEXT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_c_line_termios
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "line", NUM, C_LINE, 0, 0, 0, C("Line discipline number") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "min", NUM, T_CHAR, 0, VMIN, 0, C("Mininmum number of characters to read in raw mode") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "time", NUM, T_CHAR, 0, VTIME, 0, C("Number of .1 second intervals with raw mode") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "parenb", BIT, C_FLAG, 0, PARENB, PARENB, C("Enable (disable) parity generation and detection") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "parodd", BIT, C_FLAG, 0, PARODD, PARODD, C("Use odd (even) parity") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef PAREXT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "parext", BIT, C_FLAG, 0, PAREXT, PAREXT },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* PAREXT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef CREAD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cread", BIT, C_FLAG, SS, CREAD, CREAD, C("Enable (disable) input") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* CREAD */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cs5", SIZE, C_FLAG, 0, CSIZE, CS5 , C("Char size 5") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cs6", SIZE, C_FLAG, 0, CSIZE, CS6 , C("Char size 6") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cs7", SIZE, C_FLAG, 0, CSIZE, CS7 , C("Char size 7") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cs8", SIZE, C_FLAG, 0, CSIZE, CS8 , C("Char size 8") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "hupcl", BIT, C_FLAG, 0, HUPCL, HUPCL, C("Hangup (do not hangup) connection on last close") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "hup", BIT, C_FLAG, IG, HUPCL, HUPCL, C("Same as \bhupcl\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cstopb", BIT, C_FLAG, 0, CSTOPB, CSTOPB, C("Use two (one) stop bits") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef CRTSCTS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "crtscts", BIT, C_FLAG, 0, CRTSCTS, CRTSCTS, C("Enable (disable) RTS/CTS handshaking") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* CRTSCTS */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "clocal", BIT, C_FLAG, NL, CLOCAL, CLOCAL, C("Disable (enable) modem control signals") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ignbrk", BIT, I_FLAG, US, IGNBRK, IGNBRK, C("Ignore (do not ignore) break characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "brkint", BIT, I_FLAG, SS, BRKINT, BRKINT, C("Generate (do not generate) INTR signal on break") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ignpar", BIT, I_FLAG, 0, IGNPAR, IGNPAR, C("Ignore (do not ignore) characters with parity errors") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "parmrk", BIT, I_FLAG, 0, PARMRK, PARMRK, C("Mark (do not mark) parity errors") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "inpck", BIT, I_FLAG, 0, INPCK, INPCK, C("Enable (disable) input parity checking") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "istrip", BIT, I_FLAG, 0, ISTRIP, ISTRIP, C("Clear (do not clear) high bit of input characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "inlcr", BIT, I_FLAG, US, INLCR, INLCR, C("Translate (do not translate) carriage return to newline") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "igncr", BIT, I_FLAG, US, IGNCR, IGNCR, C("Ignore (do not ignore) carriage return") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef IUCLC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "iuclc", BIT, I_FLAG, US, IUCLC, IUCLC, C("Map (do not map) upper-case to lower case") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* IUCLC */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ixon", BIT, I_FLAG, 0, IXON, IXON, C("Enable (disable) XON/XOFF flow control. \bstop\b character stops output") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef IXANY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ixany", BIT, I_FLAG, US, IXANY, IXANY, C("Any character (only start character) can restart output.") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "decctlq", BIT, I_FLAG, IG, IXANY, 0, C("Same as \b-ixany\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* IXANY */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ixoff", BIT, I_FLAG, US, IXOFF, IXOFF, C("Disable (enable) XON/XOFF flow control") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef IMAXBEL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "imaxbel", BIT, I_FLAG, SS, IMAXBEL, IMAXBEL, C("Beep (do not beep) if a character arrives with full input buffer") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* IMAXBEL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "icrnl", BIT, I_FLAG, NL|SS, ICRNL, ICRNL, C("Translate (do not translate) carriage return to newline") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "isig", BIT, L_FLAG, SS, ISIG, ISIG, C("Enable (disable) \bintr\b, \bquit\b, and \bsusp\b special characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "icanon", BIT, L_FLAG, SS, ICANON, ICANON, C("Enable (disable) \berase\b, \bkill\b, \bwerase\b, and \brprnt\b special characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "icannon", BIT, L_FLAG, SS, ICANON, ICANON },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef IEXTEN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "iexten", BIT, L_FLAG, SS, IEXTEN, IEXTEN, C("Enable (disable) non-POSIX special characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* IEXTEN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echo", BIT, L_FLAG, SS, ECHO|ECHONL, ECHO|ECHONL, C("Echo (do not echo) input characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echoe", BIT, L_FLAG, SS, ECHOE, ECHOE, C("Echo (do not echo) erase characters as backspace-space-backspace") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echok", BIT, L_FLAG, SS, ECHOK, ECHOK, C("Echo (do not echo) a newline after a kill character") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ECHOKE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echoke", BIT, L_FLAG, SS, ECHOKE, ECHOKE, C("Echo (do not echo) a newline after a kill character") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "lfkc", BIT, L_FLAG, IG, ECHOK, ECHOK, C("Same as \bechok\b (\b-echok\b); obsolete") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echonl", BIT, L_FLAG, SS, ECHONL, ECHONL,"Echo (do not echo) newline even if not echoing other character" },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ECHOCTL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echoctl", BIT, L_FLAG, SS, ECHOCTL, ECHOCTL, C("Echo (do not echo) control characters as \b^\b\ac\a") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ECHOCTL 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ECHOCTL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ECHOPRT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "echoprt", BIT, L_FLAG, US, ECHOPRT, ECHOPRT, C("Echo (do not echo) erased characters backward, between '\\' and '/'") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ECHOPRT 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ECHOPRT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef XCASE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "xcase", BIT, L_FLAG, US, XCASE, XCASE, C("Enable (disable) \bicanon\b uppercase as lowercase with '\\' prefix") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* XCASE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef DEFECHO
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "defecho", BIT, L_FLAG, 0, DEFECHO, DEFECHO },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* DEFECHO */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef FLUSHO
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "flusho", BIT, L_FLAG, 0, FLUSHO, FLUSHO, C("Discard (do not discard) written data. Cleared by subsequent input") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* FLUSHO */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef PENDIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "pendin", BIT, L_FLAG, 0, PENDIN, PENDIN, C("Redisplay pending input at next read and then automatically clear \bpendin\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* PENDIN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "noflsh", BIT, L_FLAG, US, NOFLSH, NOFLSH, C("Disable (enable) flushing after \bintr\b and \bquit\b special characters") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef TOSTOP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "tostop", BIT, L_FLAG, NL|US, TOSTOP, TOSTOP, C("Stop (do not stop) background jobs that try to write to the terminal") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* TOSTOP */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef OLCUC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "olcuc", BIT, O_FLAG, US, OLCUC, OLCUC, C("Translate (do not translate) lowercase characters to uppercase") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* OLCUC */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ONLCR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "onlcr", BIT, O_FLAG, SS, ONLCR, ONLCR, C("Translate (do not translate) newline to carriage return-newline") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ONLCR */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ONLRET
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "onlret", BIT, O_FLAG, US, ONLRET, ONLRET, C("Newline performs (does not perform) a carriage return") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ONLRET */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef OCRNL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ocrnl", BIT, O_FLAG, US, OCRNL, OCRNL, C("Translate (do not translate) carriage return to newline") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* OCRNL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ONOCR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "onocr", BIT, O_FLAG, US, ONOCR, ONOCR, C("Do not (do) print carriage returns in the first column") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ONOCR */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef OFILL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ofill", BIT, O_FLAG, US, OFILL, OFILL, C("Use fill characters (use timing) for delays") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* OFILL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef OFDEL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ofdel", BIT, O_FLAG, US, OFDEL, OFDEL, C("Use DEL (NUL) as fill characters for delays") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* OFDEL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "opost", BIT, O_FLAG, SS, OPOST, OPOST, C(" Postprocess (do not postprocess) output") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef CRDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cr0", BITS, O_FLAG, IG|SS, CRDLY, CR0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cr1", BITS, O_FLAG, US, CRDLY, CR1 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cr2", BITS, O_FLAG, US, CRDLY, CR2 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cr3", BITS, O_FLAG, US, CRDLY, CR3 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef NLDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "nl0", BITS, O_FLAG, IG|US, NLDLY, NL0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "nl1", BITS, O_FLAG, US, NLDLY, NL1 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef TABDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "tabs", TABS, O_FLAG, IG, TABDLY, TAB3, C("Preserve (expand to spaces) tabs") },
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef TAB0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "tab0", BITS, O_FLAG, IG|SS, TABDLY, TAB0 },
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef TAB1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "tab1", BITS, O_FLAG, US, TABDLY, TAB1 },
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef TAB2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "tab2", BITS, O_FLAG, US, TABDLY, TAB2 },
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "tab3", BITS, O_FLAG, US, TABDLY, TAB3 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef BSDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "bs0", BITS, O_FLAG, IG|SS, BSDLY, BS0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "bs1", BITS, O_FLAG, US, BSDLY, BS1 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VTDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "vt0", BITS, O_FLAG, IG|SS, VTDLY, VT0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "vt1", BITS, O_FLAG, US, VTDLY, VT1 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef FFDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ff0", BITS, O_FLAG, IG|SS, FFDLY, FF0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ff1", BITS, O_FLAG, US, FFDLY, FF1 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "", MIXED, O_FLAG, NL|IG },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "evenp", MIXED, C_FLAG, IG, PARENB, 0, C("Same as \bparenb -parodd cs7\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "oddp", MIXED, C_FLAG, IG, PARODD, 0, C("Same as \bparenb parodd cs7\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "parity", MIXED, C_FLAG, IG, 0, 0, C("Same as parenb \b-parodd cs7\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "ek", MIXED, C_FLAG, IG, 0, 0, C("Reset the \berase\b and \bkill\b special characters to their default values") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "sane", SANE, C_FLAG, IG, 0, 0, C("Reset all modes to some reasonable values") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "cooked", COOKED, C_FLAG, IG, 0, 0, C("Disable raw input and output") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "raw", COOKED, C_FLAG, IG, 0, 0, C("Enable raw input and output") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "lcase", CASE, C_FLAG, IG, 0 , 0, C("Set \bxcase\b, \biuclc\b, and \bolcuc\b") },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ "LCASE", CASE, C_FLAG, IG, 0 , 0, C("Same as \blcase\b") }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CC_NATIVE == CC_ASCII
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define cntl(x) (((x)=='?')?0177:((x)&037))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define cntl(x) (((x)=='?')?ccmapc(0177,CC_ASCII,CC_NATIVE):ccmapc(ccmapc(x,CC_NATIVE,CC_ASCII)&037,CC_ASCII,CC_NATIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sane(register struct termios *sp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const Tty_t* tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (tp = Ttable; tp < &Ttable[elementsof(Ttable)]; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->flags & (SS|US))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (tp->type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case BIT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case BITS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (tp->field)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->flags & SS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case I_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->flags & SS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case O_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->flags & SS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case L_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->flags & SS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_lflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_lflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case CHAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cc[tp->mask] = cntl(tp->val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int gin(char *arg,struct termios *sp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_lflag = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0;i< NCCS; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cc[i] = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_c_line_termios
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_line =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cfsetispeed(sp, i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = strtol(arg,&arg,16);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg++ != ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cfsetospeed(sp, i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*arg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void gout(struct termios *sp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",sp->c_iflag);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",sp->c_oflag);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",sp->c_cflag);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",sp->c_lflag);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0;i< NCCS; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",sp->c_cc[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_c_line_termios
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x", sp->c_line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",cfgetispeed(sp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":%x",cfgetospeed(sp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,":\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void output(struct termios *sp, int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Tty_t *tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct termios tty;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int delim = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i,off,off2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char schar[2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned int ispeed = cfgetispeed(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned int ospeed = cfgetospeed(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&G_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gout(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tty = *sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sane(&tty);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp= &Ttable[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->flags&IG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->flags&NL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sfstdout,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(tp->type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case BIT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case BITS:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin off = off2 = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(tp->field)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sp->c_cflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tty.c_cflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off2 = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case I_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sp->c_iflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tty.c_iflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off2 = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case O_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((sp->c_oflag&tp->mask)==tp->val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tty.c_oflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off2 = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case L_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sp->c_lflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tty.c_lflag&tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off2 = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->flags&NL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin delim = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!flags && off==off2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s%c",tp->name,delim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(tp->type==BIT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"-%s%c",tp->name,delim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin delim = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case CHAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = sp->c_cc[tp->mask];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->flags&NL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin delim = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!flags && off==(unsigned char)tty.c_cc[tp->mask])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off==_POSIX_VDISABLE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s = <undef>;%c",tp->name,delim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(isprint(off&0xff))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s = %c;%c",tp->name,off,delim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CC_NATIVE == CC_ASCII
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s = ^%c;%c",tp->name,off==0177?'?':(off^0100),delim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = ccmapc(off, CC_NATIVE, CC_ASCII);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s = ^%c;%c",tp->name,off==0177?'?':ccmapc(off^0100,CC_ASCII,CC_NATIVE),delim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin delim = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SIZE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((sp->c_cflag&CSIZE)!=tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags || (sp->c_cflag&CSIZE) != (tty.c_cflag&CSIZE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s ",tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SPEED:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->mask==ispeed)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ispeed!=ospeed)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin schar[0]='i';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin schar[0]=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(tp->mask==ospeed)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin schar[0]='o';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin schar[1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef TIOCSWINSZ
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct winsize win;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = ioctl(0,TIOCGWINSZ,&win);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%sspeed %s baud; rows %d; columns %d;\n",schar,tp->name,win.ws_row,win.ws_col);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%sspeed %s baud;\n",schar,tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(delim=='\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sfstdout,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const Tty_t *lookup(const char *name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(strcmp(Ttable[i].name,name)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(&Ttable[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const Tty_t *getspeed(unsigned long val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Ttable[i].type==SPEED && Ttable[i].mask==val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(&Ttable[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int gettchar(register const char *cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*cp==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp[1]==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((unsigned)cp[0]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*cp=='^' && cp[1] && cp[2]==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(cp[1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '-':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(cntl(cp[1]));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(streq(cp,"undef") || streq(cp,"<undef>"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(*((unsigned char*)cp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void set(char *argv[], struct termios *sp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Tty_t *tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c,off;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *ep;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp = *argv++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*cp=='-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(tp=lookup(cp)) || (off && (tp->type!=BIT) && (tp->type!=TABS)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1),"%s: unknown mode",cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(tp->type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case CHAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1),"%s: unknown mode",cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!*argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1),"missing argument to %s",cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = gettchar(*argv++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cc[tp->mask] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cc[tp->mask] = _POSIX_VDISABLE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case BIT: case BITS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(tp->field)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case I_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case O_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag |= tp->val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case L_FLAG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_lflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_lflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TABS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag &= ~tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag |= tp->val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef TIOCSWINSZ
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case WIND:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct winsize win;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ioctl(0,TIOCGWINSZ,&win)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(1),"cannot set %s",tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(cp= *argv))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%d\n",tp->mask?win.ws_col:win.ws_row);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n=strtol(cp,&cp,10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(1),"%d: invalid number of %s",argv[-1],tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin win.ws_col = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin win.ws_row = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ioctl(0,TIOCSWINSZ,&win)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(1),"cannot set %s",tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case NUM:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = *argv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->field == C_SPEED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp = getspeed(*tp->name == 'i' ? cfgetispeed(sp) : cfgetospeed(sp)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout, "%s\n", tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "%s: missing numeric argument", tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = (int)strtol(cp, &ep, 10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ep)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "%s: %s: numeric argument expected", tp->name, cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (tp->field)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_c_line_termios
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_LINE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_line = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_SPEED:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(getspeed(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*tp->name != 'o')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cfsetispeed(sp, c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*tp->name != 'i')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cfsetospeed(sp, c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "%s: %s: invalid speed", tp->name, cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_CHAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cc[tp->mask] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SPEED:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cfsetospeed(sp, tp->mask);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cfsetispeed(sp, tp->mask);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SIZE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag &= ~CSIZE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_cflag |= tp->mask;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SANE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sane(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(OLCUC) && defined(IUCLC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case CASE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(off)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag |= IUCLC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag |= OLCUC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_iflag &= ~IUCLC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp->c_oflag &= ~OLCUC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* OLCUC && IUCLC */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void listchars(Sfio_t *sp,int type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i,c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = (type==CHAR?'c':'n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Ttable[i].type==type && *Ttable[i].description)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"[+%s \a%c\a?%s.]",Ttable[i].name,c,Ttable[i].description);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void listgroup(Sfio_t *sp,int type, const char *description)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"[+");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Ttable[i].type==type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"%s ",Ttable[i].name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"?%s.]",description);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void listmask(Sfio_t *sp,unsigned int mask,const char *description)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"[+");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Ttable[i].mask==mask && Ttable[i].type==BITS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"%s ",Ttable[i].name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"?%s.]",description);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void listfields(Sfio_t *sp,int field)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < elementsof(Ttable); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(Ttable[i].field==field && Ttable[i].type==BIT && *Ttable[i].description)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"[+%s (-%s)?%s.]",Ttable[i].name,Ttable[i].name,Ttable[i].description);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void listmode(Sfio_t *sp,const char *name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"[+%s?%s.]",name,lookup(name)->description);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int infof(Opt_t* op, Sfio_t* sp, const char* s, Optdisc_t* dp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(dp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"[+Control Modes.]{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listfields(sp,C_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listgroup(sp,SPEED,"Attempt to set input and output baud rate to number given. A value of \b0\b causes immediate hangup");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listchars(sp,NUM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listgroup(sp,SIZE,"Number of bits in a character");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"}[+Input Modes.]{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listfields(sp,I_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"}[+Output Modes.]{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listfields(sp,O_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef CRDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmask(sp,CRDLY,"Carriage return delay style");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef NLDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmask(sp,NLDLY,"Newline delay style");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef TABDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmask(sp,TABDLY,"Horizontal tab delay style");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef BSDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmask(sp,BSDLY,"Backspace delay style");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef FFDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmask(sp,FFDLY,"Form feed delay style");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef VTDLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmask(sp,VTDLY,"Vertical tab delay style");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"}[+Local Modes.]{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listfields(sp,L_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"}[+Control Assignments.?If \ac\a is \bundef\b or an empty "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "string then the control assignment is disabled.]{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listchars(sp,WIND);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listchars(sp,CHAR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,"}[+Combination Modes.]{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"ek");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"evenp");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"lcase");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"oddp");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"parity");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"sane");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"tabs");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin listmode(sp,"LCASE");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sp,'}');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifndef _lib_tcgetpgrp
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ifdef TIOCGPGRP
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin static int _i_;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# define tcgetpgrp(a) (ioctl(a, TIOCGPGRP, &_i_)>=0?_i_:-1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# define tcgetpgrp(a) (-1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# endif /* TIOCGPGRP */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif /* _lib_tcgetpgrp */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb_stty(int argc, char** argv, void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct termios tty;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Tty_t* tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Optdisc_t disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tcgetattr(0, &tty) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(1),"not a tty");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(&disc, 0, sizeof(disc));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin disc.version = OPT_VERSION;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin disc.infof = infof;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.disc = &disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (n = optget(argv, usage))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'g':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 't':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!opt_info.offset || !argv[opt_info.index][opt_info.offset])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= A_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'g':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= G_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 't':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz flags |= T_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!opt_info.offset)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(tp = lookup(argv[opt_info.index]+1)) || (tp->type != BIT && tp->type != TABS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "%s: unknown mode", argv[opt_info.index]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (error_info.errors || (flags && *argv) || (flags&(flags-1)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_usage(2), "%s", optusage(NiL));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (flags & T_FLAG)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstdout, "%d\n", tcgetpgrp(0));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (*argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!argv[1] && **argv == ':')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gin(*argv, &tty);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(argv, &tty);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tcsetattr(0, TCSANOW, &tty) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(1), "cannot set tty");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin output(&tty, flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return error_info.errors;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}