aboutsummaryrefslogtreecommitdiffstats
path: root/socket.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2004-09-16 17:09:46 +0000
committerWayne Davison <wayned@samba.org>2004-09-16 17:09:46 +0000
commitab217f7ffa8765887c2ed8c9a8c71d29cfe562ed (patch)
tree9186812f6d8baa8e207b1a1250eb4eef1a16ff8b /socket.c
parenta20c9893e48771be31befbb1ef809e87a658db61 (diff)
downloadandroid_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.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/socket.c b/socket.c
index 29fb2dcd..8d21735e 100644
--- a/socket.c
+++ b/socket.c
@@ -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;
}