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