GC old libarchive/bsdtar.
[dragonfly/port-amd64.git] / contrib / libreadline / rltty.c
blobb868b6970c24cca98dfe5b9ccb8a1159a050247e
1 /* rltty.c -- functions to prepare and restore the terminal for readline's
2 use. */
4 /* Copyright (C) 1992 Free Software Foundation, Inc.
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
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.
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.
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
25 #if defined (HAVE_CONFIG_H)
26 # include <config.h>
27 #endif
29 #include <sys/types.h>
30 #include <signal.h>
31 #include <errno.h>
32 #include <stdio.h>
34 #if defined (HAVE_UNISTD_H)
35 # include <unistd.h>
36 #endif /* HAVE_UNISTD_H */
38 #include "rldefs.h"
40 #if defined (GWINSZ_IN_SYS_IOCTL)
41 # include <sys/ioctl.h>
42 #endif /* GWINSZ_IN_SYS_IOCTL */
44 #include "rltty.h"
45 #include "readline.h"
46 #include "rlprivate.h"
48 #if !defined (errno)
49 extern int errno;
50 #endif /* !errno */
52 VFunction *rl_prep_term_function = rl_prep_terminal;
53 VFunction *rl_deprep_term_function = rl_deprep_terminal;
55 /* **************************************************************** */
56 /* */
57 /* Signal Management */
58 /* */
59 /* **************************************************************** */
61 #if defined (HAVE_POSIX_SIGNALS)
62 static sigset_t sigint_set, sigint_oset;
63 #else /* !HAVE_POSIX_SIGNALS */
64 # if defined (HAVE_BSD_SIGNALS)
65 static int sigint_oldmask;
66 # endif /* HAVE_BSD_SIGNALS */
67 #endif /* !HAVE_POSIX_SIGNALS */
69 static int sigint_blocked;
71 /* Cause SIGINT to not be delivered until the corresponding call to
72 release_sigint(). */
73 static void
74 block_sigint ()
76 if (sigint_blocked)
77 return;
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 */
94 sigint_blocked = 1;
97 /* Allow SIGINT to be delivered. */
98 static void
99 release_sigint ()
101 if (sigint_blocked == 0)
102 return;
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 */
116 sigint_blocked = 0;
119 /* **************************************************************** */
120 /* */
121 /* Saving and Restoring the TTY */
122 /* */
123 /* **************************************************************** */
125 /* Non-zero means that the terminal is in a prepped state. */
126 static int terminal_prepped;
128 static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars;
130 /* If non-zero, means that this process has called tcflow(fd, TCOOFF)
131 and output is suspended. */
132 #if defined (__ksr1__)
133 static int ksrflow;
134 #endif
136 /* Dummy call to force a backgrounded readline to stop before it tries
137 to get the tty settings. */
138 static void
139 set_winsize (tty)
140 int tty;
142 #if defined (TIOCGWINSZ)
143 struct winsize w;
145 if (ioctl (tty, TIOCGWINSZ, &w) == 0)
146 (void) ioctl (tty, TIOCSWINSZ, &w);
147 #endif /* TIOCGWINSZ */
150 #if defined (NEW_TTY_DRIVER)
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
160 struct 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. */
172 #define TIOTYPE struct bsdtty
174 static TIOTYPE otio;
176 static void
177 save_tty_chars (tiop)
178 TIOTYPE *tiop;
180 _rl_last_tty_chars = _rl_tty_chars;
182 if (tiop->flags & SGTTY_SET)
184 _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase;
185 _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill;
188 if (tiop->flags & TCHARS_SET)
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;
199 if (tiop->flags & LTCHARS_SET)
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;
209 _rl_tty_chars.t_status = -1;
212 static int
213 get_tty_settings (tty, tiop)
214 int tty;
215 TIOTYPE *tiop;
217 set_winsize (tty);
219 tiop->flags = tiop->lflag = 0;
221 ioctl (tty, TIOCGETP, &(tiop->sgttyb));
222 tiop->flags |= SGTTY_SET;
224 #if defined (TIOCLGET)
225 ioctl (tty, TIOCLGET, &(tiop->lflag));
226 tiop->flags |= LFLAG_SET;
227 #endif
229 #if defined (TIOCGETC)
230 ioctl (tty, TIOCGETC, &(tiop->tchars));
231 tiop->flags |= TCHARS_SET;
232 #endif
234 #if defined (TIOCGLTC)
235 ioctl (tty, TIOCGLTC, &(tiop->ltchars));
236 tiop->flags |= LTCHARS_SET;
237 #endif
239 return 0;
242 static int
243 set_tty_settings (tty, tiop)
244 int tty;
245 TIOTYPE *tiop;
247 if (tiop->flags & SGTTY_SET)
249 ioctl (tty, TIOCSETN, &(tiop->sgttyb));
250 tiop->flags &= ~SGTTY_SET;
252 readline_echoing_p = 1;
254 #if defined (TIOCLSET)
255 if (tiop->flags & LFLAG_SET)
257 ioctl (tty, TIOCLSET, &(tiop->lflag));
258 tiop->flags &= ~LFLAG_SET;
260 #endif
262 #if defined (TIOCSETC)
263 if (tiop->flags & TCHARS_SET)
265 ioctl (tty, TIOCSETC, &(tiop->tchars));
266 tiop->flags &= ~TCHARS_SET;
268 #endif
270 #if defined (TIOCSLTC)
271 if (tiop->flags & LTCHARS_SET)
273 ioctl (tty, TIOCSLTC, &(tiop->ltchars));
274 tiop->flags &= ~LTCHARS_SET;
276 #endif
278 return 0;
281 static void
282 prepare_terminal_settings (meta_flag, otio, tiop)
283 int meta_flag;
284 TIOTYPE otio, *tiop;
286 readline_echoing_p = (otio.sgttyb.sg_flags & ECHO);
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;
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;
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))
314 tiop->sgttyb.sg_flags |= ANYP;
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 */
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 */
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 */
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;
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 */
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 */
353 #else /* !defined (NEW_TTY_DRIVER) */
355 #if !defined (VMIN)
356 # define VMIN VEOF
357 #endif
359 #if !defined (VTIME)
360 # define VTIME VEOL
361 #endif
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 */
379 static TIOTYPE otio;
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
387 static void
388 save_tty_chars (tiop)
389 TIOTYPE *tiop;
391 _rl_last_tty_chars = _rl_tty_chars;
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
431 #if defined (_AIX) || defined (_AIX41)
432 /* Currently this is only used on AIX */
433 static void
434 rltty_warning (msg)
435 char *msg;
437 fprintf (stderr, "readline: warning: %s\n", msg);
439 #endif
441 #if defined (_AIX)
442 void
443 setopost(tp)
444 TIOTYPE *tp;
446 if ((tp->c_oflag & OPOST) == 0)
448 rltty_warning ("turning on OPOST for terminal\r");
449 tp->c_oflag |= OPOST|ONLCR;
452 #endif
454 static int
455 _get_tty_settings (tty, tiop)
456 int tty;
457 TIOTYPE *tiop;
459 int ioctl_ret;
461 while (1)
463 ioctl_ret = GETATTR (tty, tiop);
464 if (ioctl_ret < 0)
466 if (errno != EINTR)
467 return -1;
468 else
469 continue;
471 if (OUTPUT_BEING_FLUSHED (tiop))
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
481 break;
484 return 0;
487 static int
488 get_tty_settings (tty, tiop)
489 int tty;
490 TIOTYPE *tiop;
492 set_winsize (tty);
494 if (_get_tty_settings (tty, tiop) < 0)
495 return -1;
497 #if defined (_AIX)
498 setopost(tiop);
499 #endif
501 return 0;
504 static int
505 _set_tty_settings (tty, tiop)
506 int tty;
507 TIOTYPE *tiop;
509 while (SETATTR (tty, tiop) < 0)
511 if (errno != EINTR)
512 return -1;
513 errno = 0;
515 return 0;
518 static int
519 set_tty_settings (tty, tiop)
520 int tty;
521 TIOTYPE *tiop;
523 if (_set_tty_settings (tty, tiop) < 0)
524 return -1;
526 #if 0
528 #if defined (TERMIOS_TTY_DRIVER)
529 # if defined (__ksr1__)
530 if (ksrflow)
532 ksrflow = 0;
533 tcflow (tty, TCOON);
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 */
542 #endif /* 0 */
544 return 0;
547 static void
548 prepare_terminal_settings (meta_flag, otio, tiop)
549 int meta_flag;
550 TIOTYPE otio, *tiop;
552 readline_echoing_p = (otio.c_lflag & ECHO);
554 tiop->c_lflag &= ~(ICANON | ECHO);
556 if ((unsigned char) otio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
557 _rl_eof_char = otio.c_cc[VEOF];
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 */
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);
572 /* Make sure we differentiate between CR and NL on input. */
573 tiop->c_iflag &= ~(ICRNL | INLCR);
575 #if !defined (HANDLE_SIGNALS)
576 tiop->c_lflag &= ~ISIG;
577 #else
578 tiop->c_lflag |= ISIG;
579 #endif
581 tiop->c_cc[VMIN] = 1;
582 tiop->c_cc[VTIME] = 0;
584 #if defined (FLUSHO)
585 if (OUTPUT_BEING_FLUSHED (tiop))
587 tiop->c_lflag &= ~FLUSHO;
588 otio.c_lflag &= ~FLUSHO;
590 #endif
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)
597 #if defined (VLNEXT)
598 tiop->c_cc[VLNEXT] = _POSIX_VDISABLE;
599 #endif
601 #if defined (VDSUSP)
602 tiop->c_cc[VDSUSP] = _POSIX_VDISABLE;
603 #endif
605 #endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
607 #endif /* NEW_TTY_DRIVER */
609 /* Put the terminal in CBREAK mode so that we can detect key presses. */
610 void
611 rl_prep_terminal (meta_flag)
612 int meta_flag;
614 int tty;
615 TIOTYPE tio;
617 if (terminal_prepped)
618 return;
620 /* Try to keep this function from being INTerrupted. */
621 block_sigint ();
623 tty = fileno (rl_instream);
625 if (get_tty_settings (tty, &tio) < 0)
627 release_sigint ();
628 return;
631 otio = tio;
633 save_tty_chars (&otio);
635 prepare_terminal_settings (meta_flag, otio, &tio);
637 if (set_tty_settings (tty, &tio) < 0)
639 release_sigint ();
640 return;
643 if (_rl_enable_keypad)
644 _rl_control_keypad (1);
646 fflush (rl_outstream);
647 terminal_prepped = 1;
649 release_sigint ();
652 /* Restore the terminal's normal settings and modes. */
653 void
654 rl_deprep_terminal ()
656 int tty;
658 if (!terminal_prepped)
659 return;
661 /* Try to keep this function from being interrupted. */
662 block_sigint ();
664 tty = fileno (rl_instream);
666 if (_rl_enable_keypad)
667 _rl_control_keypad (0);
669 fflush (rl_outstream);
671 if (set_tty_settings (tty, &otio) < 0)
673 release_sigint ();
674 return;
677 terminal_prepped = 0;
679 release_sigint ();
682 /* **************************************************************** */
683 /* */
684 /* Bogus Flow Control */
685 /* */
686 /* **************************************************************** */
689 rl_restart_output (count, key)
690 int count, key;
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 */
700 #else /* !TIOCSTART */
701 # if defined (TERMIOS_TTY_DRIVER)
702 # if defined (__ksr1__)
703 if (ksrflow)
705 ksrflow = 0;
706 tcflow (fildes, TCOON);
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 */
718 return 0;
722 rl_stop_output (count, key)
723 int count, key;
725 int fildes = fileno (rl_instream);
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 */
746 return 0;
749 /* **************************************************************** */
750 /* */
751 /* Default Key Bindings */
752 /* */
753 /* **************************************************************** */
754 void
755 rltty_set_default_bindings (kmap)
756 Keymap kmap;
758 TIOTYPE ttybuff;
759 int tty = fileno (rl_instream);
761 #if defined (NEW_TTY_DRIVER)
763 #define SET_SPECIAL(sc, func) \
764 do \
766 int ic; \
767 ic = sc; \
768 if (ic != -1 && kmap[ic].type == ISFUNC) \
769 kmap[ic].function = func; \
771 while (0)
773 if (get_tty_settings (tty, &ttybuff) == 0)
775 if (ttybuff.flags & SGTTY_SET)
777 SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout);
778 SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard);
781 # if defined (TIOCGLTC)
782 if (ttybuff.flags & LTCHARS_SET)
784 SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout);
785 SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert);
787 # endif /* TIOCGLTC */
790 #else /* !NEW_TTY_DRIVER */
792 #define SET_SPECIAL(sc, func) \
793 do \
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; \
800 while (0)
802 if (get_tty_settings (tty, &ttybuff) == 0)
804 SET_SPECIAL (VERASE, rl_rubout);
805 SET_SPECIAL (VKILL, rl_unix_line_discard);
807 # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
808 SET_SPECIAL (VLNEXT, rl_quoted_insert);
809 # endif /* VLNEXT && TERMIOS_TTY_DRIVER */
811 # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
812 SET_SPECIAL (VWERASE, rl_unix_word_rubout);
813 # endif /* VWERASE && TERMIOS_TTY_DRIVER */
815 #endif /* !NEW_TTY_DRIVER */
818 #if defined (HANDLE_SIGNALS)
820 #if defined (NEW_TTY_DRIVER)
822 _rl_disable_tty_signals ()
824 return 0;
828 _rl_restore_tty_signals ()
830 return 0;
832 #else
834 static TIOTYPE sigstty, nosigstty;
835 static int tty_sigs_disabled = 0;
838 _rl_disable_tty_signals ()
840 if (tty_sigs_disabled)
841 return 0;
843 if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0)
844 return -1;
846 nosigstty = sigstty;
848 nosigstty.c_lflag &= ~ISIG;
850 if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0)
851 return (_set_tty_settings (fileno (rl_instream), &sigstty));
853 tty_sigs_disabled = 1;
854 return 0;
858 _rl_restore_tty_signals ()
860 if (tty_sigs_disabled == 0)
861 return 0;
863 return (_set_tty_settings (fileno (rl_instream), &sigstty));
865 #endif /* !NEW_TTY_DRIVER */
867 #endif /* HANDLE_SIGNALS */