Browse Source

Fix setsockopt incompatible pointer type error on Windows with GCC 14+

GCC 14+ treats -Wincompatible-pointer-types as an error by default.
On Windows, setsockopt() expects const char* for the option value and
socket timeouts use DWORD (milliseconds) instead of struct timeval.

This fixes the build with MinGW GCC 14+.
pull/4/merge^2
Leslie P. Polzer 4 months ago committed by staphen
parent
commit
eb56c9f4f5
No known key found for this signature in database
GPG Key ID: E6D757EEF0CE235F
  1. 24
      ext/miniupnpc/connecthostport.c

24
ext/miniupnpc/connecthostport.c

@ -74,7 +74,11 @@ int connecthostport(const char * host, unsigned short port,
struct addrinfo hints;
#endif /* #ifdef USE_GETHOSTBYNAME */
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
#ifdef _WIN32
DWORD timeout;
#else
struct timeval timeout;
#endif
#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
#ifdef USE_GETHOSTBYNAME
@ -94,15 +98,25 @@ int connecthostport(const char * host, unsigned short port,
}
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
/* setting a 3 seconds timeout for the connect() call */
#ifdef _WIN32
timeout = 3000; /* milliseconds */
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)) < 0)
#else
timeout.tv_sec = 3;
timeout.tv_usec = 0;
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
#endif
{
PRINT_SOCKET_ERROR("setsockopt SO_RCVTIMEO");
}
#ifdef _WIN32
timeout = 3000; /* milliseconds */
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (const char *)&timeout, sizeof(timeout)) < 0)
#else
timeout.tv_sec = 3;
timeout.tv_usec = 0;
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
#endif
{
PRINT_SOCKET_ERROR("setsockopt SO_SNDTIMEO");
}
@ -193,15 +207,25 @@ int connecthostport(const char * host, unsigned short port,
}
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
/* setting a 3 seconds timeout for the connect() call */
#ifdef _WIN32
timeout = 3000; /* milliseconds */
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)) < 0)
#else
timeout.tv_sec = 3;
timeout.tv_usec = 0;
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
#endif
{
PRINT_SOCKET_ERROR("setsockopt");
}
#ifdef _WIN32
timeout = 3000; /* milliseconds */
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (const char *)&timeout, sizeof(timeout)) < 0)
#else
timeout.tv_sec = 3;
timeout.tv_usec = 0;
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
#endif
{
PRINT_SOCKET_ERROR("setsockopt");
}

Loading…
Cancel
Save