mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-15 13:16:43 +00:00
fixes for non BSD
This commit is contained in:
@@ -803,7 +803,6 @@ Network::Errno BSD::SetSockOptImpl(s32 fd, u32 level, Network::OptName optname,
|
||||
|
||||
ASSERT(optval.size() == sizeof(u32));
|
||||
auto value = GetValue<u32>(optval);
|
||||
|
||||
switch (optname) {
|
||||
case Network::OptName::REUSEADDR:
|
||||
ASSERT(value == 0 || value == 1);
|
||||
@@ -825,6 +824,12 @@ Network::Errno BSD::SetSockOptImpl(s32 fd, u32 level, Network::OptName optname,
|
||||
case Network::OptName::NOSIGPIPE:
|
||||
LOG_WARNING(Service, "(STUBBED) setting NOSIGPIPE to {}", value);
|
||||
return Network::Errno::SUCCESS;
|
||||
case Network::OptName::REUSEPORT:
|
||||
return socket->SetReusePort(value);
|
||||
case Network::OptName::TIMESTAMP:
|
||||
return socket->SetTimeStamp(value);
|
||||
case Network::OptName::ACCEPTFILTER:
|
||||
return socket->SetAcceptFilter(value);
|
||||
default:
|
||||
UNIMPLEMENTED_MSG("Unimplemented optname={}", optname);
|
||||
return Network::Errno::SUCCESS;
|
||||
|
||||
@@ -120,8 +120,15 @@ bool EnableNonBlock(SOCKET fd, bool enable) {
|
||||
|
||||
Errno TranslateNativeError(int e, CallType call_type = CallType::Other) {
|
||||
switch (e) {
|
||||
case 0:
|
||||
return Errno::SUCCESS;
|
||||
case 0: return Errno::SUCCESS;
|
||||
case WSAECONNABORTED:
|
||||
if (call_type == CallType::Send) {
|
||||
// Winsock yields WSAECONNABORTED from `send` in situations where Unix
|
||||
// systems, and actual Switches, yield EPIPE.
|
||||
return Errno::PIPE;
|
||||
} else {
|
||||
return Errno::CONNABORTED;
|
||||
}
|
||||
case WSAEBADF:
|
||||
return Errno::BADF;
|
||||
case WSAEINVAL:
|
||||
@@ -134,14 +141,6 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) {
|
||||
return Errno::AGAIN;
|
||||
case WSAECONNREFUSED:
|
||||
return Errno::CONNREFUSED;
|
||||
case WSAECONNABORTED:
|
||||
if (call_type == CallType::Send) {
|
||||
// Winsock yields WSAECONNABORTED from `send` in situations where Unix
|
||||
// systems, and actual Switches, yield EPIPE.
|
||||
return Errno::PIPE;
|
||||
} else {
|
||||
return Errno::CONNABORTED;
|
||||
}
|
||||
case WSAECONNRESET:
|
||||
return Errno::CONNRESET;
|
||||
case WSAEHOSTUNREACH:
|
||||
@@ -160,6 +159,18 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) {
|
||||
return Errno::ISCONN;
|
||||
case WSAEADDRINUSE:
|
||||
return Errno::ADDRINUSE;
|
||||
case WSAEADDRNOTAVAIL:
|
||||
return Errno::ADDRNOTAVAIL;
|
||||
case WSAEPROTOTYPE:
|
||||
return Errno::PROTOTYPE;
|
||||
case WSAENOPROTOOPT:
|
||||
return Errno::NOPROTOOPT;
|
||||
case WSAEPROTONOSUPPORT:
|
||||
return Errno::PROTONOSUPPORT;
|
||||
case WSAESOCKTNOSUPPORT:
|
||||
return Errno::SOCKTNOSUPPORT;
|
||||
case WSAENOTSUP:
|
||||
return Errno::NOTSUP;
|
||||
default:
|
||||
UNIMPLEMENTED_MSG("Unimplemented errno={}", e);
|
||||
return Errno::OTHER;
|
||||
@@ -285,7 +296,13 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) {
|
||||
NETWORK_ERROR_ELEM(TIMEDOUT) \
|
||||
NETWORK_ERROR_ELEM(INPROGRESS) \
|
||||
NETWORK_ERROR_ELEM(ISCONN) \
|
||||
NETWORK_ERROR_ELEM(ADDRINUSE)
|
||||
NETWORK_ERROR_ELEM(PROTOTYPE) \
|
||||
NETWORK_ERROR_ELEM(NOPROTOOPT) \
|
||||
NETWORK_ERROR_ELEM(PROTONOSUPPORT) \
|
||||
NETWORK_ERROR_ELEM(SOCKTNOSUPPORT) \
|
||||
NETWORK_ERROR_ELEM(NOTSUP) \
|
||||
NETWORK_ERROR_ELEM(ADDRINUSE) \
|
||||
NETWORK_ERROR_ELEM(ADDRNOTAVAIL)
|
||||
#define NETWORK_ERROR_ELEM(name) case E##name: return Errno::name;
|
||||
NETWORK_ERROR_LIST
|
||||
#undef NETWORK_ERROR_ELEM
|
||||
@@ -400,9 +417,9 @@ GetAddrInfoError TranslateGetAddrInfoErrorFromNative(int gai_err) {
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(IPX) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(ISDN) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(INET6) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(ATM) \
|
||||
/*NETWORK_DOMAIN_TRANSLATE_ELEM(ATM)*/ \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(BLUETOOTH) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(NETLINK)
|
||||
/*NETWORK_DOMAIN_TRANSLATE_ELEM(NETLINK)*/
|
||||
#elif defined(_WIN32)
|
||||
#define NETWORK_DOMAIN_TRANSLATE_LIST \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(UNIX) \
|
||||
@@ -422,8 +439,7 @@ GetAddrInfoError TranslateGetAddrInfoErrorFromNative(int gai_err) {
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(APPLETALK) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(NETBIOS) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(ATM) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(INET6) \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(CLUSTER)
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(INET6)
|
||||
#else
|
||||
#define NETWORK_DOMAIN_TRANSLATE_LIST \
|
||||
NETWORK_DOMAIN_TRANSLATE_ELEM(INET) \
|
||||
@@ -937,15 +953,18 @@ Errno Socket::SetSockOpt(SOCKET fd_so, int option, T value) {
|
||||
}
|
||||
|
||||
Errno Socket::Initialize(Domain domain, Type type, Protocol protocol) {
|
||||
fd = socket(TranslateDomainToNative(domain), TranslateTypeToNative(type), TranslateProtocolToNative(protocol));
|
||||
if (fd != INVALID_SOCKET) {
|
||||
return Errno::SUCCESS;
|
||||
if (type == Type::STREAM && protocol == Protocol::UDP) {
|
||||
LOG_WARNING(Network, "Using IPPROTO_UDP with SOCK_STREAM");
|
||||
type = Type::DGRAM;
|
||||
}
|
||||
|
||||
fd = socket(TranslateDomainToNative(domain), TranslateTypeToNative(type), TranslateProtocolToNative(protocol));
|
||||
if (fd != INVALID_SOCKET)
|
||||
return Errno::SUCCESS;
|
||||
return GetAndLogLastError();
|
||||
}
|
||||
|
||||
std::pair<SocketBase::AcceptResult, Errno> Socket::Accept() {
|
||||
std::pair<Socket::AcceptResult, Errno> Socket::Accept() {
|
||||
sockaddr_in addr;
|
||||
socklen_t addrlen = sizeof(addr);
|
||||
|
||||
@@ -1172,6 +1191,18 @@ Errno Socket::SetRcvTimeo(u32 value) {
|
||||
return SetSockOpt(fd, SO_RCVTIMEO, value);
|
||||
}
|
||||
|
||||
Errno Socket::SetReusePort(u32 value) {
|
||||
return SetSockOpt(fd, SO_REUSEPORT, value);
|
||||
}
|
||||
|
||||
Errno Socket::SetTimeStamp(u32 value) {
|
||||
return SetSockOpt(fd, SO_TIMESTAMP, value);
|
||||
}
|
||||
|
||||
Errno Socket::SetAcceptFilter(u32 value) {
|
||||
return SetSockOpt(fd, SO_ACCEPTFILTER, value);
|
||||
}
|
||||
|
||||
Errno Socket::SetNonBlock(bool enable) {
|
||||
if (EnableNonBlock(fd, enable)) {
|
||||
is_non_blocking = enable;
|
||||
|
||||
@@ -247,13 +247,12 @@ Errno ProxySocket::Close() {
|
||||
}
|
||||
|
||||
Errno ProxySocket::SetLinger(bool enable, u32 linger) {
|
||||
struct Linger {
|
||||
struct {
|
||||
u16 linger_enable;
|
||||
u16 linger_time;
|
||||
} values;
|
||||
values.linger_enable = enable ? 1 : 0;
|
||||
values.linger_time = static_cast<u16>(linger);
|
||||
|
||||
values.linger_time = u16(linger);
|
||||
return SetSockOpt(fd, SO_LINGER, values);
|
||||
}
|
||||
|
||||
@@ -288,6 +287,18 @@ Errno ProxySocket::SetRcvTimeo(u32 value) {
|
||||
return SetSockOpt(fd, SO_RCVTIMEO, static_cast<int>(value));
|
||||
}
|
||||
|
||||
Errno ProxySocket::SetReusePort(u32 value) {
|
||||
return SetSockOpt(fd, SO_REUSEPORT, value);
|
||||
}
|
||||
|
||||
Errno ProxySocket::SetTimeStamp(u32 value) {
|
||||
return SetSockOpt(fd, SO_TIMESTAMP, value);
|
||||
}
|
||||
|
||||
Errno ProxySocket::SetAcceptFilter(u32 value) {
|
||||
return SetSockOpt(fd, SO_ACCEPTFILTER, value);
|
||||
}
|
||||
|
||||
Errno ProxySocket::SetNonBlock(bool enable) {
|
||||
blocking = !enable;
|
||||
return Errno::SUCCESS;
|
||||
|
||||
@@ -56,21 +56,16 @@ public:
|
||||
const Network::SockAddrIn* addr) override;
|
||||
|
||||
Errno SetLinger(bool enable, u32 linger) override;
|
||||
|
||||
Errno SetReuseAddr(bool enable) override;
|
||||
|
||||
Errno SetBroadcast(bool enable) override;
|
||||
|
||||
Errno SetKeepAlive(bool enable) override;
|
||||
|
||||
Errno SetSndBuf(u32 value) override;
|
||||
|
||||
Errno SetRcvBuf(u32 value) override;
|
||||
|
||||
Errno SetSndTimeo(u32 value) override;
|
||||
|
||||
Errno SetRcvTimeo(u32 value) override;
|
||||
|
||||
Errno SetReusePort(u32 value) override;
|
||||
Errno SetTimeStamp(u32 value) override;
|
||||
Errno SetAcceptFilter(u32 value) override;
|
||||
Errno SetNonBlock(bool enable) override;
|
||||
|
||||
template <typename T>
|
||||
|
||||
@@ -26,7 +26,13 @@ enum class Errno : u32 {
|
||||
MFILE = 24,
|
||||
PIPE = 32,
|
||||
MSGSIZE = 90,
|
||||
PROTOTYPE = 91,
|
||||
NOPROTOOPT = 92,
|
||||
PROTONOSUPPORT = 93,
|
||||
SOCKTNOSUPPORT = 94,
|
||||
NOTSUP = 95,
|
||||
ADDRINUSE = 98,
|
||||
ADDRNOTAVAIL = 99,
|
||||
NETDOWN = 100,
|
||||
NETUNREACH = 101,
|
||||
CONNABORTED = 103,
|
||||
@@ -233,16 +239,22 @@ enum class SocketLevel : u32 {
|
||||
};
|
||||
|
||||
enum class OptName : u32 {
|
||||
REUSEADDR = 0x4,
|
||||
KEEPALIVE = 0x8,
|
||||
BROADCAST = 0x20,
|
||||
LINGER = 0x80,
|
||||
REUSEADDR = 0x0004,
|
||||
KEEPALIVE = 0x0008,
|
||||
DONTROUTE = 0x0010,
|
||||
BROADCAST = 0x0020,
|
||||
USELOOPBACK = 0x0040,
|
||||
LINGER = 0x0080,
|
||||
OOBINLINE = 0x0100,
|
||||
REUSEPORT = 0x0200,
|
||||
TIMESTAMP = 0x0400,
|
||||
NOSIGPIPE = 0x0800, // at least according to libnx
|
||||
ACCEPTFILER = 0x1000,
|
||||
SNDBUF = 0x1001,
|
||||
RCVBUF = 0x1002,
|
||||
SNDTIMEO = 0x1005,
|
||||
RCVTIMEO = 0x1006,
|
||||
ERROR_ = 0x1007, // avoid name collision with Windows macro
|
||||
NOSIGPIPE = 0x800, // at least according to libnx
|
||||
ACCEPTFILTER = 0x1000,
|
||||
BINTIME = 0x2000,
|
||||
NO_OFFLOAD = 0x4000,
|
||||
|
||||
@@ -68,21 +68,16 @@ public:
|
||||
const Network::SockAddrIn* addr) = 0;
|
||||
|
||||
virtual Errno SetLinger(bool enable, u32 linger) = 0;
|
||||
|
||||
virtual Errno SetReuseAddr(bool enable) = 0;
|
||||
|
||||
virtual Errno SetKeepAlive(bool enable) = 0;
|
||||
|
||||
virtual Errno SetBroadcast(bool enable) = 0;
|
||||
|
||||
virtual Errno SetSndBuf(u32 value) = 0;
|
||||
|
||||
virtual Errno SetRcvBuf(u32 value) = 0;
|
||||
|
||||
virtual Errno SetSndTimeo(u32 value) = 0;
|
||||
|
||||
virtual Errno SetRcvTimeo(u32 value) = 0;
|
||||
|
||||
virtual Errno SetReusePort(u32 value) = 0;
|
||||
virtual Errno SetTimeStamp(u32 value) = 0;
|
||||
virtual Errno SetAcceptFilter(u32 value) = 0;
|
||||
virtual Errno SetNonBlock(bool enable) = 0;
|
||||
|
||||
virtual std::pair<Errno, Errno> GetPendingError() = 0;
|
||||
@@ -95,7 +90,6 @@ public:
|
||||
return fd;
|
||||
}
|
||||
|
||||
protected:
|
||||
SOCKET fd = INVALID_SOCKET;
|
||||
};
|
||||
|
||||
@@ -136,21 +130,16 @@ public:
|
||||
const Network::SockAddrIn* addr) override;
|
||||
|
||||
Errno SetLinger(bool enable, u32 linger) override;
|
||||
|
||||
Errno SetReuseAddr(bool enable) override;
|
||||
|
||||
Errno SetKeepAlive(bool enable) override;
|
||||
|
||||
Errno SetBroadcast(bool enable) override;
|
||||
|
||||
Errno SetSndBuf(u32 value) override;
|
||||
|
||||
Errno SetRcvBuf(u32 value) override;
|
||||
|
||||
Errno SetSndTimeo(u32 value) override;
|
||||
|
||||
Errno SetRcvTimeo(u32 value) override;
|
||||
|
||||
Errno SetReusePort(u32 value) override;
|
||||
Errno SetTimeStamp(u32 value) override;
|
||||
Errno SetAcceptFilter(u32 value) override;
|
||||
Errno SetNonBlock(bool enable) override;
|
||||
|
||||
template <typename T>
|
||||
|
||||
Reference in New Issue
Block a user