mirror of
https://github.com/coturn/coturn.git
synced 2025-10-29 14:01:01 +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:
parent
7038763627
commit
9fa8af6163
@ -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));
|
strncpy(ifr.ifr_name, (const char *)ifname, sizeof(ifr.ifr_name));
|
||||||
|
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
|
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");
|
perror("You must obtain superuser privileges to bind a socket to device");
|
||||||
else
|
else
|
||||||
perror("Cannot bind socket to device");
|
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 {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} while (err < 0 && errno == EINTR);
|
} while (err < 0 && socket_eintr());
|
||||||
|
|
||||||
if (out_errno)
|
if (out_errno)
|
||||||
*out_errno = errno;
|
*out_errno = socket_errno();
|
||||||
|
|
||||||
if (err < 0 && errno != EINPROGRESS)
|
if (err < 0 && !socket_einprogress())
|
||||||
perror("Connect");
|
perror("Connect");
|
||||||
|
|
||||||
return err;
|
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) {
|
if (addr->ss.sa_family == AF_INET) {
|
||||||
do {
|
do {
|
||||||
ret = bind(fd, (const struct sockaddr *)addr, sizeof(struct sockaddr_in));
|
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) {
|
} else if (addr->ss.sa_family == AF_INET6) {
|
||||||
const int off = 0;
|
const int off = 0;
|
||||||
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&off, sizeof(off));
|
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&off, sizeof(off));
|
||||||
do {
|
do {
|
||||||
ret = bind(fd, (const struct sockaddr *)addr, sizeof(struct sockaddr_in6));
|
ret = bind(fd, (const struct sockaddr *)addr, sizeof(struct sockaddr_in6));
|
||||||
} while (ret < 0 && errno == EINTR);
|
} while (ret < 0 && socket_eintr());
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (debug) {
|
if (debug) {
|
||||||
int err = errno;
|
int err = socket_errno();
|
||||||
perror("bind");
|
perror("bind");
|
||||||
char str[129];
|
char str[129];
|
||||||
addr_to_string(addr, (uint8_t *)str);
|
addr_to_string(addr, (uint8_t *)str);
|
||||||
@ -549,7 +549,7 @@ int set_socket_df(evutil_socket_t fd, int family, int value) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
int err = errno;
|
int err = socket_errno();
|
||||||
perror("set socket df:");
|
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,
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: set sockopt failed: fd=%d, err=%d, family=%d\n", __FUNCTION__, fd, err,
|
||||||
family);
|
family);
|
||||||
@ -707,61 +707,57 @@ int get_socket_mtu(evutil_socket_t fd, int family, int verbose) {
|
|||||||
//////////////////// socket error handle ////////////////////
|
//////////////////// socket error handle ////////////////////
|
||||||
|
|
||||||
int handle_socket_error(void) {
|
int handle_socket_error(void) {
|
||||||
switch (errno) {
|
if (socket_eintr()) {
|
||||||
case EINTR:
|
|
||||||
/* Interrupted system call.
|
/* Interrupted system call.
|
||||||
* Just ignore.
|
* Just ignore.
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
case ENOBUFS:
|
}
|
||||||
/* No buffers, temporary condition.
|
if (socket_enobufs()) {
|
||||||
* Just ignore and try later.
|
/* Interrupted system call.
|
||||||
|
* Just ignore.
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
case EAGAIN:
|
}
|
||||||
#if defined(EWOULDBLOCK)
|
if (socket_ewouldblock() || socket_eagain()) {
|
||||||
#if (EWOULDBLOCK != EAGAIN)
|
|
||||||
case EWOULDBLOCK:
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return 1;
|
return 1;
|
||||||
case EMSGSIZE:
|
}
|
||||||
return 1;
|
if (socket_ebadf()) {
|
||||||
case EBADF:
|
|
||||||
/* Invalid socket.
|
/* Invalid socket.
|
||||||
* Must close connection.
|
* Must close connection.
|
||||||
*/
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
#if defined(__unix__) || defined(unix) || defined(__APPLE__)
|
}
|
||||||
case EHOSTDOWN:
|
if (socket_ehostdown()) {
|
||||||
/* Host is down.
|
/* Host is down.
|
||||||
* Just ignore, might be an attacker
|
* Just ignore, might be an attacker
|
||||||
* sending fake ICMP messages.
|
* sending fake ICMP messages.
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
}
|
||||||
case ECONNRESET:
|
if (socket_econnreset() || socket_econnrefused()) {
|
||||||
case ECONNREFUSED:
|
|
||||||
/* Connection reset by peer. */
|
/* Connection reset by peer. */
|
||||||
return 0;
|
return 0;
|
||||||
case ENOMEM:
|
}
|
||||||
|
if (socket_enomem()) {
|
||||||
/* Out of memory.
|
/* Out of memory.
|
||||||
* Must close connection.
|
* Must close connection.
|
||||||
*/
|
*/
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Out of memory!\n");
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Out of memory!\n");
|
||||||
return 0;
|
return 0;
|
||||||
case EACCES:
|
}
|
||||||
|
if (socket_eacces()) {
|
||||||
/* Permission denied.
|
/* Permission denied.
|
||||||
* Just ignore, we might be blocked
|
* Just ignore, we might be blocked
|
||||||
* by some firewall policy. Try again
|
* by some firewall policy. Try again
|
||||||
* and hope for the best.
|
* and hope for the best.
|
||||||
*/
|
*/
|
||||||
return 1;
|
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 //////////////////////////////
|
//////////////////// Misc utils //////////////////////////////
|
||||||
|
|||||||
@ -81,7 +81,7 @@ static void redisLibeventReadEvent(int fd, short event, void *arg) {
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
do {
|
do {
|
||||||
len = recv(fd, buf, sizeof(buf), MSG_PEEK);
|
len = recv(fd, buf, sizeof(buf), MSG_PEEK);
|
||||||
} while ((len < 0) && (errno == EINTR));
|
} while ((len < 0) && socket_eintr());
|
||||||
if (len < 1) {
|
if (len < 1) {
|
||||||
e->invalid = 1;
|
e->invalid = 1;
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Redis connection broken: e=0x%lx\n", __FUNCTION__, ((unsigned long)e));
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Redis connection broken: e=0x%lx\n", __FUNCTION__, ((unsigned long)e));
|
||||||
|
|||||||
@ -138,7 +138,7 @@ static int stunclient_send(int sockfd, ioa_addr *local_addr, int *local_port, io
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = sendto(sockfd, req.getRawBuffer(), req.getSize(), 0, (struct sockaddr *)remote_addr, (socklen_t)slen);
|
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)
|
if (len < 0)
|
||||||
err(-1, NULL);
|
err(-1, NULL);
|
||||||
@ -177,9 +177,9 @@ static int stunclient_receive(int sockfd, ioa_addr *local_addr, ioa_addr *reflex
|
|||||||
ptr += len;
|
ptr += len;
|
||||||
break;
|
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");
|
printf("STUN receive timeout..\n");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
return ret;
|
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 = 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_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);
|
ret = stunclient_receive(udp_fd, local_addr, reflexive_addr, other_addr, rfc5780);
|
||||||
close(udp_fd);
|
socket_closesocket(udp_fd);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -298,8 +298,8 @@ static int run_stunclient_hairpinning(ioa_addr *local_addr, ioa_addr *remote_add
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
ret = stunclient_receive(udp_fd2, local_addr, reflexive_addr, other_addr, rfc5780);
|
ret = stunclient_receive(udp_fd2, local_addr, reflexive_addr, other_addr, rfc5780);
|
||||||
}
|
}
|
||||||
close(udp_fd);
|
socket_closesocket(udp_fd);
|
||||||
close(udp_fd2);
|
socket_closesocket(udp_fd2);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -375,7 +375,7 @@ static int stunclient_send(stun_buffer *buf, int sockfd, ioa_addr *local_addr, i
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = sendto(sockfd, buf->buf, buf->len, 0, (struct sockaddr *)remote_addr, (socklen_t)slen);
|
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)
|
if (len < 0)
|
||||||
err(-1, NULL);
|
err(-1, NULL);
|
||||||
@ -413,7 +413,7 @@ static int stunclient_receive(stun_buffer *buf, int sockfd, ioa_addr *local_addr
|
|||||||
ptr += len;
|
ptr += len;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (len < 0 && (errno == EINTR));
|
} while (len < 0 && socket_eintr());
|
||||||
|
|
||||||
if (recvd > 0)
|
if (recvd > 0)
|
||||||
len = recvd;
|
len = recvd;
|
||||||
@ -481,7 +481,7 @@ static int stunclient_receive(stun_buffer *buf, int sockfd, ioa_addr *local_addr
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
if (socket_eagain() || socket_ewouldblock()) {
|
||||||
printf("STUN receive timeout..\n");
|
printf("STUN receive timeout..\n");
|
||||||
} else {
|
} else {
|
||||||
printf("The response is not a STUN message\n");
|
printf("The response is not a STUN message\n");
|
||||||
|
|||||||
@ -48,14 +48,14 @@ static void udp_server_input_handler(evutil_socket_t fd, short what, void *arg)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = recvfrom(fd, buffer.buf, sizeof(buffer.buf) - 1, 0, (struct sockaddr *)&remote_addr, (socklen_t *)&slen);
|
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;
|
buffer.len = len;
|
||||||
|
|
||||||
if (len >= 0) {
|
if (len >= 0) {
|
||||||
do {
|
do {
|
||||||
len = sendto(fd, buffer.buf, buffer.len, 0, (const struct sockaddr *)&remote_addr, (socklen_t)slen);
|
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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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));
|
ioa_socket_handle ret = (ioa_socket *)malloc(sizeof(ioa_socket));
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Cannot allocate new socket structure\n", __FUNCTION__);
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Cannot allocate new socket structure\n", __FUNCTION__);
|
||||||
close(udp_fd);
|
socket_closesocket(udp_fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -663,7 +663,7 @@ start_udp_cycle:
|
|||||||
do {
|
do {
|
||||||
bsize = recvfrom(fd, ioa_network_buffer_data(elem), ioa_network_buffer_get_capacity_udp(), flags,
|
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);
|
(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();
|
conn_reset = is_connreset();
|
||||||
to_block = would_block();
|
to_block = would_block();
|
||||||
@ -681,7 +681,7 @@ start_udp_cycle:
|
|||||||
|
|
||||||
if (bsize < 0) {
|
if (bsize < 0) {
|
||||||
if (!to_block && !conn_reset) {
|
if (!to_block && !conn_reset) {
|
||||||
int ern = errno;
|
int ern = socket_errno();
|
||||||
perror(__FUNCTION__);
|
perror(__FUNCTION__);
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: recvfrom error %d\n", __FUNCTION__, ern);
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: recvfrom error %d\n", __FUNCTION__, ern);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -88,11 +88,11 @@ static void barrier_wait_func(const char *func, int line) {
|
|||||||
do {
|
do {
|
||||||
br = pthread_barrier_wait(&barrier);
|
br = pthread_barrier_wait(&barrier);
|
||||||
if ((br < 0) && (br != PTHREAD_BARRIER_SERIAL_THREAD)) {
|
if ((br < 0) && (br != PTHREAD_BARRIER_SERIAL_THREAD)) {
|
||||||
int err = errno;
|
int err = socket_errno();
|
||||||
perror("barrier wait");
|
perror("barrier wait");
|
||||||
printf("%s:%s:%d: %d\n", __FUNCTION__, func, line, err);
|
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
|
#else
|
||||||
UNUSED_ARG(func);
|
UNUSED_ARG(func);
|
||||||
UNUSED_ARG(line);
|
UNUSED_ARG(line);
|
||||||
|
|||||||
@ -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) {
|
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");
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int connect_err = 0;
|
int connect_err = 0;
|
||||||
if (addr_connect(udp_fd, &(s->remote_addr), &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");
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
set_raw_socket_ttl_options(udp_fd, s->local_addr.ss.sa_family);
|
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) {
|
if (!ret) {
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Cannot allocate new socket structure\n", __FUNCTION__);
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Cannot allocate new socket structure\n", __FUNCTION__);
|
||||||
if (udp_fd >= 0)
|
if (udp_fd >= 0)
|
||||||
close(udp_fd);
|
socket_closesocket(udp_fd);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1787,7 +1787,7 @@ int ssl_read(evutil_socket_t fd, SSL *ssl, ioa_network_buffer_handle nbh, int ve
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = SSL_read(ssl, new_buffer, buf_size);
|
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);
|
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;
|
ret = 0;
|
||||||
|
|
||||||
} else if (len < 0 && ((errno == ENOBUFS) || (errno == EAGAIN))) {
|
} else if (len < 0 && (socket_enobufs() || socket_eagain())) {
|
||||||
if (eve(verbose)) {
|
if (eve(verbose)) {
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: ENOBUFS/EAGAIN\n", __FUNCTION__);
|
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;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
case SSL_ERROR_SYSCALL: {
|
case SSL_ERROR_SYSCALL: {
|
||||||
int err = errno;
|
int err = socket_errno();
|
||||||
if (handle_socket_error()) {
|
if (handle_socket_error()) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -1922,7 +1922,7 @@ static int socket_readerr(evutil_socket_t fd, ioa_addr *orig_addr) {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = recvmsg(fd, &msg, flags);
|
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));
|
} 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)
|
#if defined(_MSC_VER) || !defined(CMSG_SPACE)
|
||||||
do {
|
do {
|
||||||
len = recvfrom(fd, buffer, buf_size, flags, (struct sockaddr *)orig_addr, (socklen_t *)&slen);
|
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)
|
if (len < 0 && errcode)
|
||||||
*errcode = (uint32_t)errno;
|
*errcode = (uint32_t)socket_errno();
|
||||||
#else
|
#else
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
@ -1980,7 +1980,7 @@ try_again:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = recvmsg(fd, &msg, flags);
|
len = recvmsg(fd, &msg, flags);
|
||||||
} while (len < 0 && (errno == EINTR));
|
} while (len < 0 && socket_eintr());
|
||||||
|
|
||||||
#if defined(MSG_ERRQUEUE)
|
#if defined(MSG_ERRQUEUE)
|
||||||
|
|
||||||
@ -1997,7 +1997,7 @@ try_again:
|
|||||||
// try again...
|
// try again...
|
||||||
do {
|
do {
|
||||||
len = recvmsg(fd, &msg, flags);
|
len = recvmsg(fd, &msg, flags);
|
||||||
} while (len < 0 && (errno == EINTR));
|
} while (len < 0 && socket_eintr());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2090,7 +2090,7 @@ static TURN_TLS_TYPE check_tentative_tls(ioa_socket_raw fd) {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = (int)recv(fd, s, sizeof(s), MSG_PEEK);
|
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 (len > 0 && ((size_t)len == sizeof(s))) {
|
||||||
if ((s[0] == 22) && (s[1] == 3) && (s[5] == 1) && (s[9] == 3)) {
|
if ((s[0] == 22) && (s[1] == 3) && (s[5] == 1) && (s[9] == 3)) {
|
||||||
@ -2932,13 +2932,13 @@ try_start:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
rc = SSL_write(ssl, buffer, len);
|
rc = SSL_write(ssl, buffer, len);
|
||||||
} while (rc < 0 && errno == EINTR);
|
} while (rc < 0 && socket_eintr());
|
||||||
|
|
||||||
if (eve(verbose)) {
|
if (eve(verbose)) {
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: after write: %d\n", __FUNCTION__, rc);
|
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)) {
|
if (eve(verbose)) {
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: ENOBUFS/EAGAIN\n", __FUNCTION__);
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: ENOBUFS/EAGAIN\n", __FUNCTION__);
|
||||||
}
|
}
|
||||||
@ -2972,7 +2972,7 @@ try_start:
|
|||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
return 0;
|
return 0;
|
||||||
case SSL_ERROR_SYSCALL: {
|
case SSL_ERROR_SYSCALL: {
|
||||||
int err = errno;
|
int err = socket_errno();
|
||||||
if (!handle_socket_error()) {
|
if (!handle_socket_error()) {
|
||||||
if (s->st == DTLS_SOCKET) {
|
if (s->st == DTLS_SOCKET) {
|
||||||
if (is_connreset()) {
|
if (is_connreset()) {
|
||||||
@ -3036,22 +3036,13 @@ static int send_ssl_backlog_buffers(ioa_socket_handle s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int is_connreset(void) {
|
int is_connreset(void) {
|
||||||
switch (errno) {
|
if (socket_econnreset() || socket_econnrefused()) {
|
||||||
case ECONNRESET:
|
|
||||||
case ECONNREFUSED:
|
|
||||||
return 1;
|
return 1;
|
||||||
default:;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int would_block(void) {
|
int would_block(void) { return socket_ewouldblock(); }
|
||||||
#if defined(EWOULDBLOCK)
|
|
||||||
if (errno == EWOULDBLOCK)
|
|
||||||
return 1;
|
|
||||||
#endif
|
|
||||||
return (errno == EAGAIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
int udp_send(ioa_socket_handle s, const ioa_addr *dest_addr, const char *buffer, int len) {
|
int udp_send(ioa_socket_handle s, const ioa_addr *dest_addr, const char *buffer, int len) {
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@ -3085,16 +3076,16 @@ int udp_send(ioa_socket_handle s, const ioa_addr *dest_addr, const char *buffer,
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
rc = sendto(fd, buffer, len, 0, (const struct sockaddr *)dest_addr, (socklen_t)slen);
|
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 {
|
} else {
|
||||||
do {
|
do {
|
||||||
rc = send(fd, buffer, len, 0);
|
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 (rc < 0) {
|
||||||
if ((errno == ENOBUFS) || (errno == EAGAIN)) {
|
if (socket_enobufs() || socket_eagain()) {
|
||||||
// Lost packet due to overload ... fine.
|
// Lost packet due to overload ... fine.
|
||||||
rc = len;
|
rc = len;
|
||||||
} else if (is_connreset()) {
|
} 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) {
|
if (ret < 0) {
|
||||||
s->tobeclosed = 1;
|
s->tobeclosed = 1;
|
||||||
#if defined(EADDRNOTAVAIL)
|
#if defined(EADDRNOTAVAIL)
|
||||||
int perr = errno;
|
int perr = socket_errno();
|
||||||
#endif
|
#endif
|
||||||
perror("udp send");
|
perror("udp send");
|
||||||
#if defined(EADDRNOTAVAIL)
|
#if defined(EADDRNOTAVAIL)
|
||||||
|
|||||||
@ -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) {
|
if (addr_bind(tls_listen_fd, &server->addr, 1, 0, SCTP_SOCKET) < 0) {
|
||||||
close(tls_listen_fd);
|
socket_closesocket(tls_listen_fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -836,7 +836,7 @@ static void close_cli_session(struct cli_session *cs) {
|
|||||||
BUFFEREVENT_FREE(cs->bev);
|
BUFFEREVENT_FREE(cs->bev);
|
||||||
|
|
||||||
if (cs->fd >= 0) {
|
if (cs->fd >= 0) {
|
||||||
close(cs->fd);
|
socket_closesocket(cs->fd);
|
||||||
cs->fd = -1;
|
cs->fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -150,7 +150,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = sendto(udp_fd, req.getRawBuffer(), req.getSize(), 0, (struct sockaddr *)&remote_addr, (socklen_t)slen);
|
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)
|
if (len < 0)
|
||||||
err(-1, NULL);
|
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) {
|
if (new_udp_fd >= 0) {
|
||||||
close(udp_fd);
|
socket_closesocket(udp_fd);
|
||||||
udp_fd = new_udp_fd;
|
udp_fd = new_udp_fd;
|
||||||
new_udp_fd = -1;
|
new_udp_fd = -1;
|
||||||
}
|
}
|
||||||
@ -184,7 +184,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
|
|||||||
ptr += len;
|
ptr += len;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (len < 0 && (errno == EINTR));
|
} while (len < 0 && socket_eintr());
|
||||||
|
|
||||||
if (recvd > 0)
|
if (recvd > 0)
|
||||||
len = recvd;
|
len = recvd;
|
||||||
@ -305,7 +305,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
len = sendto(udp_fd, buf.buf, buf.len, 0, (struct sockaddr *)&remote_addr, (socklen_t)slen);
|
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)
|
if (len < 0)
|
||||||
err(-1, NULL);
|
err(-1, NULL);
|
||||||
@ -338,7 +338,7 @@ static int run_stunclient(const char *rip, int rport, int *port, int *rfc5780, i
|
|||||||
ptr += len;
|
ptr += len;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (len < 0 && ((errno == EINTR) || (errno == EAGAIN)));
|
} while (len < 0 && (socket_eintr() || socket_eagain()));
|
||||||
|
|
||||||
if (recvd > 0)
|
if (recvd > 0)
|
||||||
len = recvd;
|
len = recvd;
|
||||||
|
|||||||
@ -130,8 +130,8 @@ static SSL *tls_connect(ioa_socket_raw fd, ioa_addr *remote_addr, int *try_again
|
|||||||
do {
|
do {
|
||||||
do {
|
do {
|
||||||
rc = SSL_connect(ssl);
|
rc = SSL_connect(ssl);
|
||||||
} while (rc < 0 && errno == EINTR);
|
} while (rc < 0 && socket_eintr());
|
||||||
int orig_errno = errno;
|
int orig_errno = socket_errno();
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: client session connected with cipher %s, method=%s\n", __FUNCTION__,
|
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));
|
SSL_get_cipher(ssl), turn_get_ssl_method(ssl, NULL));
|
||||||
@ -586,7 +586,7 @@ beg_allocate:
|
|||||||
SSL_free(ssl);
|
SSL_free(ssl);
|
||||||
fd = -1;
|
fd = -1;
|
||||||
} else if (fd >= 0) {
|
} else if (fd >= 0) {
|
||||||
close(fd);
|
socket_closesocket(fd);
|
||||||
fd = -1;
|
fd = -1;
|
||||||
ssl = NULL;
|
ssl = NULL;
|
||||||
}
|
}
|
||||||
@ -608,7 +608,7 @@ beg_allocate:
|
|||||||
SSL_shutdown(ssl);
|
SSL_shutdown(ssl);
|
||||||
SSL_free(ssl);
|
SSL_free(ssl);
|
||||||
} else if (fd >= 0) {
|
} else if (fd >= 0) {
|
||||||
close(fd);
|
socket_closesocket(fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -226,7 +226,7 @@ int send_buffer(app_ur_conn_info *clnet_info, stun_buffer *message, int data_con
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
do {
|
do {
|
||||||
len = SSL_write(ssl, buffer, (int)message->len);
|
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 (len == (int)message->len) {
|
||||||
if (clnet_verbose) {
|
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) {
|
while (left > 0) {
|
||||||
do {
|
do {
|
||||||
rc = send(fd, buffer, left, 0);
|
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) {
|
if (rc > 0) {
|
||||||
left -= (size_t)rc;
|
left -= (size_t)rc;
|
||||||
buffer += rc;
|
buffer += rc;
|
||||||
@ -335,7 +335,7 @@ static int wait_fd(int fd, unsigned int cycle) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
rc = select(fd + 1, &fds, NULL, NULL, &timeout);
|
rc = select(fd + 1, &fds, NULL, NULL, &timeout);
|
||||||
if ((rc < 0) && (errno == EINTR)) {
|
if ((rc < 0) && socket_eintr()) {
|
||||||
gettimeofday(&ctime, NULL);
|
gettimeofday(&ctime, NULL);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
@ -391,9 +391,7 @@ recv_again:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
rc = recv(fd, message->buf, sizeof(message->buf) - 1, 0);
|
rc = recv(fd, message->buf, sizeof(message->buf) - 1, 0);
|
||||||
if (rc < 0 && errno == EAGAIN && sync)
|
} while (rc < 0 && (socket_eintr() || (socket_eagain() && sync)));
|
||||||
errno = EINTR;
|
|
||||||
} while (rc < 0 && (errno == EINTR));
|
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -415,9 +413,9 @@ recv_again:
|
|||||||
rc = 0;
|
rc = 0;
|
||||||
do {
|
do {
|
||||||
rc = SSL_read(ssl, message->buf, sizeof(message->buf) - 1);
|
rc = SSL_read(ssl, message->buf, sizeof(message->buf) - 1);
|
||||||
if (rc < 0 && errno == EAGAIN && sync)
|
if (rc < 0 && socket_eagain() && sync)
|
||||||
continue;
|
continue;
|
||||||
} while (rc < 0 && (errno == EINTR));
|
} while (rc < 0 && socket_eintr());
|
||||||
|
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
|
|
||||||
@ -480,9 +478,9 @@ recv_again:
|
|||||||
rc = 0;
|
rc = 0;
|
||||||
do {
|
do {
|
||||||
rc = SSL_read(ssl, message->buf, sizeof(message->buf) - 1);
|
rc = SSL_read(ssl, message->buf, sizeof(message->buf) - 1);
|
||||||
if (rc < 0 && errno == EAGAIN && sync)
|
if (rc < 0 && socket_eagain() && sync)
|
||||||
continue;
|
continue;
|
||||||
} while (rc < 0 && (errno == EINTR));
|
} while (rc < 0 && socket_eintr());
|
||||||
|
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
|
|
||||||
@ -538,10 +536,7 @@ recv_again:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
rc = recv(fd, message->buf, sizeof(message->buf) - 1, MSG_PEEK);
|
rc = recv(fd, message->buf, sizeof(message->buf) - 1, MSG_PEEK);
|
||||||
if ((rc < 0) && (errno == EAGAIN) && sync) {
|
} while (rc < 0 && (socket_eintr() || (socket_eagain() && sync)));
|
||||||
errno = EINTR;
|
|
||||||
}
|
|
||||||
} while (rc < 0 && (errno == EINTR));
|
|
||||||
|
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
int mlen = rc;
|
int mlen = rc;
|
||||||
@ -566,9 +561,7 @@ recv_again:
|
|||||||
while (rsf < mlen && cycle++ < 128) {
|
while (rsf < mlen && cycle++ < 128) {
|
||||||
do {
|
do {
|
||||||
rcr = recv(fd, message->buf + rsf, (size_t)mlen - (size_t)rsf, 0);
|
rcr = recv(fd, message->buf + rsf, (size_t)mlen - (size_t)rsf, 0);
|
||||||
if (rcr < 0 && errno == EAGAIN && sync)
|
} while (rcr < 0 && (socket_eintr() || (socket_eagain() && sync)));
|
||||||
errno = EINTR;
|
|
||||||
} while (rcr < 0 && (errno == EINTR));
|
|
||||||
|
|
||||||
if (rcr > 0)
|
if (rcr > 0)
|
||||||
rsf += rcr;
|
rsf += rcr;
|
||||||
@ -1312,7 +1305,7 @@ static void timer_handler(evutil_socket_t fd, short event, void *arg) {
|
|||||||
if (done > 5 && (dos || random_disconnect)) {
|
if (done > 5 && (dos || random_disconnect)) {
|
||||||
for (i = 0; i < total_clients; ++i) {
|
for (i = 0; i < total_clients; ++i) {
|
||||||
if (elems[i]) {
|
if (elems[i]) {
|
||||||
close(elems[i]->pinfo.fd);
|
socket_closesocket(elems[i]->pinfo.fd);
|
||||||
elems[i]->pinfo.fd = -1;
|
elems[i]->pinfo.fd = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -107,6 +107,41 @@ static inline uint64_t _ioa_ntoh64(uint64_t v) {
|
|||||||
#define ioa_ntoh64 _ioa_ntoh64
|
#define ioa_ntoh64 _ioa_ntoh64
|
||||||
#define ioa_hton64 _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) \
|
#define BUFFEREVENT_FREE(be) \
|
||||||
do { \
|
do { \
|
||||||
if (be) { \
|
if (be) { \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user