Commit 5cc4fcee authored by Joseph Noir's avatar Joseph Noir

Fix missing includes and function to close sockets

parent 80d1dd81
......@@ -34,14 +34,13 @@ namespace network {
using getsockopt_ptr = char*;
using socket_send_ptr = const char*;
using socket_recv_ptr = char*;
//using socket_size_type = int;
using socket_size_type = int;
#else
using setsockopt_ptr = const void*;
using getsockopt_ptr = void*;
using socket_send_ptr = const void*;
using socket_recv_ptr = void*;
using socket_size_type = unsigned;
void closesocket(int fd);
#endif
using signed_size_type = std::make_signed<size_t>::type;
......@@ -69,6 +68,9 @@ extern const int no_sigpipe_io_flag;
/// Returns the last socket error as an integer.
int last_socket_error();
/// Close socket `fd`.
void close_socket(native_socket fd);
/// Returns true if `errcode` indicates that an operation would
/// block or return nothing at the moment and can be tried again
/// at a later point.
......
......@@ -628,9 +628,9 @@ void default_multiplexer::resume(intrusive_ptr<resumable> ptr) {
default_multiplexer::~default_multiplexer() {
if (epollfd_ != invalid_native_socket)
closesocket(epollfd_);
close_socket(epollfd_);
// close write handle first
closesocket(pipe_.second);
close_socket(pipe_.second);
// flush pipe before closing it
nonblocking(pipe_.first, true);
auto ptr = pipe_reader_.try_read_next();
......@@ -639,7 +639,7 @@ default_multiplexer::~default_multiplexer() {
ptr = pipe_reader_.try_read_next();
}
// do cleanup for pipe reader manually, since WSACleanup needs to happen last
closesocket(pipe_reader_.fd());
close_socket(pipe_reader_.fd());
pipe_reader_.init(invalid_native_socket);
# ifdef CAF_WINDOWS
WSACleanup();
......
......@@ -43,7 +43,7 @@ event_handler::event_handler(default_multiplexer& dm, native_socket sockfd)
event_handler::~event_handler() {
if (fd_ != invalid_native_socket) {
CAF_LOG_DEBUG("close socket" << CAF_ARG(fd_));
closesocket(fd_);
close_socket(fd_);
}
}
......
......@@ -85,23 +85,13 @@ namespace io {
namespace network {
#ifdef CAF_WINDOWS
int last_socket_error() { return WSAGetLastError(); }
bool would_block_or_temporarily_unavailable(int errcode) {
return errcode == WSAEWOULDBLOCK || errcode == WSATRY_AGAIN;
}
const int ec_out_of_memory = WSAENOBUFS;
const int ec_interrupted_syscall = WSAEINTR;
#else
void closesocket(int fd) { close(fd); }
int last_socket_error() { return errno; }
bool would_block_or_temporarily_unavailable(int errcode) {
return errcode == EAGAIN || errcode == EWOULDBLOCK;
}
const int ec_out_of_memory = ENOMEM;
const int ec_interrupted_syscall = EINTR;
#endif
// platform-dependent SIGPIPE setup
#if defined(CAF_MACOS) || defined(CAF_IOS) || defined(CAF_BSD)
// Use the socket option but no flags to recv/send on macOS/iOS/BSD.
......@@ -119,6 +109,18 @@ namespace network {
#ifndef CAF_WINDOWS
int last_socket_error() {
return errno;
}
void close_socket(native_socket fd) {
close(fd);
}
bool would_block_or_temporarily_unavailable(int errcode) {
return errcode == EAGAIN || errcode == EWOULDBLOCK;
}
string last_socket_error_as_string() {
return strerror(errno);
}
......@@ -159,6 +161,18 @@ namespace network {
#else // CAF_WINDOWS
int last_socket_error() {
return WSAGetLastError();
}
void close_socket(native_socket fd) {
closesocket(fd);
}
bool would_block_or_temporarily_unavailable(int errcode) {
return errcode == WSAEWOULDBLOCK || errcode == WSATRY_AGAIN;
}
string last_socket_error_as_string() {
LPTSTR errorText = NULL;
auto hresult = last_socket_error();
......@@ -250,9 +264,9 @@ namespace network {
// makes sure all sockets are closed in case of an error
auto guard = detail::make_scope_guard([&] {
auto e = WSAGetLastError();
closesocket(listener);
closesocket(socks[0]);
closesocket(socks[1]);
close_socket(listener);
close_socket(socks[0]);
close_socket(socks[1]);
WSASetLastError(e);
});
// bind listener to a local port
......@@ -283,7 +297,7 @@ namespace network {
// get write-only end of the pipe
CALL_CRITICAL_CFUN(write_fd, detail::cc_valid_socket, "accept",
accept(listener, nullptr, nullptr));
closesocket(listener);
close_socket(listener);
guard.disable();
return std::make_pair(read_fd, write_fd);
}
......
......@@ -18,7 +18,11 @@
#include "caf/detail/socket_guard.hpp"
#include <unistd.h>
#ifdef CAF_WINDOWS
# include <winsock2.h>
#else
# include <unistd.h>
#endif
#include "caf/logger.hpp"
......@@ -42,7 +46,7 @@ io::network::native_socket socket_guard::release() {
void socket_guard::close() {
if (fd_ != io::network::invalid_native_socket) {
CAF_LOG_DEBUG("close socket" << CAF_ARG(fd_));
io::network::closesocket(fd_);
io::network::close_socket(fd_);
fd_ = io::network::invalid_native_socket;
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment