Annotation of embedaddon/readline/rltty.c, revision 1.1.1.1

1.1       misho       1: /* rltty.c -- functions to prepare and restore the terminal for readline's
                      2:    use. */
                      3: 
                      4: /* Copyright (C) 1992-2005 Free Software Foundation, Inc.
                      5: 
                      6:    This file is part of the GNU Readline Library (Readline), a library
                      7:    for reading lines of text with interactive input and history editing.      
                      8: 
                      9:    Readline is free software: you can redistribute it and/or modify
                     10:    it under the terms of the GNU General Public License as published by
                     11:    the Free Software Foundation, either version 3 of the License, or
                     12:    (at your option) any later version.
                     13: 
                     14:    Readline is distributed in the hope that it will be useful,
                     15:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     16:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     17:    GNU General Public License for more details.
                     18: 
                     19:    You should have received a copy of the GNU General Public License
                     20:    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
                     21: */
                     22: 
                     23: #define READLINE_LIBRARY
                     24: 
                     25: #if defined (HAVE_CONFIG_H)
                     26: #  include <config.h>
                     27: #endif
                     28: 
                     29: #include <sys/types.h>
                     30: #include <signal.h>
                     31: #include <errno.h>
                     32: #include <stdio.h>
                     33: 
                     34: #if defined (HAVE_UNISTD_H)
                     35: #  include <unistd.h>
                     36: #endif /* HAVE_UNISTD_H */
                     37: 
                     38: #include "rldefs.h"
                     39: 
                     40: #if defined (GWINSZ_IN_SYS_IOCTL)
                     41: #  include <sys/ioctl.h>
                     42: #endif /* GWINSZ_IN_SYS_IOCTL */
                     43: 
                     44: #include "rltty.h"
                     45: #include "readline.h"
                     46: #include "rlprivate.h"
                     47: 
                     48: #if !defined (errno)
                     49: extern int errno;
                     50: #endif /* !errno */
                     51: 
                     52: rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal;
                     53: rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal;
                     54: 
                     55: static void set_winsize PARAMS((int));
                     56: 
                     57: /* **************************************************************** */
                     58: /*                                                                 */
                     59: /*                   Saving and Restoring the TTY                  */
                     60: /*                                                                 */
                     61: /* **************************************************************** */
                     62: 
                     63: /* Non-zero means that the terminal is in a prepped state. */
                     64: static int terminal_prepped;
                     65: 
                     66: static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars;
                     67: 
                     68: /* If non-zero, means that this process has called tcflow(fd, TCOOFF)
                     69:    and output is suspended. */
                     70: #if defined (__ksr1__)
                     71: static int ksrflow;
                     72: #endif
                     73: 
                     74: /* Dummy call to force a backgrounded readline to stop before it tries
                     75:    to get the tty settings. */
                     76: static void
                     77: set_winsize (tty)
                     78:      int tty;
                     79: {
                     80: #if defined (TIOCGWINSZ)
                     81:   struct winsize w;
                     82: 
                     83:   if (ioctl (tty, TIOCGWINSZ, &w) == 0)
                     84:       (void) ioctl (tty, TIOCSWINSZ, &w);
                     85: #endif /* TIOCGWINSZ */
                     86: }
                     87: 
                     88: #if defined (NO_TTY_DRIVER)
                     89: /* Nothing */
                     90: #elif defined (NEW_TTY_DRIVER)
                     91: 
                     92: /* Values for the `flags' field of a struct bsdtty.  This tells which
                     93:    elements of the struct bsdtty have been fetched from the system and
                     94:    are valid. */
                     95: #define SGTTY_SET      0x01
                     96: #define LFLAG_SET      0x02
                     97: #define TCHARS_SET     0x04
                     98: #define LTCHARS_SET    0x08
                     99: 
                    100: struct bsdtty {
                    101:   struct sgttyb sgttyb;        /* Basic BSD tty driver information. */
                    102:   int lflag;           /* Local mode flags, like LPASS8. */
                    103: #if defined (TIOCGETC)
                    104:   struct tchars tchars;        /* Terminal special characters, including ^S and ^Q. */
                    105: #endif
                    106: #if defined (TIOCGLTC)
                    107:   struct ltchars ltchars; /* 4.2 BSD editing characters */
                    108: #endif
                    109:   int flags;           /* Bitmap saying which parts of the struct are valid. */
                    110: };
                    111: 
                    112: #define TIOTYPE struct bsdtty
                    113: 
                    114: static TIOTYPE otio;
                    115: 
                    116: static void save_tty_chars PARAMS((TIOTYPE *));
                    117: static int _get_tty_settings PARAMS((int, TIOTYPE *));
                    118: static int get_tty_settings PARAMS((int, TIOTYPE *));
                    119: static int _set_tty_settings PARAMS((int, TIOTYPE *));
                    120: static int set_tty_settings PARAMS((int, TIOTYPE *));
                    121: 
                    122: static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *));
                    123: 
                    124: static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t *));
                    125: 
                    126: static void
                    127: save_tty_chars (tiop)
                    128:      TIOTYPE *tiop;
                    129: {
                    130:   _rl_last_tty_chars = _rl_tty_chars;
                    131: 
                    132:   if (tiop->flags & SGTTY_SET)
                    133:     {
                    134:       _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase;
                    135:       _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill;
                    136:     }
                    137: 
                    138:   if (tiop->flags & TCHARS_SET)
                    139:     {
                    140:       _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
                    141:       _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
                    142: 
                    143:       _rl_tty_chars.t_start = tiop->tchars.t_startc;
                    144:       _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
                    145:       _rl_tty_chars.t_eof = tiop->tchars.t_eofc;
                    146:       _rl_tty_chars.t_eol = '\n';
                    147:       _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc;
                    148:     }
                    149: 
                    150:   if (tiop->flags & LTCHARS_SET)
                    151:     {
                    152:       _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
                    153: 
                    154:       _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc;
                    155:       _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc;
                    156:       _rl_tty_chars.t_flush = tiop->ltchars.t_flushc;
                    157:       _rl_tty_chars.t_werase = tiop->ltchars.t_werasc;
                    158:       _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc;
                    159:     }
                    160: 
                    161:   _rl_tty_chars.t_status = -1;
                    162: }
                    163: 
                    164: static int
                    165: get_tty_settings (tty, tiop)
                    166:      int tty;
                    167:      TIOTYPE *tiop;
                    168: {
                    169:   set_winsize (tty);
                    170: 
                    171:   tiop->flags = tiop->lflag = 0;
                    172: 
                    173:   errno = 0;
                    174:   if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0)
                    175:     return -1;
                    176:   tiop->flags |= SGTTY_SET;
                    177: 
                    178: #if defined (TIOCLGET)
                    179:   if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0)
                    180:     tiop->flags |= LFLAG_SET;
                    181: #endif
                    182: 
                    183: #if defined (TIOCGETC)
                    184:   if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0)
                    185:     tiop->flags |= TCHARS_SET;
                    186: #endif
                    187: 
                    188: #if defined (TIOCGLTC)
                    189:   if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0)
                    190:     tiop->flags |= LTCHARS_SET;
                    191: #endif
                    192: 
                    193:   return 0;
                    194: }
                    195: 
                    196: static int
                    197: set_tty_settings (tty, tiop)
                    198:      int tty;
                    199:      TIOTYPE *tiop;
                    200: {
                    201:   if (tiop->flags & SGTTY_SET)
                    202:     {
                    203:       ioctl (tty, TIOCSETN, &(tiop->sgttyb));
                    204:       tiop->flags &= ~SGTTY_SET;
                    205:     }
                    206:   _rl_echoing_p = 1;
                    207: 
                    208: #if defined (TIOCLSET)
                    209:   if (tiop->flags & LFLAG_SET)
                    210:     {
                    211:       ioctl (tty, TIOCLSET, &(tiop->lflag));
                    212:       tiop->flags &= ~LFLAG_SET;
                    213:     }
                    214: #endif
                    215: 
                    216: #if defined (TIOCSETC)
                    217:   if (tiop->flags & TCHARS_SET)
                    218:     {
                    219:       ioctl (tty, TIOCSETC, &(tiop->tchars));
                    220:       tiop->flags &= ~TCHARS_SET;
                    221:     }
                    222: #endif
                    223: 
                    224: #if defined (TIOCSLTC)
                    225:   if (tiop->flags & LTCHARS_SET)
                    226:     {
                    227:       ioctl (tty, TIOCSLTC, &(tiop->ltchars));
                    228:       tiop->flags &= ~LTCHARS_SET;
                    229:     }
                    230: #endif
                    231: 
                    232:   return 0;
                    233: }
                    234: 
                    235: static void
                    236: prepare_terminal_settings (meta_flag, oldtio, tiop)
                    237:      int meta_flag;
                    238:      TIOTYPE oldtio, *tiop;
                    239: {
                    240:   _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
                    241:   _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL);
                    242: 
                    243:   /* Copy the original settings to the structure we're going to use for
                    244:      our settings. */
                    245:   tiop->sgttyb = oldtio.sgttyb;
                    246:   tiop->lflag = oldtio.lflag;
                    247: #if defined (TIOCGETC)
                    248:   tiop->tchars = oldtio.tchars;
                    249: #endif
                    250: #if defined (TIOCGLTC)
                    251:   tiop->ltchars = oldtio.ltchars;
                    252: #endif
                    253:   tiop->flags = oldtio.flags;
                    254: 
                    255:   /* First, the basic settings to put us into character-at-a-time, no-echo
                    256:      input mode. */
                    257:   tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD);
                    258:   tiop->sgttyb.sg_flags |= CBREAK;
                    259: 
                    260:   /* If this terminal doesn't care how the 8th bit is used, then we can
                    261:      use it for the meta-key.  If only one of even or odd parity is
                    262:      specified, then the terminal is using parity, and we cannot. */
                    263: #if !defined (ANYP)
                    264: #  define ANYP (EVENP | ODDP)
                    265: #endif
                    266:   if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) ||
                    267:       ((oldtio.sgttyb.sg_flags & ANYP) == 0))
                    268:     {
                    269:       tiop->sgttyb.sg_flags |= ANYP;
                    270: 
                    271:       /* Hack on local mode flags if we can. */
                    272: #if defined (TIOCLGET)
                    273: #  if defined (LPASS8)
                    274:       tiop->lflag |= LPASS8;
                    275: #  endif /* LPASS8 */
                    276: #endif /* TIOCLGET */
                    277:     }
                    278: 
                    279: #if defined (TIOCGETC)
                    280: #  if defined (USE_XON_XOFF)
                    281:   /* Get rid of terminal output start and stop characters. */
                    282:   tiop->tchars.t_stopc = -1; /* C-s */
                    283:   tiop->tchars.t_startc = -1; /* C-q */
                    284: 
                    285:   /* If there is an XON character, bind it to restart the output. */
                    286:   if (oldtio.tchars.t_startc != -1)
                    287:     rl_bind_key (oldtio.tchars.t_startc, rl_restart_output);
                    288: #  endif /* USE_XON_XOFF */
                    289: 
                    290:   /* If there is an EOF char, bind _rl_eof_char to it. */
                    291:   if (oldtio.tchars.t_eofc != -1)
                    292:     _rl_eof_char = oldtio.tchars.t_eofc;
                    293: 
                    294: #  if defined (NO_KILL_INTR)
                    295:   /* Get rid of terminal-generated SIGQUIT and SIGINT. */
                    296:   tiop->tchars.t_quitc = -1; /* C-\ */
                    297:   tiop->tchars.t_intrc = -1; /* C-c */
                    298: #  endif /* NO_KILL_INTR */
                    299: #endif /* TIOCGETC */
                    300: 
                    301: #if defined (TIOCGLTC)
                    302:   /* Make the interrupt keys go away.  Just enough to make people happy. */
                    303:   tiop->ltchars.t_dsuspc = -1; /* C-y */
                    304:   tiop->ltchars.t_lnextc = -1; /* C-v */
                    305: #endif /* TIOCGLTC */
                    306: }
                    307: 
                    308: #else  /* !defined (NEW_TTY_DRIVER) */
                    309: 
                    310: #if !defined (VMIN)
                    311: #  define VMIN VEOF
                    312: #endif
                    313: 
                    314: #if !defined (VTIME)
                    315: #  define VTIME VEOL
                    316: #endif
                    317: 
                    318: #if defined (TERMIOS_TTY_DRIVER)
                    319: #  define TIOTYPE struct termios
                    320: #  define DRAIN_OUTPUT(fd)     tcdrain (fd)
                    321: #  define GETATTR(tty, tiop)   (tcgetattr (tty, tiop))
                    322: #  ifdef M_UNIX
                    323: #    define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
                    324: #  else
                    325: #    define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
                    326: #  endif /* !M_UNIX */
                    327: #else
                    328: #  define TIOTYPE struct termio
                    329: #  define DRAIN_OUTPUT(fd)
                    330: #  define GETATTR(tty, tiop)   (ioctl (tty, TCGETA, tiop))
                    331: #  define SETATTR(tty, tiop)   (ioctl (tty, TCSETAW, tiop))
                    332: #endif /* !TERMIOS_TTY_DRIVER */
                    333: 
                    334: static TIOTYPE otio;
                    335: 
                    336: static void save_tty_chars PARAMS((TIOTYPE *));
                    337: static int _get_tty_settings PARAMS((int, TIOTYPE *));
                    338: static int get_tty_settings PARAMS((int, TIOTYPE *));
                    339: static int _set_tty_settings PARAMS((int, TIOTYPE *));
                    340: static int set_tty_settings PARAMS((int, TIOTYPE *));
                    341: 
                    342: static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *));
                    343: 
                    344: static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t *));
                    345: static void _rl_bind_tty_special_chars PARAMS((Keymap, TIOTYPE));
                    346: 
                    347: #if defined (FLUSHO)
                    348: #  define OUTPUT_BEING_FLUSHED(tp)  (tp->c_lflag & FLUSHO)
                    349: #else
                    350: #  define OUTPUT_BEING_FLUSHED(tp)  0
                    351: #endif
                    352: 
                    353: static void
                    354: save_tty_chars (tiop)
                    355:      TIOTYPE *tiop;
                    356: {
                    357:   _rl_last_tty_chars = _rl_tty_chars;
                    358: 
                    359:   _rl_tty_chars.t_eof = tiop->c_cc[VEOF];
                    360:   _rl_tty_chars.t_eol = tiop->c_cc[VEOL];
                    361: #ifdef VEOL2
                    362:   _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2];
                    363: #endif
                    364:   _rl_tty_chars.t_erase = tiop->c_cc[VERASE];
                    365: #ifdef VWERASE
                    366:   _rl_tty_chars.t_werase = tiop->c_cc[VWERASE];
                    367: #endif
                    368:   _rl_tty_chars.t_kill = tiop->c_cc[VKILL];
                    369: #ifdef VREPRINT
                    370:   _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
                    371: #endif
                    372:   _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
                    373:   _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
                    374: #ifdef VSUSP
                    375:   _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
                    376: #endif
                    377: #ifdef VDSUSP
                    378:   _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
                    379: #endif
                    380: #ifdef VSTART
                    381:   _rl_tty_chars.t_start = tiop->c_cc[VSTART];
                    382: #endif
                    383: #ifdef VSTOP
                    384:   _rl_tty_chars.t_stop = tiop->c_cc[VSTOP];
                    385: #endif
                    386: #ifdef VLNEXT
                    387:   _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT];
                    388: #endif
                    389: #ifdef VDISCARD
                    390:   _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD];
                    391: #endif
                    392: #ifdef VSTATUS
                    393:   _rl_tty_chars.t_status = tiop->c_cc[VSTATUS];
                    394: #endif
                    395: }
                    396: 
                    397: #if defined (_AIX) || defined (_AIX41)
                    398: /* Currently this is only used on AIX */
                    399: static void
                    400: rltty_warning (msg)
                    401:      char *msg;
                    402: {
                    403:   _rl_errmsg ("warning: %s", msg);
                    404: }
                    405: #endif
                    406: 
                    407: #if defined (_AIX)
                    408: void
                    409: setopost(tp)
                    410: TIOTYPE *tp;
                    411: {
                    412:   if ((tp->c_oflag & OPOST) == 0)
                    413:     {
                    414:       _rl_errmsg ("warning: turning on OPOST for terminal\r");
                    415:       tp->c_oflag |= OPOST|ONLCR;
                    416:     }
                    417: }
                    418: #endif
                    419: 
                    420: static int
                    421: _get_tty_settings (tty, tiop)
                    422:      int tty;
                    423:      TIOTYPE *tiop;
                    424: {
                    425:   int ioctl_ret;
                    426: 
                    427:   while (1)
                    428:     {
                    429:       ioctl_ret = GETATTR (tty, tiop);
                    430:       if (ioctl_ret < 0)
                    431:        {
                    432:          if (errno != EINTR)
                    433:            return -1;
                    434:          else
                    435:            continue;
                    436:        }
                    437:       if (OUTPUT_BEING_FLUSHED (tiop))
                    438:        {
                    439: #if defined (FLUSHO)
                    440:          _rl_errmsg ("warning: turning off output flushing");
                    441:          tiop->c_lflag &= ~FLUSHO;
                    442:          break;
                    443: #else
                    444:          continue;
                    445: #endif
                    446:        }
                    447:       break;
                    448:     }
                    449: 
                    450:   return 0;
                    451: }
                    452: 
                    453: static int
                    454: get_tty_settings (tty, tiop)
                    455:      int tty;
                    456:      TIOTYPE *tiop;
                    457: {
                    458:   set_winsize (tty);
                    459: 
                    460:   errno = 0;
                    461:   if (_get_tty_settings (tty, tiop) < 0)
                    462:     return -1;
                    463: 
                    464: #if defined (_AIX)
                    465:   setopost(tiop);
                    466: #endif
                    467: 
                    468:   return 0;
                    469: }
                    470: 
                    471: static int
                    472: _set_tty_settings (tty, tiop)
                    473:      int tty;
                    474:      TIOTYPE *tiop;
                    475: {
                    476:   while (SETATTR (tty, tiop) < 0)
                    477:     {
                    478:       if (errno != EINTR)
                    479:        return -1;
                    480:       errno = 0;
                    481:     }
                    482:   return 0;
                    483: }
                    484: 
                    485: static int
                    486: set_tty_settings (tty, tiop)
                    487:      int tty;
                    488:      TIOTYPE *tiop;
                    489: {
                    490:   if (_set_tty_settings (tty, tiop) < 0)
                    491:     return -1;
                    492:     
                    493: #if 0
                    494: 
                    495: #if defined (TERMIOS_TTY_DRIVER)
                    496: #  if defined (__ksr1__)
                    497:   if (ksrflow)
                    498:     {
                    499:       ksrflow = 0;
                    500:       tcflow (tty, TCOON);
                    501:     }
                    502: #  else /* !ksr1 */
                    503:   tcflow (tty, TCOON);         /* Simulate a ^Q. */
                    504: #  endif /* !ksr1 */
                    505: #else
                    506:   ioctl (tty, TCXONC, 1);      /* Simulate a ^Q. */
                    507: #endif /* !TERMIOS_TTY_DRIVER */
                    508: 
                    509: #endif /* 0 */
                    510: 
                    511:   return 0;
                    512: }
                    513: 
                    514: static void
                    515: prepare_terminal_settings (meta_flag, oldtio, tiop)
                    516:      int meta_flag;
                    517:      TIOTYPE oldtio, *tiop;
                    518: {
                    519:   _rl_echoing_p = (oldtio.c_lflag & ECHO);
                    520: #if defined (ECHOCTL)
                    521:   _rl_echoctl = (oldtio.c_lflag & ECHOCTL);
                    522: #endif
                    523: 
                    524:   tiop->c_lflag &= ~(ICANON | ECHO);
                    525: 
                    526:   if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
                    527:     _rl_eof_char = oldtio.c_cc[VEOF];
                    528: 
                    529: #if defined (USE_XON_XOFF)
                    530: #if defined (IXANY)
                    531:   tiop->c_iflag &= ~(IXON | IXANY);
                    532: #else
                    533:   /* `strict' Posix systems do not define IXANY. */
                    534:   tiop->c_iflag &= ~IXON;
                    535: #endif /* IXANY */
                    536: #endif /* USE_XON_XOFF */
                    537: 
                    538:   /* Only turn this off if we are using all 8 bits. */
                    539:   if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag)
                    540:     tiop->c_iflag &= ~(ISTRIP | INPCK);
                    541: 
                    542:   /* Make sure we differentiate between CR and NL on input. */
                    543:   tiop->c_iflag &= ~(ICRNL | INLCR);
                    544: 
                    545: #if !defined (HANDLE_SIGNALS)
                    546:   tiop->c_lflag &= ~ISIG;
                    547: #else
                    548:   tiop->c_lflag |= ISIG;
                    549: #endif
                    550: 
                    551:   tiop->c_cc[VMIN] = 1;
                    552:   tiop->c_cc[VTIME] = 0;
                    553: 
                    554: #if defined (FLUSHO)
                    555:   if (OUTPUT_BEING_FLUSHED (tiop))
                    556:     {
                    557:       tiop->c_lflag &= ~FLUSHO;
                    558:       oldtio.c_lflag &= ~FLUSHO;
                    559:     }
                    560: #endif
                    561: 
                    562:   /* Turn off characters that we need on Posix systems with job control,
                    563:      just to be sure.  This includes ^Y and ^V.  This should not really
                    564:      be necessary.  */
                    565: #if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
                    566: 
                    567: #if defined (VLNEXT)
                    568:   tiop->c_cc[VLNEXT] = _POSIX_VDISABLE;
                    569: #endif
                    570: 
                    571: #if defined (VDSUSP)
                    572:   tiop->c_cc[VDSUSP] = _POSIX_VDISABLE;
                    573: #endif
                    574: 
                    575: #endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
                    576: }
                    577: #endif  /* !NEW_TTY_DRIVER */
                    578: 
                    579: /* Put the terminal in CBREAK mode so that we can detect key presses. */
                    580: #if defined (NO_TTY_DRIVER)
                    581: void
                    582: rl_prep_terminal (meta_flag)
                    583:      int meta_flag;
                    584: {
                    585:   _rl_echoing_p = 1;
                    586: }
                    587: 
                    588: void
                    589: rl_deprep_terminal ()
                    590: {
                    591: }
                    592: 
                    593: #else /* ! NO_TTY_DRIVER */
                    594: void
                    595: rl_prep_terminal (meta_flag)
                    596:      int meta_flag;
                    597: {
                    598:   int tty;
                    599:   TIOTYPE tio;
                    600: 
                    601:   if (terminal_prepped)
                    602:     return;
                    603: 
                    604:   /* Try to keep this function from being INTerrupted. */
                    605:   _rl_block_sigint ();
                    606: 
                    607:   tty = rl_instream ? fileno (rl_instream) : fileno (stdin);
                    608: 
                    609:   if (get_tty_settings (tty, &tio) < 0)
                    610:     {
                    611: #if defined (ENOTSUP)
                    612:       /* MacOS X and Linux, at least, lie about the value of errno if
                    613:         tcgetattr fails. */
                    614:       if (errno == ENOTTY || errno == EINVAL || errno == ENOTSUP)
                    615: #else
                    616:       if (errno == ENOTTY || errno == EINVAL)
                    617: #endif
                    618:        _rl_echoing_p = 1;              /* XXX */
                    619: 
                    620:       _rl_release_sigint ();
                    621:       return;
                    622:     }
                    623: 
                    624:   otio = tio;
                    625: 
                    626:   if (_rl_bind_stty_chars)
                    627:     {
                    628: #if defined (VI_MODE)
                    629:       /* If editing in vi mode, make sure we restore the bindings in the
                    630:         insertion keymap no matter what keymap we ended up in. */
                    631:       if (rl_editing_mode == vi_mode)
                    632:        rl_tty_unset_default_bindings (vi_insertion_keymap);
                    633:       else
                    634: #endif
                    635:        rl_tty_unset_default_bindings (_rl_keymap);
                    636:     }
                    637:   save_tty_chars (&otio);
                    638:   RL_SETSTATE(RL_STATE_TTYCSAVED);
                    639:   if (_rl_bind_stty_chars)
                    640:     {
                    641: #if defined (VI_MODE)
                    642:       /* If editing in vi mode, make sure we set the bindings in the
                    643:         insertion keymap no matter what keymap we ended up in. */
                    644:       if (rl_editing_mode == vi_mode)
                    645:        _rl_bind_tty_special_chars (vi_insertion_keymap, tio);  
                    646:       else
                    647: #endif
                    648:        _rl_bind_tty_special_chars (_rl_keymap, tio);
                    649:     }
                    650: 
                    651:   prepare_terminal_settings (meta_flag, otio, &tio);
                    652: 
                    653:   if (set_tty_settings (tty, &tio) < 0)
                    654:     {
                    655:       _rl_release_sigint ();
                    656:       return;
                    657:     }
                    658: 
                    659:   if (_rl_enable_keypad)
                    660:     _rl_control_keypad (1);
                    661: 
                    662:   fflush (rl_outstream);
                    663:   terminal_prepped = 1;
                    664:   RL_SETSTATE(RL_STATE_TERMPREPPED);
                    665: 
                    666:   _rl_release_sigint ();
                    667: }
                    668: 
                    669: /* Restore the terminal's normal settings and modes. */
                    670: void
                    671: rl_deprep_terminal ()
                    672: {
                    673:   int tty;
                    674: 
                    675:   if (!terminal_prepped)
                    676:     return;
                    677: 
                    678:   /* Try to keep this function from being interrupted. */
                    679:   _rl_block_sigint ();
                    680: 
                    681:   tty = rl_instream ? fileno (rl_instream) : fileno (stdin);
                    682: 
                    683:   if (_rl_enable_keypad)
                    684:     _rl_control_keypad (0);
                    685: 
                    686:   fflush (rl_outstream);
                    687: 
                    688:   if (set_tty_settings (tty, &otio) < 0)
                    689:     {
                    690:       _rl_release_sigint ();
                    691:       return;
                    692:     }
                    693: 
                    694:   terminal_prepped = 0;
                    695:   RL_UNSETSTATE(RL_STATE_TERMPREPPED);
                    696: 
                    697:   _rl_release_sigint ();
                    698: }
                    699: #endif /* !NO_TTY_DRIVER */
                    700: 
                    701: /* **************************************************************** */
                    702: /*                                                                 */
                    703: /*                     Bogus Flow Control                          */
                    704: /*                                                                 */
                    705: /* **************************************************************** */
                    706: 
                    707: int
                    708: rl_restart_output (count, key)
                    709:      int count, key;
                    710: {
                    711: #if defined (__MINGW32__)
                    712:   return 0;
                    713: #else /* !__MING32__ */
                    714: 
                    715:   int fildes = fileno (rl_outstream);
                    716: #if defined (TIOCSTART)
                    717: #if defined (apollo)
                    718:   ioctl (&fildes, TIOCSTART, 0);
                    719: #else
                    720:   ioctl (fildes, TIOCSTART, 0);
                    721: #endif /* apollo */
                    722: 
                    723: #else /* !TIOCSTART */
                    724: #  if defined (TERMIOS_TTY_DRIVER)
                    725: #    if defined (__ksr1__)
                    726:   if (ksrflow)
                    727:     {
                    728:       ksrflow = 0;
                    729:       tcflow (fildes, TCOON);
                    730:     }
                    731: #    else /* !ksr1 */
                    732:   tcflow (fildes, TCOON);              /* Simulate a ^Q. */
                    733: #    endif /* !ksr1 */
                    734: #  else /* !TERMIOS_TTY_DRIVER */
                    735: #    if defined (TCXONC)
                    736:   ioctl (fildes, TCXONC, TCOON);
                    737: #    endif /* TCXONC */
                    738: #  endif /* !TERMIOS_TTY_DRIVER */
                    739: #endif /* !TIOCSTART */
                    740: 
                    741:   return 0;
                    742: #endif /* !__MINGW32__ */
                    743: }
                    744: 
                    745: int
                    746: rl_stop_output (count, key)
                    747:      int count, key;
                    748: {
                    749: #if defined (__MINGW32__)
                    750:   return 0;
                    751: #else
                    752: 
                    753:   int fildes = fileno (rl_instream);
                    754: 
                    755: #if defined (TIOCSTOP)
                    756: # if defined (apollo)
                    757:   ioctl (&fildes, TIOCSTOP, 0);
                    758: # else
                    759:   ioctl (fildes, TIOCSTOP, 0);
                    760: # endif /* apollo */
                    761: #else /* !TIOCSTOP */
                    762: # if defined (TERMIOS_TTY_DRIVER)
                    763: #  if defined (__ksr1__)
                    764:   ksrflow = 1;
                    765: #  endif /* ksr1 */
                    766:   tcflow (fildes, TCOOFF);
                    767: # else
                    768: #   if defined (TCXONC)
                    769:   ioctl (fildes, TCXONC, TCOON);
                    770: #   endif /* TCXONC */
                    771: # endif /* !TERMIOS_TTY_DRIVER */
                    772: #endif /* !TIOCSTOP */
                    773: 
                    774:   return 0;
                    775: #endif /* !__MINGW32__ */
                    776: }
                    777: 
                    778: /* **************************************************************** */
                    779: /*                                                                 */
                    780: /*                     Default Key Bindings                        */
                    781: /*                                                                 */
                    782: /* **************************************************************** */
                    783: 
                    784: #if !defined (NO_TTY_DRIVER)
                    785: #define SET_SPECIAL(sc, func)  set_special_char(kmap, &ttybuff, sc, func)
                    786: #endif
                    787: 
                    788: #if defined (NO_TTY_DRIVER)
                    789: 
                    790: #define SET_SPECIAL(sc, func)
                    791: #define RESET_SPECIAL(c)
                    792: 
                    793: #elif defined (NEW_TTY_DRIVER)
                    794: static void
                    795: set_special_char (kmap, tiop, sc, func)
                    796:      Keymap kmap;
                    797:      TIOTYPE *tiop;
                    798:      int sc;
                    799:      rl_command_func_t *func;
                    800: {
                    801:   if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC)
                    802:     kmap[(unsigned char)sc].function = func;
                    803: }
                    804: 
                    805: #define RESET_SPECIAL(c) \
                    806:   if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) \
                    807:     kmap[(unsigned char)c].function = rl_insert;
                    808: 
                    809: static void
                    810: _rl_bind_tty_special_chars (kmap, ttybuff)
                    811:      Keymap kmap;
                    812:      TIOTYPE ttybuff;
                    813: {
                    814:   if (ttybuff.flags & SGTTY_SET)
                    815:     {
                    816:       SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout);
                    817:       SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard);
                    818:     }
                    819: 
                    820: #  if defined (TIOCGLTC)
                    821:   if (ttybuff.flags & LTCHARS_SET)
                    822:     {
                    823:       SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout);
                    824:       SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert);
                    825:     }
                    826: #  endif /* TIOCGLTC */
                    827: }
                    828: 
                    829: #else /* !NEW_TTY_DRIVER */
                    830: static void
                    831: set_special_char (kmap, tiop, sc, func)
                    832:      Keymap kmap;
                    833:      TIOTYPE *tiop;
                    834:      int sc;
                    835:      rl_command_func_t *func;
                    836: {
                    837:   unsigned char uc;
                    838: 
                    839:   uc = tiop->c_cc[sc];
                    840:   if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC)
                    841:     kmap[uc].function = func;
                    842: }
                    843: 
                    844: /* used later */
                    845: #define RESET_SPECIAL(uc) \
                    846:   if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
                    847:     kmap[uc].function = rl_insert;
                    848: 
                    849: static void
                    850: _rl_bind_tty_special_chars (kmap, ttybuff)
                    851:      Keymap kmap;
                    852:      TIOTYPE ttybuff;
                    853: {
                    854:   SET_SPECIAL (VERASE, rl_rubout);
                    855:   SET_SPECIAL (VKILL, rl_unix_line_discard);
                    856: 
                    857: #  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
                    858:   SET_SPECIAL (VLNEXT, rl_quoted_insert);
                    859: #  endif /* VLNEXT && TERMIOS_TTY_DRIVER */
                    860: 
                    861: #  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
                    862:   SET_SPECIAL (VWERASE, rl_unix_word_rubout);
                    863: #  endif /* VWERASE && TERMIOS_TTY_DRIVER */
                    864: }
                    865: 
                    866: #endif /* !NEW_TTY_DRIVER */
                    867: 
                    868: /* Set the system's default editing characters to their readline equivalents
                    869:    in KMAP.  Should be static, now that we have rl_tty_set_default_bindings. */
                    870: void
                    871: rltty_set_default_bindings (kmap)
                    872:      Keymap kmap;
                    873: {
                    874: #if !defined (NO_TTY_DRIVER)
                    875:   TIOTYPE ttybuff;
                    876:   int tty;
                    877: 
                    878:   tty = fileno (rl_instream);
                    879: 
                    880:   if (get_tty_settings (tty, &ttybuff) == 0)
                    881:     _rl_bind_tty_special_chars (kmap, ttybuff);
                    882: #endif
                    883: }
                    884: 
                    885: /* New public way to set the system default editing chars to their readline
                    886:    equivalents. */
                    887: void
                    888: rl_tty_set_default_bindings (kmap)
                    889:      Keymap kmap;
                    890: {
                    891:   rltty_set_default_bindings (kmap);
                    892: }
                    893: 
                    894: /* Rebind all of the tty special chars that readline worries about back
                    895:    to self-insert.  Call this before saving the current terminal special
                    896:    chars with save_tty_chars().  This only works on POSIX termios or termio
                    897:    systems. */
                    898: void
                    899: rl_tty_unset_default_bindings (kmap)
                    900:      Keymap kmap;
                    901: {
                    902:   /* Don't bother before we've saved the tty special chars at least once. */
                    903:   if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0)
                    904:     return;
                    905: 
                    906:   RESET_SPECIAL (_rl_tty_chars.t_erase);
                    907:   RESET_SPECIAL (_rl_tty_chars.t_kill);
                    908: 
                    909: #  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
                    910:   RESET_SPECIAL (_rl_tty_chars.t_lnext);
                    911: #  endif /* VLNEXT && TERMIOS_TTY_DRIVER */
                    912: 
                    913: #  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
                    914:   RESET_SPECIAL (_rl_tty_chars.t_werase);
                    915: #  endif /* VWERASE && TERMIOS_TTY_DRIVER */
                    916: }
                    917: 
                    918: #if defined (HANDLE_SIGNALS)
                    919: 
                    920: #if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER)
                    921: int
                    922: _rl_disable_tty_signals ()
                    923: {
                    924:   return 0;
                    925: }
                    926: 
                    927: int
                    928: _rl_restore_tty_signals ()
                    929: {
                    930:   return 0;
                    931: }
                    932: #else
                    933: 
                    934: static TIOTYPE sigstty, nosigstty;
                    935: static int tty_sigs_disabled = 0;
                    936: 
                    937: int
                    938: _rl_disable_tty_signals ()
                    939: {
                    940:   if (tty_sigs_disabled)
                    941:     return 0;
                    942: 
                    943:   if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0)
                    944:     return -1;
                    945: 
                    946:   nosigstty = sigstty;
                    947: 
                    948:   nosigstty.c_lflag &= ~ISIG;
                    949:   nosigstty.c_iflag &= ~IXON;
                    950: 
                    951:   if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0)
                    952:     return (_set_tty_settings (fileno (rl_instream), &sigstty));
                    953: 
                    954:   tty_sigs_disabled = 1;
                    955:   return 0;
                    956: }
                    957: 
                    958: int
                    959: _rl_restore_tty_signals ()
                    960: {
                    961:   int r;
                    962: 
                    963:   if (tty_sigs_disabled == 0)
                    964:     return 0;
                    965: 
                    966:   r = _set_tty_settings (fileno (rl_instream), &sigstty);
                    967: 
                    968:   if (r == 0)
                    969:     tty_sigs_disabled = 0;
                    970: 
                    971:   return r;
                    972: }
                    973: #endif /* !NEW_TTY_DRIVER */
                    974: 
                    975: #endif /* HANDLE_SIGNALS */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>