From ec68495bd31f0b4525c8b4624b5bd751da03c839 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Sun, 25 Apr 2021 08:33:14 -0500 Subject: [PATCH] Change WSAStartup logic in network.c to better allow for errors. WSAStartup should now get called once only and should be restarted if needed. https://github.com/Hamlib/Hamlib/issues/679 --- src/network.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/network.c b/src/network.c index 98a49c153..bd458412c 100644 --- a/src/network.c +++ b/src/network.c @@ -143,11 +143,23 @@ int network_open(hamlib_port_t *rp, int default_port) #ifdef __MINGW32__ WSADATA wsadata; + int ret; - if (!(wsstarted++) && WSAStartup(MAKEWORD(1, 1), &wsadata) == SOCKET_ERROR) + if (wsstarted == 0) { - rig_debug(RIG_DEBUG_ERR, "%s: error creating socket\n", __func__); - RETURNFUNC(-RIG_EIO); + ret = WSAStartup(MAKEWORD(1, 1), &wsadata); + + if (ret == 0) + { + wsstarted = 1; + rig_debug(RIG_DEBUG_VERBOSE, "%s: WSAStartup OK\n", __func__); + } + else + { + rig_debug(RIG_DEBUG_ERR, "%s: error creating socket, WSAStartup ret=%d\n", + __func__, ret); + RETURNFUNC(-RIG_EIO); + } } #endif @@ -347,20 +359,30 @@ void network_flush(hamlib_port_t *rp) //! @cond Doxygen_Suppress int network_close(hamlib_port_t *rp) { - int ret; + int ret = 0; ENTERFUNC; -#ifdef __MINGW32__ - ret = closesocket(rp->fd); - - if (--wsstarted) + if (rp->fd > 0) { - WSACleanup(); +#ifdef __MINGW32__ + ret = closesocket(rp->fd); +#else + ret = close(rp->fd); +#endif + rig_debug(RIG_DEBUG_VERBOSE, "%s: close socket ret=%d\n", __func__, ret); + rp->fd = 0; + } + +#ifdef __MINGW32__ + + if (wsstarted) + { + ret = WSACleanup(); + rig_debug(RIG_DEBUG_VERBOSE, "%s: WSACleanup ret=%d\n", __func__, ret); + wsstarted = 0; } -#else - ret = close(rp->fd); #endif RETURNFUNC(ret); }