Is it a bug or a feature?
Internally cygwin uses a flag OLD_O_NDELAY with the value 0x0004. This
is used for backward compatibility (according to the comment). There is
code to check that if either the OLD_O_NDELAY flag is set or if O_NDELAY
(0x4000) is set they both get set.
So when rsync does a GETFL it does the 'normal':- val &= ~NONBLOCK_FLAG
to set to blocking. Unfortunately the OLD_O_NDELAY bit is still set so
the when the SETFL is called is sets the O_FNDELAY bit as well.
Obviously this means that once a socket is set to non-blocking mode it
cannot be reset using this method. Note that the OLD_O_NDELAY is not
defined in the installed header files, only internally to cygwin.
I think that it is not possible to run old executables with newer DLLs,
so may be the OLD_O_NDELAY flag can be removed.
I added this patch to rsync.h
470a471,474
> #ifdef __CYGWIN32__
> #define OLD_O_NDELAY 0x0004
> #define NONBLOCK_FLAG (O_NONBLOCK | OLD_O_NDELAY)
> #else
476a481
> #endif
This fixes the problem for rsync.
bill
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/