1
0
mirror of https://github.com/coturn/coturn.git synced 2025-10-28 13:31:16 +01:00

Use inline functions for errno checks (#1123)

Since winsock do not use errno, and have different error codes, this is
needed to be windows compatible

This pull request is a split of PR #1061
This commit is contained in:
Emil Ljungdahl 2022-12-22 20:10:34 +01:00 committed by GitHub
parent 7038763627
commit 9fa8af6163
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 124 additions and 109 deletions

View File

@ -239,7 +239,7 @@ int sock_bind_to_device(evutil_socket_t fd, const unsigned char *ifname) {
strncpy(ifr.ifr_name, (const char *)ifname, sizeof(ifr.ifr_name));
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
if (errno == EPERM)
if (socket_eperm())
perror("You must obtain superuser privileges to bind a socket to device");
else
perror("Cannot bind socket to device");
@ -268,12 +268,12 @@ int addr_connect(evutil_socket_t fd, const ioa_addr *addr, int *out_errno) {
} else {
return -1;
}
} while (err < 0 && errno == EINTR);
} while (err < 0 && socket_eintr());
if (out_errno)
*out_errno = errno;
*out_errno = socket_errno();
if (err < 0 && errno != EINPROGRESS)
if (err < 0 && !socket_einprogress())
perror("Connect");
return err;
@ -294,19 +294,19 @@ int addr_bind(evutil_socket_t fd, const ioa_addr *addr, int reusable, int debug,
if (addr->ss.sa_family == AF_INET) {
do {
ret = bind(fd, (const struct sockaddr *)addr, sizeof(struct sockaddr_in));
} while (ret < 0 && errno == EINTR);
} while (ret < 0 && socket_eintr());
} else if (addr->ss.sa_family == AF_INET6) {
const int off = 0;
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&off, sizeof(off));
do {
ret = bind(fd, (const struct sockaddr *)addr, sizeof(struct sockaddr_in6));
} while (ret < 0 && errno == EINTR);
} while (ret < 0 && socket_eintr());
} else {
return -1;
}
if (ret < 0) {
if (debug) {
int err = errno;
int err = socket_errno();
perror("bind");
char str[129];
addr_to_string(addr, (uint8_t *)str);
@ -549,7 +549,7 @@ int set_socket_df(evutil_socket_t fd, int family, int value) {
#endif
}
if (ret < 0) {
int err = errno;
int err = socket_errno();
perror("set socket df:");
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: set sockopt failed: fd=%d, err=%d, family=%d\n", __FUNCTION__, fd, err,
family);
@ -707,61 +707,57 @@ int get_socket_mtu(evutil_socket_t fd, int family, int verbose) {
//////////////////// socket error handle ////////////////////
int handle_socket_error(void) {
switch (errno) {
case EINTR:
if (socket_eintr()) {
/* Interrupted system call.
* Just ignore.
*/
return 1;
case ENOBUFS:
/* No buffers, temporary condition.
* Just ignore and try later.
}
if (socket_enobufs()) {
/* Interrupted system call.
* Just ignore.
*/
return 1;
case EAGAIN:
#if defined(EWOULDBLOCK)
#if (EWOULDBLOCK != EAGAIN)
case EWOULDBLOCK:
#endif
#endif
}
if (socket_ewouldblock() || socket_eagain()) {
return 1;
case EMSGSIZE:
return 1;
case EBADF:
}
if (socket_ebadf()) {
/* Invalid socket.
* Must close connection.
*/
return 0;
#if defined(__unix__) || defined(unix) || defined(__APPLE__)
case EHOSTDOWN:
}
if (socket_ehostdown()) {
/* Host is down.
* Just ignore, might be an attacker
* sending fake ICMP messages.
*/
return 1;
#endif
case ECONNRESET:
case ECONNREFUSED:
}
if (socket_econnreset() || socket_econnrefused()) {
/* Connection reset by peer. */
return 0;
case ENOMEM:
}
if (socket_enomem()) {
/* Out of memory.
* Must close connection.
*/
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Out of memory!\n");
return 0;
case EACCES:
}
if (socket_eacces()) {
/* Permission denied.
* Just ignore, we might be blocked
* by some firewall policy. Try again
* and hope for the best.
*/
return 1;
default:
/* Something unexpected happened */
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Unexpected error! (errno = %d)\n", errno);
return 0;
}
/* Something unexpected happened */
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Unexpected error! (errno = %d)\n", socket_errno());
return 0;
}
//////////////////// Misc utils //////////////////////////////

View File

@ -81,7 +81,7 @@ static void redisLibeventReadEvent(int fd, short event, void *arg) {
int len = 0;
do {
len = recv(fd, buf, sizeof(buf), MSG_PEEK);
} while ((len < 0) && (errno == EINTR));
} while ((len < 0) && socket_eintr());
if (len < 1) {
e->invalid = 1;
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Redis connection broken: e=0x%lx\n", __FUNCTION__, ((unsigned long)e));

View File

@ -138,7 +138,7 @@ static int stunclient_send(int sockfd, ioa_addr *local_addr, int *local_port, io
do {
len = sendto(sockfd, req.getRawBuffer(), req.getSize(), 0, (struct sockaddr *)remote_addr, (socklen_t)slen);
} while (len < 0 && ((errno == EINTR) || (errno == ENOBUFS) || (errno == EAGAIN)));
} while (len < 0 && (socket_eintr() || socket_enobufs() || socket_eagain()));
if (len < 0)
err(-1, NULL);
@ -177,9 +177,9 @@ static int stunclient_receive(int sockfd, ioa_addr *local_addr, ioa_addr *reflex
ptr += len;
break;
}
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
if (socket_eagain() || socket_ewouldblock()) {
printf("STUN receive timeout..\n");
ret = 1;
return ret;
@ -272,7 +272,7 @@ static int run_stunclient(ioa_addr *local_addr, ioa_addr *remote_addr, ioa_addr
ret = init_socket(&udp_fd, local_addr, *local_port, remote_addr);
ret = stunclient_send(udp_fd, local_addr, local_port, remote_addr, change_ip, change_port, padding, -1);
ret = stunclient_receive(udp_fd, local_addr, reflexive_addr, other_addr, rfc5780);
close(udp_fd);
socket_closesocket(udp_fd);
return ret;
}
@ -298,8 +298,8 @@ static int run_stunclient_hairpinning(ioa_addr *local_addr, ioa_addr *remote_add
if (ret) {
ret = stunclient_receive(udp_fd2, local_addr, reflexive_addr, other_addr, rfc5780);
}
close(udp_fd);
close(udp_fd2);
socket_closesocket(udp_fd);
socket_closesocket(udp_fd2);
return ret;
}
@ -375,7 +375,7 @@ static int stunclient_send(stun_buffer *buf, int sockfd, ioa_addr *local_addr, i
do {
len = sendto(sockfd, buf->buf, buf->len, 0, (struct sockaddr *)remote_addr, (socklen_t)slen);
} while (len < 0 && ((errno == EINTR) || (errno == ENOBUFS) || (errno == EAGAIN)));
} while (len < 0 && (socket_eintr() || socket_enobufs() || socket_eagain()));
if (len < 0)
err(-1, NULL);
@ -413,7 +413,7 @@ static int stunclient_receive(stun_buffer *buf, int sockfd, ioa_addr *local_addr
ptr += len;
break;
}
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
if (recvd > 0)
len = recvd;
@ -481,7 +481,7 @@ static int stunclient_receive(stun_buffer *buf, int sockfd, ioa_addr *local_addr
ret = 1;
}
} else {
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
if (socket_eagain() || socket_ewouldblock()) {
printf("STUN receive timeout..\n");
} else {
printf("The response is not a STUN message\n");

View File

@ -48,14 +48,14 @@ static void udp_server_input_handler(evutil_socket_t fd, short what, void *arg)
do {
len = recvfrom(fd, buffer.buf, sizeof(buffer.buf) - 1, 0, (struct sockaddr *)&remote_addr, (socklen_t *)&slen);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
buffer.len = len;
if (len >= 0) {
do {
len = sendto(fd, buffer.buf, buffer.len, 0, (const struct sockaddr *)&remote_addr, (socklen_t)slen);
} while (len < 0 && ((errno == EINTR) || (errno == ENOBUFS) || (errno == EAGAIN)));
} while (len < 0 && (socket_eintr() || socket_enobufs() || socket_eagain()));
}
}

View File

@ -479,7 +479,7 @@ static int create_new_connected_udp_socket(dtls_listener_relay_server_type *serv
ioa_socket_handle ret = (ioa_socket *)malloc(sizeof(ioa_socket));
if (!ret) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Cannot allocate new socket structure\n", __FUNCTION__);
close(udp_fd);
socket_closesocket(udp_fd);
return -1;
}
@ -663,7 +663,7 @@ start_udp_cycle:
do {
bsize = recvfrom(fd, ioa_network_buffer_data(elem), ioa_network_buffer_get_capacity_udp(), flags,
(struct sockaddr *)&(server->sm.m.sm.nd.src_addr), (socklen_t *)&slen);
} while (bsize < 0 && (errno == EINTR));
} while (bsize < 0 && socket_eintr());
conn_reset = is_connreset();
to_block = would_block();
@ -681,7 +681,7 @@ start_udp_cycle:
if (bsize < 0) {
if (!to_block && !conn_reset) {
int ern = errno;
int ern = socket_errno();
perror(__FUNCTION__);
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: recvfrom error %d\n", __FUNCTION__, ern);
}

View File

@ -88,11 +88,11 @@ static void barrier_wait_func(const char *func, int line) {
do {
br = pthread_barrier_wait(&barrier);
if ((br < 0) && (br != PTHREAD_BARRIER_SERIAL_THREAD)) {
int err = errno;
int err = socket_errno();
perror("barrier wait");
printf("%s:%s:%d: %d\n", __FUNCTION__, func, line, err);
}
} while (((br < 0) && (br != PTHREAD_BARRIER_SERIAL_THREAD)) && (errno == EINTR));
} while (((br < 0) && (br != PTHREAD_BARRIER_SERIAL_THREAD)) && socket_eintr());
#else
UNUSED_ARG(func);
UNUSED_ARG(line);

View File

@ -1555,14 +1555,14 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s) {
if (addr_bind(udp_fd, &(s->local_addr), 1, 1, UDP_SOCKET) < 0) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Cannot bind new detached udp server socket to local addr\n");
close(udp_fd);
socket_closesocket(udp_fd);
return ret;
}
int connect_err = 0;
if (addr_connect(udp_fd, &(s->remote_addr), &connect_err) < 0) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Cannot connect new detached udp server socket to remote addr\n");
close(udp_fd);
socket_closesocket(udp_fd);
return ret;
}
set_raw_socket_ttl_options(udp_fd, s->local_addr.ss.sa_family);
@ -1580,7 +1580,7 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s) {
if (!ret) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Cannot allocate new socket structure\n", __FUNCTION__);
if (udp_fd >= 0)
close(udp_fd);
socket_closesocket(udp_fd);
return ret;
}
@ -1787,7 +1787,7 @@ int ssl_read(evutil_socket_t fd, SSL *ssl, ioa_network_buffer_handle nbh, int ve
do {
len = SSL_read(ssl, new_buffer, buf_size);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
int if2 = SSL_is_init_finished(ssl);
@ -1814,7 +1814,7 @@ int ssl_read(evutil_socket_t fd, SSL *ssl, ioa_network_buffer_handle nbh, int ve
ret = 0;
} else if (len < 0 && ((errno == ENOBUFS) || (errno == EAGAIN))) {
} else if (len < 0 && (socket_enobufs() || socket_eagain())) {
if (eve(verbose)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: ENOBUFS/EAGAIN\n", __FUNCTION__);
}
@ -1843,7 +1843,7 @@ int ssl_read(evutil_socket_t fd, SSL *ssl, ioa_network_buffer_handle nbh, int ve
ret = 0;
break;
case SSL_ERROR_SYSCALL: {
int err = errno;
int err = socket_errno();
if (handle_socket_error()) {
ret = 0;
} else {
@ -1922,7 +1922,7 @@ static int socket_readerr(evutil_socket_t fd, ioa_addr *orig_addr) {
do {
len = recvmsg(fd, &msg, flags);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
} while ((len > 0) && (try_cycle++ < MAX_ERRORS_IN_UDP_BATCH));
@ -1952,9 +1952,9 @@ int udp_recvfrom(evutil_socket_t fd, ioa_addr *orig_addr, const ioa_addr *like_a
#if defined(_MSC_VER) || !defined(CMSG_SPACE)
do {
len = recvfrom(fd, buffer, buf_size, flags, (struct sockaddr *)orig_addr, (socklen_t *)&slen);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
if (len < 0 && errcode)
*errcode = (uint32_t)errno;
*errcode = (uint32_t)socket_errno();
#else
struct msghdr msg;
struct iovec iov;
@ -1980,7 +1980,7 @@ try_again:
do {
len = recvmsg(fd, &msg, flags);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
#if defined(MSG_ERRQUEUE)
@ -1997,7 +1997,7 @@ try_again:
// try again...
do {
len = recvmsg(fd, &msg, flags);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
}
#endif
@ -2090,7 +2090,7 @@ static TURN_TLS_TYPE check_tentative_tls(ioa_socket_raw fd) {
do {
len = (int)recv(fd, s, sizeof(s), MSG_PEEK);
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
if (len > 0 && ((size_t)len == sizeof(s))) {
if ((s[0] == 22) && (s[1] == 3) && (s[5] == 1) && (s[9] == 3)) {
@ -2932,13 +2932,13 @@ try_start:
do {
rc = SSL_write(ssl, buffer, len);
} while (rc < 0 && errno == EINTR);
} while (rc < 0 && socket_eintr());
if (eve(verbose)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: after write: %d\n", __FUNCTION__, rc);
}
if (rc < 0 && ((errno == ENOBUFS) || (errno == EAGAIN))) {
if (rc < 0 && (socket_enobufs() || socket_eagain())) {
if (eve(verbose)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: ENOBUFS/EAGAIN\n", __FUNCTION__);
}
@ -2972,7 +2972,7 @@ try_start:
case SSL_ERROR_WANT_READ:
return 0;
case SSL_ERROR_SYSCALL: {
int err = errno;
int err = socket_errno();
if (!handle_socket_error()) {
if (s->st == DTLS_SOCKET) {
if (is_connreset()) {
@ -3036,22 +3036,13 @@ static int send_ssl_backlog_buffers(ioa_socket_handle s) {
}
int is_connreset(void) {
switch (errno) {
case ECONNRESET:
case ECONNREFUSED:
if (socket_econnreset() || socket_econnrefused()) {
return 1;
default:;
}
return 0;
}
int would_block(void) {
#if defined(EWOULDBLOCK)
if (errno == EWOULDBLOCK)
return 1;
#endif
return (errno == EAGAIN);
}
int would_block(void) { return socket_ewouldblock(); }
int udp_send(ioa_socket_handle s, const ioa_addr *dest_addr, const char *buffer, int len) {
int rc = 0;
@ -3085,16 +3076,16 @@ int udp_send(ioa_socket_handle s, const ioa_addr *dest_addr, const char *buffer,
do {
rc = sendto(fd, buffer, len, 0, (const struct sockaddr *)dest_addr, (socklen_t)slen);
} while (((rc < 0) && (errno == EINTR)) || ((rc < 0) && is_connreset() && (++cycle < TRIAL_EFFORTS_TO_SEND)));
} while (((rc < 0) && socket_eintr()) || ((rc < 0) && is_connreset() && (++cycle < TRIAL_EFFORTS_TO_SEND)));
} else {
do {
rc = send(fd, buffer, len, 0);
} while (((rc < 0) && (errno == EINTR)) || ((rc < 0) && is_connreset() && (++cycle < TRIAL_EFFORTS_TO_SEND)));
} while (((rc < 0) && socket_eintr()) || ((rc < 0) && is_connreset() && (++cycle < TRIAL_EFFORTS_TO_SEND)));
}
if (rc < 0) {
if ((errno == ENOBUFS) || (errno == EAGAIN)) {
if (socket_enobufs() || socket_eagain()) {
// Lost packet due to overload ... fine.
rc = len;
} else if (is_connreset()) {
@ -3197,7 +3188,7 @@ int send_data_from_ioa_socket_nbh(ioa_socket_handle s, ioa_addr *dest_addr, ioa_
if (ret < 0) {
s->tobeclosed = 1;
#if defined(EADDRNOTAVAIL)
int perr = errno;
int perr = socket_errno();
#endif
perror("udp send");
#if defined(EADDRNOTAVAIL)

View File

@ -264,7 +264,7 @@ static int sctp_create_server_listener(tls_listener_relay_server_type *server) {
}
if (addr_bind(tls_listen_fd, &server->addr, 1, 0, SCTP_SOCKET) < 0) {
close(tls_listen_fd);
socket_closesocket(tls_listen_fd);
return -1;
}

View File

@ -836,7 +836,7 @@ static void close_cli_session(struct cli_session *cs) {
BUFFEREVENT_FREE(cs->bev);
if (cs->fd >= 0) {
close(cs->fd);
socket_closesocket(cs->fd);
cs->fd = -1;
}

View File

@ -150,7 +150,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
do {
len = sendto(udp_fd, req.getRawBuffer(), req.getSize(), 0, (struct sockaddr *)&remote_addr, (socklen_t)slen);
} while (len < 0 && ((errno == EINTR) || (errno == ENOBUFS) || (errno == EAGAIN)));
} while (len < 0 && (socket_eintr() || socket_enobufs() || socket_eagain()));
if (len < 0)
err(-1, NULL);
@ -164,7 +164,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
{
if (new_udp_fd >= 0) {
close(udp_fd);
socket_closesocket(udp_fd);
udp_fd = new_udp_fd;
new_udp_fd = -1;
}
@ -184,7 +184,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
ptr += len;
break;
}
} while (len < 0 && (errno == EINTR));
} while (len < 0 && socket_eintr());
if (recvd > 0)
len = recvd;
@ -305,7 +305,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
do {
len = sendto(udp_fd, buf.buf, buf.len, 0, (struct sockaddr *)&remote_addr, (socklen_t)slen);
} while (len < 0 && ((errno == EINTR) || (errno == ENOBUFS) || (errno == EAGAIN)));
} while (len < 0 && (socket_eintr() || socket_enobufs() || socket_eagain()));
if (len < 0)
err(-1, NULL);
@ -338,7 +338,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
ptr += len;
break;
}
} while (len < 0 && ((errno == EINTR) || (errno == EAGAIN)));
} while (len < 0 && (socket_eintr() || socket_eagain()));
if (recvd > 0)
len = recvd;

View File

@ -130,8 +130,8 @@ static SSL *tls_connect(ioa_socket_raw fd, ioa_addr *remote_addr, int *try_again
do {
do {
rc = SSL_connect(ssl);
} while (rc < 0 && errno == EINTR);
int orig_errno = errno;
} while (rc < 0 && socket_eintr());
int orig_errno = socket_errno();
if (rc > 0) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: client session connected with cipher %s, method=%s\n", __FUNCTION__,
SSL_get_cipher(ssl), turn_get_ssl_method(ssl, NULL));
@ -586,7 +586,7 @@ beg_allocate:
SSL_free(ssl);
fd = -1;
} else if (fd >= 0) {
close(fd);
socket_closesocket(fd);
fd = -1;
ssl = NULL;
}
@ -608,7 +608,7 @@ beg_allocate:
SSL_shutdown(ssl);
SSL_free(ssl);
} else if (fd >= 0) {
close(fd);
socket_closesocket(fd);
}
}

View File

@ -226,7 +226,7 @@ int send_buffer(app_ur_conn_info *clnet_info, stun_buffer *message, int data_con
int len = 0;
do {
len = SSL_write(ssl, buffer, (int)message->len);
} while (len < 0 && ((errno == EINTR) || (errno == ENOBUFS)));
} while (len < 0 && (socket_eintr() || socket_enobufs()));
if (len == (int)message->len) {
if (clnet_verbose) {
@ -276,7 +276,7 @@ int send_buffer(app_ur_conn_info *clnet_info, stun_buffer *message, int data_con
while (left > 0) {
do {
rc = send(fd, buffer, left, 0);
} while (rc <= 0 && ((errno == EINTR) || (errno == ENOBUFS) || (errno == EAGAIN)));
} while (rc <= 0 && (socket_eintr() || socket_enobufs() || socket_eagain()));
if (rc > 0) {
left -= (size_t)rc;
buffer += rc;
@ -335,7 +335,7 @@ static int wait_fd(int fd, unsigned int cycle) {
}
}
rc = select(fd + 1, &fds, NULL, NULL, &timeout);
if ((rc < 0) && (errno == EINTR)) {
if ((rc < 0) && socket_eintr()) {
gettimeofday(&ctime, NULL);
} else {
break;
@ -391,9 +391,7 @@ recv_again:
do {
rc = recv(fd, message->buf, sizeof(message->buf) - 1, 0);
if (rc < 0 && errno == EAGAIN && sync)
errno = EINTR;
} while (rc < 0 && (errno == EINTR));
} while (rc < 0 && (socket_eintr() || (socket_eagain() && sync)));
if (rc < 0) {
return -1;
@ -415,9 +413,9 @@ recv_again:
rc = 0;
do {
rc = SSL_read(ssl, message->buf, sizeof(message->buf) - 1);
if (rc < 0 && errno == EAGAIN && sync)
if (rc < 0 && socket_eagain() && sync)
continue;
} while (rc < 0 && (errno == EINTR));
} while (rc < 0 && socket_eintr());
if (rc > 0) {
@ -480,9 +478,9 @@ recv_again:
rc = 0;
do {
rc = SSL_read(ssl, message->buf, sizeof(message->buf) - 1);
if (rc < 0 && errno == EAGAIN && sync)
if (rc < 0 && socket_eagain() && sync)
continue;
} while (rc < 0 && (errno == EINTR));
} while (rc < 0 && socket_eintr());
if (rc > 0) {
@ -538,10 +536,7 @@ recv_again:
do {
rc = recv(fd, message->buf, sizeof(message->buf) - 1, MSG_PEEK);
if ((rc < 0) && (errno == EAGAIN) && sync) {
errno = EINTR;
}
} while (rc < 0 && (errno == EINTR));
} while (rc < 0 && (socket_eintr() || (socket_eagain() && sync)));
if (rc > 0) {
int mlen = rc;
@ -566,9 +561,7 @@ recv_again:
while (rsf < mlen && cycle++ < 128) {
do {
rcr = recv(fd, message->buf + rsf, (size_t)mlen - (size_t)rsf, 0);
if (rcr < 0 && errno == EAGAIN && sync)
errno = EINTR;
} while (rcr < 0 && (errno == EINTR));
} while (rcr < 0 && (socket_eintr() || (socket_eagain() && sync)));
if (rcr > 0)
rsf += rcr;
@ -1312,7 +1305,7 @@ static void timer_handler(evutil_socket_t fd, short event, void *arg) {
if (done > 5 && (dos || random_disconnect)) {
for (i = 0; i < total_clients; ++i) {
if (elems[i]) {
close(elems[i]->pinfo.fd);
socket_closesocket(elems[i]->pinfo.fd);
elems[i]->pinfo.fd = -1;
}
}

View File

@ -107,6 +107,41 @@ static inline uint64_t _ioa_ntoh64(uint64_t v) {
#define ioa_ntoh64 _ioa_ntoh64
#define ioa_hton64 _ioa_ntoh64
#if defined(WINDOWS)
static inline int socket_errno(void) { return WSAGetLastError(); }
static inline int socket_enomem(void) { return socket_errno() == WSA_NOT_ENOUGH_MEMORY; }
static inline int socket_eintr(void) { return socket_errno() == WSAEINTR; }
static inline int socket_ebadf(void) { return socket_errno() == WSAEBADF; }
static inline int socket_eacces(void) { return socket_errno() == WSAEACCES; }
static inline int socket_enobufs(void) { return socket_errno() == WSAENOBUFS; }
static inline int socket_eagain(void) { return socket_errno() == WSATRY_AGAIN; }
static inline int socket_ewouldblock(void) { return socket_errno() == WSAEWOULDBLOCK; }
static inline int socket_einprogress(void) { return socket_errno() == WSAEINPROGRESS; }
static inline int socket_econnreset(void) { return socket_errno() == WSAECONNRESET; }
static inline int socket_econnrefused(void) { return socket_errno() == WSAECONNREFUSED; }
static inline int socket_ehostdown(void) { return socket_errno() == WSAEHOSTDOWN; }
static inline int socket_emsgsize(void) { return socket_errno() == WSAEMSGSIZE; }
#else
static inline int socket_errno(void) { return errno; }
static inline int socket_eperm(void) { return socket_errno() == EPERM; }
static inline int socket_enomem(void) { return socket_errno() == ENOMEM; }
static inline int socket_eintr(void) { return socket_errno() == EINTR; }
static inline int socket_ebadf(void) { return socket_errno() == EBADF; }
static inline int socket_eacces(void) { return socket_errno() == EACCES; }
static inline int socket_enobufs(void) { return socket_errno() == ENOBUFS; }
static inline int socket_eagain(void) { return socket_errno() == EAGAIN; }
#if defined(EWOULDBLOCK)
static inline int socket_ewouldblock(void) { return socket_errno() == EWOULDBLOCK; }
#else
static inline int socket_ewouldblock(void) { return socket_errno() == EAGAIN; }
#endif
static inline int socket_einprogress(void) { return socket_errno() == EINPROGRESS; }
static inline int socket_econnreset(void) { return socket_errno() == ECONNRESET; }
static inline int socket_econnrefused(void) { return socket_errno() == ECONNREFUSED; }
static inline int socket_ehostdown(void) { return socket_errno() == EHOSTDOWN; }
static inline int socket_emsgsize(void) { return socket_errno() == EMSGSIZE; }
#endif
#define BUFFEREVENT_FREE(be) \
do { \
if (be) { \