Subject: Re: Rsync: found the problem
From: Bill Petheram <[email-masked]>
To: Corinna Vinschen <[email-masked]>, Lapo Luchini <[email-masked]>
Date: Mon, 06 Aug 2001 13:09:34 +0100

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/