#include "log.h"
#include "mm-internal.h"
#include "bufferevent-internal.h"
+#include "util-internal.h"
/* prototypes */
res = evbuffer_read(input, fd, howmuch);
if (res == -1) {
- if (errno == EAGAIN || errno == EINTR)
+ int err = evutil_socket_geterror(fd);
+ if (EVUTIL_ERR_RW_RETRIABLE(err))
goto reschedule;
/* error case */
what |= EVBUFFER_ERROR;
if (EVBUFFER_LENGTH(bufev->output)) {
res = evbuffer_write(bufev->output, fd);
if (res == -1) {
-#ifndef WIN32
-/*todo. evbuffer uses WriteFile when WIN32 is set. WIN32 system calls do not
- *set errno. thus this error checking is not portable*/
- if (errno == EAGAIN ||
- errno == EINTR ||
- errno == EINPROGRESS)
- goto reschedule;
- /* error case */
- what |= EVBUFFER_ERROR;
-
-#else
+ int err = evutil_socket_geterror(fd);
+ /* XXXX we used to check for EINPROGRESS here too, but I
+ don't think write can set that. -nick */
+ if (EVUTIL_ERR_RW_RETRIABLE(err))
goto reschedule;
-#endif
-
+ what |= EVBUFFER_ERROR;
} else if (res == 0) {
/* eof case */
what |= EVBUFFER_EOF;
#include "mm-internal.h"
#include "strlcpy-internal.h"
#include "ipv6-internal.h"
+#include "util-internal.h"
#ifdef WIN32
#include <winsock2.h>
#include <windows.h>
#ifdef WIN32
static int
-error_is_eagain(int err)
-{
- return err == EAGAIN || err == WSAEWOULDBLOCK;
-}
-static int
inet_aton(const char *c, struct in_addr *addr)
{
ev_uint32_t r;
}
return 1;
}
-#else
-#define error_is_eagain(err) ((err) == EAGAIN)
#endif
#define CLOSE_SOCKET(s) EVUTIL_CLOSESOCKET(s)
const int r = recv(ns->socket, packet, sizeof(packet), 0);
if (r < 0) {
int err = evutil_socket_geterror(ns->socket);
- if (error_is_eagain(err)) return;
+ if (EVUTIL_ERR_RW_RETRIABLE(err))
+ return;
nameserver_failed(ns, evutil_socket_error_to_string(err));
return;
}
(struct sockaddr*) &addr, &addrlen);
if (r < 0) {
int err = evutil_socket_geterror(s->socket);
- if (error_is_eagain(err)) return;
+ if (EVUTIL_ERR_RW_RETRIABLE(err))
+ return;
log(EVDNS_LOG_WARN, "Error %s (%d) while reading request.",
evutil_socket_error_to_string(err), err);
return;
(struct sockaddr*) &req->addr, req->addrlen);
if (r < 0) {
int err = evutil_socket_geterror(port->socket);
- if (error_is_eagain(err))
+ if (EVUTIL_ERR_RW_RETRIABLE(err))
return;
log(EVDNS_LOG_WARN, "Error %s (%d) while writing response to port; dropping", evutil_socket_error_to_string(err), err);
}
(struct sockaddr*) &req->addr, req->addrlen);
if (r<0) {
int sock_err = evutil_socket_geterror(port->socket);
- if (! error_is_eagain(sock_err))
+ if (EVUTIL_ERR_RW_RETRIABLE(sock_err))
return -1;
if (port->pending_replies) {
const int r = send(server->socket, req->request, req->request_len, 0);
if (r < 0) {
int err = evutil_socket_geterror(server->socket);
- if (error_is_eagain(err)) return 1;
+ if (EVUTIL_ERR_RW_RETRIABLE(err))
+ return 1;
nameserver_failed(req->ns, evutil_socket_error_to_string(err));
return 2;
} else if (r != (int)req->request_len) {
#include "log.h"
#include "http-internal.h"
#include "mm-internal.h"
+#include "util-internal.h"
#ifdef WIN32
#define strcasecmp _stricmp
evutil_socket_t nfd;
if ((nfd = accept(fd, (struct sockaddr *)&ss, &addrlen)) == -1) {
- if (errno != EAGAIN && errno != EINTR)
+ int err = evutil_socket_geterror(fd);
+ if (! EVUTIL_ERR_ACCEPT_RETRIABLE(err))
event_warn("%s: bad accept", __func__);
return;
}
}
if (connect(fd, ai->ai_addr, ai->ai_addrlen) == -1) {
-#ifdef WIN32
- int tmp_error = WSAGetLastError();
- if (tmp_error != WSAEWOULDBLOCK && tmp_error != WSAEINVAL &&
- tmp_error != WSAEINPROGRESS) {
- goto out;
- }
-#else
- if (errno != EINPROGRESS) {
+ int err = evutil_socket_geterror(fd);
+ if (! EVUTIL_ERR_CONNECT_RETRIABLE(err))
goto out;
- }
-#endif
}
/* everything is fine */