From 3aae4cdc595ff6f428a2abbfb9d5055c03423bc2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 22 Dec 2023 13:45:50 -0600 Subject: [PATCH] Improve ENet socket error propagation for better debuggability --- src/ControlStream.c | 4 ++++ src/Misc.c | 7 ++++++- src/RtspConnection.c | 6 +++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/ControlStream.c b/src/ControlStream.c index 7be88b6..a332798 100644 --- a/src/ControlStream.c +++ b/src/ControlStream.c @@ -1068,6 +1068,10 @@ static void controlReceiveThreadFunc(void* context) { } if (err < 0) { + // The error from serviceEnetHost() should be propagated via LastSocketError() + LC_ASSERT(err == -1); + + err = LastSocketFail(); Limelog("Control stream connection failed: %d\n", err); ListenerCallbacks.connectionTerminated(err); return; diff --git a/src/Misc.c b/src/Misc.c index 0df1ffc..4988b12 100644 --- a/src/Misc.c +++ b/src/Misc.c @@ -9,6 +9,10 @@ static int serviceEnetHostInternal(ENetHost* client, ENetEvent* event, enet_uint32 timeoutMs, bool ignoreInterrupts) { int ret; + // Clear the last socket error to ensure the caller doesn't read a stale error upon a + // failure in non-socket-related processing in enet_host_service() + SetLastSocketError(0); + // We need to call enet_host_service() multiple times to make sure retransmissions happen for (;;) { int selectedTimeout = timeoutMs < ENET_INTERNAL_TIMEOUT_MS ? timeoutMs : ENET_INTERNAL_TIMEOUT_MS; @@ -16,6 +20,7 @@ static int serviceEnetHostInternal(ENetHost* client, ENetEvent* event, enet_uint // We want to report an interrupt event if we are able to read data if (!ignoreInterrupts && ConnectionInterrupted) { Limelog("ENet wait interrupted\n"); + SetLastSocketError(EINTR); ret = -1; break; } @@ -67,7 +72,7 @@ int gracefullyDisconnectEnetPeer(ENetHost* host, ENetPeer* peer, enet_uint32 lin Limelog("Timed out waiting for ENet peer to acknowledge disconnection\n"); } else { - Limelog("Failed to receive ENet peer disconnection acknowledgement\n"); + Limelog("Failed to receive ENet peer disconnection acknowledgement: %d\n", LastSocketFail()); } return -1; diff --git a/src/RtspConnection.c b/src/RtspConnection.c index 4e16479..e94bb52 100644 --- a/src/RtspConnection.c +++ b/src/RtspConnection.c @@ -144,7 +144,7 @@ static bool transactRtspMessageEnet(PRTSP_MESSAGE request, PRTSP_MESSAGE respons // Wait for a reply if (serviceEnetHost(client, &event, RTSP_RECEIVE_TIMEOUT_SEC * 1000) <= 0 || event.type != ENET_EVENT_TYPE_RECEIVE) { - Limelog("Failed to receive RTSP reply\n"); + Limelog("Failed to receive RTSP reply: %d\n", LastSocketFail()); goto Exit; } @@ -165,7 +165,7 @@ static bool transactRtspMessageEnet(PRTSP_MESSAGE request, PRTSP_MESSAGE respons // The payload comes in a second packet if (serviceEnetHost(client, &event, RTSP_RECEIVE_TIMEOUT_SEC * 1000) <= 0 || event.type != ENET_EVENT_TYPE_RECEIVE) { - Limelog("Failed to receive RTSP reply payload\n"); + Limelog("Failed to receive RTSP reply payload: %d\n", LastSocketFail()); goto Exit; } @@ -851,7 +851,7 @@ int performRtspHandshake(PSERVER_INFORMATION serverInfo) { // Wait for the connect to complete if (serviceEnetHost(client, &event, RTSP_CONNECT_TIMEOUT_SEC * 1000) <= 0 || event.type != ENET_EVENT_TYPE_CONNECT) { - Limelog("RTSP: Failed to connect to UDP port %u\n", RtspPortNumber); + Limelog("RTSP: Failed to connect to UDP port %u: error %d\n", RtspPortNumber, LastSocketFail()); enet_peer_reset(peer); peer = NULL; enet_host_destroy(client);