summaryrefslogtreecommitdiff
path: root/drivers/unix/net_socket_posix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/unix/net_socket_posix.cpp')
-rw-r--r--drivers/unix/net_socket_posix.cpp68
1 files changed, 46 insertions, 22 deletions
diff --git a/drivers/unix/net_socket_posix.cpp b/drivers/unix/net_socket_posix.cpp
index 5f99a40c79..cab5513e0a 100644
--- a/drivers/unix/net_socket_posix.cpp
+++ b/drivers/unix/net_socket_posix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -189,7 +189,7 @@ NetSocketPosix::~NetSocketPosix() {
#pragma GCC diagnostic ignored "-Wlogical-op"
#endif
-NetSocketPosix::NetError NetSocketPosix::_get_socket_error() {
+NetSocketPosix::NetError NetSocketPosix::_get_socket_error() const {
#if defined(WINDOWS_ENABLED)
int err = WSAGetLastError();
@@ -199,7 +199,7 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() {
return ERR_NET_IN_PROGRESS;
if (err == WSAEWOULDBLOCK)
return ERR_NET_WOULD_BLOCK;
- ERR_PRINTS("Socket error: " + itos(err));
+ print_verbose("Socket error: " + itos(err));
return ERR_NET_OTHER;
#else
if (errno == EISCONN)
@@ -208,7 +208,7 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() {
return ERR_NET_IN_PROGRESS;
if (errno == EAGAIN || errno == EWOULDBLOCK)
return ERR_NET_WOULD_BLOCK;
- ERR_PRINTS("Socket error: " + itos(errno));
+ print_verbose("Socket error: " + itos(errno));
return ERR_NET_OTHER;
#endif
}
@@ -333,9 +333,10 @@ Error NetSocketPosix::open(Type p_sock_type, IP::Type &ip_type) {
set_ipv6_only_enabled(ip_type != IP::TYPE_ANY);
}
- if (protocol == IPPROTO_UDP && ip_type != IP::TYPE_IPV6) {
- // Enable broadcasting for UDP sockets if it's not IPv6 only (IPv6 has no broadcast option).
- set_broadcasting_enabled(true);
+ if (protocol == IPPROTO_UDP) {
+ // Make sure to disable broadcasting for UDP sockets.
+ // Depending on the OS, this option might or might not be enabled by default. Let's normalize it.
+ set_broadcasting_enabled(false);
}
_is_stream = p_sock_type == TYPE_TCP;
@@ -386,8 +387,10 @@ Error NetSocketPosix::bind(IP_Address p_addr, uint16_t p_port) {
size_t addr_size = _set_addr_storage(&addr, p_addr, p_port, _ip_type);
if (::bind(_sock, (struct sockaddr *)&addr, addr_size) != 0) {
+ _get_socket_error();
+ print_verbose("Failed to bind socket.");
close();
- ERR_FAIL_V(ERR_UNAVAILABLE);
+ return ERR_UNAVAILABLE;
}
return OK;
@@ -397,9 +400,10 @@ Error NetSocketPosix::listen(int p_max_pending) {
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
if (::listen(_sock, p_max_pending) != 0) {
-
+ _get_socket_error();
+ print_verbose("Failed to listen from socket.");
close();
- ERR_FAIL_V(FAILED);
+ return FAILED;
};
return OK;
@@ -426,7 +430,7 @@ Error NetSocketPosix::connect_to_host(IP_Address p_host, uint16_t p_port) {
case ERR_NET_IN_PROGRESS:
return ERR_BUSY;
default:
- ERR_PRINT("Connection to remote host failed!");
+ print_verbose("Connection to remote host failed!");
close();
return FAILED;
}
@@ -473,12 +477,18 @@ Error NetSocketPosix::poll(PollType p_type, int p_timeout) const {
}
int ret = select(1, rdp, wrp, &ex, tp);
- ERR_FAIL_COND_V(ret == SOCKET_ERROR, FAILED);
+ if (ret == SOCKET_ERROR) {
+ return FAILED;
+ }
if (ret == 0)
return ERR_BUSY;
- ERR_FAIL_COND_V(FD_ISSET(_sock, &ex), FAILED);
+ if (FD_ISSET(_sock, &ex)) {
+ _get_socket_error();
+ print_verbose("Exception when polling socket.");
+ return FAILED;
+ }
if (rdp && FD_ISSET(_sock, rdp))
ready = true;
@@ -505,8 +515,11 @@ Error NetSocketPosix::poll(PollType p_type, int p_timeout) const {
int ret = ::poll(&pfd, 1, p_timeout);
- ERR_FAIL_COND_V(ret < 0, FAILED);
- ERR_FAIL_COND_V(pfd.revents & POLLERR, FAILED);
+ if (ret < 0 || pfd.revents & POLLERR) {
+ _get_socket_error();
+ print_verbose("Error when polling socket.");
+ return FAILED;
+ }
if (ret == 0)
return ERR_BUSY;
@@ -603,15 +616,18 @@ Error NetSocketPosix::sendto(const uint8_t *p_buffer, int p_len, int &r_sent, IP
return OK;
}
-void NetSocketPosix::set_broadcasting_enabled(bool p_enabled) {
- ERR_FAIL_COND(!is_open());
+Error NetSocketPosix::set_broadcasting_enabled(bool p_enabled) {
+ ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
// IPv6 has no broadcast support.
- ERR_FAIL_COND(_ip_type == IP::TYPE_IPV6);
+ if (_ip_type == IP::TYPE_IPV6)
+ return ERR_UNAVAILABLE;
int par = p_enabled ? 1 : 0;
if (setsockopt(_sock, SOL_SOCKET, SO_BROADCAST, SOCK_CBUF(&par), sizeof(int)) != 0) {
WARN_PRINT("Unable to change broadcast setting");
+ return FAILED;
}
+ return OK;
}
void NetSocketPosix::set_blocking_enabled(bool p_enabled) {
@@ -681,11 +697,15 @@ bool NetSocketPosix::is_open() const {
int NetSocketPosix::get_available_bytes() const {
- ERR_FAIL_COND_V(_sock == SOCK_EMPTY, -1);
+ ERR_FAIL_COND_V(!is_open(), -1);
unsigned long len;
int ret = SOCK_IOCTL(_sock, FIONREAD, &len);
- ERR_FAIL_COND_V(ret == -1, 0);
+ if (ret == -1) {
+ _get_socket_error();
+ print_verbose("Error when checking available bytes on socket.");
+ return -1;
+ }
return len;
}
@@ -697,7 +717,11 @@ Ref<NetSocket> NetSocketPosix::accept(IP_Address &r_ip, uint16_t &r_port) {
struct sockaddr_storage their_addr;
socklen_t size = sizeof(their_addr);
SOCKET_TYPE fd = ::accept(_sock, (struct sockaddr *)&their_addr, &size);
- ERR_FAIL_COND_V(fd == SOCK_EMPTY, out);
+ if (fd == SOCK_EMPTY) {
+ _get_socket_error();
+ print_verbose("Error when accepting socket connection.");
+ return out;
+ }
_set_ip_port(&their_addr, r_ip, r_port);