Cygwin: pty: Fix error handling of master write().
- Currently, error handling of write() in pty master side is broken. This patch fixes that.
This commit is contained in:
parent
522cdab541
commit
b52f10c4ca
|
@ -308,12 +308,12 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
|
||||||
int input_done = 0;
|
int input_done = 0;
|
||||||
bool sawsig = false;
|
bool sawsig = false;
|
||||||
int iscanon = ti.c_lflag & ICANON;
|
int iscanon = ti.c_lflag & ICANON;
|
||||||
|
size_t read_cnt = 0;
|
||||||
|
|
||||||
if (bytes_read)
|
while (read_cnt < nread)
|
||||||
*bytes_read = nread;
|
|
||||||
while (nread-- > 0)
|
|
||||||
{
|
{
|
||||||
c = *rptr++;
|
c = *rptr++;
|
||||||
|
read_cnt++;
|
||||||
|
|
||||||
paranoid_printf ("char %0o", c);
|
paranoid_printf ("char %0o", c);
|
||||||
|
|
||||||
|
@ -453,7 +453,6 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
|
||||||
if (status != 1)
|
if (status != 1)
|
||||||
{
|
{
|
||||||
ret = status ? line_edit_error : line_edit_pipe_full;
|
ret = status ? line_edit_error : line_edit_pipe_full;
|
||||||
nread += ralen ();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ret = line_edit_input_done;
|
ret = line_edit_input_done;
|
||||||
|
@ -462,22 +461,21 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we didn't write all bytes in non-canonical mode, write them now. */
|
/* If we didn't write all bytes in non-canonical mode, write them now. */
|
||||||
if (!iscanon && ralen () > 0
|
if ((input_done || !iscanon) && ralen () > 0 && ret != line_edit_error)
|
||||||
&& (ret == line_edit_ok || ret == line_edit_input_done))
|
|
||||||
{
|
{
|
||||||
int status = accept_input ();
|
int status;
|
||||||
|
int retry_count = 3;
|
||||||
|
while ((status = accept_input ()) != 1 &&
|
||||||
|
ralen () > 0 && --retry_count > 0)
|
||||||
|
cygwait ((DWORD) 10);
|
||||||
if (status != 1)
|
if (status != 1)
|
||||||
{
|
|
||||||
ret = status ? line_edit_error : line_edit_pipe_full;
|
ret = status ? line_edit_error : line_edit_pipe_full;
|
||||||
nread += ralen ();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
ret = line_edit_input_done;
|
ret = line_edit_input_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adding one compensates for the postdecrement in the above loop. */
|
|
||||||
if (bytes_read)
|
if (bytes_read)
|
||||||
*bytes_read -= (nread + 1);
|
*bytes_read = read_cnt;
|
||||||
|
|
||||||
if (sawsig)
|
if (sawsig)
|
||||||
ret = line_edit_signalled;
|
ret = line_edit_signalled;
|
||||||
|
|
|
@ -561,18 +561,21 @@ fhandler_pty_master::accept_input ()
|
||||||
{
|
{
|
||||||
n = p1 - p0 + 1;
|
n = p1 - p0 + 1;
|
||||||
rc = WriteFile (write_to, p0, n, &n, NULL);
|
rc = WriteFile (write_to, p0, n, &n, NULL);
|
||||||
|
if (rc)
|
||||||
written += n;
|
written += n;
|
||||||
p0 = p1 + 1;
|
p0 = p1 + 1;
|
||||||
}
|
}
|
||||||
if ((n = bytes_left - (p0 - p)))
|
if (rc && (n = bytes_left - (p0 - p)))
|
||||||
{
|
{
|
||||||
rc = WriteFile (write_to, p0, n, &n, NULL);
|
rc = WriteFile (write_to, p0, n, &n, NULL);
|
||||||
|
if (rc)
|
||||||
written += n;
|
written += n;
|
||||||
}
|
}
|
||||||
if (!rc)
|
if (!rc && written == 0)
|
||||||
{
|
{
|
||||||
debug_printf ("error writing to pipe %p %E", write_to);
|
debug_printf ("error writing to pipe %p %E", write_to);
|
||||||
get_ttyp ()->read_retval = -1;
|
get_ttyp ()->read_retval = -1;
|
||||||
|
puts_readahead (p, bytes_left);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue