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:
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));
|
||||
|
||||
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 //////////////////////////////
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) { \
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user