diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 85c5ac714d..32cd481bd6 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -565,7 +565,7 @@ std::pair BSD::PollImpl(std::vector& write_buffer, std: if (!IsFileDescriptorValid(pollfd.fd)) { pollfd.revents = {}; if (!file_descriptors[pollfd.fd]) - pollfd.revents = Network::PollEvents::Nval; + pollfd.revents = Network::PollEvents::NVAL; has_invalid = true; } } @@ -583,11 +583,8 @@ std::pair BSD::PollImpl(std::vector& write_buffer, std: }); const auto result = Network::Poll(host_pollfds, timeout); - for (size_t i = 0; i < host_pollfds.size(); ++i) { - fds[i].socket = host_pollfds[i].socket->fd; - fds[i].events = host_pollfds[i].events; + for (size_t i = 0; i < host_pollfds.size(); ++i) fds[i].revents = host_pollfds[i].revents; - } std::memcpy(write_buffer.data(), fds.data(), nfds * sizeof(Network::PollFD)); return result; } diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index b3024bee4a..8ff2abe9ca 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -742,15 +742,18 @@ static s16 TranslatePollEvents(Network::PollEvents events) noexcept { result |= host; } }; - translate(Network::PollEvents::In, POLLIN); - translate(Network::PollEvents::Pri, POLLPRI); - translate(Network::PollEvents::Out, POLLOUT); - translate(Network::PollEvents::Err, POLLERR); - translate(Network::PollEvents::Hup, POLLHUP); - translate(Network::PollEvents::Nval, POLLNVAL); - translate(Network::PollEvents::RdNorm, POLLRDNORM); - translate(Network::PollEvents::RdBand, POLLRDBAND); - translate(Network::PollEvents::WrBand, POLLWRBAND); + translate(Network::PollEvents::IN_, POLLIN); + translate(Network::PollEvents::PRI_, POLLPRI); + translate(Network::PollEvents::OUT_, POLLOUT); + translate(Network::PollEvents::ERR_, POLLERR); + translate(Network::PollEvents::HUP_, POLLHUP); + translate(Network::PollEvents::NVAL, POLLNVAL); + translate(Network::PollEvents::RDNORM, POLLRDNORM); + translate(Network::PollEvents::RDBAND, POLLRDBAND); + translate(Network::PollEvents::WRBAND, POLLWRBAND); +#ifdef POLLIGNEOF + translate(Network::PollEvents::IGNEOF, POLLIGNEOF); +#endif #ifdef _WIN32 s16 allowed_events = POLLRDBAND | POLLRDNORM | POLLWRNORM; // Unlike poll on other OSes, WSAPoll will complain if any other flags are set on input. @@ -771,15 +774,18 @@ static Network::PollEvents TranslatePollRevents(s16 revents) { result |= guest; } }; - translate(POLLIN, Network::PollEvents::In); - translate(POLLPRI, Network::PollEvents::Pri); - translate(POLLOUT, Network::PollEvents::Out); - translate(POLLERR, Network::PollEvents::Err); - translate(POLLHUP, Network::PollEvents::Hup); - translate(POLLNVAL, Network::PollEvents::Nval); - translate(POLLRDNORM, Network::PollEvents::RdNorm); - translate(POLLRDBAND, Network::PollEvents::RdBand); - translate(POLLWRBAND, Network::PollEvents::WrBand); + translate(POLLIN, Network::PollEvents::IN_); + translate(POLLPRI, Network::PollEvents::PRI_); + translate(POLLOUT, Network::PollEvents::OUT_); + translate(POLLERR, Network::PollEvents::ERR_); + translate(POLLHUP, Network::PollEvents::HUP_); + translate(POLLNVAL, Network::PollEvents::NVAL); + translate(POLLRDNORM, Network::PollEvents::RDNORM); + translate(POLLRDBAND, Network::PollEvents::RDBAND); + translate(POLLWRBAND, Network::PollEvents::WRBAND); +#ifdef POLLIGNEOF + translate(POLLIGNEOF, Network::PollEvents::IGNEOF); +#endif UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents=0x{:x}", revents); return result; } diff --git a/src/core/internal_network/socket_types.h b/src/core/internal_network/socket_types.h index 6fc729e146..3db114f80c 100644 --- a/src/core/internal_network/socket_types.h +++ b/src/core/internal_network/socket_types.h @@ -305,15 +305,16 @@ static_assert(sizeof(SockAddrIn) == 0x100); enum class PollEvents : u16 { // Using Pascal case because IN is a macro on Windows. - In = 1 << 0, - Pri = 1 << 1, - Out = 1 << 2, - Err = 1 << 3, - Hup = 1 << 4, - Nval = 1 << 5, - RdNorm = 1 << 6, - RdBand = 1 << 7, - WrBand = 1 << 8, + IN_ = 0x0001, + PRI_ = 0x0002, + OUT_ = 0x0004, + ERR_ = 0x0008, + HUP_ = 0x0010, + NVAL = 0x0020, + RDNORM = 0x0040, + RDBAND = 0x0080, + WRBAND = 0x0100, + IGNEOF = 0x2000, }; DECLARE_ENUM_FLAG_OPERATORS(PollEvents); @@ -322,11 +323,13 @@ struct PollFD { Network::PollEvents events; Network::PollEvents revents; }; +static_assert(sizeof(PollFD) == 8); struct Linger { - u32 onoff; - u32 linger; + s32 onoff; + s32 linger; }; +static_assert(sizeof(Linger) == 8); constexpr u32 FLAG_MSG_PEEK = 0x2; constexpr u32 FLAG_MSG_DONTWAIT = 0x80;