diff options
author | Wayne Davison <wayned@samba.org> | 2004-09-16 17:09:46 +0000 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2004-09-16 17:09:46 +0000 |
commit | ab217f7ffa8765887c2ed8c9a8c71d29cfe562ed (patch) | |
tree | 9186812f6d8baa8e207b1a1250eb4eef1a16ff8b /socket.c | |
parent | a20c9893e48771be31befbb1ef809e87a658db61 (diff) | |
download | android_external_rsync-ab217f7ffa8765887c2ed8c9a8c71d29cfe562ed.tar.gz android_external_rsync-ab217f7ffa8765887c2ed8c9a8c71d29cfe562ed.tar.bz2 android_external_rsync-ab217f7ffa8765887c2ed8c9a8c71d29cfe562ed.zip |
- Set "listener" to -1 after we close it so that the error-handler
doesn't try to re-close it.
- Set blocking I/O before the second (final) connect() call.
Diffstat (limited to 'socket.c')
-rw-r--r-- | socket.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -687,7 +687,7 @@ static int socketpair_tcp(int fd[2]) struct sockaddr_in sock; struct sockaddr_in sock2; socklen_t socklen = sizeof sock; - int connect_done = 0; + int errno_save, connect_done = 0; fd[0] = fd[1] = listener = -1; @@ -727,24 +727,28 @@ static int socketpair_tcp(int fd[2]) goto failed; close(listener); + listener = -1; + + set_blocking(fd[1]); + if (connect_done == 0) { if (connect(fd[1], (struct sockaddr *)&sock, sizeof sock) != 0 && errno != EISCONN) goto failed; } - set_blocking(fd[1]); - /* all OK! */ return 0; failed: + errno_save = errno; if (fd[0] != -1) close(fd[0]); if (fd[1] != -1) close(fd[1]); if (listener != -1) close(listener); + errno = errno_save; return -1; } |