net/SocketError: add syscall specific check functions
Fixes Windows compatibility.
This commit is contained in:
parent
2719f62feb
commit
9e2d09dabc
2
NEWS
2
NEWS
|
@ -1,4 +1,6 @@
|
|||
ver 0.22.5 (not yet released)
|
||||
* output
|
||||
- httpd: error handling on Windows improved
|
||||
|
||||
ver 0.22.4 (2021/01/21)
|
||||
* protocol
|
||||
|
|
|
@ -36,7 +36,7 @@ BufferedSocket::DirectRead(void *data, size_t length) noexcept
|
|||
}
|
||||
|
||||
const auto code = GetSocketError();
|
||||
if (IsSocketErrorAgain(code))
|
||||
if (IsSocketErrorReceiveWouldBlock(code))
|
||||
return 0;
|
||||
|
||||
if (IsSocketErrorClosed(code))
|
||||
|
|
|
@ -31,7 +31,7 @@ FullyBufferedSocket::DirectWrite(const void *data, size_t length) noexcept
|
|||
const auto nbytes = GetSocket().Write((const char *)data, length);
|
||||
if (gcc_unlikely(nbytes < 0)) {
|
||||
const auto code = GetSocketError();
|
||||
if (IsSocketErrorAgain(code))
|
||||
if (IsSocketErrorSendWouldBlock(code))
|
||||
return 0;
|
||||
|
||||
IdleMonitor::Cancel();
|
||||
|
|
|
@ -52,14 +52,79 @@ GetSocketError() noexcept
|
|||
#endif
|
||||
}
|
||||
|
||||
gcc_const
|
||||
static inline bool
|
||||
IsSocketErrorAgain(socket_error_t code) noexcept
|
||||
constexpr bool
|
||||
IsSocketErrorInProgress(socket_error_t code) noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return code == WSAEINPROGRESS;
|
||||
#else
|
||||
return code == EAGAIN;
|
||||
return code == EINPROGRESS;
|
||||
#endif
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
IsSocketErrorWouldBlock(socket_error_t code) noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return code == WSAEWOULDBLOCK;
|
||||
#else
|
||||
return code == EWOULDBLOCK;
|
||||
#endif
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
IsSocketErrorConnectWouldBlock(socket_error_t code) noexcept
|
||||
{
|
||||
#if defined(_WIN32) || defined(__linux__)
|
||||
/* on Windows, WSAEINPROGRESS is for blocking sockets and
|
||||
WSAEWOULDBLOCK for non-blocking sockets */
|
||||
/* on Linux, EAGAIN==EWOULDBLOCK is for local sockets and
|
||||
EINPROGRESS is for all other sockets */
|
||||
return IsSocketErrorInProgress(code) || IsSocketErrorWouldBlock(code);
|
||||
#else
|
||||
/* on all other operating systems, there's just EINPROGRESS */
|
||||
return IsSocketErrorInProgress(code);
|
||||
#endif
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
IsSocketErrorSendWouldBlock(socket_error_t code) noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
/* on Windows, WSAEINPROGRESS is for blocking sockets and
|
||||
WSAEWOULDBLOCK for non-blocking sockets */
|
||||
return IsSocketErrorInProgress(code) || IsSocketErrorWouldBlock(code);
|
||||
#else
|
||||
/* on all other operating systems, there's just EAGAIN==EWOULDBLOCK */
|
||||
return IsSocketErrorWouldBlock(code);
|
||||
#endif
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
IsSocketErrorReceiveWouldBlock(socket_error_t code) noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
/* on Windows, WSAEINPROGRESS is for blocking sockets and
|
||||
WSAEWOULDBLOCK for non-blocking sockets */
|
||||
return IsSocketErrorInProgress(code) || IsSocketErrorWouldBlock(code);
|
||||
#else
|
||||
/* on all other operating systems, there's just
|
||||
EAGAIN==EWOULDBLOCK */
|
||||
return IsSocketErrorWouldBlock(code);
|
||||
#endif
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
IsSocketErrorAcceptWouldBlock(socket_error_t code) noexcept
|
||||
{
|
||||
#ifdef _WIN32
|
||||
/* on Windows, WSAEINPROGRESS is for blocking sockets and
|
||||
WSAEWOULDBLOCK for non-blocking sockets */
|
||||
return IsSocketErrorInProgress(code) || IsSocketErrorWouldBlock(code);
|
||||
#else
|
||||
/* on all other operating systems, there's just
|
||||
EAGAIN==EWOULDBLOCK */
|
||||
return IsSocketErrorWouldBlock(code);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -278,7 +278,7 @@ HttpdClient::TryWrite() noexcept
|
|||
metadata_current_position);
|
||||
if (nbytes < 0) {
|
||||
auto e = GetSocketError();
|
||||
if (IsSocketErrorAgain(e))
|
||||
if (IsSocketErrorSendWouldBlock(e))
|
||||
return true;
|
||||
|
||||
if (!IsSocketErrorClosed(e)) {
|
||||
|
@ -305,7 +305,7 @@ HttpdClient::TryWrite() noexcept
|
|||
ssize_t nbytes = GetSocket().Write(&empty_data, 1);
|
||||
if (nbytes < 0) {
|
||||
auto e = GetSocketError();
|
||||
if (IsSocketErrorAgain(e))
|
||||
if (IsSocketErrorSendWouldBlock(e))
|
||||
return true;
|
||||
|
||||
if (!IsSocketErrorClosed(e)) {
|
||||
|
@ -328,7 +328,7 @@ HttpdClient::TryWrite() noexcept
|
|||
bytes_to_write);
|
||||
if (nbytes < 0) {
|
||||
auto e = GetSocketError();
|
||||
if (IsSocketErrorAgain(e))
|
||||
if (IsSocketErrorSendWouldBlock(e))
|
||||
return true;
|
||||
|
||||
if (!IsSocketErrorClosed(e)) {
|
||||
|
|
Loading…
Reference in New Issue