+ if (errno == EINPROGRESS) {
+ struct timeval tv;
+ tv.tv_usec = 0;
+ tv.tv_sec = 5; /* give it five seconds ... */
+ fd_set wfds;
+ FD_ZERO(&wfds);
+ FD_SET(sock, &wfds);
+
+ if ((err = select(sock + 1, NULL, &wfds, NULL, &tv)) == 0) {
+ /* timeout */
+ LOG(log_error, logtype_cnid, "getfd: select timed out for CNID server %s",
+ host);
+ close(sock);
+ sock = -1;
+ continue;
+ }
+ if (err == -1) {
+ /* select failed */
+ LOG(log_error, logtype_cnid, "getfd: select failed for CNID server %s",
+ host);
+ close(sock);
+ sock = -1;
+ continue;
+ }
+
+ if ( ! FD_ISSET(sock, &wfds)) {
+ /* give up */
+ LOG(log_error, logtype_cnid, "getfd: socket not ready connecting to %s",
+ host);
+ close(sock);
+ sock = -1;
+ continue;
+ }
+
+ if ((err = getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen)) != 0 || optval != 0) {
+ if (err != 0) {
+ /* somethings very wrong */
+ LOG(log_error, logtype_cnid, "getfd: getsockopt error with CNID server %s: %s",
+ host, strerror(errno));
+ } else {
+ errno = optval;
+ LOG(log_error, logtype_cnid, "getfd: getsockopt says: %s",
+ strerror(errno));
+ }
+ close(sock);
+ sock = -1;
+ continue;
+ }
+ } else {
+ LOG(log_error, logtype_cnid, "getfd: connect CNID server %s: %s",
+ host, strerror(errno));
+ close(sock);
+ sock = -1;
+ continue;
+ }