From 2f9023065ea5f7ba69a171ff5ba1ce75dae2773b Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 1 Jul 2026 19:24:21 +0000 Subject: [PATCH] fix messages native flags --- src/core/internal_network/network.cpp | 38 ++++++++++++++++++++---- src/core/internal_network/socket_types.h | 13 ++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index b290339492..30b1e2c14b 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -1105,19 +1105,45 @@ std::pair Socket::RecvFrom(int flags, std::span message, Network } std::pair Socket::Send(std::span message, int flags) { - ASSERT(message.size() < static_cast((std::numeric_limits::max)())); - ASSERT(flags == 0); + ASSERT(message.size() < size_t((std::numeric_limits::max)())); int native_flags = 0; +#ifdef MSG_OOB + if (flags & int(MsgOpt::OOB)) native_flags |= MSG_OOB; +#endif +#ifdef MSG_PEEK + if (flags & int(MsgOpt::PEEK)) native_flags |= MSG_PEEK; +#endif +#ifdef MSG_DONTROUTE + if (flags & int(MsgOpt::DONTROUTE)) native_flags |= MSG_DONTROUTE; +#endif +#ifdef MSG_EOR + if (flags & int(MsgOpt::EOR_)) native_flags |= MSG_EOR; +#endif +#ifdef MSG_TRUNC + if (flags & int(MsgOpt::TRUNC)) native_flags |= MSG_TRUNC; +#endif +#ifdef MSG_CTRUNC + if (flags & int(MsgOpt::CTRUNC)) native_flags |= MSG_CTRUNC; +#endif +#ifdef MSG_WAITALL + if (flags & int(MsgOpt::WAITALL)) native_flags |= MSG_WAITALL; +#endif +#ifdef MSG_DONTWAIT + if (flags & int(MsgOpt::DONTWAIT)) native_flags |= MSG_DONTWAIT; +#endif +#ifdef MSG_EOF + if (flags & int(MsgOpt::EOF_)) native_flags |= MSG_EOF; +#endif + #ifdef __unix__ + // NOSIGNAL is set for all sockets native_flags |= MSG_NOSIGNAL; // do not send us SIGPIPE #endif - const auto result = send(fd, reinterpret_cast(message.data()), - static_cast(message.size()), native_flags); + const auto result = send(fd, reinterpret_cast(message.data()), int(message.size()), native_flags); if (result != SOCKET_ERROR) { - return {static_cast(result), Errno::SUCCESS}; + return {s32(result), Errno::SUCCESS}; } - return {-1, GetAndLogLastError(CallType::Send)}; } diff --git a/src/core/internal_network/socket_types.h b/src/core/internal_network/socket_types.h index 454b13446f..1fbb2e4678 100644 --- a/src/core/internal_network/socket_types.h +++ b/src/core/internal_network/socket_types.h @@ -238,6 +238,19 @@ enum class SocketLevel : u32 { SOCKET = 0xffff, // i.e. SOL_SOCKET }; +enum class MsgOpt : u32 { + OOB = 0x00001, + PEEK = 0x00002, + DONTROUTE = 0x00004, + EOR_ = 0x00008, + TRUNC = 0x00010, + CTRUNC = 0x00020, + WAITALL = 0x00040, + DONTWAIT = 0x00080, + EOF_ = 0x00100, + NOSIGNAL = 0x20000, +}; + enum class OptName : u32 { REUSEADDR = 0x0004, KEEPALIVE = 0x0008,