📄 term.c
字号:
/* Copyright (C) 1998,2001 Free Software Foundation, Inc. This file is part of GNU Inetutils. GNU Inetutils is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Inetutils is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Inetutils; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */#include <telnetd.h>#if defined(HAVE_TERMIOS_H)typedef struct termios TERMDESC;# define _term_getattr tcgetattr# define _term_setattr(fd, tp) tcsetattr (fd, TCSANOW, tp)#elif defined(HAVE_TERMIO_H)typedef struct termio TERMDESC;# define _term_getattr tcgetattr# define _term_setattr(fd, tp) tcsetattr (fd, TCSANOW, tp)#else#define IOCTL_INTERFACEtypedef struct { struct sgttyb sg; struct tchars tc; struct ltchars ltc; int state; int lflags;#define termdesc_eofc tc.t_eofc#define termdesc_erase tc.sg.sg_erase#define termdesc_kill sg.sg_kill#define termdesc_ip tc.t_intrc#define termdesc_abort tc.t_quitc#define termdesc_xon tc.t_startc#define termdesc_xoff tc.t_stopc#define termdesc_ao ltc.t_flushc#define termdesc_susp ltc.t_suspc#define termdesc_ew ltc.t_werasc#define termdesc_rp ltc.t_rprntc#define termdesc_lnext ltc.t_lnextc#define termdesc_forw1 tc.t_brkc} TERMDESC;# define cfsetospeed(tp, val) (tp)->sg.sg_ospeed = (val)# define cfsetispeed(tp, val) (tp)->sg.sg_ispeed = (val)# define cfgetospeed(tp) (tp)->sg.sg_ospeed# define cfgetispeed(tp) (tp)->sg.sg_ispeedint_term_getattr (int fd, TERMDESC *tp){ ioctl (fd, TIOCGETP, (char *)&tp->sg); ioctl (fd, TIOCGETC, (char *)&tp->tc); ioctl (fd, TIOCGLTC, (char *)&tp->ltc);# ifdef TIOCGSTATE ioctl (fd, TIOCGSTATE, (char *)&tp->state);# endif return 0;}#endifTERMDESC termbuf, termbuf2;#ifdef IOCTL_INTERFACEvoid_term_setattr (int fd, TERMDESC *tp){ ioctl (fd, TIOCSETN, (char *)&tp->sg); ioctl (fd, TIOCSETC, (char *)&tp->tc); ioctl (fd, TIOCSLTC, (char *)&tp->ltc); ioctl (fd, TIOCLSET, &tp->lflags);}voidterm_send_eof (){ /*nothing*/}intterm_change_eof (){ return 0;}inttty_linemode(){ return termbuf.state & TS_EXTPROC;}voidtty_setlinemode (int on){#ifdef TIOCEXT set_termbuf (); ioctl (pty, TIOCEXT, (char *)&on); init_termbuf ();#else /* !TIOCEXT */# ifdef EXTPROC if (on) termbuf.c_lflag |= EXTPROC; else termbuf.c_lflag &= ~EXTPROC;# endif#endif /* TIOCEXT */}inttty_isecho (){ return termbuf.sg.sg_flags & ECHO;}inttty_flowmode (){ return ((termbuf.tc.t_startc) > 0 && (termbuf.tc.t_stopc) > 0) ? 1 : 0;}inttty_restartany (){# ifdef DECCTQ return (termbuf.lflags & DECCTQ) ? 0 : 1;# else return -1;# endif}voidtty_setecho(int on){ if (on) termbuf.sg.sg_flags |= ECHO|CRMOD; else termbuf.sg.sg_flags &= ~(ECHO|CRMOD);}inttty_israw (){ return termbuf.sg.sg_flags & RAW;}#if defined (AUTHENTICATION) && defined(NO_LOGIN_F) && defined(LOGIN_R)inttty_setraw(int on){ if (on) termbuf.sg.sg_flags |= RAW; else termbuf.sg.sg_flags &= ~RAW;}#endifvoidtty_binaryin (int on){ if (on) termbuf.lflags |= LPASS8; else termbuf.lflags &= ~LPASS8;}voidtty_binaryout (int on){ if (on) termbuf.lflags |= LLITOUT; else termbuf.lflags &= ~LLITOUT;}inttty_isbinaryin (){ return termbuf.lflags & LPASS8;}inttty_isbinaryout (){ return termbuf.lflags & LLITOUT;}inttty_isediting (){ return !(termbuf.sg.sg_flags & (CBREAK|RAW));}inttty_istrapsig(){ return !(termbuf.sg.sg_flags&RAW);}voidtty_setedit (int on){ if (on) termbuf.sg.sg_flags &= ~CBREAK; else termbuf.sg.sg_flags |= CBREAK;}voidtty_setsig (int on){}inttty_issofttab (){ return termbuf.sg.sg_flags & XTABS;}voidtty_setsofttab (int on){ if (on) termbuf.sg.sg_flags |= XTABS; else termbuf.sg.sg_flags &= ~XTABS;}inttty_islitecho (){ return !(termbuf.lflags & LCTLECH);}voidtty_setlitecho (int on){ if (on) termbuf.lflags &= ~LCTLECH; else termbuf.lflags |= LCTLECH;}inttty_iscrnl (){ return termbuf.sg.sg_flags & CRMOD;}#else# define termdesc_eofc c_cc[VEOF]# define termdesc_erase c_cc[VERASE]# define termdesc_kill c_cc[VKILL]# define termdesc_ip c_cc[VINTR]# define termdesc_abort c_cc[VQUIT]# ifdef VSTART# define termdesc_xon c_cc[VSTART]# endif# ifdef VSTOP# define termdesc_xoff c_cc[VSTOP]# endif# if !defined(VDISCARD) && defined(VFLUSHO)# define VDISCARD VFLUSHO# endif# ifdef VDISCARD# define termdesc_ao c_cc[VDISCARD]# endif# ifdef VSUSP# define termdesc_susp c_cc[VSUSP]# endif# ifdef VWERASE# define termdesc_ew c_cc[VWERASE]# endif# ifdef VREPRINT# define termdesc_rp c_cc[VREPRINT]# endif# ifdef VLNEXT# define termdesc_lnext c_cc[VLNEXT]# endif# ifdef VEOL# define termdesc_forw1 c_cc[VEOL]# endif# ifdef VEOL2# define termdesc_forw2 c_cc[VEOL2]# endif# ifdef VSTATUS# define termdesc_status c_cc[VSTATUS]# endifstatic cc_t oldeofc = '\004';voidterm_send_eof (){#if VEOF == VMIN if (!tty_isediting()) pty_output_byte (oldeofc);#endif}intterm_change_eof (){#if VEOF == VMIN if (!tty_isediting()) return 1; if (slctab[SLC_EOF].sptr) oldeofc = *slctab[SLC_EOF].sptr; return 0;#endif}inttty_linemode(){#ifdef EXTPROC return (termbuf.c_lflag & EXTPROC);#else return 0; /* Can't ever set it either. */#endif /* EXTPROC */}voidtty_setlinemode (int on){#ifdef TIOCEXT set_termbuf (); ioctl (pty, TIOCEXT, (char *)&on); init_termbuf ();#else /* !TIOCEXT */# ifdef EXTPROC if (on) termbuf.c_lflag |= EXTPROC; else termbuf.c_lflag &= ~EXTPROC;# endif#endif /* TIOCEXT */}inttty_isecho (){ return termbuf.c_lflag & ECHO;}inttty_flowmode (){ return (termbuf.c_iflag & IXON) ? 1 : 0;}inttty_restartany (){ return (termbuf.c_iflag & IXANY) ? 1 : 0;}voidtty_setecho(int on){ if (on) termbuf.c_lflag |= ECHO; else termbuf.c_lflag &= ~ECHO;}inttty_israw (){ return !(termbuf.c_lflag & ICANON);}#if defined (AUTHENTICATION) && defined(NO_LOGIN_F) && defined(LOGIN_R)inttty_setraw(int on){ if (on) termbuf.c_lflag &= ~ICANON; else termbuf.c_lflag |= ICANON;}#endifvoidtty_binaryin (int on){ if (on) termbuf.c_iflag &= ~ISTRIP; else termbuf.c_iflag |= ISTRIP;}voidtty_binaryout (int on){ if (on) { termbuf.c_cflag &= ~(CSIZE|PARENB); termbuf.c_cflag |= CS8; termbuf.c_oflag &= ~OPOST; } else { termbuf.c_cflag &= ~CSIZE; termbuf.c_cflag |= CS7|PARENB; termbuf.c_oflag |= OPOST; }}inttty_isbinaryin (){ return !(termbuf.c_iflag & ISTRIP);}inttty_isbinaryout (){ return !(termbuf.c_oflag&OPOST);}inttty_isediting (){ return termbuf.c_lflag & ICANON;}inttty_istrapsig(){ return termbuf.c_lflag & ISIG;}voidtty_setedit (int on){ if (on) termbuf.c_lflag |= ICANON; else termbuf.c_lflag &= ~ICANON;}voidtty_setsig (int on){ if (on) termbuf.c_lflag |= ISIG; else termbuf.c_lflag &= ~ISIG;}inttty_issofttab (){# ifdef OXTABS return termbuf.c_oflag & OXTABS;# endif# ifdef TABDLY return (termbuf.c_oflag & TABDLY) == TAB3;# endif}voidtty_setsofttab (int on){ if (on) {# ifdef OXTABS termbuf.c_oflag |= OXTABS;# endif# ifdef TABDLY termbuf.c_oflag &= ~TABDLY; termbuf.c_oflag |= TAB3;# endif } else {# ifdef OXTABS termbuf.c_oflag &= ~OXTABS;# endif# ifdef TABDLY termbuf.c_oflag &= ~TABDLY; termbuf.c_oflag |= TAB0;# endif }}inttty_islitecho (){# ifdef ECHOCTL return !(termbuf.c_lflag & ECHOCTL);# endif# ifdef TCTLECH return !(termbuf.c_lflag & TCTLECH);# endif# if!defined(ECHOCTL) && !defined(TCTLECH) return 0; /* assumes ctl chars are echoed '^x' */#endif}voidtty_setlitecho (int on){# ifdef ECHOCTL if (on) termbuf.c_lflag &= ~ECHOCTL; else termbuf.c_lflag |= ECHOCTL;# endif# ifdef TCTLECH if (on) termbuf.c_lflag &= ~TCTLECH; else termbuf.c_lflag |= TCTLECH;# endif}inttty_iscrnl (){ return termbuf.c_iflag & ICRNL;}#endifvoidinit_termbuf (){ _term_getattr (pty, &termbuf); termbuf2 = termbuf;}#if defined(TIOCPKT_IOCTL)/*FIXME: Hardly needed*/voidcopy_termbuf (){ int len = 0; char *cp = (char*) &termbuf; while (pty_input_level () > 0) { if (len >= sizeof (termbuf)) break; *cp++ = pty_get_char (0); } termbuf2 = termbuf;}#endifvoidset_termbuf (){ if (memcmp (&termbuf, &termbuf2, sizeof (termbuf))) _term_setattr (pty, &termbuf);}/* spcset(func, valp, valpp) This function takes various special characters (func), and sets *valp to the current value of that character, and *valpp to point to where in the "termbuf" structure that value is kept. It returns the SLC_ level of support for this function. */#define setval(a, b) *valp = termbuf.a ; \ *valpp = &termbuf.a ; \ return b;#define defval(a) *valp = ((cc_t)a); \ *valpp = (cc_t *)0; \ return SLC_DEFAULT;intspcset (int func, cc_t *valp, cc_t **valpp){ switch (func) { case SLC_EOF: setval (termdesc_eofc, SLC_VARIABLE); case SLC_EC: setval (termdesc_erase, SLC_VARIABLE); case SLC_EL: setval (termdesc_kill, SLC_VARIABLE); case SLC_IP: setval (termdesc_ip, SLC_VARIABLE|SLC_FLUSHIN|SLC_FLUSHOUT); case SLC_ABORT: setval (termdesc_abort, SLC_VARIABLE|SLC_FLUSHIN|SLC_FLUSHOUT); case SLC_XON:#ifdef termdesc_xon setval (termdesc_xon, SLC_VARIABLE);#else defval (0x13);#endif case SLC_XOFF:#ifdef termdesc_xoff setval (termdesc_xoff, SLC_VARIABLE);#else defval (0x11);#endif case SLC_EW:#ifdef termdesc_ew setval (termdesc_ew, SLC_VARIABLE);#else defval (0);#endif case SLC_RP:#ifdef termdesc_rp setval (termdesc_rp, SLC_VARIABLE);#else defval(0);#endif case SLC_LNEXT:#ifdef termdesc_lnext setval (termdesc_lnext, SLC_VARIABLE);#else defval (0);#endif case SLC_AO:#ifdef termdesc_ao setval (termdesc_ao, SLC_VARIABLE|SLC_FLUSHOUT);#else defval (0);#endif case SLC_SUSP:#ifdef termdesc_susp setval (termdesc_susp, SLC_VARIABLE|SLC_FLUSHIN);#else defval (0);#endif #ifdef termdesc_forw1 case SLC_FORW1: setval (termdesc_forw1, SLC_VARIABLE);#endif #ifdef termdesc_forw2 case SLC_FORW2: setval (termdesc_forw2, SLC_VARIABLE);#endif case SLC_AYT:#ifdef termdesc_status setval (termdesc_status, SLC_VARIABLE);#else defval (0);#endif case SLC_BRK: case SLC_SYNCH: case SLC_EOR: defval (0); default: *valp = 0; *valpp = 0; return SLC_NOSUPPORT; }}#if B4800 != 4800#define DECODE_BAUD#endif#ifdef DECODE_BAUD/* * A table of available terminal speeds */struct termspeeds { int speed; int value;} termspeeds[] = { { 0, B0 }, { 50, B50 }, { 75, B75 }, { 110, B110 }, { 134, B134 }, { 150, B150 }, { 200, B200 }, { 300, B300 }, { 600, B600 }, { 1200, B1200 }, { 1800, B1800 }, { 2400, B2400 }, { 4800, B4800 },#ifdef B7200 { 7200, B7200 },#endif { 9600, B9600 },#ifdef B14400 { 14400, B14400 },#endif#ifdef B19200 { 19200, B19200 },#endif#ifdef B28800 { 28800, B28800 },#endif#ifdef B38400 { 38400, B38400 },#endif#ifdef B57600 { 57600, B57600 },#endif#ifdef B115200 { 115200, B115200 },#endif#ifdef B230400 { 230400, B230400 },#endif { -1, 0 }};#endif /* DECODE_BAUD */voidtty_tspeed (int val){#ifdef DECODE_BAUD struct termspeeds *tp; for (tp = termspeeds; (tp->speed != -1) && (val > tp->speed); tp++) ; if (tp->speed == -1) /* back up to last valid value */ --tp; val = tp->value;#endif cfsetospeed (&termbuf, val);}voidtty_rspeed (int val){#ifdef DECODE_BAUD struct termspeeds *tp; for (tp = termspeeds; (tp->speed != -1) && (val > tp->speed); tp++) ; if (tp->speed == -1) /* back up to last valid value */ --tp; val = tp->value;#endif cfsetispeed (&termbuf, val);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -