Author: vlendec Date: 2004-12-15 12:09:04 +0000 (Wed, 15 Dec 2004) New Revision: 4218
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4218 Log: Merge of fixes to open_socket_out from 3_0. Volker Modified: trunk/source/lib/util_sock.c Changeset: Modified: trunk/source/lib/util_sock.c =================================================================== --- trunk/source/lib/util_sock.c 2004-12-15 12:05:48 UTC (rev 4217) +++ trunk/source/lib/util_sock.c 2004-12-15 12:09:04 UTC (rev 4218) @@ -903,6 +903,9 @@ for (i=0; i<num_addrs; i++) { + if (sockets[i] == -1) + continue; + if (connect(sockets[i], (struct sockaddr *)&(addrs[i]), sizeof(*addrs)) == 0) { /* Rather unlikely as we are non-blocking, but it @@ -916,6 +919,10 @@ /* These are the error messages that something is progressing. */ good_connect = True; + } else if (errno != 0) { + /* There was a direct error */ + close(sockets[i]); + sockets[i] = -1; } } @@ -931,6 +938,8 @@ FD_ZERO(&r_fds); for (i=0; i<num_addrs; i++) { + if (sockets[i] == -1) + continue; FD_SET(sockets[i], &wr_fds); FD_SET(sockets[i], &r_fds); if (sockets[i]>maxfd) @@ -950,14 +959,23 @@ for (i=0; i<num_addrs; i++) { - if (!FD_ISSET(sockets[i], &wr_fds)) + if (sockets[i] == -1) continue; /* Stevens, Network Programming says that if there's a * successful connect, the socket is only writable. Upon an * error, it's both readable and writable. */ - if (!FD_ISSET(sockets[i], &r_fds)) { + if (FD_ISSET(sockets[i], &r_fds) && + FD_ISSET(sockets[i], &wr_fds)) { + /* readable and writable, so it's an error */ + close(sockets[i]); + sockets[i] = -1; + continue; + } + + if (!FD_ISSET(sockets[i], &r_fds) && + FD_ISSET(sockets[i], &wr_fds)) { /* Only writable, so it's connected */ resulting_index = i; goto done;