diff --git a/src/anchor.c b/src/anchor.c index 6d3877e0..7f992a5c 100644 --- a/src/anchor.c +++ b/src/anchor.c @@ -1199,7 +1199,7 @@ static void tas_read_cb(void *userarg) return; } } - } else if (_getdns_socket_retry()) + } else if (_getdns_socket_wants_retry()) return; DEBUG_ANCHOR("Read error: %d %s\n", (int)n, _getdns_errnostr()); @@ -1249,7 +1249,7 @@ static void tas_write_cb(void *userarg) tas_read_cb, NULL, tas_timeout_cb)); return; - } else if (_getdns_socket_retry()) + } else if (_getdns_socket_wants_retry()) return; DEBUG_ANCHOR("Write error: %s\n", _getdns_errnostr()); diff --git a/src/platform.c b/src/platform.c index aad62d63..49a7e225 100644 --- a/src/platform.c +++ b/src/platform.c @@ -147,32 +147,6 @@ const char *_getdns_strerror(DWORD errnum) case WSA_QOS_EFLOWSPEC: return "QOS flowspec error."; case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer."; case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style."; - case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize."; - case WSASYSCALLFAILURE: return "System call failure."; - case WSASERVICE_NOT_FOUND: return "Service not found."; - case WSATYPE_NOT_FOUND: return "Class type not found."; - case WSA_E_NO_MORE: return "No more results."; - case WSA_E_CANCELLED: return "Call was canceled."; - case WSAEREFUSED: return "Database query was refused."; - case WSAHOST_NOT_FOUND: return "Host not found."; - case WSATRY_AGAIN: return "Nonauthoritative host not found."; - case WSANO_RECOVERY: return "This is a nonrecoverable error."; - case WSANO_DATA: return "Valid name, no data record of requested type."; - case WSA_QOS_RECEIVERS: return "QOS receivers."; - case WSA_QOS_SENDERS: return "QOS senders."; - case WSA_QOS_NO_SENDERS: return "No QOS senders."; - case WSA_QOS_NO_RECEIVERS: return "QOS no receivers."; - case WSA_QOS_REQUEST_CONFIRMED: return "QOS request confirmed."; - case WSA_QOS_ADMISSION_FAILURE: return "QOS admission error."; - case WSA_QOS_POLICY_FAILURE: return "QOS policy failure."; - case WSA_QOS_BAD_STYLE: return "QOS bad style."; - case WSA_QOS_BAD_OBJECT: return "QOS bad object."; - case WSA_QOS_TRAFFIC_CTRL_ERROR: return "QOS traffic control error."; - case WSA_QOS_GENERIC_ERROR: return "QOS generic error."; - case WSA_QOS_ESERVICETYPE: return "QOS service type error."; - case WSA_QOS_EFLOWSPEC: return "QOS flowspec error."; - case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer."; - case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style."; case WSA_QOS_EFILTERTYPE: return "Invalid QOS filter type."; case WSA_QOS_EFILTERCOUNT: return "Incorrect QOS filter count."; case WSA_QOS_EOBJLENGTH: return "Invalid QOS object length."; @@ -187,7 +161,7 @@ const char *_getdns_strerror(DWORD errnum) case WSA_QOS_RESERVED_PETYPE: return "Reserved policy QOS element type."; default: snprintf(unknown, sizeof(unknown), - "unknown WSA error code %d", (int)err); + "unknown WSA error code %d", (int)errnum); return unknown; } } diff --git a/src/platform.h b/src/platform.h index d2b69da5..940d0f6e 100644 --- a/src/platform.h +++ b/src/platform.h @@ -46,7 +46,11 @@ typedef u_short sa_family_t; #define _getdns_ENOBUFS (WSAENOBUFS) #define _getdns_EPROTO (0) #define _getdns_EMFILE (WSAEMFILE) -#define _getdns_ENFILE (WSAENFILE) +#ifdef WSAENFILE +# define _getdns_ENFILE (WSAENFILE) +#else +# define _getdns_ENFILE (0) +#endif #define _getdns_ECONNRESET (WSAECONNRESET) #define _getdns_ECONNABORTED (0) #define _getdns_EISCONN (WSAEISCONN) @@ -138,7 +142,7 @@ void _getdns_perror(const char *str); || (X) == _getdns_EWOULDBLOCK \ || (X) == _getdns_EINPROGRESS \ || (X) == _getdns_ENOBUFS ) -#define _getdns_socket_retry() (_getdns_errno_retry(_getdns_socketerror())) +#define _getdns_socket_wants_retry() (_getdns_errno_retry(_getdns_socketerror())) #define _getdns_resource_depletion() ( _getdns_socketerror() == _getdns_ENFILE \ || _getdns_socketerror() == _getdns_EMFILE ) diff --git a/src/server.c b/src/server.c index 28aa9052..7bbda6eb 100644 --- a/src/server.c +++ b/src/server.c @@ -191,7 +191,7 @@ static void tcp_write_cb(void *userarg) (const void *)&to_write->write_buf[to_write->written], to_write->write_buf_len - to_write->written, 0)) == -1) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return; DEBUG_SERVER("I/O error from send(): %s\n", @@ -287,7 +287,7 @@ getdns_reply( if (conn->l->fd >= 0 && sendto(conn->l->fd, (void *)buf, len, 0, (struct sockaddr *)&conn->remote_in, conn->addrlen) == -1) { - /* TODO: handle _getdns_socket_retry() */ + /* TODO: handle _getdns_socket_wants_retry() */ /* IO error, never cleanup a listener because of I/O error */ DEBUG_SERVER("I/O error from sendto(): %s\n", @@ -371,7 +371,7 @@ static void tcp_read_cb(void *userarg) if ((bytes_read = recv(conn->fd, (void *)conn->read_pos, conn->to_read, 0)) < 0) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return; /* Come back to do the read later */ /* IO error, close connection */ @@ -486,7 +486,7 @@ static void tcp_accept_cb(void *userarg) if ((conn->fd = accept(l->fd, (struct sockaddr *) &conn->super.remote_in, &conn->super.addrlen)) == -1) { - if (_getdns_socket_retry() || + if (_getdns_socket_wants_retry() || _getdns_socketerror() == _getdns_ECONNRESET) ; /* pass */ @@ -564,7 +564,7 @@ static void udp_read_cb(void *userarg) conn->addrlen = sizeof(conn->remote_in); if ((len = recvfrom(l->fd, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&conn->remote_in, &conn->addrlen)) == -1) { - if ( _getdns_socket_retry() && + if ( _getdns_socket_wants_retry() && _getdns_socketerror() != _getdns_ECONNRESET) { /* * WINSOCK gives ECONNRESET on ICMP Port Unreachable diff --git a/src/stub.c b/src/stub.c index e9089291..247862d6 100644 --- a/src/stub.c +++ b/src/stub.c @@ -638,7 +638,7 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) } read = recv(fd, (void *)tcp->read_pos, tcp->to_read, 0); if (read < 0) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return STUB_TCP_RETRY; else return STUB_TCP_ERROR; @@ -756,7 +756,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) (struct sockaddr *)&(netreq->upstream->addr), netreq->upstream->addr_len); #endif - if ((written == -1 && _getdns_socket_retry()) || + if ((written == -1 && _getdns_socket_wants_retry()) || (size_t)written < pkt_len + 2) { /* We couldn't write the whole packet. @@ -788,7 +788,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) written = send(fd, (void *)(tcp->write_buf + tcp->written), tcp->write_buf_len - tcp->written, 0); if (written == -1) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return STUB_TCP_RETRY; else { DEBUG_STUB("%s %-35s: MSG: %p error while writing to TCP socket:" @@ -1331,7 +1331,7 @@ stub_udp_read_cb(void *userarg) * i.e. overflow */ 0, NULL, NULL); - if (read == -1 && (_getdns_socket_retry() || + if (read == -1 && (_getdns_socket_wants_retry() || _getdns_socketerror() == _getdns_ECONNRESET)) return; /* Try again later */