diff options
author | cvs2svn <> | 2012-08-10 13:37:35 +0400 |
---|---|---|
committer | cvs2svn <> | 2012-08-10 13:37:35 +0400 |
commit | 316eee31fe861ecb6db3905a85719fd536f984be (patch) | |
tree | 504dc9042e08d314c2b0222092d0a63314981e7e /winsup/cygwin/fhandler_tty.cc | |
parent | c0956742a74d194b9c18c7a91aa6d6010beb4cd3 (diff) |
This commit was manufactured by cvs2svn to create tag 'cygwin-cygwin-1_7_11-release
1_7_11-release'.
Sprout from cygwin-64bit-branch 2012-08-10 09:37:33 UTC cvs2svn 'This commit was manufactured by cvs2svn to create branch 'cygwin-64bit-'
Cherrypick from master 2012-02-25 10:51:32 UTC Corinna Vinschen <corinna@vinschen.de> ' * new-features.sgml (ov-new1.7.11): Add two more changes to the list.':
COPYING.LIBGLOSS
COPYING.NEWLIB
COPYING3
COPYING3.LIB
ChangeLog
MAINTAINERS
compile
config.rpath
config.sub
config/ChangeLog
config/mh-darwin
config/mh-interix
config/mh-ppc-aix
config/mt-alphaieee
config/mt-sde
config/picflag.m4
config/stdint.m4
config/tcl.m4
configure
configure.ac
include/ChangeLog
include/bfdlink.h
include/dis-asm.h
include/dwarf2.h
include/elf/ChangeLog
include/elf/avr.h
include/elf/common.h
include/elf/m68hc11.h
include/elf/mn10300.h
include/elf/ppc.h
include/elf/s390.h
include/elf/sparc.h
include/elf/tilegx.h
include/elf/tilepro.h
include/filenames.h
include/gdb/ChangeLog
include/gdb/callback.h
include/gdb/signals.def
include/gdb/signals.h
include/mach-o/ChangeLog
include/mach-o/codesign.h
include/mach-o/external.h
include/mach-o/loader.h
include/mach-o/reloc.h
include/mach-o/x86-64.h
include/opcode/ChangeLog
include/opcode/avr.h
include/opcode/crx.h
include/opcode/m68hc11.h
include/opcode/mips.h
include/opcode/ppc.h
include/opcode/sparc.h
include/opcode/tilegx.h
include/opcode/tilepro.h
include/plugin-api.h
include/splay-tree.h
include/vms/ChangeLog
include/vms/lbr.h
ltgcc.m4
ltoptions.m4
ltversion.m4
lt~obsolete.m4
newlib/ChangeLog
newlib/doc/Makefile.am
newlib/doc/Makefile.in
newlib/libc/include/machine/setjmp-dj.h
newlib/libc/include/stdio.h
newlib/libc/include/string.h
newlib/libc/include/sys/signal.h
newlib/libc/include/sys/stat.h
newlib/libc/include/sys/time.h
newlib/libc/include/sys/times.h
newlib/libc/include/sys/types.h
newlib/libc/include/sys/unistd.h
newlib/libc/include/sys/wait.h
newlib/libc/locale/lmessages.c
newlib/libc/locale/lmonetary.c
newlib/libc/locale/locale.c
newlib/libc/locale/nl_langinfo.c
newlib/libc/machine/arm/access.c
newlib/libc/machine/cr16/sys/asm.h
newlib/libc/machine/epiphany/Makefile.am
newlib/libc/machine/epiphany/Makefile.in
newlib/libc/machine/epiphany/aclocal.m4
newlib/libc/machine/epiphany/configure
newlib/libc/machine/epiphany/configure.in
newlib/libc/machine/epiphany/machine/stdlib.h
newlib/libc/machine/epiphany/setjmp.S
newlib/libc/machine/i386/setjmp.S
newlib/libc/machine/rl78/Makefile.am
newlib/libc/machine/rl78/Makefile.in
newlib/libc/machine/rl78/aclocal.m4
newlib/libc/machine/rl78/configure
newlib/libc/machine/rl78/configure.in
newlib/libc/machine/rl78/setjmp.S
newlib/libc/posix/collate.c
newlib/libc/posix/engine.c
newlib/libc/posix/glob.c
newlib/libc/posix/popen.c
newlib/libc/posix/readdir.c
newlib/libc/posix/readdir_r.c
newlib/libc/posix/regcomp.c
newlib/libc/posix/telldir.c
newlib/libc/posix/wordexp.c
newlib/libc/reent/mkdirr.c
newlib/libc/reent/renamer.c
newlib/libc/search/hash.c
newlib/libc/search/hash_bigkey.c
newlib/libc/search/hash_page.c
newlib/libc/search/hcreate_r.c
newlib/libc/stdio/asiprintf.c
newlib/libc/stdio/asprintf.c
newlib/libc/stdio/clearerr.c
newlib/libc/stdio/fclose.c
newlib/libc/stdio/fdopen.c
newlib/libc/stdio/feof.c
newlib/libc/stdio/ferror.c
newlib/libc/stdio/fflush.c
newlib/libc/stdio/fgetc.c
newlib/libc/stdio/fgets.c
newlib/libc/stdio/fgetwc.c
newlib/libc/stdio/fgetws.c
newlib/libc/stdio/fileno.c
newlib/libc/stdio/findfp.c
newlib/libc/stdio/fmemopen.c
newlib/libc/stdio/fopen.c
newlib/libc/stdio/fopencookie.c
newlib/libc/stdio/fpurge.c
newlib/libc/stdio/fputc.c
newlib/libc/stdio/fputs.c
newlib/libc/stdio/fputwc.c
newlib/libc/stdio/fputws.c
newlib/libc/stdio/fread.c
newlib/libc/stdio/freopen.c
newlib/libc/stdio/fseek.c
newlib/libc/stdio/ftell.c
newlib/libc/stdio/funopen.c
newlib/libc/stdio/fwide.c
newlib/libc/stdio/fwrite.c
newlib/libc/stdio/getc.c
newlib/libc/stdio/getdelim.c
newlib/libc/stdio/gets.c
newlib/libc/stdio/local.h
newlib/libc/stdio/mktemp.c
newlib/libc/stdio/open_memstream.c
newlib/libc/stdio/putc.c
newlib/libc/stdio/setvbuf.c
newlib/libc/stdio/ungetc.c
newlib/libc/stdio/ungetwc.c
newlib/libc/stdio/vasiprintf.c
newlib/libc/stdio/vasprintf.c
newlib/libc/stdio/vfprintf.c
newlib/libc/stdio/vfscanf.c
newlib/libc/stdio/vfwprintf.c
newlib/libc/stdio/vfwscanf.c
newlib/libc/stdio64/fdopen64.c
newlib/libc/stdio64/fopen64.c
newlib/libc/stdio64/freopen64.c
newlib/libc/stdio64/fseeko64.c
newlib/libc/stdio64/ftello64.c
newlib/libc/stdlib/mbtowc_r.c
newlib/libc/stdlib/mprec.h
newlib/libc/stdlib/wctomb_r.c
newlib/libc/string/Makefile.am
newlib/libc/string/Makefile.in
newlib/libc/string/strcasestr.c
newlib/libc/sys/epiphany/Makefile.am
newlib/libc/sys/epiphany/Makefile.in
newlib/libc/sys/epiphany/aclocal.m4
newlib/libc/sys/epiphany/configure
newlib/libc/sys/epiphany/configure.in
newlib/libc/sys/epiphany/e_printf.c
newlib/libc/sys/h8300hms/sys/file.h
newlib/libc/sys/linux/machine/i386/setjmp.S
newlib/libc/sys/rtems/crt0.c
newlib/libc/sys/rtems/machine/_types.h
newlib/libc/sys/sysmec/access.c
newlib/libc/sys/sysnecv850/access.c
newlib/libc/sys/sysnecv850/crt0.S
newlib/libc/time/strptime.c
newlib/libm/common/sf_round.c
newlib/libm/math/e_atan2.c
newlib/libm/math/e_exp.c
newlib/libm/math/e_pow.c
newlib/libm/math/e_rem_pio2.c
newlib/libm/math/ef_exp.c
newlib/libm/math/ef_pow.c
newlib/libm/math/er_lgamma.c
newlib/libm/math/erf_lgamma.c
newlib/testsuite/newlib.stdio/stdio.exp
newlib/testsuite/newlib.stdio/swprintf.c
newlib/testsuite/newlib.string/strcmp-1.c
winsup/ChangeLog
winsup/Makefile.common
winsup/cygserver/ChangeLog
winsup/cygserver/client.cc
winsup/cygserver/woutsup.h
winsup/cygwin/ChangeLog
winsup/cygwin/Makefile.in
winsup/cygwin/advapi32.cc
winsup/cygwin/child_info.h
winsup/cygwin/configure.in
winsup/cygwin/cygheap.cc
winsup/cygwin/cygheap.h
winsup/cygwin/cygprops.h
winsup/cygwin/cygserver_ipc.h
winsup/cygwin/cygthread.cc
winsup/cygwin/cygtls.cc
winsup/cygwin/cygtls.h
winsup/cygwin/cygwin.din
winsup/cygwin/cygwin.sc
winsup/cygwin/dcrt0.cc
winsup/cygwin/devices.cc
winsup/cygwin/devices.h
winsup/cygwin/devices.in
winsup/cygwin/dir.cc
winsup/cygwin/dll_init.cc
winsup/cygwin/dll_init.h
winsup/cygwin/dtable.cc
winsup/cygwin/dtable.h
winsup/cygwin/environ.cc
winsup/cygwin/exceptions.cc
winsup/cygwin/external.cc
winsup/cygwin/fenv.cc
winsup/cygwin/fhandler.cc
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_clipboard.cc
winsup/cygwin/fhandler_console.cc
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/fhandler_dsp.cc
winsup/cygwin/fhandler_fifo.cc
winsup/cygwin/fhandler_floppy.cc
winsup/cygwin/fhandler_mem.cc
winsup/cygwin/fhandler_nodevice.cc
winsup/cygwin/fhandler_process.cc
winsup/cygwin/fhandler_procnet.cc
winsup/cygwin/fhandler_registry.cc
winsup/cygwin/fhandler_serial.cc
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/fhandler_tape.cc
winsup/cygwin/fhandler_termios.cc
winsup/cygwin/fhandler_tty.cc
winsup/cygwin/fhandler_virtual.cc
winsup/cygwin/fhandler_windows.cc
winsup/cygwin/flock.cc
winsup/cygwin/fork.cc
winsup/cygwin/gendef
winsup/cygwin/gendevices
winsup/cygwin/gentls_offsets
winsup/cygwin/glob.cc
winsup/cygwin/globals.cc
winsup/cygwin/heap.cc
winsup/cygwin/hires.h
winsup/cygwin/hookapi.cc
winsup/cygwin/include/cygwin/if.h
winsup/cygwin/include/cygwin/in.h
winsup/cygwin/include/cygwin/socket.h
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/include/elf.h
winsup/cygwin/include/inttypes.h
winsup/cygwin/include/mntent.h
winsup/cygwin/include/netdb.h
winsup/cygwin/include/stdint.h
winsup/cygwin/include/sys/elf32.h
winsup/cygwin/include/sys/elf64.h
winsup/cygwin/include/sys/elf_common.h
winsup/cygwin/include/sys/elf_generic.h
winsup/cygwin/include/sys/termios.h
winsup/cygwin/include/sys/wait.h
winsup/cygwin/init.cc
winsup/cygwin/kernel32.cc
winsup/cygwin/lib/_cygwin_crt0_common.cc
winsup/cygwin/lib/crt0.h
winsup/cygwin/libc/inet_addr.c
winsup/cygwin/libc/inet_network.c
winsup/cygwin/libc/minires-os-if.c
winsup/cygwin/libc/minires.h
winsup/cygwin/libc/rcmd.cc
winsup/cygwin/miscfuncs.cc
winsup/cygwin/miscfuncs.h
winsup/cygwin/mkglobals_h
winsup/cygwin/mkvers.sh
winsup/cygwin/mmap.cc
winsup/cygwin/mount.cc
winsup/cygwin/mount.h
winsup/cygwin/net.cc
winsup/cygwin/ntdll.h
winsup/cygwin/passwd.cc
winsup/cygwin/path.cc
winsup/cygwin/path.h
winsup/cygwin/pinfo.cc
winsup/cygwin/pinfo.h
winsup/cygwin/pipe.cc
winsup/cygwin/poll.cc
winsup/cygwin/posix.sgml
winsup/cygwin/posix_ipc.cc
winsup/cygwin/pseudo-reloc.cc
winsup/cygwin/regex/regcomp.c
winsup/cygwin/registry.cc
winsup/cygwin/release/1.7.10
winsup/cygwin/release/1.7.11
winsup/cygwin/sched.cc
winsup/cygwin/sec_acl.cc
winsup/cygwin/sec_helper.cc
winsup/cygwin/security.cc
winsup/cygwin/security.h
winsup/cygwin/select.cc
winsup/cygwin/select.h
winsup/cygwin/shared.cc
winsup/cygwin/signal.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/sigproc.h
winsup/cygwin/smallprint.cc
winsup/cygwin/spawn.cc
winsup/cygwin/strace.cc
winsup/cygwin/strfuncs.cc
winsup/cygwin/sync.h
winsup/cygwin/syscalls.cc
winsup/cygwin/sysconf.cc
winsup/cygwin/syslog.cc
winsup/cygwin/termios.cc
winsup/cygwin/thread.cc
winsup/cygwin/thread.h
winsup/cygwin/times.cc
winsup/cygwin/tlsoffsets.h
winsup/cygwin/wait.cc
winsup/cygwin/winbase.h
winsup/cygwin/wincap.cc
winsup/cygwin/wincap.h
winsup/cygwin/winlean.h
winsup/cygwin/winsup.h
winsup/cygwin/winver.rc
winsup/doc/ChangeLog
winsup/doc/configure
winsup/doc/cygwinenv.sgml
winsup/doc/faq-programming.xml
winsup/doc/faq-using.xml
winsup/doc/new-features.sgml
winsup/doc/overview2.sgml
winsup/doc/pathnames.sgml
winsup/doc/setup-net.sgml
winsup/doc/using.sgml
winsup/lsaauth/ChangeLog
winsup/lsaauth/Makefile.in
winsup/lsaauth/cyglsa.c
winsup/lsaauth/cyglsa64.dll
winsup/lsaauth/make-64bit-version-with-mingw-w64.sh
winsup/mingw/ChangeLog
winsup/mingw/configure
winsup/mingw/configure.in
winsup/mingw/include/_mingw.h
winsup/mingw/include/excpt.h
winsup/mingw/include/inttypes.h
winsup/mingw/include/limits.h
winsup/mingw/include/process.h
winsup/mingw/include/stdint.h
winsup/mingw/include/stdio.h
winsup/mingw/include/stdlib.h
winsup/mingw/include/sys/param.h
winsup/mingw/include/wchar.h
winsup/mingw/mingwex/Makefile.in
winsup/mingw/mingwex/gdtoa/gd_qnan.h
winsup/mingw/mingwex/tsearch.c
winsup/mingw/profile/Makefile.in
winsup/testsuite/ChangeLog
winsup/testsuite/configure
winsup/utils/ChangeLog
winsup/utils/Makefile.in
winsup/utils/bloda.cc
winsup/utils/cygcheck.cc
winsup/utils/cygpath.cc
winsup/utils/dump_setup.cc
winsup/utils/dumper.cc
winsup/utils/locale.cc
winsup/utils/mkgroup.c
winsup/utils/mkpasswd.c
winsup/utils/ps.cc
winsup/utils/regtool.cc
winsup/utils/strace.cc
winsup/w32api/ChangeLog
winsup/w32api/include/routprot.h
winsup/w32api/include/setupapi.h
winsup/w32api/include/winbase.h
winsup/w32api/include/windows.h
winsup/w32api/include/winnt.h
winsup/w32api/include/winsock.h
winsup/w32api/include/winsock2.h
winsup/w32api/include/winuser.h
winsup/w32api/include/winver.h
winsup/w32api/include/wtsapi32.h
winsup/w32api/lib/Makefile.in
winsup/w32api/lib/kernel32.def
winsup/w32api/lib/wtsapi32.def
Delete:
config/asmcfi.m4
config/math.m4
config/mmap.m4
config/weakref.m4
include/dwarf2.def
include/elf/xgate.h
include/gdb/gdb-index.h
include/leb128.h
include/opcode/xgate.h
newlib/libc/string/memrchr.c
winsup/cygwin/DevNotes
winsup/cygwin/cygwait.cc
winsup/cygwin/cygwait.h
winsup/cygwin/fhandler_dev.cc
winsup/cygwin/include/machine/elf.h
winsup/cygwin/include/sys/elf.h
winsup/mingw/mingwex/membarrier.c
winsup/w32api/include/sdkddkver.h
winsup/w32api/include/shobjidl.h
winsup/w32api/lib/shobjidl-uuid.c
Diffstat (limited to 'winsup/cygwin/fhandler_tty.cc')
-rw-r--r-- | winsup/cygwin/fhandler_tty.cc | 172 |
1 files changed, 75 insertions, 97 deletions
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index c5b65c5b8..b316a0aaf 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -11,7 +11,6 @@ details. */ #include "winsup.h" #include <stdlib.h> -#include <sys/param.h> #include <cygwin/kd.h> #include "cygerrno.h" #include "security.h" @@ -26,7 +25,6 @@ details. */ #include "cygthread.h" #include "child_info.h" #include <asm/socket.h> -#include "cygwait.h" #define close_maybe(h) \ do { \ @@ -51,32 +49,6 @@ fhandler_pty_slave::get_unit () return dev ().get_minor (); } -bool -bytes_available (DWORD& n, HANDLE h) -{ - DWORD navail, nleft; - navail = nleft = 0; - bool succeeded = PeekNamedPipe (h, NULL, 0, NULL, &navail, &nleft); - if (succeeded) - /* nleft should always be the right choice unless something has written 0 - bytes to the pipe. In that pathological case we return the actual number - of bytes available in the pipe. See cgf-000008 for more details. */ - n = nleft ?: navail; - else - { - termios_printf ("PeekNamedPipe(%p) failed, %E", h); - n = 0; - } - debug_only_printf ("n %u, nleft %u, navail %u"); - return succeeded; -} - -bool -fhandler_pty_common::bytes_available (DWORD &n) -{ - return ::bytes_available (n, get_handle ()); -} - #ifdef DEBUGGING static class mutex_stack { @@ -89,16 +61,9 @@ public: static int osi; #endif /*DEBUGGING*/ -void -fhandler_pty_master::flush_to_slave () -{ - if (get_readahead_valid () && !(get_ttyp ()->ti.c_lflag & ICANON)) - accept_input (); -} - DWORD fhandler_pty_common::__acquire_output_mutex (const char *fn, int ln, - DWORD ms) + DWORD ms) { if (strace.active ()) strace.prntf (_STRACE_TERMIOS, fn, "(%d): pty output_mutex (%p): waiting %d ms", ln, output_mutex, ms); @@ -176,7 +141,7 @@ fhandler_pty_master::accept_input () DWORD rc; DWORD written = 0; - paranoid_printf ("about to write %d chars to slave", bytes_left); + termios_printf ("about to write %d chars to slave", bytes_left); rc = WriteFile (get_output_handle (), p, bytes_left, &written, NULL); if (!rc) { @@ -228,8 +193,6 @@ fhandler_pty_master::process_slave_output (char *buf, size_t len, int pktmode_on int column = 0; int rc = 0; - flush_to_slave (); - if (len == 0) goto out; @@ -246,6 +209,7 @@ fhandler_pty_master::process_slave_output (char *buf, size_t len, int pktmode_on goto out; } + for (;;) { /* Set RLEN to the number of bytes to read from the pipe. */ @@ -261,40 +225,50 @@ fhandler_pty_master::process_slave_output (char *buf, size_t len, int pktmode_on if (rlen > sizeof outbuf) rlen = sizeof outbuf; - n = 0; - for (;;) - { - if (!bytes_available (n)) - goto err; - if (n) - break; - if (hit_eof ()) - goto out; - /* DISCARD (FLUSHO) and tcflush can finish here. */ - if ((get_ttyp ()->ti.c_lflag & FLUSHO || !buf)) - goto out; + HANDLE handle = get_io_handle (); - if (is_nonblocking ()) + n = 0; // get_readahead_into_buffer (outbuf, len); + if (!n) + { + /* Doing a busy wait like this is quite inefficient, but nothing + else seems to work completely. Windows should provide some sort + of overlapped I/O for pipes, or something, but it doesn't. */ + while (1) { - set_errno (EAGAIN); - rc = -1; - goto out; + if (!PeekNamedPipe (handle, NULL, 0, NULL, &n, NULL)) + { + termios_printf ("PeekNamedPipe(%p) failed, %E", handle); + goto err; + } + if (n > 0) + break; + if (hit_eof ()) + goto out; + /* DISCARD (FLUSHO) and tcflush can finish here. */ + if ((get_ttyp ()->ti.c_lflag & FLUSHO || !buf)) + goto out; + + if (is_nonblocking ()) + { + set_errno (EAGAIN); + rc = -1; + goto out; + } + pthread_testcancel (); + if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0 + && !_my_tls.call_signal_handler ()) + { + set_errno (EINTR); + rc = -1; + goto out; + } } - pthread_testcancel (); - if (cancelable_wait (NULL, 10, cw_sig_eintr) == WAIT_SIGNALED - && !_my_tls.call_signal_handler ()) + + if (!ReadFile (handle, outbuf, rlen, &n, NULL)) { - set_errno (EINTR); - rc = -1; - goto out; + termios_printf ("ReadFile failed, %E"); + goto err; } - flush_to_slave (); - } - - if (!ReadFile (get_handle (), outbuf, rlen, &n, NULL)) - { - termios_printf ("ReadFile failed, %E"); - goto err; } termios_printf ("bytes read %u", n); @@ -649,7 +623,7 @@ fhandler_pty_slave::write (const void *ptr, size_t len) while (len) { - n = MIN (OUT_BUFFER_SIZE, len); + n = min (OUT_BUFFER_SIZE, len); char *buf = (char *)ptr; ptr = (char *) ptr + n; len -= n; @@ -693,6 +667,7 @@ fhandler_pty_slave::read (void *ptr, size_t& len) size_t readlen; DWORD bytes_in_pipe; char buf[INP_BUFFER_SIZE]; + char peek_buf[INP_BUFFER_SIZE]; DWORD time_to_wait; bg_check_types bg = bg_check (SIGTTIN); @@ -738,14 +713,14 @@ fhandler_pty_slave::read (void *ptr, size_t& len) goto out; } break; - case WAIT_SIGNALED: + case WAIT_OBJECT_0 + 1: if (totalread > 0) goto out; termios_printf ("wait catched signal"); set_sig_errno (EINTR); totalread = -1; goto out; - case WAIT_CANCELED: + case WAIT_OBJECT_0 + 2: process_state.pop (); pthread::static_cancel_self (); /*NOTREACHED*/ @@ -773,14 +748,14 @@ fhandler_pty_slave::read (void *ptr, size_t& len) case WAIT_OBJECT_0: case WAIT_ABANDONED_0: break; - case WAIT_SIGNALED: + case WAIT_OBJECT_0 + 1: if (totalread > 0) goto out; - termios_printf ("wait for mutex caught signal"); + termios_printf ("wait for mutex catched signal"); set_sig_errno (EINTR); totalread = -1; goto out; - case WAIT_CANCELED: + case WAIT_OBJECT_0 + 2: process_state.pop (); pthread::static_cancel_self (); /*NOTREACHED*/ @@ -809,8 +784,12 @@ fhandler_pty_slave::read (void *ptr, size_t& len) } goto out; } - if (!bytes_available (bytes_in_pipe)) - raise (SIGHUP); + if (!PeekNamedPipe (get_handle (), peek_buf, sizeof (peek_buf), &bytes_in_pipe, NULL, NULL)) + { + termios_printf ("PeekNamedPipe failed, %E"); + raise (SIGHUP); + bytes_in_pipe = 0; + } /* On first peek determine no. of bytes to flush. */ if (!ptr && len == UINT_MAX) @@ -823,7 +802,7 @@ fhandler_pty_slave::read (void *ptr, size_t& len) return; } - readlen = MIN (bytes_in_pipe, MIN (len, sizeof (buf))); + readlen = min (bytes_in_pipe, min (len, sizeof (buf))); if (ptr && vmin && readlen > (unsigned) vmin) readlen = vmin; @@ -835,6 +814,7 @@ fhandler_pty_slave::read (void *ptr, size_t& len) if (!ReadFile (get_handle (), buf, readlen, &n, NULL)) { termios_printf ("read failed, %E"); + bytes_in_pipe = 0; raise (SIGHUP); bytes_in_pipe = 0; ptr = NULL; @@ -845,8 +825,12 @@ fhandler_pty_slave::read (void *ptr, size_t& len) number of bytes in pipe, but for some reason this number doesn't change after successful read. So we have to peek into the pipe again to see if input is still available */ - if (!bytes_available (bytes_in_pipe)) - raise (SIGHUP); + if (!PeekNamedPipe (get_handle (), peek_buf, 1, &bytes_in_pipe, NULL, NULL)) + { + termios_printf ("PeekNamedPipe failed, %E"); + raise (SIGHUP); + bytes_in_pipe = 0; + } if (n) { len -= n; @@ -914,16 +898,7 @@ out: int fhandler_pty_slave::dup (fhandler_base *child, int flags) { - /* This code was added in Oct 2001 for some undisclosed reason. - However, setting the controlling tty on a dup causes rxvt to - hang when the parent does a dup since the controlling pgid changes. - Specifically testing for -2 (ctty has been setsid'ed) works around - this problem. However, it's difficult to see scenarios in which you - have a dup'able fd, no controlling tty, and not having run setsid. - So, we might want to consider getting rid of the set_ctty in tty-like dup - methods entirely at some point */ - if (myself->ctty != -2) - myself->set_ctty (this, flags); + myself->set_ctty (this, flags); report_tty_counts (child, "duped slave", ""); return 0; } @@ -1014,15 +989,15 @@ fhandler_pty_slave::ioctl (unsigned int cmd, void *arg) goto out; case FIONREAD: { - DWORD n; - if (!bytes_available (n)) + int n; + if (!PeekNamedPipe (get_handle (), NULL, 0, NULL, (DWORD *) &n, NULL)) { set_errno (EINVAL); retval = -1; } else { - *(int *) arg = (int) n; + *(int *) arg = n; retval = 0; } } @@ -1280,6 +1255,11 @@ fhandler_pty_master::cleanup () int fhandler_pty_master::close () { +#if 0 + while (accept_input () > 0) + continue; +#endif + termios_printf ("closing from_master(%p)/to_master(%p) since we own them(%d)", from_master, to_master, dwProcessId); if (cygwin_finished_initializing) @@ -1430,13 +1410,13 @@ fhandler_pty_master::ioctl (unsigned int cmd, void *arg) return this->tcsetpgrp ((pid_t) arg); case FIONREAD: { - DWORD n; - if (!::bytes_available (n, to_master)) + int n; + if (!PeekNamedPipe (to_master, NULL, 0, NULL, (DWORD *) &n, NULL)) { set_errno (EINVAL); return -1; } - *(int *) arg = (int) n; + *(int *) arg = n; } break; default: @@ -1482,9 +1462,7 @@ fhandler_pty_slave::fixup_after_exec () fixup_after_fork (NULL); } -#ifndef __MINGW64_VERSION_MAJOR extern "C" BOOL WINAPI GetNamedPipeClientProcessId (HANDLE, PULONG); -#endif /* This thread function handles the master control pipe. It waits for a client to connect. Then it checks if the client process has permissions |