xref: /dflybsd-src/contrib/gdb-7/readline/rltty.c (revision 16003dcfd2baa152f5dd24794ec9f36e139eaeb8)
1*6b445a62SJohn Marino /* rltty.c -- functions to prepare and restore the terminal for readline's
2*6b445a62SJohn Marino    use. */
3*6b445a62SJohn Marino 
4*6b445a62SJohn Marino /* Copyright (C) 1992-2005 Free Software Foundation, Inc.
5*6b445a62SJohn Marino 
6*6b445a62SJohn Marino    This file is part of the GNU Readline Library (Readline), a library
7*6b445a62SJohn Marino    for reading lines of text with interactive input and history editing.
8*6b445a62SJohn Marino 
9*6b445a62SJohn Marino    Readline is free software: you can redistribute it and/or modify
10*6b445a62SJohn Marino    it under the terms of the GNU General Public License as published by
11*6b445a62SJohn Marino    the Free Software Foundation, either version 3 of the License, or
12*6b445a62SJohn Marino    (at your option) any later version.
13*6b445a62SJohn Marino 
14*6b445a62SJohn Marino    Readline is distributed in the hope that it will be useful,
15*6b445a62SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
16*6b445a62SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*6b445a62SJohn Marino    GNU General Public License for more details.
18*6b445a62SJohn Marino 
19*6b445a62SJohn Marino    You should have received a copy of the GNU General Public License
20*6b445a62SJohn Marino    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
21*6b445a62SJohn Marino */
22*6b445a62SJohn Marino 
23*6b445a62SJohn Marino #define READLINE_LIBRARY
24*6b445a62SJohn Marino 
25*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
26*6b445a62SJohn Marino #  include <config.h>
27*6b445a62SJohn Marino #endif
28*6b445a62SJohn Marino 
29*6b445a62SJohn Marino #include <sys/types.h>
30*6b445a62SJohn Marino #include <signal.h>
31*6b445a62SJohn Marino #include <errno.h>
32*6b445a62SJohn Marino #include <stdio.h>
33*6b445a62SJohn Marino 
34*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
35*6b445a62SJohn Marino #  include <unistd.h>
36*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
37*6b445a62SJohn Marino 
38*6b445a62SJohn Marino #include "rldefs.h"
39*6b445a62SJohn Marino 
40*6b445a62SJohn Marino #if defined (GWINSZ_IN_SYS_IOCTL)
41*6b445a62SJohn Marino #  include <sys/ioctl.h>
42*6b445a62SJohn Marino #endif /* GWINSZ_IN_SYS_IOCTL */
43*6b445a62SJohn Marino 
44*6b445a62SJohn Marino #include "rltty.h"
45*6b445a62SJohn Marino #include "readline.h"
46*6b445a62SJohn Marino #include "rlprivate.h"
47*6b445a62SJohn Marino 
48*6b445a62SJohn Marino #if !defined (errno)
49*6b445a62SJohn Marino extern int errno;
50*6b445a62SJohn Marino #endif /* !errno */
51*6b445a62SJohn Marino 
52*6b445a62SJohn Marino rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal;
53*6b445a62SJohn Marino rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal;
54*6b445a62SJohn Marino 
55*6b445a62SJohn Marino static void set_winsize PARAMS((int));
56*6b445a62SJohn Marino 
57*6b445a62SJohn Marino /* **************************************************************** */
58*6b445a62SJohn Marino /*								    */
59*6b445a62SJohn Marino /*		      Saving and Restoring the TTY	    	    */
60*6b445a62SJohn Marino /*								    */
61*6b445a62SJohn Marino /* **************************************************************** */
62*6b445a62SJohn Marino 
63*6b445a62SJohn Marino /* Non-zero means that the terminal is in a prepped state. */
64*6b445a62SJohn Marino static int terminal_prepped;
65*6b445a62SJohn Marino 
66*6b445a62SJohn Marino static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars;
67*6b445a62SJohn Marino 
68*6b445a62SJohn Marino /* If non-zero, means that this process has called tcflow(fd, TCOOFF)
69*6b445a62SJohn Marino    and output is suspended. */
70*6b445a62SJohn Marino #if defined (__ksr1__)
71*6b445a62SJohn Marino static int ksrflow;
72*6b445a62SJohn Marino #endif
73*6b445a62SJohn Marino 
74*6b445a62SJohn Marino /* Dummy call to force a backgrounded readline to stop before it tries
75*6b445a62SJohn Marino    to get the tty settings. */
76*6b445a62SJohn Marino static void
set_winsize(tty)77*6b445a62SJohn Marino set_winsize (tty)
78*6b445a62SJohn Marino      int tty;
79*6b445a62SJohn Marino {
80*6b445a62SJohn Marino #if defined (TIOCGWINSZ)
81*6b445a62SJohn Marino   struct winsize w;
82*6b445a62SJohn Marino 
83*6b445a62SJohn Marino   if (ioctl (tty, TIOCGWINSZ, &w) == 0)
84*6b445a62SJohn Marino       (void) ioctl (tty, TIOCSWINSZ, &w);
85*6b445a62SJohn Marino #endif /* TIOCGWINSZ */
86*6b445a62SJohn Marino }
87*6b445a62SJohn Marino 
88*6b445a62SJohn Marino #if defined (NO_TTY_DRIVER)
89*6b445a62SJohn Marino /* Nothing */
90*6b445a62SJohn Marino #elif defined (NEW_TTY_DRIVER)
91*6b445a62SJohn Marino 
92*6b445a62SJohn Marino /* Values for the `flags' field of a struct bsdtty.  This tells which
93*6b445a62SJohn Marino    elements of the struct bsdtty have been fetched from the system and
94*6b445a62SJohn Marino    are valid. */
95*6b445a62SJohn Marino #define SGTTY_SET	0x01
96*6b445a62SJohn Marino #define LFLAG_SET	0x02
97*6b445a62SJohn Marino #define TCHARS_SET	0x04
98*6b445a62SJohn Marino #define LTCHARS_SET	0x08
99*6b445a62SJohn Marino 
100*6b445a62SJohn Marino struct bsdtty {
101*6b445a62SJohn Marino   struct sgttyb sgttyb;	/* Basic BSD tty driver information. */
102*6b445a62SJohn Marino   int lflag;		/* Local mode flags, like LPASS8. */
103*6b445a62SJohn Marino #if defined (TIOCGETC)
104*6b445a62SJohn Marino   struct tchars tchars;	/* Terminal special characters, including ^S and ^Q. */
105*6b445a62SJohn Marino #endif
106*6b445a62SJohn Marino #if defined (TIOCGLTC)
107*6b445a62SJohn Marino   struct ltchars ltchars; /* 4.2 BSD editing characters */
108*6b445a62SJohn Marino #endif
109*6b445a62SJohn Marino   int flags;		/* Bitmap saying which parts of the struct are valid. */
110*6b445a62SJohn Marino };
111*6b445a62SJohn Marino 
112*6b445a62SJohn Marino #define TIOTYPE struct bsdtty
113*6b445a62SJohn Marino 
114*6b445a62SJohn Marino static TIOTYPE otio;
115*6b445a62SJohn Marino 
116*6b445a62SJohn Marino static void save_tty_chars PARAMS((TIOTYPE *));
117*6b445a62SJohn Marino static int _get_tty_settings PARAMS((int, TIOTYPE *));
118*6b445a62SJohn Marino static int get_tty_settings PARAMS((int, TIOTYPE *));
119*6b445a62SJohn Marino static int _set_tty_settings PARAMS((int, TIOTYPE *));
120*6b445a62SJohn Marino static int set_tty_settings PARAMS((int, TIOTYPE *));
121*6b445a62SJohn Marino 
122*6b445a62SJohn Marino static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *));
123*6b445a62SJohn Marino 
124*6b445a62SJohn Marino static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t));
125*6b445a62SJohn Marino 
126*6b445a62SJohn Marino static void
save_tty_chars(tiop)127*6b445a62SJohn Marino save_tty_chars (tiop)
128*6b445a62SJohn Marino      TIOTYPE *tiop;
129*6b445a62SJohn Marino {
130*6b445a62SJohn Marino   _rl_last_tty_chars = _rl_tty_chars;
131*6b445a62SJohn Marino 
132*6b445a62SJohn Marino   if (tiop->flags & SGTTY_SET)
133*6b445a62SJohn Marino     {
134*6b445a62SJohn Marino       _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase;
135*6b445a62SJohn Marino       _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill;
136*6b445a62SJohn Marino     }
137*6b445a62SJohn Marino 
138*6b445a62SJohn Marino   if (tiop->flags & TCHARS_SET)
139*6b445a62SJohn Marino     {
140*6b445a62SJohn Marino       _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
141*6b445a62SJohn Marino       _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
142*6b445a62SJohn Marino 
143*6b445a62SJohn Marino       _rl_tty_chars.t_start = tiop->tchars.t_startc;
144*6b445a62SJohn Marino       _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
145*6b445a62SJohn Marino       _rl_tty_chars.t_eof = tiop->tchars.t_eofc;
146*6b445a62SJohn Marino       _rl_tty_chars.t_eol = '\n';
147*6b445a62SJohn Marino       _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc;
148*6b445a62SJohn Marino     }
149*6b445a62SJohn Marino 
150*6b445a62SJohn Marino   if (tiop->flags & LTCHARS_SET)
151*6b445a62SJohn Marino     {
152*6b445a62SJohn Marino       _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
153*6b445a62SJohn Marino 
154*6b445a62SJohn Marino       _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc;
155*6b445a62SJohn Marino       _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc;
156*6b445a62SJohn Marino       _rl_tty_chars.t_flush = tiop->ltchars.t_flushc;
157*6b445a62SJohn Marino       _rl_tty_chars.t_werase = tiop->ltchars.t_werasc;
158*6b445a62SJohn Marino       _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc;
159*6b445a62SJohn Marino     }
160*6b445a62SJohn Marino 
161*6b445a62SJohn Marino   _rl_tty_chars.t_status = -1;
162*6b445a62SJohn Marino }
163*6b445a62SJohn Marino 
164*6b445a62SJohn Marino static int
get_tty_settings(tty,tiop)165*6b445a62SJohn Marino get_tty_settings (tty, tiop)
166*6b445a62SJohn Marino      int tty;
167*6b445a62SJohn Marino      TIOTYPE *tiop;
168*6b445a62SJohn Marino {
169*6b445a62SJohn Marino   set_winsize (tty);
170*6b445a62SJohn Marino 
171*6b445a62SJohn Marino   tiop->flags = tiop->lflag = 0;
172*6b445a62SJohn Marino 
173*6b445a62SJohn Marino   errno = 0;
174*6b445a62SJohn Marino   if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0)
175*6b445a62SJohn Marino     return -1;
176*6b445a62SJohn Marino   tiop->flags |= SGTTY_SET;
177*6b445a62SJohn Marino 
178*6b445a62SJohn Marino #if defined (TIOCLGET)
179*6b445a62SJohn Marino   if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0)
180*6b445a62SJohn Marino     tiop->flags |= LFLAG_SET;
181*6b445a62SJohn Marino #endif
182*6b445a62SJohn Marino 
183*6b445a62SJohn Marino #if defined (TIOCGETC)
184*6b445a62SJohn Marino   if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0)
185*6b445a62SJohn Marino     tiop->flags |= TCHARS_SET;
186*6b445a62SJohn Marino #endif
187*6b445a62SJohn Marino 
188*6b445a62SJohn Marino #if defined (TIOCGLTC)
189*6b445a62SJohn Marino   if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0)
190*6b445a62SJohn Marino     tiop->flags |= LTCHARS_SET;
191*6b445a62SJohn Marino #endif
192*6b445a62SJohn Marino 
193*6b445a62SJohn Marino   return 0;
194*6b445a62SJohn Marino }
195*6b445a62SJohn Marino 
196*6b445a62SJohn Marino static int
set_tty_settings(tty,tiop)197*6b445a62SJohn Marino set_tty_settings (tty, tiop)
198*6b445a62SJohn Marino      int tty;
199*6b445a62SJohn Marino      TIOTYPE *tiop;
200*6b445a62SJohn Marino {
201*6b445a62SJohn Marino   if (tiop->flags & SGTTY_SET)
202*6b445a62SJohn Marino     {
203*6b445a62SJohn Marino       ioctl (tty, TIOCSETN, &(tiop->sgttyb));
204*6b445a62SJohn Marino       tiop->flags &= ~SGTTY_SET;
205*6b445a62SJohn Marino     }
206*6b445a62SJohn Marino   _rl_echoing_p = 1;
207*6b445a62SJohn Marino 
208*6b445a62SJohn Marino #if defined (TIOCLSET)
209*6b445a62SJohn Marino   if (tiop->flags & LFLAG_SET)
210*6b445a62SJohn Marino     {
211*6b445a62SJohn Marino       ioctl (tty, TIOCLSET, &(tiop->lflag));
212*6b445a62SJohn Marino       tiop->flags &= ~LFLAG_SET;
213*6b445a62SJohn Marino     }
214*6b445a62SJohn Marino #endif
215*6b445a62SJohn Marino 
216*6b445a62SJohn Marino #if defined (TIOCSETC)
217*6b445a62SJohn Marino   if (tiop->flags & TCHARS_SET)
218*6b445a62SJohn Marino     {
219*6b445a62SJohn Marino       ioctl (tty, TIOCSETC, &(tiop->tchars));
220*6b445a62SJohn Marino       tiop->flags &= ~TCHARS_SET;
221*6b445a62SJohn Marino     }
222*6b445a62SJohn Marino #endif
223*6b445a62SJohn Marino 
224*6b445a62SJohn Marino #if defined (TIOCSLTC)
225*6b445a62SJohn Marino   if (tiop->flags & LTCHARS_SET)
226*6b445a62SJohn Marino     {
227*6b445a62SJohn Marino       ioctl (tty, TIOCSLTC, &(tiop->ltchars));
228*6b445a62SJohn Marino       tiop->flags &= ~LTCHARS_SET;
229*6b445a62SJohn Marino     }
230*6b445a62SJohn Marino #endif
231*6b445a62SJohn Marino 
232*6b445a62SJohn Marino   return 0;
233*6b445a62SJohn Marino }
234*6b445a62SJohn Marino 
235*6b445a62SJohn Marino static void
prepare_terminal_settings(meta_flag,oldtio,tiop)236*6b445a62SJohn Marino prepare_terminal_settings (meta_flag, oldtio, tiop)
237*6b445a62SJohn Marino      int meta_flag;
238*6b445a62SJohn Marino      TIOTYPE oldtio, *tiop;
239*6b445a62SJohn Marino {
240*6b445a62SJohn Marino   _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
241*6b445a62SJohn Marino   _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL);
242*6b445a62SJohn Marino 
243*6b445a62SJohn Marino   /* Copy the original settings to the structure we're going to use for
244*6b445a62SJohn Marino      our settings. */
245*6b445a62SJohn Marino   tiop->sgttyb = oldtio.sgttyb;
246*6b445a62SJohn Marino   tiop->lflag = oldtio.lflag;
247*6b445a62SJohn Marino #if defined (TIOCGETC)
248*6b445a62SJohn Marino   tiop->tchars = oldtio.tchars;
249*6b445a62SJohn Marino #endif
250*6b445a62SJohn Marino #if defined (TIOCGLTC)
251*6b445a62SJohn Marino   tiop->ltchars = oldtio.ltchars;
252*6b445a62SJohn Marino #endif
253*6b445a62SJohn Marino   tiop->flags = oldtio.flags;
254*6b445a62SJohn Marino 
255*6b445a62SJohn Marino   /* First, the basic settings to put us into character-at-a-time, no-echo
256*6b445a62SJohn Marino      input mode. */
257*6b445a62SJohn Marino   tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD);
258*6b445a62SJohn Marino   tiop->sgttyb.sg_flags |= CBREAK;
259*6b445a62SJohn Marino 
260*6b445a62SJohn Marino   /* If this terminal doesn't care how the 8th bit is used, then we can
261*6b445a62SJohn Marino      use it for the meta-key.  If only one of even or odd parity is
262*6b445a62SJohn Marino      specified, then the terminal is using parity, and we cannot. */
263*6b445a62SJohn Marino #if !defined (ANYP)
264*6b445a62SJohn Marino #  define ANYP (EVENP | ODDP)
265*6b445a62SJohn Marino #endif
266*6b445a62SJohn Marino   if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) ||
267*6b445a62SJohn Marino       ((oldtio.sgttyb.sg_flags & ANYP) == 0))
268*6b445a62SJohn Marino     {
269*6b445a62SJohn Marino       tiop->sgttyb.sg_flags |= ANYP;
270*6b445a62SJohn Marino 
271*6b445a62SJohn Marino       /* Hack on local mode flags if we can. */
272*6b445a62SJohn Marino #if defined (TIOCLGET)
273*6b445a62SJohn Marino #  if defined (LPASS8)
274*6b445a62SJohn Marino       tiop->lflag |= LPASS8;
275*6b445a62SJohn Marino #  endif /* LPASS8 */
276*6b445a62SJohn Marino #endif /* TIOCLGET */
277*6b445a62SJohn Marino     }
278*6b445a62SJohn Marino 
279*6b445a62SJohn Marino #if defined (TIOCGETC)
280*6b445a62SJohn Marino #  if defined (USE_XON_XOFF)
281*6b445a62SJohn Marino   /* Get rid of terminal output start and stop characters. */
282*6b445a62SJohn Marino   tiop->tchars.t_stopc = -1; /* C-s */
283*6b445a62SJohn Marino   tiop->tchars.t_startc = -1; /* C-q */
284*6b445a62SJohn Marino 
285*6b445a62SJohn Marino   /* If there is an XON character, bind it to restart the output. */
286*6b445a62SJohn Marino   if (oldtio.tchars.t_startc != -1)
287*6b445a62SJohn Marino     rl_bind_key (oldtio.tchars.t_startc, rl_restart_output);
288*6b445a62SJohn Marino #  endif /* USE_XON_XOFF */
289*6b445a62SJohn Marino 
290*6b445a62SJohn Marino   /* If there is an EOF char, bind _rl_eof_char to it. */
291*6b445a62SJohn Marino   if (oldtio.tchars.t_eofc != -1)
292*6b445a62SJohn Marino     _rl_eof_char = oldtio.tchars.t_eofc;
293*6b445a62SJohn Marino 
294*6b445a62SJohn Marino #  if defined (NO_KILL_INTR)
295*6b445a62SJohn Marino   /* Get rid of terminal-generated SIGQUIT and SIGINT. */
296*6b445a62SJohn Marino   tiop->tchars.t_quitc = -1; /* C-\ */
297*6b445a62SJohn Marino   tiop->tchars.t_intrc = -1; /* C-c */
298*6b445a62SJohn Marino #  endif /* NO_KILL_INTR */
299*6b445a62SJohn Marino #endif /* TIOCGETC */
300*6b445a62SJohn Marino 
301*6b445a62SJohn Marino #if defined (TIOCGLTC)
302*6b445a62SJohn Marino   /* Make the interrupt keys go away.  Just enough to make people happy. */
303*6b445a62SJohn Marino   tiop->ltchars.t_dsuspc = -1;	/* C-y */
304*6b445a62SJohn Marino   tiop->ltchars.t_lnextc = -1;	/* C-v */
305*6b445a62SJohn Marino #endif /* TIOCGLTC */
306*6b445a62SJohn Marino }
307*6b445a62SJohn Marino 
308*6b445a62SJohn Marino #else  /* !defined (NEW_TTY_DRIVER) */
309*6b445a62SJohn Marino 
310*6b445a62SJohn Marino #if !defined (VMIN)
311*6b445a62SJohn Marino #  define VMIN VEOF
312*6b445a62SJohn Marino #endif
313*6b445a62SJohn Marino 
314*6b445a62SJohn Marino #if !defined (VTIME)
315*6b445a62SJohn Marino #  define VTIME VEOL
316*6b445a62SJohn Marino #endif
317*6b445a62SJohn Marino 
318*6b445a62SJohn Marino #if defined (TERMIOS_TTY_DRIVER)
319*6b445a62SJohn Marino #  define TIOTYPE struct termios
320*6b445a62SJohn Marino #  define DRAIN_OUTPUT(fd)	tcdrain (fd)
321*6b445a62SJohn Marino #  define GETATTR(tty, tiop)	(tcgetattr (tty, tiop))
322*6b445a62SJohn Marino #  ifdef M_UNIX
323*6b445a62SJohn Marino #    define SETATTR(tty, tiop)	(tcsetattr (tty, TCSANOW, tiop))
324*6b445a62SJohn Marino #  else
325*6b445a62SJohn Marino #    define SETATTR(tty, tiop)	(tcsetattr (tty, TCSADRAIN, tiop))
326*6b445a62SJohn Marino #  endif /* !M_UNIX */
327*6b445a62SJohn Marino #else
328*6b445a62SJohn Marino #  define TIOTYPE struct termio
329*6b445a62SJohn Marino #  define DRAIN_OUTPUT(fd)
330*6b445a62SJohn Marino #  define GETATTR(tty, tiop)	(ioctl (tty, TCGETA, tiop))
331*6b445a62SJohn Marino #  define SETATTR(tty, tiop)	(ioctl (tty, TCSETAW, tiop))
332*6b445a62SJohn Marino #endif /* !TERMIOS_TTY_DRIVER */
333*6b445a62SJohn Marino 
334*6b445a62SJohn Marino static TIOTYPE otio;
335*6b445a62SJohn Marino 
336*6b445a62SJohn Marino static void save_tty_chars PARAMS((TIOTYPE *));
337*6b445a62SJohn Marino static int _get_tty_settings PARAMS((int, TIOTYPE *));
338*6b445a62SJohn Marino static int get_tty_settings PARAMS((int, TIOTYPE *));
339*6b445a62SJohn Marino static int _set_tty_settings PARAMS((int, TIOTYPE *));
340*6b445a62SJohn Marino static int set_tty_settings PARAMS((int, TIOTYPE *));
341*6b445a62SJohn Marino 
342*6b445a62SJohn Marino static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *));
343*6b445a62SJohn Marino 
344*6b445a62SJohn Marino static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t));
345*6b445a62SJohn Marino static void _rl_bind_tty_special_chars PARAMS((Keymap, TIOTYPE));
346*6b445a62SJohn Marino 
347*6b445a62SJohn Marino #if defined (FLUSHO)
348*6b445a62SJohn Marino #  define OUTPUT_BEING_FLUSHED(tp)  (tp->c_lflag & FLUSHO)
349*6b445a62SJohn Marino #else
350*6b445a62SJohn Marino #  define OUTPUT_BEING_FLUSHED(tp)  0
351*6b445a62SJohn Marino #endif
352*6b445a62SJohn Marino 
353*6b445a62SJohn Marino static void
save_tty_chars(tiop)354*6b445a62SJohn Marino save_tty_chars (tiop)
355*6b445a62SJohn Marino      TIOTYPE *tiop;
356*6b445a62SJohn Marino {
357*6b445a62SJohn Marino   _rl_last_tty_chars = _rl_tty_chars;
358*6b445a62SJohn Marino 
359*6b445a62SJohn Marino   _rl_tty_chars.t_eof = tiop->c_cc[VEOF];
360*6b445a62SJohn Marino   _rl_tty_chars.t_eol = tiop->c_cc[VEOL];
361*6b445a62SJohn Marino #ifdef VEOL2
362*6b445a62SJohn Marino   _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2];
363*6b445a62SJohn Marino #endif
364*6b445a62SJohn Marino   _rl_tty_chars.t_erase = tiop->c_cc[VERASE];
365*6b445a62SJohn Marino #ifdef VWERASE
366*6b445a62SJohn Marino   _rl_tty_chars.t_werase = tiop->c_cc[VWERASE];
367*6b445a62SJohn Marino #endif
368*6b445a62SJohn Marino   _rl_tty_chars.t_kill = tiop->c_cc[VKILL];
369*6b445a62SJohn Marino #ifdef VREPRINT
370*6b445a62SJohn Marino   _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
371*6b445a62SJohn Marino #endif
372*6b445a62SJohn Marino   _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
373*6b445a62SJohn Marino   _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
374*6b445a62SJohn Marino #ifdef VSUSP
375*6b445a62SJohn Marino   _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
376*6b445a62SJohn Marino #endif
377*6b445a62SJohn Marino #ifdef VDSUSP
378*6b445a62SJohn Marino   _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
379*6b445a62SJohn Marino #endif
380*6b445a62SJohn Marino #ifdef VSTART
381*6b445a62SJohn Marino   _rl_tty_chars.t_start = tiop->c_cc[VSTART];
382*6b445a62SJohn Marino #endif
383*6b445a62SJohn Marino #ifdef VSTOP
384*6b445a62SJohn Marino   _rl_tty_chars.t_stop = tiop->c_cc[VSTOP];
385*6b445a62SJohn Marino #endif
386*6b445a62SJohn Marino #ifdef VLNEXT
387*6b445a62SJohn Marino   _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT];
388*6b445a62SJohn Marino #endif
389*6b445a62SJohn Marino #ifdef VDISCARD
390*6b445a62SJohn Marino   _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD];
391*6b445a62SJohn Marino #endif
392*6b445a62SJohn Marino #ifdef VSTATUS
393*6b445a62SJohn Marino   _rl_tty_chars.t_status = tiop->c_cc[VSTATUS];
394*6b445a62SJohn Marino #endif
395*6b445a62SJohn Marino }
396*6b445a62SJohn Marino 
397*6b445a62SJohn Marino #if defined (_AIX) || defined (_AIX41)
398*6b445a62SJohn Marino /* Currently this is only used on AIX */
399*6b445a62SJohn Marino static void
rltty_warning(msg)400*6b445a62SJohn Marino rltty_warning (msg)
401*6b445a62SJohn Marino      char *msg;
402*6b445a62SJohn Marino {
403*6b445a62SJohn Marino   _rl_errmsg ("warning: %s", msg);
404*6b445a62SJohn Marino }
405*6b445a62SJohn Marino #endif
406*6b445a62SJohn Marino 
407*6b445a62SJohn Marino #if defined (_AIX)
408*6b445a62SJohn Marino void
setopost(tp)409*6b445a62SJohn Marino setopost(tp)
410*6b445a62SJohn Marino TIOTYPE *tp;
411*6b445a62SJohn Marino {
412*6b445a62SJohn Marino   if ((tp->c_oflag & OPOST) == 0)
413*6b445a62SJohn Marino     {
414*6b445a62SJohn Marino       _rl_errmsg ("warning: turning on OPOST for terminal\r");
415*6b445a62SJohn Marino       tp->c_oflag |= OPOST|ONLCR;
416*6b445a62SJohn Marino     }
417*6b445a62SJohn Marino }
418*6b445a62SJohn Marino #endif
419*6b445a62SJohn Marino 
420*6b445a62SJohn Marino static int
_get_tty_settings(tty,tiop)421*6b445a62SJohn Marino _get_tty_settings (tty, tiop)
422*6b445a62SJohn Marino      int tty;
423*6b445a62SJohn Marino      TIOTYPE *tiop;
424*6b445a62SJohn Marino {
425*6b445a62SJohn Marino   int ioctl_ret;
426*6b445a62SJohn Marino 
427*6b445a62SJohn Marino   while (1)
428*6b445a62SJohn Marino     {
429*6b445a62SJohn Marino       ioctl_ret = GETATTR (tty, tiop);
430*6b445a62SJohn Marino       if (ioctl_ret < 0)
431*6b445a62SJohn Marino 	{
432*6b445a62SJohn Marino 	  if (errno != EINTR)
433*6b445a62SJohn Marino 	    return -1;
434*6b445a62SJohn Marino 	  else
435*6b445a62SJohn Marino 	    continue;
436*6b445a62SJohn Marino 	}
437*6b445a62SJohn Marino       if (OUTPUT_BEING_FLUSHED (tiop))
438*6b445a62SJohn Marino 	{
439*6b445a62SJohn Marino #if defined (FLUSHO)
440*6b445a62SJohn Marino 	  _rl_errmsg ("warning: turning off output flushing");
441*6b445a62SJohn Marino 	  tiop->c_lflag &= ~FLUSHO;
442*6b445a62SJohn Marino 	  break;
443*6b445a62SJohn Marino #else
444*6b445a62SJohn Marino 	  continue;
445*6b445a62SJohn Marino #endif
446*6b445a62SJohn Marino 	}
447*6b445a62SJohn Marino       break;
448*6b445a62SJohn Marino     }
449*6b445a62SJohn Marino 
450*6b445a62SJohn Marino   return 0;
451*6b445a62SJohn Marino }
452*6b445a62SJohn Marino 
453*6b445a62SJohn Marino static int
get_tty_settings(tty,tiop)454*6b445a62SJohn Marino get_tty_settings (tty, tiop)
455*6b445a62SJohn Marino      int tty;
456*6b445a62SJohn Marino      TIOTYPE *tiop;
457*6b445a62SJohn Marino {
458*6b445a62SJohn Marino   set_winsize (tty);
459*6b445a62SJohn Marino 
460*6b445a62SJohn Marino   errno = 0;
461*6b445a62SJohn Marino   if (_get_tty_settings (tty, tiop) < 0)
462*6b445a62SJohn Marino     return -1;
463*6b445a62SJohn Marino 
464*6b445a62SJohn Marino #if defined (_AIX)
465*6b445a62SJohn Marino   setopost(tiop);
466*6b445a62SJohn Marino #endif
467*6b445a62SJohn Marino 
468*6b445a62SJohn Marino   return 0;
469*6b445a62SJohn Marino }
470*6b445a62SJohn Marino 
471*6b445a62SJohn Marino static int
_set_tty_settings(tty,tiop)472*6b445a62SJohn Marino _set_tty_settings (tty, tiop)
473*6b445a62SJohn Marino      int tty;
474*6b445a62SJohn Marino      TIOTYPE *tiop;
475*6b445a62SJohn Marino {
476*6b445a62SJohn Marino   while (SETATTR (tty, tiop) < 0)
477*6b445a62SJohn Marino     {
478*6b445a62SJohn Marino       if (errno != EINTR)
479*6b445a62SJohn Marino 	return -1;
480*6b445a62SJohn Marino       errno = 0;
481*6b445a62SJohn Marino     }
482*6b445a62SJohn Marino   return 0;
483*6b445a62SJohn Marino }
484*6b445a62SJohn Marino 
485*6b445a62SJohn Marino static int
set_tty_settings(tty,tiop)486*6b445a62SJohn Marino set_tty_settings (tty, tiop)
487*6b445a62SJohn Marino      int tty;
488*6b445a62SJohn Marino      TIOTYPE *tiop;
489*6b445a62SJohn Marino {
490*6b445a62SJohn Marino   if (_set_tty_settings (tty, tiop) < 0)
491*6b445a62SJohn Marino     return -1;
492*6b445a62SJohn Marino 
493*6b445a62SJohn Marino #if 0
494*6b445a62SJohn Marino 
495*6b445a62SJohn Marino #if defined (TERMIOS_TTY_DRIVER)
496*6b445a62SJohn Marino #  if defined (__ksr1__)
497*6b445a62SJohn Marino   if (ksrflow)
498*6b445a62SJohn Marino     {
499*6b445a62SJohn Marino       ksrflow = 0;
500*6b445a62SJohn Marino       tcflow (tty, TCOON);
501*6b445a62SJohn Marino     }
502*6b445a62SJohn Marino #  else /* !ksr1 */
503*6b445a62SJohn Marino   tcflow (tty, TCOON);		/* Simulate a ^Q. */
504*6b445a62SJohn Marino #  endif /* !ksr1 */
505*6b445a62SJohn Marino #else
506*6b445a62SJohn Marino   ioctl (tty, TCXONC, 1);	/* Simulate a ^Q. */
507*6b445a62SJohn Marino #endif /* !TERMIOS_TTY_DRIVER */
508*6b445a62SJohn Marino 
509*6b445a62SJohn Marino #endif /* 0 */
510*6b445a62SJohn Marino 
511*6b445a62SJohn Marino   return 0;
512*6b445a62SJohn Marino }
513*6b445a62SJohn Marino 
514*6b445a62SJohn Marino static void
prepare_terminal_settings(meta_flag,oldtio,tiop)515*6b445a62SJohn Marino prepare_terminal_settings (meta_flag, oldtio, tiop)
516*6b445a62SJohn Marino      int meta_flag;
517*6b445a62SJohn Marino      TIOTYPE oldtio, *tiop;
518*6b445a62SJohn Marino {
519*6b445a62SJohn Marino   _rl_echoing_p = (oldtio.c_lflag & ECHO);
520*6b445a62SJohn Marino #if defined (ECHOCTL)
521*6b445a62SJohn Marino   _rl_echoctl = (oldtio.c_lflag & ECHOCTL);
522*6b445a62SJohn Marino #endif
523*6b445a62SJohn Marino 
524*6b445a62SJohn Marino   tiop->c_lflag &= ~(ICANON | ECHO);
525*6b445a62SJohn Marino 
526*6b445a62SJohn Marino   if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
527*6b445a62SJohn Marino     _rl_eof_char = oldtio.c_cc[VEOF];
528*6b445a62SJohn Marino 
529*6b445a62SJohn Marino #if defined (USE_XON_XOFF)
530*6b445a62SJohn Marino #if defined (IXANY)
531*6b445a62SJohn Marino   tiop->c_iflag &= ~(IXON | IXOFF | IXANY);
532*6b445a62SJohn Marino #else
533*6b445a62SJohn Marino   /* `strict' Posix systems do not define IXANY. */
534*6b445a62SJohn Marino   tiop->c_iflag &= ~(IXON | IXOFF);
535*6b445a62SJohn Marino #endif /* IXANY */
536*6b445a62SJohn Marino #endif /* USE_XON_XOFF */
537*6b445a62SJohn Marino 
538*6b445a62SJohn Marino   /* Only turn this off if we are using all 8 bits. */
539*6b445a62SJohn Marino   if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag)
540*6b445a62SJohn Marino     tiop->c_iflag &= ~(ISTRIP | INPCK);
541*6b445a62SJohn Marino 
542*6b445a62SJohn Marino   /* Make sure we differentiate between CR and NL on input. */
543*6b445a62SJohn Marino   tiop->c_iflag &= ~(ICRNL | INLCR);
544*6b445a62SJohn Marino 
545*6b445a62SJohn Marino #if !defined (HANDLE_SIGNALS)
546*6b445a62SJohn Marino   tiop->c_lflag &= ~ISIG;
547*6b445a62SJohn Marino #else
548*6b445a62SJohn Marino   tiop->c_lflag |= ISIG;
549*6b445a62SJohn Marino #endif
550*6b445a62SJohn Marino 
551*6b445a62SJohn Marino   tiop->c_cc[VMIN] = 1;
552*6b445a62SJohn Marino   tiop->c_cc[VTIME] = 0;
553*6b445a62SJohn Marino 
554*6b445a62SJohn Marino #if defined (FLUSHO)
555*6b445a62SJohn Marino   if (OUTPUT_BEING_FLUSHED (tiop))
556*6b445a62SJohn Marino     {
557*6b445a62SJohn Marino       tiop->c_lflag &= ~FLUSHO;
558*6b445a62SJohn Marino       oldtio.c_lflag &= ~FLUSHO;
559*6b445a62SJohn Marino     }
560*6b445a62SJohn Marino #endif
561*6b445a62SJohn Marino 
562*6b445a62SJohn Marino   /* Turn off characters that we need on Posix systems with job control,
563*6b445a62SJohn Marino      just to be sure.  This includes ^Y and ^V.  This should not really
564*6b445a62SJohn Marino      be necessary.  */
565*6b445a62SJohn Marino #if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
566*6b445a62SJohn Marino 
567*6b445a62SJohn Marino #if defined (VLNEXT)
568*6b445a62SJohn Marino   tiop->c_cc[VLNEXT] = _POSIX_VDISABLE;
569*6b445a62SJohn Marino #endif
570*6b445a62SJohn Marino 
571*6b445a62SJohn Marino #if defined (VDSUSP)
572*6b445a62SJohn Marino   tiop->c_cc[VDSUSP] = _POSIX_VDISABLE;
573*6b445a62SJohn Marino #endif
574*6b445a62SJohn Marino 
575*6b445a62SJohn Marino #endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
576*6b445a62SJohn Marino }
577*6b445a62SJohn Marino #endif  /* !NEW_TTY_DRIVER */
578*6b445a62SJohn Marino 
579*6b445a62SJohn Marino /* Put the terminal in CBREAK mode so that we can detect key presses. */
580*6b445a62SJohn Marino #if defined (NO_TTY_DRIVER)
581*6b445a62SJohn Marino void
rl_prep_terminal(meta_flag)582*6b445a62SJohn Marino rl_prep_terminal (meta_flag)
583*6b445a62SJohn Marino      int meta_flag;
584*6b445a62SJohn Marino {
585*6b445a62SJohn Marino   _rl_echoing_p = 1;
586*6b445a62SJohn Marino }
587*6b445a62SJohn Marino 
588*6b445a62SJohn Marino void
rl_deprep_terminal()589*6b445a62SJohn Marino rl_deprep_terminal ()
590*6b445a62SJohn Marino {
591*6b445a62SJohn Marino }
592*6b445a62SJohn Marino 
593*6b445a62SJohn Marino #else /* ! NO_TTY_DRIVER */
594*6b445a62SJohn Marino void
rl_prep_terminal(meta_flag)595*6b445a62SJohn Marino rl_prep_terminal (meta_flag)
596*6b445a62SJohn Marino      int meta_flag;
597*6b445a62SJohn Marino {
598*6b445a62SJohn Marino   int tty;
599*6b445a62SJohn Marino   TIOTYPE tio;
600*6b445a62SJohn Marino 
601*6b445a62SJohn Marino   if (terminal_prepped)
602*6b445a62SJohn Marino     return;
603*6b445a62SJohn Marino 
604*6b445a62SJohn Marino   /* Try to keep this function from being INTerrupted. */
605*6b445a62SJohn Marino   _rl_block_sigint ();
606*6b445a62SJohn Marino 
607*6b445a62SJohn Marino   tty = rl_instream ? fileno (rl_instream) : fileno (stdin);
608*6b445a62SJohn Marino 
609*6b445a62SJohn Marino   if (get_tty_settings (tty, &tio) < 0)
610*6b445a62SJohn Marino     {
611*6b445a62SJohn Marino #if defined (ENOTSUP)
612*6b445a62SJohn Marino       /* MacOS X and Linux, at least, lie about the value of errno if
613*6b445a62SJohn Marino 	 tcgetattr fails. */
614*6b445a62SJohn Marino       if (errno == ENOTTY || errno == EINVAL || errno == ENOTSUP)
615*6b445a62SJohn Marino #else
616*6b445a62SJohn Marino       if (errno == ENOTTY || errno == EINVAL)
617*6b445a62SJohn Marino #endif
618*6b445a62SJohn Marino 	_rl_echoing_p = 1;		/* XXX */
619*6b445a62SJohn Marino 
620*6b445a62SJohn Marino       _rl_release_sigint ();
621*6b445a62SJohn Marino       return;
622*6b445a62SJohn Marino     }
623*6b445a62SJohn Marino 
624*6b445a62SJohn Marino   otio = tio;
625*6b445a62SJohn Marino 
626*6b445a62SJohn Marino   if (_rl_bind_stty_chars)
627*6b445a62SJohn Marino     {
628*6b445a62SJohn Marino #if defined (VI_MODE)
629*6b445a62SJohn Marino       /* If editing in vi mode, make sure we restore the bindings in the
630*6b445a62SJohn Marino 	 insertion keymap no matter what keymap we ended up in. */
631*6b445a62SJohn Marino       if (rl_editing_mode == vi_mode)
632*6b445a62SJohn Marino 	rl_tty_unset_default_bindings (vi_insertion_keymap);
633*6b445a62SJohn Marino       else
634*6b445a62SJohn Marino #endif
635*6b445a62SJohn Marino 	rl_tty_unset_default_bindings (_rl_keymap);
636*6b445a62SJohn Marino     }
637*6b445a62SJohn Marino   save_tty_chars (&otio);
638*6b445a62SJohn Marino   RL_SETSTATE(RL_STATE_TTYCSAVED);
639*6b445a62SJohn Marino   if (_rl_bind_stty_chars)
640*6b445a62SJohn Marino     {
641*6b445a62SJohn Marino #if defined (VI_MODE)
642*6b445a62SJohn Marino       /* If editing in vi mode, make sure we set the bindings in the
643*6b445a62SJohn Marino 	 insertion keymap no matter what keymap we ended up in. */
644*6b445a62SJohn Marino       if (rl_editing_mode == vi_mode)
645*6b445a62SJohn Marino 	_rl_bind_tty_special_chars (vi_insertion_keymap, tio);
646*6b445a62SJohn Marino       else
647*6b445a62SJohn Marino #endif
648*6b445a62SJohn Marino 	_rl_bind_tty_special_chars (_rl_keymap, tio);
649*6b445a62SJohn Marino     }
650*6b445a62SJohn Marino 
651*6b445a62SJohn Marino   prepare_terminal_settings (meta_flag, otio, &tio);
652*6b445a62SJohn Marino 
653*6b445a62SJohn Marino   if (set_tty_settings (tty, &tio) < 0)
654*6b445a62SJohn Marino     {
655*6b445a62SJohn Marino       _rl_release_sigint ();
656*6b445a62SJohn Marino       return;
657*6b445a62SJohn Marino     }
658*6b445a62SJohn Marino 
659*6b445a62SJohn Marino   if (_rl_enable_keypad)
660*6b445a62SJohn Marino     _rl_control_keypad (1);
661*6b445a62SJohn Marino 
662*6b445a62SJohn Marino   fflush (rl_outstream);
663*6b445a62SJohn Marino   terminal_prepped = 1;
664*6b445a62SJohn Marino   RL_SETSTATE(RL_STATE_TERMPREPPED);
665*6b445a62SJohn Marino 
666*6b445a62SJohn Marino   _rl_release_sigint ();
667*6b445a62SJohn Marino }
668*6b445a62SJohn Marino 
669*6b445a62SJohn Marino /* Restore the terminal's normal settings and modes. */
670*6b445a62SJohn Marino void
rl_deprep_terminal()671*6b445a62SJohn Marino rl_deprep_terminal ()
672*6b445a62SJohn Marino {
673*6b445a62SJohn Marino   int tty;
674*6b445a62SJohn Marino 
675*6b445a62SJohn Marino   if (!terminal_prepped)
676*6b445a62SJohn Marino     return;
677*6b445a62SJohn Marino 
678*6b445a62SJohn Marino   /* Try to keep this function from being interrupted. */
679*6b445a62SJohn Marino   _rl_block_sigint ();
680*6b445a62SJohn Marino 
681*6b445a62SJohn Marino   tty = rl_instream ? fileno (rl_instream) : fileno (stdout);
682*6b445a62SJohn Marino 
683*6b445a62SJohn Marino   if (_rl_enable_keypad)
684*6b445a62SJohn Marino     _rl_control_keypad (0);
685*6b445a62SJohn Marino 
686*6b445a62SJohn Marino   fflush (rl_outstream);
687*6b445a62SJohn Marino 
688*6b445a62SJohn Marino   if (set_tty_settings (tty, &otio) < 0)
689*6b445a62SJohn Marino     {
690*6b445a62SJohn Marino       _rl_release_sigint ();
691*6b445a62SJohn Marino       return;
692*6b445a62SJohn Marino     }
693*6b445a62SJohn Marino 
694*6b445a62SJohn Marino   terminal_prepped = 0;
695*6b445a62SJohn Marino   RL_UNSETSTATE(RL_STATE_TERMPREPPED);
696*6b445a62SJohn Marino 
697*6b445a62SJohn Marino   _rl_release_sigint ();
698*6b445a62SJohn Marino }
699*6b445a62SJohn Marino #endif /* !NO_TTY_DRIVER */
700*6b445a62SJohn Marino 
701*6b445a62SJohn Marino /* **************************************************************** */
702*6b445a62SJohn Marino /*								    */
703*6b445a62SJohn Marino /*			Bogus Flow Control      		    */
704*6b445a62SJohn Marino /*								    */
705*6b445a62SJohn Marino /* **************************************************************** */
706*6b445a62SJohn Marino 
707*6b445a62SJohn Marino int
rl_restart_output(count,key)708*6b445a62SJohn Marino rl_restart_output (count, key)
709*6b445a62SJohn Marino      int count, key;
710*6b445a62SJohn Marino {
711*6b445a62SJohn Marino #if defined (__MINGW32__)
712*6b445a62SJohn Marino   return 0;
713*6b445a62SJohn Marino #else /* !__MING32__ */
714*6b445a62SJohn Marino 
715*6b445a62SJohn Marino   int fildes = fileno (rl_outstream);
716*6b445a62SJohn Marino #if defined (TIOCSTART)
717*6b445a62SJohn Marino #if defined (apollo)
718*6b445a62SJohn Marino   ioctl (&fildes, TIOCSTART, 0);
719*6b445a62SJohn Marino #else
720*6b445a62SJohn Marino   ioctl (fildes, TIOCSTART, 0);
721*6b445a62SJohn Marino #endif /* apollo */
722*6b445a62SJohn Marino 
723*6b445a62SJohn Marino #else /* !TIOCSTART */
724*6b445a62SJohn Marino #  if defined (TERMIOS_TTY_DRIVER)
725*6b445a62SJohn Marino #    if defined (__ksr1__)
726*6b445a62SJohn Marino   if (ksrflow)
727*6b445a62SJohn Marino     {
728*6b445a62SJohn Marino       ksrflow = 0;
729*6b445a62SJohn Marino       tcflow (fildes, TCOON);
730*6b445a62SJohn Marino     }
731*6b445a62SJohn Marino #    else /* !ksr1 */
732*6b445a62SJohn Marino   tcflow (fildes, TCOON);		/* Simulate a ^Q. */
733*6b445a62SJohn Marino #    endif /* !ksr1 */
734*6b445a62SJohn Marino #  else /* !TERMIOS_TTY_DRIVER */
735*6b445a62SJohn Marino #    if defined (TCXONC)
736*6b445a62SJohn Marino   ioctl (fildes, TCXONC, TCOON);
737*6b445a62SJohn Marino #    endif /* TCXONC */
738*6b445a62SJohn Marino #  endif /* !TERMIOS_TTY_DRIVER */
739*6b445a62SJohn Marino #endif /* !TIOCSTART */
740*6b445a62SJohn Marino 
741*6b445a62SJohn Marino   return 0;
742*6b445a62SJohn Marino #endif /* !__MINGW32__ */
743*6b445a62SJohn Marino }
744*6b445a62SJohn Marino 
745*6b445a62SJohn Marino int
rl_stop_output(count,key)746*6b445a62SJohn Marino rl_stop_output (count, key)
747*6b445a62SJohn Marino      int count, key;
748*6b445a62SJohn Marino {
749*6b445a62SJohn Marino #if defined (__MINGW32__)
750*6b445a62SJohn Marino   return 0;
751*6b445a62SJohn Marino #else
752*6b445a62SJohn Marino 
753*6b445a62SJohn Marino   int fildes = fileno (rl_instream);
754*6b445a62SJohn Marino 
755*6b445a62SJohn Marino #if defined (TIOCSTOP)
756*6b445a62SJohn Marino # if defined (apollo)
757*6b445a62SJohn Marino   ioctl (&fildes, TIOCSTOP, 0);
758*6b445a62SJohn Marino # else
759*6b445a62SJohn Marino   ioctl (fildes, TIOCSTOP, 0);
760*6b445a62SJohn Marino # endif /* apollo */
761*6b445a62SJohn Marino #else /* !TIOCSTOP */
762*6b445a62SJohn Marino # if defined (TERMIOS_TTY_DRIVER)
763*6b445a62SJohn Marino #  if defined (__ksr1__)
764*6b445a62SJohn Marino   ksrflow = 1;
765*6b445a62SJohn Marino #  endif /* ksr1 */
766*6b445a62SJohn Marino   tcflow (fildes, TCOOFF);
767*6b445a62SJohn Marino # else
768*6b445a62SJohn Marino #   if defined (TCXONC)
769*6b445a62SJohn Marino   ioctl (fildes, TCXONC, TCOON);
770*6b445a62SJohn Marino #   endif /* TCXONC */
771*6b445a62SJohn Marino # endif /* !TERMIOS_TTY_DRIVER */
772*6b445a62SJohn Marino #endif /* !TIOCSTOP */
773*6b445a62SJohn Marino 
774*6b445a62SJohn Marino   return 0;
775*6b445a62SJohn Marino #endif /* !__MINGW32__ */
776*6b445a62SJohn Marino }
777*6b445a62SJohn Marino 
778*6b445a62SJohn Marino /* **************************************************************** */
779*6b445a62SJohn Marino /*								    */
780*6b445a62SJohn Marino /*			Default Key Bindings			    */
781*6b445a62SJohn Marino /*								    */
782*6b445a62SJohn Marino /* **************************************************************** */
783*6b445a62SJohn Marino 
784*6b445a62SJohn Marino #if !defined (NO_TTY_DRIVER)
785*6b445a62SJohn Marino #define SET_SPECIAL(sc, func)	set_special_char(kmap, &ttybuff, sc, func)
786*6b445a62SJohn Marino #endif
787*6b445a62SJohn Marino 
788*6b445a62SJohn Marino #if defined (NO_TTY_DRIVER)
789*6b445a62SJohn Marino 
790*6b445a62SJohn Marino #define SET_SPECIAL(sc, func)
791*6b445a62SJohn Marino #define RESET_SPECIAL(c)
792*6b445a62SJohn Marino 
793*6b445a62SJohn Marino #elif defined (NEW_TTY_DRIVER)
794*6b445a62SJohn Marino static void
set_special_char(kmap,tiop,sc,func)795*6b445a62SJohn Marino set_special_char (kmap, tiop, sc, func)
796*6b445a62SJohn Marino      Keymap kmap;
797*6b445a62SJohn Marino      TIOTYPE *tiop;
798*6b445a62SJohn Marino      int sc;
799*6b445a62SJohn Marino      rl_command_func_t *func;
800*6b445a62SJohn Marino {
801*6b445a62SJohn Marino   if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC)
802*6b445a62SJohn Marino     kmap[(unsigned char)sc].function = func;
803*6b445a62SJohn Marino }
804*6b445a62SJohn Marino 
805*6b445a62SJohn Marino #define RESET_SPECIAL(c) \
806*6b445a62SJohn Marino   if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) \
807*6b445a62SJohn Marino     kmap[(unsigned char)c].function = rl_insert;
808*6b445a62SJohn Marino 
809*6b445a62SJohn Marino static void
_rl_bind_tty_special_chars(kmap,ttybuff)810*6b445a62SJohn Marino _rl_bind_tty_special_chars (kmap, ttybuff)
811*6b445a62SJohn Marino      Keymap kmap;
812*6b445a62SJohn Marino      TIOTYPE ttybuff;
813*6b445a62SJohn Marino {
814*6b445a62SJohn Marino   if (ttybuff.flags & SGTTY_SET)
815*6b445a62SJohn Marino     {
816*6b445a62SJohn Marino       SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout);
817*6b445a62SJohn Marino       SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard);
818*6b445a62SJohn Marino     }
819*6b445a62SJohn Marino 
820*6b445a62SJohn Marino #  if defined (TIOCGLTC)
821*6b445a62SJohn Marino   if (ttybuff.flags & LTCHARS_SET)
822*6b445a62SJohn Marino     {
823*6b445a62SJohn Marino       SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout);
824*6b445a62SJohn Marino       SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert);
825*6b445a62SJohn Marino     }
826*6b445a62SJohn Marino #  endif /* TIOCGLTC */
827*6b445a62SJohn Marino }
828*6b445a62SJohn Marino 
829*6b445a62SJohn Marino #else /* !NEW_TTY_DRIVER */
830*6b445a62SJohn Marino static void
set_special_char(kmap,tiop,sc,func)831*6b445a62SJohn Marino set_special_char (kmap, tiop, sc, func)
832*6b445a62SJohn Marino      Keymap kmap;
833*6b445a62SJohn Marino      TIOTYPE *tiop;
834*6b445a62SJohn Marino      int sc;
835*6b445a62SJohn Marino      rl_command_func_t *func;
836*6b445a62SJohn Marino {
837*6b445a62SJohn Marino   unsigned char uc;
838*6b445a62SJohn Marino 
839*6b445a62SJohn Marino   uc = tiop->c_cc[sc];
840*6b445a62SJohn Marino   if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC)
841*6b445a62SJohn Marino     kmap[uc].function = func;
842*6b445a62SJohn Marino }
843*6b445a62SJohn Marino 
844*6b445a62SJohn Marino /* used later */
845*6b445a62SJohn Marino #define RESET_SPECIAL(uc) \
846*6b445a62SJohn Marino   if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
847*6b445a62SJohn Marino     kmap[uc].function = rl_insert;
848*6b445a62SJohn Marino 
849*6b445a62SJohn Marino static void
_rl_bind_tty_special_chars(kmap,ttybuff)850*6b445a62SJohn Marino _rl_bind_tty_special_chars (kmap, ttybuff)
851*6b445a62SJohn Marino      Keymap kmap;
852*6b445a62SJohn Marino      TIOTYPE ttybuff;
853*6b445a62SJohn Marino {
854*6b445a62SJohn Marino   SET_SPECIAL (VERASE, rl_rubout);
855*6b445a62SJohn Marino   SET_SPECIAL (VKILL, rl_unix_line_discard);
856*6b445a62SJohn Marino 
857*6b445a62SJohn Marino #  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
858*6b445a62SJohn Marino   SET_SPECIAL (VLNEXT, rl_quoted_insert);
859*6b445a62SJohn Marino #  endif /* VLNEXT && TERMIOS_TTY_DRIVER */
860*6b445a62SJohn Marino 
861*6b445a62SJohn Marino #  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
862*6b445a62SJohn Marino   SET_SPECIAL (VWERASE, rl_unix_word_rubout);
863*6b445a62SJohn Marino #  endif /* VWERASE && TERMIOS_TTY_DRIVER */
864*6b445a62SJohn Marino }
865*6b445a62SJohn Marino 
866*6b445a62SJohn Marino #endif /* !NEW_TTY_DRIVER */
867*6b445a62SJohn Marino 
868*6b445a62SJohn Marino /* Set the system's default editing characters to their readline equivalents
869*6b445a62SJohn Marino    in KMAP.  Should be static, now that we have rl_tty_set_default_bindings. */
870*6b445a62SJohn Marino void
rltty_set_default_bindings(kmap)871*6b445a62SJohn Marino rltty_set_default_bindings (kmap)
872*6b445a62SJohn Marino      Keymap kmap;
873*6b445a62SJohn Marino {
874*6b445a62SJohn Marino #if !defined (NO_TTY_DRIVER)
875*6b445a62SJohn Marino   TIOTYPE ttybuff;
876*6b445a62SJohn Marino   int tty;
877*6b445a62SJohn Marino 
878*6b445a62SJohn Marino   tty = fileno (rl_instream);
879*6b445a62SJohn Marino 
880*6b445a62SJohn Marino   if (get_tty_settings (tty, &ttybuff) == 0)
881*6b445a62SJohn Marino     _rl_bind_tty_special_chars (kmap, ttybuff);
882*6b445a62SJohn Marino #endif
883*6b445a62SJohn Marino }
884*6b445a62SJohn Marino 
885*6b445a62SJohn Marino /* New public way to set the system default editing chars to their readline
886*6b445a62SJohn Marino    equivalents. */
887*6b445a62SJohn Marino void
rl_tty_set_default_bindings(kmap)888*6b445a62SJohn Marino rl_tty_set_default_bindings (kmap)
889*6b445a62SJohn Marino      Keymap kmap;
890*6b445a62SJohn Marino {
891*6b445a62SJohn Marino   rltty_set_default_bindings (kmap);
892*6b445a62SJohn Marino }
893*6b445a62SJohn Marino 
894*6b445a62SJohn Marino /* Rebind all of the tty special chars that readline worries about back
895*6b445a62SJohn Marino    to self-insert.  Call this before saving the current terminal special
896*6b445a62SJohn Marino    chars with save_tty_chars().  This only works on POSIX termios or termio
897*6b445a62SJohn Marino    systems. */
898*6b445a62SJohn Marino void
rl_tty_unset_default_bindings(kmap)899*6b445a62SJohn Marino rl_tty_unset_default_bindings (kmap)
900*6b445a62SJohn Marino      Keymap kmap;
901*6b445a62SJohn Marino {
902*6b445a62SJohn Marino   /* Don't bother before we've saved the tty special chars at least once. */
903*6b445a62SJohn Marino   if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0)
904*6b445a62SJohn Marino     return;
905*6b445a62SJohn Marino 
906*6b445a62SJohn Marino   RESET_SPECIAL (_rl_tty_chars.t_erase);
907*6b445a62SJohn Marino   RESET_SPECIAL (_rl_tty_chars.t_kill);
908*6b445a62SJohn Marino 
909*6b445a62SJohn Marino #  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
910*6b445a62SJohn Marino   RESET_SPECIAL (_rl_tty_chars.t_lnext);
911*6b445a62SJohn Marino #  endif /* VLNEXT && TERMIOS_TTY_DRIVER */
912*6b445a62SJohn Marino 
913*6b445a62SJohn Marino #  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
914*6b445a62SJohn Marino   RESET_SPECIAL (_rl_tty_chars.t_werase);
915*6b445a62SJohn Marino #  endif /* VWERASE && TERMIOS_TTY_DRIVER */
916*6b445a62SJohn Marino }
917*6b445a62SJohn Marino 
918*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
919*6b445a62SJohn Marino 
920*6b445a62SJohn Marino #if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER)
921*6b445a62SJohn Marino int
_rl_disable_tty_signals()922*6b445a62SJohn Marino _rl_disable_tty_signals ()
923*6b445a62SJohn Marino {
924*6b445a62SJohn Marino   return 0;
925*6b445a62SJohn Marino }
926*6b445a62SJohn Marino 
927*6b445a62SJohn Marino int
_rl_restore_tty_signals()928*6b445a62SJohn Marino _rl_restore_tty_signals ()
929*6b445a62SJohn Marino {
930*6b445a62SJohn Marino   return 0;
931*6b445a62SJohn Marino }
932*6b445a62SJohn Marino #else
933*6b445a62SJohn Marino 
934*6b445a62SJohn Marino static TIOTYPE sigstty, nosigstty;
935*6b445a62SJohn Marino static int tty_sigs_disabled = 0;
936*6b445a62SJohn Marino 
937*6b445a62SJohn Marino int
_rl_disable_tty_signals()938*6b445a62SJohn Marino _rl_disable_tty_signals ()
939*6b445a62SJohn Marino {
940*6b445a62SJohn Marino   if (tty_sigs_disabled)
941*6b445a62SJohn Marino     return 0;
942*6b445a62SJohn Marino 
943*6b445a62SJohn Marino   if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0)
944*6b445a62SJohn Marino     return -1;
945*6b445a62SJohn Marino 
946*6b445a62SJohn Marino   nosigstty = sigstty;
947*6b445a62SJohn Marino 
948*6b445a62SJohn Marino   nosigstty.c_lflag &= ~ISIG;
949*6b445a62SJohn Marino   nosigstty.c_iflag &= ~IXON;
950*6b445a62SJohn Marino 
951*6b445a62SJohn Marino   if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0)
952*6b445a62SJohn Marino     return (_set_tty_settings (fileno (rl_instream), &sigstty));
953*6b445a62SJohn Marino 
954*6b445a62SJohn Marino   tty_sigs_disabled = 1;
955*6b445a62SJohn Marino   return 0;
956*6b445a62SJohn Marino }
957*6b445a62SJohn Marino 
958*6b445a62SJohn Marino int
_rl_restore_tty_signals()959*6b445a62SJohn Marino _rl_restore_tty_signals ()
960*6b445a62SJohn Marino {
961*6b445a62SJohn Marino   int r;
962*6b445a62SJohn Marino 
963*6b445a62SJohn Marino   if (tty_sigs_disabled == 0)
964*6b445a62SJohn Marino     return 0;
965*6b445a62SJohn Marino 
966*6b445a62SJohn Marino   r = _set_tty_settings (fileno (rl_instream), &sigstty);
967*6b445a62SJohn Marino 
968*6b445a62SJohn Marino   if (r == 0)
969*6b445a62SJohn Marino     tty_sigs_disabled = 0;
970*6b445a62SJohn Marino 
971*6b445a62SJohn Marino   return r;
972*6b445a62SJohn Marino }
973*6b445a62SJohn Marino #endif /* !NEW_TTY_DRIVER */
974*6b445a62SJohn Marino 
975*6b445a62SJohn Marino #endif /* HANDLE_SIGNALS */
976