* fhandler.h (fhandler_termios::line_edit): Replace third argument with
passed-in termios struct. * fhandler_console.cc (fhandler_console::read): Prior to loop, make a copy of current termios for passing to line_edit prior so that all characters are processed consistently. * fhandler_tty.cc (fhandler_pty_master::write): Ditto. (process_input): Make a copy of curent termios prior to read for use in subsequent line_edit. * fhandler_termios.cc (fhandler_termios::line_edit): Replace third parameter with passed-in termios struct and use it throughout rather than the data from the current fhandler_termios class.
This commit is contained in:
parent
4a5c645e62
commit
46b73ef192
|
@ -1,3 +1,17 @@
|
||||||
|
2002-12-26 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* fhandler.h (fhandler_termios::line_edit): Replace third argument with
|
||||||
|
passed-in termios struct.
|
||||||
|
* fhandler_console.cc (fhandler_console::read): Prior to loop, make a
|
||||||
|
copy of current termios for passing to line_edit prior so that all
|
||||||
|
characters are processed consistently.
|
||||||
|
* fhandler_tty.cc (fhandler_pty_master::write): Ditto.
|
||||||
|
(process_input): Make a copy of curent termios prior to read for use in
|
||||||
|
subsequent line_edit.
|
||||||
|
* fhandler_termios.cc (fhandler_termios::line_edit): Replace third
|
||||||
|
parameter with passed-in termios struct and use it throughout rather
|
||||||
|
than the data from the current fhandler_termios class.
|
||||||
|
|
||||||
2002-12-25 Christopher Faylor <cgf@redhat.com>
|
2002-12-25 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* include/cygwin/version.h: Bump DLL minor number.
|
* include/cygwin/version.h: Bump DLL minor number.
|
||||||
|
|
|
@ -705,7 +705,7 @@ class fhandler_termios: public fhandler_base
|
||||||
set_need_fork_fixup ();
|
set_need_fork_fixup ();
|
||||||
}
|
}
|
||||||
HANDLE& get_output_handle () { return output_handle; }
|
HANDLE& get_output_handle () { return output_handle; }
|
||||||
line_edit_status line_edit (const char *rptr, int nread, int always_accept = 0);
|
line_edit_status line_edit (const char *rptr, int nread, termios&);
|
||||||
void set_output_handle (HANDLE h) { output_handle = h; }
|
void set_output_handle (HANDLE h) { output_handle = h; }
|
||||||
void tcinit (tty_min *this_tc, int force = FALSE);
|
void tcinit (tty_min *this_tc, int force = FALSE);
|
||||||
virtual int is_tty () { return 1; }
|
virtual int is_tty () { return 1; }
|
||||||
|
|
|
@ -247,6 +247,7 @@ fhandler_console::read (void *pv, size_t& buflen)
|
||||||
nwait = 2;
|
nwait = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
termios ti = tc->ti;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
int bgres;
|
int bgres;
|
||||||
|
@ -461,7 +462,7 @@ fhandler_console::read (void *pv, size_t& buflen)
|
||||||
|
|
||||||
if (toadd)
|
if (toadd)
|
||||||
{
|
{
|
||||||
line_edit_status res = line_edit (toadd, nread);
|
line_edit_status res = line_edit (toadd, nread, ti);
|
||||||
if (res == line_edit_signalled)
|
if (res == line_edit_signalled)
|
||||||
goto sig_exit;
|
goto sig_exit;
|
||||||
else if (res == line_edit_input_done)
|
else if (res == line_edit_input_done)
|
||||||
|
|
|
@ -187,13 +187,13 @@ fhandler_termios::echo_erase (int force)
|
||||||
}
|
}
|
||||||
|
|
||||||
line_edit_status
|
line_edit_status
|
||||||
fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
fhandler_termios::line_edit (const char *rptr, int nread, termios& ti)
|
||||||
{
|
{
|
||||||
line_edit_status ret = line_edit_ok;
|
line_edit_status ret = line_edit_ok;
|
||||||
char c;
|
char c;
|
||||||
int input_done = 0;
|
int input_done = 0;
|
||||||
bool sawsig = false;
|
bool sawsig = false;
|
||||||
int iscanon = tc->ti.c_lflag & ICANON;
|
int iscanon = ti.c_lflag & ICANON;
|
||||||
|
|
||||||
while (nread-- > 0)
|
while (nread-- > 0)
|
||||||
{
|
{
|
||||||
|
@ -205,9 +205,9 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
||||||
|
|
||||||
if (c == '\r')
|
if (c == '\r')
|
||||||
{
|
{
|
||||||
if (tc->ti.c_iflag & IGNCR)
|
if (ti.c_iflag & IGNCR)
|
||||||
continue;
|
continue;
|
||||||
if (tc->ti.c_iflag & ICRNL)
|
if (ti.c_iflag & ICRNL)
|
||||||
{
|
{
|
||||||
c = '\n';
|
c = '\n';
|
||||||
set_input_done (iscanon);
|
set_input_done (iscanon);
|
||||||
|
@ -215,22 +215,22 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
||||||
}
|
}
|
||||||
else if (c == '\n')
|
else if (c == '\n')
|
||||||
{
|
{
|
||||||
if (tc->ti.c_iflag & INLCR)
|
if (ti.c_iflag & INLCR)
|
||||||
c = '\r';
|
c = '\r';
|
||||||
else
|
else
|
||||||
set_input_done (iscanon);
|
set_input_done (iscanon);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tc->ti.c_iflag & ISTRIP)
|
if (ti.c_iflag & ISTRIP)
|
||||||
c &= 0x7f;
|
c &= 0x7f;
|
||||||
if (tc->ti.c_lflag & ISIG)
|
if (ti.c_lflag & ISIG)
|
||||||
{
|
{
|
||||||
int sig;
|
int sig;
|
||||||
if (CCEQ (tc->ti.c_cc[VINTR], c))
|
if (CCEQ (ti.c_cc[VINTR], c))
|
||||||
sig = SIGINT;
|
sig = SIGINT;
|
||||||
else if (CCEQ (tc->ti.c_cc[VQUIT], c))
|
else if (CCEQ (ti.c_cc[VQUIT], c))
|
||||||
sig = SIGQUIT;
|
sig = SIGQUIT;
|
||||||
else if (CCEQ (tc->ti.c_cc[VSUSP], c))
|
else if (CCEQ (ti.c_cc[VSUSP], c))
|
||||||
sig = SIGTSTP;
|
sig = SIGTSTP;
|
||||||
else
|
else
|
||||||
goto not_a_sig;
|
goto not_a_sig;
|
||||||
|
@ -238,14 +238,14 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
||||||
termios_printf ("got interrupt %d, sending signal %d", c, sig);
|
termios_printf ("got interrupt %d, sending signal %d", c, sig);
|
||||||
eat_readahead (-1);
|
eat_readahead (-1);
|
||||||
tc->kill_pgrp (sig);
|
tc->kill_pgrp (sig);
|
||||||
tc->ti.c_lflag &= ~FLUSHO;
|
ti.c_lflag &= ~FLUSHO;
|
||||||
sawsig = true;
|
sawsig = true;
|
||||||
goto restart_output;
|
goto restart_output;
|
||||||
}
|
}
|
||||||
not_a_sig:
|
not_a_sig:
|
||||||
if (tc->ti.c_iflag & IXON)
|
if (ti.c_iflag & IXON)
|
||||||
{
|
{
|
||||||
if (CCEQ (tc->ti.c_cc[VSTOP], c))
|
if (CCEQ (ti.c_cc[VSTOP], c))
|
||||||
{
|
{
|
||||||
if (!tc->output_stopped)
|
if (!tc->output_stopped)
|
||||||
{
|
{
|
||||||
|
@ -254,30 +254,30 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (CCEQ (tc->ti.c_cc[VSTART], c))
|
else if (CCEQ (ti.c_cc[VSTART], c))
|
||||||
{
|
{
|
||||||
restart_output:
|
restart_output:
|
||||||
tc->output_stopped = 0;
|
tc->output_stopped = 0;
|
||||||
release_output_mutex ();
|
release_output_mutex ();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if ((tc->ti.c_iflag & IXANY) && tc->output_stopped)
|
else if ((ti.c_iflag & IXANY) && tc->output_stopped)
|
||||||
goto restart_output;
|
goto restart_output;
|
||||||
}
|
}
|
||||||
if (iscanon && tc->ti.c_lflag & IEXTEN && CCEQ (tc->ti.c_cc[VDISCARD], c))
|
if (iscanon && ti.c_lflag & IEXTEN && CCEQ (ti.c_cc[VDISCARD], c))
|
||||||
{
|
{
|
||||||
tc->ti.c_lflag ^= FLUSHO;
|
ti.c_lflag ^= FLUSHO;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!iscanon)
|
if (!iscanon)
|
||||||
/* nothing */;
|
/* nothing */;
|
||||||
else if (CCEQ (tc->ti.c_cc[VERASE], c))
|
else if (CCEQ (ti.c_cc[VERASE], c))
|
||||||
{
|
{
|
||||||
if (eat_readahead (1))
|
if (eat_readahead (1))
|
||||||
echo_erase ();
|
echo_erase ();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (CCEQ (tc->ti.c_cc[VWERASE], c))
|
else if (CCEQ (ti.c_cc[VWERASE], c))
|
||||||
{
|
{
|
||||||
int ch;
|
int ch;
|
||||||
do
|
do
|
||||||
|
@ -288,43 +288,43 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
||||||
while ((ch = peek_readahead (1)) >= 0 && !isspace (ch));
|
while ((ch = peek_readahead (1)) >= 0 && !isspace (ch));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (CCEQ (tc->ti.c_cc[VKILL], c))
|
else if (CCEQ (ti.c_cc[VKILL], c))
|
||||||
{
|
{
|
||||||
int nchars = eat_readahead (-1);
|
int nchars = eat_readahead (-1);
|
||||||
if (tc->ti.c_lflag & ECHO)
|
if (ti.c_lflag & ECHO)
|
||||||
while (nchars--)
|
while (nchars--)
|
||||||
echo_erase (1);
|
echo_erase (1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (CCEQ (tc->ti.c_cc[VREPRINT], c))
|
else if (CCEQ (ti.c_cc[VREPRINT], c))
|
||||||
{
|
{
|
||||||
if (tc->ti.c_lflag & ECHO)
|
if (ti.c_lflag & ECHO)
|
||||||
{
|
{
|
||||||
doecho ("\n\r", 2);
|
doecho ("\n\r", 2);
|
||||||
doecho (rabuf, ralen);
|
doecho (rabuf, ralen);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (CCEQ (tc->ti.c_cc[VEOF], c))
|
else if (CCEQ (ti.c_cc[VEOF], c))
|
||||||
{
|
{
|
||||||
termios_printf ("EOF");
|
termios_printf ("EOF");
|
||||||
(void) accept_input();
|
(void) accept_input();
|
||||||
ret = line_edit_input_done;
|
ret = line_edit_input_done;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (CCEQ (tc->ti.c_cc[VEOL], c) ||
|
else if (CCEQ (ti.c_cc[VEOL], c) ||
|
||||||
CCEQ (tc->ti.c_cc[VEOL2], c) ||
|
CCEQ (ti.c_cc[VEOL2], c) ||
|
||||||
c == '\n')
|
c == '\n')
|
||||||
{
|
{
|
||||||
set_input_done (1);
|
set_input_done (1);
|
||||||
termios_printf ("EOL");
|
termios_printf ("EOL");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tc->ti.c_iflag & IUCLC && isupper (c))
|
if (ti.c_iflag & IUCLC && isupper (c))
|
||||||
c = cyg_tolower (c);
|
c = cyg_tolower (c);
|
||||||
|
|
||||||
put_readahead (c);
|
put_readahead (c);
|
||||||
if (!iscanon || always_accept || input_done)
|
if (!iscanon || input_done)
|
||||||
{
|
{
|
||||||
int status = accept_input ();
|
int status = accept_input ();
|
||||||
if (status != 1)
|
if (status != 1)
|
||||||
|
@ -336,11 +336,11 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
|
||||||
ret = line_edit_input_done;
|
ret = line_edit_input_done;
|
||||||
input_done = 0;
|
input_done = 0;
|
||||||
}
|
}
|
||||||
if (tc->ti.c_lflag & ECHO)
|
if (ti.c_lflag & ECHO)
|
||||||
doecho (&c, 1);
|
doecho (&c, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!iscanon || always_accept) && ralen > 0)
|
if (!iscanon && ralen > 0)
|
||||||
ret = line_edit_input_done;
|
ret = line_edit_input_done;
|
||||||
|
|
||||||
if (sawsig)
|
if (sawsig)
|
||||||
|
|
|
@ -198,8 +198,9 @@ process_input (void *)
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
size_t nraw = INP_BUFFER_SIZE;
|
size_t nraw = INP_BUFFER_SIZE;
|
||||||
|
termios ti = tty_master->get_ttyp ()->ti;
|
||||||
tty_master->console->read ((void *) rawbuf, nraw);
|
tty_master->console->read ((void *) rawbuf, nraw);
|
||||||
(void) tty_master->line_edit (rawbuf, nraw);
|
(void) tty_master->line_edit (rawbuf, nraw, ti);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1080,9 +1081,11 @@ fhandler_pty_master::write (const void *ptr, size_t len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *p = (char *) ptr;
|
char *p = (char *) ptr;
|
||||||
for (i=0; i < (int) len; i++)
|
termios ti = tc->ti;
|
||||||
|
|
||||||
|
for (i = 0; i < (int) len; i++)
|
||||||
{
|
{
|
||||||
line_edit_status status = line_edit (p++, 1);
|
line_edit_status status = line_edit (p++, 1, ti);
|
||||||
if (status > line_edit_signalled)
|
if (status > line_edit_signalled)
|
||||||
{
|
{
|
||||||
if (status != line_edit_pipe_full)
|
if (status != line_edit_pipe_full)
|
||||||
|
|
Loading…
Reference in New Issue