From 5a0f35eca0c42ade4daa268d098a6d16a2ca8946 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 8 Jul 2024 17:08:01 +0100 Subject: [PATCH 1/3] Fix a small bug. --- UDPSocket.cpp | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 6981e29..c28c039 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -36,7 +36,11 @@ CUDPSocket::CUDPSocket(const std::string& address, unsigned short port) : m_localAddress(address), m_localPort(port), +#if defined(_WIN32) || defined(_WIN64) +m_fd(INVALID_SOCKET), +#else m_fd(-1), +#endif m_af(AF_UNSPEC) { } @@ -44,7 +48,11 @@ m_af(AF_UNSPEC) CUDPSocket::CUDPSocket(unsigned short port) : m_localAddress(), m_localPort(port), +#if defined(_WIN32) || defined(_WIN64) +m_fd(INVALID_SOCKET), +#else m_fd(-1), +#endif m_af(AF_UNSPEC) { } @@ -97,7 +105,9 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned short port, sockadd return err; } - ::memcpy(&addr, res->ai_addr, address_length = res->ai_addrlen); + address_length = (unsigned int)res->ai_addrlen; + + ::memcpy(&addr, res->ai_addr, address_length); ::freeaddrinfo(res); @@ -160,7 +170,11 @@ bool CUDPSocket::open(const sockaddr_storage& address) bool CUDPSocket::open() { +#if defined(_WIN32) || defined(_WIN64) + assert(m_fd == INVALID_SOCKET); +#else assert(m_fd == -1); +#endif sockaddr_storage addr; unsigned int addrlen; @@ -221,7 +235,14 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storag { assert(buffer != NULL); assert(length > 0U); - assert(m_fd >= 0); + +#if defined(_WIN32) || defined(_WIN64) + if (m_fd == INVALID_SOCKET) + return 0; +#else + if (m_fd == -1) + return 0; +#endif // Check that the readfrom() won't block struct pollfd pfd; @@ -282,7 +303,11 @@ bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const s { assert(buffer != NULL); assert(length > 0U); +#if defined(_WIN32) || defined(_WIN64) + assert(m_fd != INVALID_SOCKET); +#else assert(m_fd >= 0); +#endif bool result = false; @@ -313,13 +338,16 @@ bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const s void CUDPSocket::close() { - if (m_fd >= 0) { #if defined(_WIN32) || defined(_WIN64) + if (m_fd != INVALID_SOCKET) { ::closesocket(m_fd); + m_fd = INVALID_SOCKET; + } #else + if (m_fd >= 0) { ::close(m_fd); -#endif m_fd = -1; } +#endif } From cf96a2653ff4ebc2b1d6fe702f3081e65dba441a Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 15 Jul 2024 13:50:58 +0100 Subject: [PATCH 2/3] Fix FM RAW mode resampler bug. --- FMNetwork.cpp | 4 +++- RemoteControl.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/FMNetwork.cpp b/FMNetwork.cpp index 5545967..f649368 100644 --- a/FMNetwork.cpp +++ b/FMNetwork.cpp @@ -104,10 +104,12 @@ bool CFMNetwork::open() } } +#if !defined(HAS_SRC) if ((m_protocol == FMNP_RAW) && (m_sampleRate != MMDVM_SAMPLERATE)) { LogError("The resampler needed for non-native sample rates has not been included"); return false; } +#endif return m_socket.open(m_addr); } @@ -544,7 +546,7 @@ bool CFMNetwork::writeUSRPStart() buffer[length++] = 0x08U; // TLV Length - buffer[length++] = 3U + 4U + 3U + 1U + 1U + m_callsign.size() + 1U; + buffer[length++] = 3U + 4U + 3U + 1U + 1U + (unsigned char)m_callsign.size() + 1U; // DMR Id buffer[length++] = 0x00U; diff --git a/RemoteControl.cpp b/RemoteControl.cpp index f88f15d..3951693 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -192,7 +192,7 @@ REMOTE_COMMAND CRemoteControl::getCommand() #endif } - m_socket.write((unsigned char*)replyStr.c_str(), replyStr.length(), address, addrlen); + m_socket.write((unsigned char*)replyStr.c_str(), (unsigned int)replyStr.length(), address, addrlen); } return m_command; @@ -209,14 +209,14 @@ unsigned int CRemoteControl::getArgCount() const case RCD_MODE_P25: case RCD_MODE_NXDN: case RCD_MODE_M17: - return m_args.size() - SET_MODE_ARGS; + return (unsigned int)m_args.size() - SET_MODE_ARGS; case RCD_PAGE: case RCD_PAGE_BCD: case RCD_PAGE_A1: case RCD_PAGE_A2: - return m_args.size() - 1U; + return (unsigned int)m_args.size() - 1U; case RCD_CW: - return m_args.size() - 1U; + return (unsigned int)m_args.size() - 1U; default: return 0U; } From aa03a969252e2e8d0f814195357094d5ea311983 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Wed, 28 Aug 2024 16:32:20 +0100 Subject: [PATCH 3/3] Fix the restart processing. --- MMDVMHost.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 937967f..f29d0ef 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -60,16 +60,11 @@ static int m_signal = 0; static bool m_reload = false; #if !defined(_WIN32) && !defined(_WIN64) -static void sigHandler1(int signum) +static void sigHandler(int signum) { m_killed = true; m_signal = signum; } - -static void sigHandler2(int signum) -{ - m_reload = true; -} #endif const char* HEADER1 = "This software is for use on amateur radio networks only,"; @@ -96,16 +91,16 @@ int main(int argc, char** argv) } #if !defined(_WIN32) && !defined(_WIN64) - ::signal(SIGINT, sigHandler1); - ::signal(SIGTERM, sigHandler1); - ::signal(SIGHUP, sigHandler1); - ::signal(SIGUSR1, sigHandler2); + ::signal(SIGINT, sigHandler); + ::signal(SIGTERM, sigHandler); + ::signal(SIGHUP, sigHandler); #endif int ret = 0; do { m_signal = 0; + m_killed = false; CMMDVMHost* host = new CMMDVMHost(std::string(iniFile)); ret = host->run(); @@ -113,6 +108,8 @@ int main(int argc, char** argv) delete host; switch (m_signal) { + case 0: + break; case 2: ::LogInfo("MMDVMHost-%s exited on receipt of SIGINT", VERSION); break; @@ -120,16 +117,14 @@ int main(int argc, char** argv) ::LogInfo("MMDVMHost-%s exited on receipt of SIGTERM", VERSION); break; case 1: - ::LogInfo("MMDVMHost-%s exited on receipt of SIGHUP", VERSION); - break; - case 10: - ::LogInfo("MMDVMHost-%s is restarting on receipt of SIGUSR1", VERSION); + ::LogInfo("MMDVMHost-%s is restarting on receipt of SIGHUP", VERSION); + m_reload = true; break; default: ::LogInfo("MMDVMHost-%s exited on receipt of an unknown signal", VERSION); break; } - } while (m_signal == 10); + } while (m_reload || (m_signal == 1)); ::LogFinalise();