int attr;
int err;
struct addrinfo hints, *servinfo, *p;
+ int optval;
+ socklen_t optlen = sizeof(optval);
/* Prepare hint for getaddrinfo */
memset(&hints, 0, sizeof hints);
fd_set wfds;
FD_ZERO(&wfds);
FD_SET(sock, &wfds);
- if (select(sock + 1, NULL, &wfds, NULL, &tv) < 1) {
+
+ 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: select timed out for CNID server %s: %s",
- host, strerror(errno));
+ LOG(log_error, logtype_cnid, "getfd: socket not ready connecting to %s",
+ host);
close(sock);
sock = -1;
continue;
}
- int optval;
- socklen_t optlen = sizeof(optval);
- if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen) != 0 || optval != 0) {
- /* somethings still wrong */
- LOG(log_error, logtype_cnid, "getfd: getsockopt error with CNID server %s: %s",
- host, strerror(errno));
+
+ 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;
freeaddrinfo(servinfo);
if (p == NULL) {
- LOG(log_error, logtype_cnid, "tsock_getfd: no suitable network config from CNID server %s:%s",
- host, port);
+ errno = optval;
+ LOG(log_error, logtype_cnid, "tsock_getfd: no suitable network config from CNID server (%s:%s): %s",
+ host, port, strerror(errno));
return -1;
}
db->fd = -1; /* FD not valid... will need to reconnect */
}
+ if (errno == ECONNREFUSED) { /* errno carefully injected in tsock_getfd */
+ /* give up */
+ LOG(log_error, logtype_cnid, "transmit: connection refused (db_dir %s)", db->db_dir);
+ return -1;
+ }
+
if (!clean) { /* don't sleep if just got disconnected by cnid server */
time(&t);
if (t - orig > MAX_DELAY) {