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