- pfd[i].events = POLLOUT;
- }
-
- while (num && poll(pfd, num, -1) != -1) {
- for (i = 0; i < num; i++) {
- int err;
- socklen_t errlen = sizeof(err);
- if (!pfd[i].revents)
- continue;
- if (getsockopt(pfd[i].fd, SOL_SOCKET, SO_ERROR, &err,
- &errlen) != 0)
- goto out;
- if (err == 0)
- goto got_one;
-
- /* Remove dead one. */
- errno = err;
- remove_fd(pfd, addr, slen, &num, i--);
+ if (err == 0) {
+ /* Don't hand them non-blocking fd! */
+ if (!set_nonblock(pfds[i].fd, false)) {
+ net_connect_abort(pfds);
+ return -1;
+ }
+ /* Close other one. */
+ if (pfds[!i].fd != -1)
+ close(pfds[!i].fd);
+ return pfds[i].fd;