File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / rltty.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jul 30 08:16:45 2014 UTC (9 years, 10 months ago) by misho
Branches: readline, MAIN
CVS tags: v6_3p10_cross, v6_3p10, v6_3, p6, HEAD
readline 6.3

    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>