Cygwin1.dll 1.7.0-5x: RSYNC failures in close() system call on pipe file descriptors
cygwin
karl@sipxx.com
Fri Aug 14 01:57:00 GMT 2009
I wrote a small test program to isolate the problem from RSYNC.
The problem occurs when a file descriptor obtained from socketpair() is
dup2()'ed into STDIN and then closed. The close call fails.
Output from the program is as follows:
socket 1 = 3
socket 2 = 4
dup2 socket 1...
closing socket 1...
close: Socket operation on non-socket
closing socket 1 failed
It is interesting to note that the close() is successful when the dup2
calling sequence is omitted.
Since socketpair() in cygwin appears to use AF_INET sockets to simulate
AF_UNIX it might be interesting to try this on a single INET socket.
===============================================
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
main()
{
int fd[2];
int res = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
if (res < 0) {
perror("socketpair");
fprintf(stderr, "socketpair failed\n");
exit(1);
}
fprintf(stderr, "socket 1 = %d\n", fd[0]);
fprintf(stderr, "socket 2 = %d\n", fd[1]);
fprintf(stderr, "dup2 socket 1...\n");
res = dup2(fd[0], STDIN_FILENO);
if (res < 0) {
perror("dup2");
fprintf(stderr, "dup2 failed\n");
}
fprintf(stderr, "closing socket 1...\n");
res = close(fd[0] < 0);
if (res < 0) {
perror("close");
fprintf(stderr, "closing socket 1 failed\n");
}
}
=====================================================
cygwin wrote:
>
> After updating 2 other systems to cygwin 1.7, I find that they also
> work fine in the same test.
> However, that doesn't help much debugging this.
>
> I found that the problem on the failing system is related to using
> Unix domain sockets for the IPC pipes.
> If I replace the socketpair() call in fd_pair() in file util.c with
> pipe(), everything works fine.
>
> int fd_pair(int fd[2])
> {
> int ret;
>
> //#ifdef HAVE_SOCKETPAIR
> // ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
> //#else
> ret = pipe(fd);
> //#endif
>
> if (ret == 0) {
> set_nonblocking(fd[0]);
> set_nonblocking(fd[1]);
> }
>
> return ret;
> }
>
> The fact that cygwin 1.5 works fine on this system indicates that
> something is going wrong in 1.7 cygwin1.dll triggered by some
> conditions on this particular system.
>
>
>
>
> Corinna Vinschen wrote:
>> On Aug 13 13:17, cygwin wrote:
>>
>>> The RSYNC application fails in close() on the pipe streams to and
>>> from child processes created when rsync starts.
>>> When running rsync.exe and cygwin1.dll from cygwin 1.5 within the
>>> 1.7 installation on the same system (WinXP pro),
>>> the identical invocation completes without errors.
>>>
>>> The problems appears to be a bug in the cygwin.dll
>>>
>>> For example,
>>>
>>> $ rsync -a /etc /test
>>>
>>> produces the following messages:
>>>
>>> rsync: Failed to dup/close: Socket operation on non-socket (108)
>>> rsync error: error in IPC code (code 14) at pipe.c(147)
>>> [receiver=3.0.5]
>>> rsync: read error: Connection reset by peer (104)
>>> rsync error: error in IPC code (code 14) at io.c(759) [sender=3.0.5]
>>>
>>
>> I tested the exact above command with cygwin 1.7-0-58 and rsync-3.0.5-1
>> on Windows 7, WIndows Server 2008 SP2, as well as on XP SP3.
>>
>> Works fine for me on all three systems.
>>
>>
>> Corinna
>>
>>
>
>
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
More information about the Cygwin
mailing list