From: svost Date: Thu, 2 Feb 2017 13:17:25 +0000 (+0300) Subject: Replace non-threadsafe strerror X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=341ac696e277ad50bdf64553cd9f8440a69770f4 Replace non-threadsafe strerror origin from https://github.com/bitcoin/bitcoin/commit/a60838d09aed4d976e9343e8329d61afff204435#diff-4942713bcd2752bb531bf76c9a0ba38e --- diff --git a/src/net.cpp b/src/net.cpp index 8ff66c1..e284291 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -179,7 +179,7 @@ bool RecvLine(SOCKET hSocket, string& strLine) { // socket error int nErr = WSAGetLastError(); - printf("recv failed: %d\n", nErr); + printf("recv failed: %s\n", NetworkErrorString(nErr).c_str()); return false; } } @@ -445,10 +445,10 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, int64_t nTimeout) #ifdef WIN32 u_long nOne = 1; if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR) - printf("ConnectSocket() : ioctlsocket non-blocking setting failed, error %d\n", WSAGetLastError()); + printf("ConnectSocket() : ioctlsocket non-blocking setting failed, error %s\n", NetworkErrorString(WSAGetLastError()).c_str()); #else if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR) - printf("ConnectSocket() : fcntl non-blocking setting failed, error %d\n", errno); + printf("ConnectSocket() : fcntl non-blocking setting failed, error %s\n", NetworkErrorString(errno).c_str()); #endif // Add node @@ -939,7 +939,7 @@ void ThreadSocketHandler2(void* parg) if (have_fds) { int nErr = WSAGetLastError(); - printf("socket select error %d\n", nErr); + printf("socket select error %s\n", NetworkErrorString(nErr).c_str()); for (unsigned int i = 0; i <= hSocketMax; i++) FD_SET(i, &fdsetRecv); } @@ -976,7 +976,7 @@ void ThreadSocketHandler2(void* parg) { int nErr = WSAGetLastError(); if (nErr != WSAEWOULDBLOCK) - printf("socket error accept failed: %d\n", nErr); + printf("socket error accept failed: %s\n", NetworkErrorString(nErr).c_str()); } else if (nInbound >= GetArgInt("-maxconnections", 125) - MAX_OUTBOUND_CONNECTIONS) { @@ -1063,7 +1063,7 @@ void ThreadSocketHandler2(void* parg) if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) { if (!pnode->fDisconnect) - printf("socket recv error %d\n", nErr); + printf("socket recv error %s\n", NetworkErrorString(nErr).c_str()); pnode->CloseSocketDisconnect(); } } @@ -1098,7 +1098,7 @@ void ThreadSocketHandler2(void* parg) int nErr = WSAGetLastError(); if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) { - printf("socket send error %d\n", nErr); + printf("socket send error %s\n", NetworkErrorString(nErr).c_str()); pnode->CloseSocketDisconnect(); } } @@ -1746,7 +1746,7 @@ bool BindListenPort(const CService &addrBind, string& strError) SOCKET hListenSocket = socket(((struct sockaddr*)&sockaddr)->sa_family, SOCK_STREAM, IPPROTO_TCP); if (hListenSocket == INVALID_SOCKET) { - strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError()); + strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %s)", NetworkErrorString(WSAGetLastError()).c_str()); printf("%s\n", strError.c_str()); return false; } @@ -1776,7 +1776,7 @@ bool BindListenPort(const CService &addrBind, string& strError) if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR) #endif { - strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError()); + strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %s)", NetworkErrorString(WSAGetLastError()).c_str()); printf("%s\n", strError.c_str()); CloseSocket(hListenSocket); return false; @@ -1816,7 +1816,7 @@ bool BindListenPort(const CService &addrBind, string& strError) if (nErr == WSAEADDRINUSE) strError = strprintf(_("Unable to bind to %s on this computer. NovaCoin is probably already running."), addrBind.ToString().c_str()); else - strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %d, %s)"), addrBind.ToString().c_str(), nErr, strerror(nErr)); + strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %s)"), addrBind.ToString().c_str(), NetworkErrorString(nErr).c_str()); printf("%s\n", strError.c_str()); CloseSocket(hListenSocket); return false; @@ -1826,7 +1826,7 @@ bool BindListenPort(const CService &addrBind, string& strError) // Listen for incoming connections if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR) { - strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError()); + strError = strprintf("Error: Listening for incoming connections failed (listen returned error %s)", NetworkErrorString(WSAGetLastError()).c_str()); printf("%s\n", strError.c_str()); CloseSocket(hListenSocket); return false; @@ -2016,7 +2016,7 @@ public: for(SOCKET hListenSocket : vhListenSocket) if (hListenSocket != INVALID_SOCKET) if (!CloseSocket(hListenSocket)) - printf("CloseSocket(hListenSocket) failed with error %d\n", WSAGetLastError()); + printf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()).c_str()); // clean up some globals (to help leak detection) for(CNode *pnode : vNodes) @@ -2099,6 +2099,7 @@ uint64_t CNode::GetTotalBytesSent() LOCK(cs_totalBytesSent); return nTotalBytesSent; } + int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) { return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5); } diff --git a/src/netbase.cpp b/src/netbase.cpp index 6268d38..7ee808a 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -328,7 +328,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe } if (nRet == SOCKET_ERROR) { - printf("select() for connection failed: %i\n",WSAGetLastError()); + printf("select() for connection failed: %s\n", NetworkErrorString(WSAGetLastError()).c_str()); CloseSocket(hSocket); return false; } @@ -339,13 +339,13 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR) #endif { - printf("getsockopt() for connection failed: %i\n",WSAGetLastError()); + printf("getsockopt() for connection failed: %s\n", NetworkErrorString(WSAGetLastError()).c_str()); CloseSocket(hSocket); return false; } if (nRet != 0) { - printf("connect() failed after select(): %s\n",strerror(nRet)); + printf("connect() failed after select(): %s\n", NetworkErrorString(nRet).c_str()); CloseSocket(hSocket); return false; } @@ -356,7 +356,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe else #endif { - printf("connect() failed: %i\n",WSAGetLastError()); + printf("connect() failed: %s\n", NetworkErrorString(WSAGetLastError()).c_str()); CloseSocket(hSocket); return false; } @@ -1088,6 +1088,40 @@ void CService::SetupPort(uint16_t portIn) port = portIn; } +#ifdef WIN32 +std::string NetworkErrorString(int err) +{ + char buf[256]; + buf[0] = 0; + if(FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, + NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + buf, sizeof(buf), NULL)) + { + return strprintf("%s (%d)", buf, err); + } + else + { + return strprintf("Unknown error (%d)", err); + } +} +#else +std::string NetworkErrorString(int err) +{ + char buf[256]; + const char *s = buf; + buf[0] = 0; + /* Too bad there are two incompatible implementations of the + * thread-safe strerror. */ +#ifdef STRERROR_R_CHAR_P /* GNU variant can return a pointer outside the passed buffer */ + s = strerror_r(err, buf, sizeof(buf)); +#else /* POSIX variant always returns message in buffer */ + if (strerror_r(err, buf, sizeof(buf))) + buf[0] = 0; +#endif + return strprintf("%s (%d)", s, err); +} +#endif + bool CloseSocket(SOCKET& hSocket) { if (hSocket == INVALID_SOCKET) diff --git a/src/netbase.h b/src/netbase.h index ae5a865..efa59f8 100644 --- a/src/netbase.h +++ b/src/netbase.h @@ -138,6 +138,8 @@ bool Lookup(const char *pszName, std::vector& vAddr, uint16_t portDefa bool LookupNumeric(const char *pszName, CService& addr, uint16_t portDefault = 0); bool ConnectSocket(const CService &addr, SOCKET& hSocketRet, int nTimeout = nConnectTimeout); bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest, uint16_t portDefault = 0, int nTimeout = nConnectTimeout); +/** Return readable error string for a network error code */ +std::string NetworkErrorString(int err); /** Close socket and set hSocket to INVALID_SOCKET */ bool CloseSocket(SOCKET& hSocket);