source: trunk/third/readline/rltty.c @ 15410

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