Mail Archives: cygwin-developers/1998/02/17/09:05:36
From: Sergey Okhapkin <sos AT prospect DOT com DOT ru>
Date: Tue, 17 Feb 1998 10:09:51 +0300
Ian Lance Taylor wrote:
> I guess I don't understand this. I thought it was already safe for
> the master to open and close the tty slave, particularly with the
> patch I checked in a few days ago. Can you give an example of a
> program which fails without this patch?
Rxvt-2.20 terminal emulator, Xemacs.
Sorry, I was not clear. What I meant was a small program, like the
one I sent. Tracking down and building rxvt or xemacs would be far
more work than I care to put into cygwin32. (I only got involved
because Geoff asked me to see what was involved in getting expect to
work, so that the dejagnu testsuite harness will run on cygwin32.)
> I've appended one simple pty testing program I use. It works on Unix,
> and needs to continue to work on cygwin32. When it works, it should
> print the output of stty.
Your program hangs in parent's read with this patch. I know the difference
now - both rxvt and Xemacs sets pty master handle to non-blocking.
My program doesn't hang, at least not for me. I test every change to
the pty handling using it and using the expect testsuite. Where does
it hang for you, and why?
The appended patch ought to make the pty master handle non blocking
reads better.
Ian
Index: tty.cc
===================================================================
RCS file: /cvs/cvsfiles/devo/winsup/tty.cc,v
retrieving revision 1.6.8.1.4.12
diff -u -r1.6.8.1.4.12 tty.cc
--- tty.cc 1998/02/16 20:45:06 1.6.8.1.4.12
+++ tty.cc 1998/02/17 16:41:38
@@ -1593,11 +1593,10 @@
int
fhandler_pty_master::read (void *ptr, size_t len)
{
- int n;
+ DWORD n;
char *cptr = (char *) ptr;
- if (PeekNamedPipe (get_handle (), NULL, 0, NULL, (unsigned *) &n, NULL)
- == FALSE)
+ if (! PeekNamedPipe (get_handle (), NULL, 0, NULL, &n, NULL))
{
if (GetLastError () == ERROR_BROKEN_PIPE)
{
@@ -1605,6 +1604,12 @@
return 0;
}
__seterrno ();
+ return -1;
+ }
+ if (n == 0
+ && (get_flags () & (O_NONBLOCK | O_NDELAY)) != 0)
+ {
+ set_errno (EAGAIN);
return -1;
}
if (pktmode)
- Raw text -