[ dejagnu/ChangeLog ]
[deliverable/binutils-gdb.git] / readline / rltty.c
CommitLineData
d60d9f65
SS
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
1b17e766 11 as published by the Free Software Foundation; either version 2, or
d60d9f65
SS
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,
1b17e766 22 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
d60d9f65
SS
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
c862e87b 40#if defined (GWINSZ_IN_SYS_IOCTL)
d60d9f65 41# include <sys/ioctl.h>
c862e87b 42#endif /* GWINSZ_IN_SYS_IOCTL */
d60d9f65
SS
43
44#include "rltty.h"
45#include "readline.h"
1b17e766 46#include "rlprivate.h"
d60d9f65
SS
47
48#if !defined (errno)
49extern int errno;
50#endif /* !errno */
51
d60d9f65
SS
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 */
1b17e766 93
d60d9f65
SS
94 sigint_blocked = 1;
95}
96
97/* Allow SIGINT to be delivered. */
98static void
99release_sigint ()
100{
1b17e766 101 if (sigint_blocked == 0)
d60d9f65
SS
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
1b17e766
EZ
128static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars;
129
d60d9f65
SS
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
d60d9f65
SS
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{
1b17e766 142#if defined (TIOCGWINSZ)
d60d9f65
SS
143 struct winsize w;
144
145 if (ioctl (tty, TIOCGWINSZ, &w) == 0)
146 (void) ioctl (tty, TIOCSWINSZ, &w);
c862e87b 147#endif /* TIOCGWINSZ */
1b17e766 148}
d60d9f65
SS
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
1b17e766
EZ
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;
5844f845 193 _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
1b17e766
EZ
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
d60d9f65
SS
212static int
213get_tty_settings (tty, tiop)
214 int tty;
215 TIOTYPE *tiop;
216{
d1857004 217#if defined (TIOCGWINSZ)
d60d9f65 218 set_winsize (tty);
d1857004 219#endif
d60d9f65
SS
220
221 tiop->flags = tiop->lflag = 0;
222
223 ioctl (tty, TIOCGETP, &(tiop->sgttyb));
224 tiop->flags |= SGTTY_SET;
225
226#if defined (TIOCLGET)
227 ioctl (tty, TIOCLGET, &(tiop->lflag));
228 tiop->flags |= LFLAG_SET;
229#endif
230
231#if defined (TIOCGETC)
232 ioctl (tty, TIOCGETC, &(tiop->tchars));
233 tiop->flags |= TCHARS_SET;
234#endif
235
236#if defined (TIOCGLTC)
237 ioctl (tty, TIOCGLTC, &(tiop->ltchars));
238 tiop->flags |= LTCHARS_SET;
239#endif
240
241 return 0;
242}
243
244static int
245set_tty_settings (tty, tiop)
246 int tty;
247 TIOTYPE *tiop;
248{
249 if (tiop->flags & SGTTY_SET)
250 {
251 ioctl (tty, TIOCSETN, &(tiop->sgttyb));
252 tiop->flags &= ~SGTTY_SET;
253 }
254 readline_echoing_p = 1;
255
256#if defined (TIOCLSET)
257 if (tiop->flags & LFLAG_SET)
258 {
259 ioctl (tty, TIOCLSET, &(tiop->lflag));
260 tiop->flags &= ~LFLAG_SET;
261 }
262#endif
263
264#if defined (TIOCSETC)
265 if (tiop->flags & TCHARS_SET)
266 {
267 ioctl (tty, TIOCSETC, &(tiop->tchars));
268 tiop->flags &= ~TCHARS_SET;
269 }
270#endif
271
272#if defined (TIOCSLTC)
273 if (tiop->flags & LTCHARS_SET)
274 {
275 ioctl (tty, TIOCSLTC, &(tiop->ltchars));
276 tiop->flags &= ~LTCHARS_SET;
277 }
278#endif
279
280 return 0;
281}
282
283static void
284prepare_terminal_settings (meta_flag, otio, tiop)
285 int meta_flag;
286 TIOTYPE otio, *tiop;
287{
d60d9f65
SS
288 readline_echoing_p = (otio.sgttyb.sg_flags & ECHO);
289
290 /* Copy the original settings to the structure we're going to use for
291 our settings. */
292 tiop->sgttyb = otio.sgttyb;
293 tiop->lflag = otio.lflag;
294#if defined (TIOCGETC)
295 tiop->tchars = otio.tchars;
296#endif
297#if defined (TIOCGLTC)
298 tiop->ltchars = otio.ltchars;
299#endif
300 tiop->flags = otio.flags;
301
302 /* First, the basic settings to put us into character-at-a-time, no-echo
303 input mode. */
304 tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD);
305 tiop->sgttyb.sg_flags |= CBREAK;
306
307 /* If this terminal doesn't care how the 8th bit is used, then we can
308 use it for the meta-key. If only one of even or odd parity is
309 specified, then the terminal is using parity, and we cannot. */
310#if !defined (ANYP)
311# define ANYP (EVENP | ODDP)
312#endif
313 if (((otio.sgttyb.sg_flags & ANYP) == ANYP) ||
314 ((otio.sgttyb.sg_flags & ANYP) == 0))
315 {
316 tiop->sgttyb.sg_flags |= ANYP;
317
318 /* Hack on local mode flags if we can. */
319#if defined (TIOCLGET)
320# if defined (LPASS8)
321 tiop->lflag |= LPASS8;
322# endif /* LPASS8 */
323#endif /* TIOCLGET */
324 }
325
326#if defined (TIOCGETC)
327# if defined (USE_XON_XOFF)
328 /* Get rid of terminal output start and stop characters. */
329 tiop->tchars.t_stopc = -1; /* C-s */
330 tiop->tchars.t_startc = -1; /* C-q */
331
332 /* If there is an XON character, bind it to restart the output. */
333 if (otio.tchars.t_startc != -1)
334 rl_bind_key (otio.tchars.t_startc, rl_restart_output);
335# endif /* USE_XON_XOFF */
336
337 /* If there is an EOF char, bind _rl_eof_char to it. */
338 if (otio.tchars.t_eofc != -1)
339 _rl_eof_char = otio.tchars.t_eofc;
340
341# if defined (NO_KILL_INTR)
342 /* Get rid of terminal-generated SIGQUIT and SIGINT. */
343 tiop->tchars.t_quitc = -1; /* C-\ */
344 tiop->tchars.t_intrc = -1; /* C-c */
345# endif /* NO_KILL_INTR */
346#endif /* TIOCGETC */
347
348#if defined (TIOCGLTC)
349 /* Make the interrupt keys go away. Just enough to make people happy. */
350 tiop->ltchars.t_dsuspc = -1; /* C-y */
351 tiop->ltchars.t_lnextc = -1; /* C-v */
352#endif /* TIOCGLTC */
d60d9f65
SS
353}
354
355#else /* !defined (NEW_TTY_DRIVER) */
356
357#if !defined (VMIN)
358# define VMIN VEOF
359#endif
360
361#if !defined (VTIME)
362# define VTIME VEOL
363#endif
364
365#if defined (TERMIOS_TTY_DRIVER)
366# define TIOTYPE struct termios
367# define DRAIN_OUTPUT(fd) tcdrain (fd)
368# define GETATTR(tty, tiop) (tcgetattr (tty, tiop))
369# ifdef M_UNIX
370# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
371# else
372# define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
373# endif /* !M_UNIX */
374#else
375# define TIOTYPE struct termio
376# define DRAIN_OUTPUT(fd)
377# define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop))
378# define SETATTR(tty, tiop) (ioctl (tty, TCSETA, tiop))
379#endif /* !TERMIOS_TTY_DRIVER */
380
381static TIOTYPE otio;
382
383#if defined (FLUSHO)
384# define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO)
385#else
386# define OUTPUT_BEING_FLUSHED(tp) 0
387#endif
388
1b17e766
EZ
389static void
390save_tty_chars (tiop)
391 TIOTYPE *tiop;
392{
393 _rl_last_tty_chars = _rl_tty_chars;
394
395 _rl_tty_chars.t_eof = tiop->c_cc[VEOF];
396 _rl_tty_chars.t_eol = tiop->c_cc[VEOL];
397#ifdef VEOL2
398 _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2];
399#endif
400 _rl_tty_chars.t_erase = tiop->c_cc[VERASE];
401#ifdef VWERASE
402 _rl_tty_chars.t_werase = tiop->c_cc[VWERASE];
403#endif
404 _rl_tty_chars.t_kill = tiop->c_cc[VKILL];
405#ifdef VREPRINT
406 _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
407#endif
408 _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
409 _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
410#ifdef VSUSP
411 _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
412#endif
413#ifdef VDSUSP
414 _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
415#endif
416#ifdef VSTART
417 _rl_tty_chars.t_start = tiop->c_cc[VSTART];
418#endif
419#ifdef VSTOP
420 _rl_tty_chars.t_stop = tiop->c_cc[VSTOP];
421#endif
422#ifdef VLNEXT
423 _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT];
424#endif
425#ifdef VDISCARD
426 _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD];
427#endif
428#ifdef VSTATUS
429 _rl_tty_chars.t_status = tiop->c_cc[VSTATUS];
430#endif
431}
432
433#if defined (_AIX) || defined (_AIX41)
434/* Currently this is only used on AIX */
d60d9f65
SS
435static void
436rltty_warning (msg)
437 char *msg;
438{
439 fprintf (stderr, "readline: warning: %s\n", msg);
440}
1b17e766 441#endif
d60d9f65
SS
442
443#if defined (_AIX)
444void
445setopost(tp)
446TIOTYPE *tp;
447{
448 if ((tp->c_oflag & OPOST) == 0)
449 {
450 rltty_warning ("turning on OPOST for terminal\r");
451 tp->c_oflag |= OPOST|ONLCR;
452 }
453}
454#endif
455
456static int
1b17e766 457_get_tty_settings (tty, tiop)
d60d9f65
SS
458 int tty;
459 TIOTYPE *tiop;
460{
461 int ioctl_ret;
c862e87b 462
d60d9f65
SS
463 while (1)
464 {
465 ioctl_ret = GETATTR (tty, tiop);
466 if (ioctl_ret < 0)
467 {
468 if (errno != EINTR)
469 return -1;
470 else
471 continue;
472 }
473 if (OUTPUT_BEING_FLUSHED (tiop))
474 {
475#if defined (FLUSHO) && defined (_AIX41)
476 rltty_warning ("turning off output flushing");
477 tiop->c_lflag &= ~FLUSHO;
478 break;
479#else
480 continue;
481#endif
482 }
483 break;
484 }
485
1b17e766
EZ
486 return 0;
487}
488
489static int
490get_tty_settings (tty, tiop)
491 int tty;
492 TIOTYPE *tiop;
493{
494#if defined (TIOCGWINSZ)
495 set_winsize (tty);
496#endif
497
498 if (_get_tty_settings (tty, tiop) < 0)
499 return -1;
500
d60d9f65
SS
501#if defined (_AIX)
502 setopost(tiop);
503#endif
504
505 return 0;
506}
507
508static int
1b17e766 509_set_tty_settings (tty, tiop)
d60d9f65
SS
510 int tty;
511 TIOTYPE *tiop;
512{
513 while (SETATTR (tty, tiop) < 0)
514 {
515 if (errno != EINTR)
516 return -1;
517 errno = 0;
518 }
1b17e766
EZ
519 return 0;
520}
d60d9f65 521
1b17e766
EZ
522static int
523set_tty_settings (tty, tiop)
524 int tty;
525 TIOTYPE *tiop;
526{
527 if (_set_tty_settings (tty, tiop) < 0)
528 return -1;
529
d60d9f65
SS
530#if 0
531
532#if defined (TERMIOS_TTY_DRIVER)
533# if defined (__ksr1__)
534 if (ksrflow)
535 {
536 ksrflow = 0;
537 tcflow (tty, TCOON);
538 }
539# else /* !ksr1 */
540 tcflow (tty, TCOON); /* Simulate a ^Q. */
541# endif /* !ksr1 */
542#else
543 ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */
544#endif /* !TERMIOS_TTY_DRIVER */
545
1b17e766 546#endif /* 0 */
d60d9f65
SS
547
548 return 0;
549}
550
551static void
552prepare_terminal_settings (meta_flag, otio, tiop)
553 int meta_flag;
554 TIOTYPE otio, *tiop;
555{
556 readline_echoing_p = (otio.c_lflag & ECHO);
557
558 tiop->c_lflag &= ~(ICANON | ECHO);
559
560 if ((unsigned char) otio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
561 _rl_eof_char = otio.c_cc[VEOF];
562
563#if defined (USE_XON_XOFF)
564#if defined (IXANY)
565 tiop->c_iflag &= ~(IXON | IXOFF | IXANY);
566#else
567 /* `strict' Posix systems do not define IXANY. */
568 tiop->c_iflag &= ~(IXON | IXOFF);
569#endif /* IXANY */
570#endif /* USE_XON_XOFF */
571
572 /* Only turn this off if we are using all 8 bits. */
573 if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag)
574 tiop->c_iflag &= ~(ISTRIP | INPCK);
575
576 /* Make sure we differentiate between CR and NL on input. */
577 tiop->c_iflag &= ~(ICRNL | INLCR);
578
579#if !defined (HANDLE_SIGNALS)
580 tiop->c_lflag &= ~ISIG;
581#else
582 tiop->c_lflag |= ISIG;
583#endif
584
585 tiop->c_cc[VMIN] = 1;
586 tiop->c_cc[VTIME] = 0;
587
588#if defined (FLUSHO)
589 if (OUTPUT_BEING_FLUSHED (tiop))
590 {
591 tiop->c_lflag &= ~FLUSHO;
592 otio.c_lflag &= ~FLUSHO;
593 }
594#endif
595
596 /* Turn off characters that we need on Posix systems with job control,
597 just to be sure. This includes ^Y and ^V. This should not really
598 be necessary. */
599#if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
600
601#if defined (VLNEXT)
602 tiop->c_cc[VLNEXT] = _POSIX_VDISABLE;
603#endif
604
605#if defined (VDSUSP)
606 tiop->c_cc[VDSUSP] = _POSIX_VDISABLE;
607#endif
608
609#endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
610}
611#endif /* NEW_TTY_DRIVER */
612
613/* Put the terminal in CBREAK mode so that we can detect key presses. */
614void
615rl_prep_terminal (meta_flag)
616 int meta_flag;
617{
d60d9f65
SS
618 int tty;
619 TIOTYPE tio;
620
621 if (terminal_prepped)
622 return;
623
624 /* Try to keep this function from being INTerrupted. */
625 block_sigint ();
626
627 tty = fileno (rl_instream);
628
629 if (get_tty_settings (tty, &tio) < 0)
630 {
631 release_sigint ();
632 return;
633 }
634
635 otio = tio;
636
1b17e766
EZ
637 save_tty_chars (&otio);
638
d60d9f65
SS
639 prepare_terminal_settings (meta_flag, otio, &tio);
640
641 if (set_tty_settings (tty, &tio) < 0)
642 {
643 release_sigint ();
644 return;
645 }
646
647 if (_rl_enable_keypad)
648 _rl_control_keypad (1);
649
650 fflush (rl_outstream);
651 terminal_prepped = 1;
652
653 release_sigint ();
d60d9f65
SS
654}
655
656/* Restore the terminal's normal settings and modes. */
657void
658rl_deprep_terminal ()
659{
d60d9f65
SS
660 int tty;
661
662 if (!terminal_prepped)
663 return;
664
665 /* Try to keep this function from being interrupted. */
666 block_sigint ();
667
668 tty = fileno (rl_instream);
669
670 if (_rl_enable_keypad)
671 _rl_control_keypad (0);
672
673 fflush (rl_outstream);
674
675 if (set_tty_settings (tty, &otio) < 0)
676 {
677 release_sigint ();
678 return;
679 }
680
681 terminal_prepped = 0;
682
683 release_sigint ();
d60d9f65
SS
684}
685\f
686/* **************************************************************** */
687/* */
688/* Bogus Flow Control */
689/* */
690/* **************************************************************** */
691
692int
693rl_restart_output (count, key)
694 int count, key;
695{
696 int fildes = fileno (rl_outstream);
697#if defined (TIOCSTART)
698#if defined (apollo)
699 ioctl (&fildes, TIOCSTART, 0);
700#else
701 ioctl (fildes, TIOCSTART, 0);
702#endif /* apollo */
703
704#else /* !TIOCSTART */
705# if defined (TERMIOS_TTY_DRIVER)
706# if defined (__ksr1__)
707 if (ksrflow)
708 {
709 ksrflow = 0;
710 tcflow (fildes, TCOON);
711 }
712# else /* !ksr1 */
713 tcflow (fildes, TCOON); /* Simulate a ^Q. */
714# endif /* !ksr1 */
715# else /* !TERMIOS_TTY_DRIVER */
716# if defined (TCXONC)
717 ioctl (fildes, TCXONC, TCOON);
718# endif /* TCXONC */
719# endif /* !TERMIOS_TTY_DRIVER */
720#endif /* !TIOCSTART */
721
722 return 0;
723}
724
725int
726rl_stop_output (count, key)
727 int count, key;
728{
729 int fildes = fileno (rl_instream);
730
731#if defined (TIOCSTOP)
732# if defined (apollo)
733 ioctl (&fildes, TIOCSTOP, 0);
734# else
735 ioctl (fildes, TIOCSTOP, 0);
736# endif /* apollo */
737#else /* !TIOCSTOP */
738# if defined (TERMIOS_TTY_DRIVER)
739# if defined (__ksr1__)
740 ksrflow = 1;
741# endif /* ksr1 */
742 tcflow (fildes, TCOOFF);
743# else
744# if defined (TCXONC)
745 ioctl (fildes, TCXONC, TCOON);
746# endif /* TCXONC */
747# endif /* !TERMIOS_TTY_DRIVER */
748#endif /* !TIOCSTOP */
749
750 return 0;
751}
752
753/* **************************************************************** */
754/* */
755/* Default Key Bindings */
756/* */
757/* **************************************************************** */
758void
759rltty_set_default_bindings (kmap)
760 Keymap kmap;
761{
762 TIOTYPE ttybuff;
763 int tty = fileno (rl_instream);
764
765#if defined (NEW_TTY_DRIVER)
766
767#define SET_SPECIAL(sc, func) \
768 do \
769 { \
770 int ic; \
771 ic = sc; \
772 if (ic != -1 && kmap[ic].type == ISFUNC) \
773 kmap[ic].function = func; \
774 } \
775 while (0)
776
777 if (get_tty_settings (tty, &ttybuff) == 0)
778 {
779 if (ttybuff.flags & SGTTY_SET)
780 {
781 SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout);
782 SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard);
783 }
784
785# if defined (TIOCGLTC)
786 if (ttybuff.flags & LTCHARS_SET)
787 {
788 SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout);
789 SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert);
790 }
791# endif /* TIOCGLTC */
792 }
793
794#else /* !NEW_TTY_DRIVER */
795
796#define SET_SPECIAL(sc, func) \
797 do \
798 { \
799 unsigned char uc; \
800 uc = ttybuff.c_cc[sc]; \
801 if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
802 kmap[uc].function = func; \
803 } \
804 while (0)
805
806 if (get_tty_settings (tty, &ttybuff) == 0)
807 {
808 SET_SPECIAL (VERASE, rl_rubout);
809 SET_SPECIAL (VKILL, rl_unix_line_discard);
810
811# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
812 SET_SPECIAL (VLNEXT, rl_quoted_insert);
813# endif /* VLNEXT && TERMIOS_TTY_DRIVER */
814
815# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
816 SET_SPECIAL (VWERASE, rl_unix_word_rubout);
817# endif /* VWERASE && TERMIOS_TTY_DRIVER */
818 }
819#endif /* !NEW_TTY_DRIVER */
820}
1b17e766
EZ
821
822#if defined (HANDLE_SIGNALS)
823
824#if defined (NEW_TTY_DRIVER)
825int
826_rl_disable_tty_signals ()
827{
828 return 0;
829}
830
831int
832_rl_restore_tty_signals ()
833{
834 return 0;
835}
836#else
837
838static TIOTYPE sigstty, nosigstty;
839static int tty_sigs_disabled = 0;
840
841int
842_rl_disable_tty_signals ()
843{
844 if (tty_sigs_disabled)
845 return 0;
846
847 if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0)
848 return -1;
849
850 nosigstty = sigstty;
851
852 nosigstty.c_lflag &= ~ISIG;
853
854 if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0)
855 return (_set_tty_settings (fileno (rl_instream), &sigstty));
856
857 tty_sigs_disabled = 1;
858 return 0;
859}
860
861int
862_rl_restore_tty_signals ()
863{
864 if (tty_sigs_disabled == 0)
865 return 0;
866
867 return (_set_tty_settings (fileno (rl_instream), &sigstty));
868}
869#endif /* !NEW_TTY_DRIVER */
870
871#endif /* HANDLE_SIGNALS */
This page took 0.197342 seconds and 4 git commands to generate.