Annotation of embedaddon/readline/rltty.c, revision 1.1.1.1
1.1 misho 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>