From e1b6b2219d2e5b44c50b9809a19321ee0d0c77db Mon Sep 17 00:00:00 2001 From: Gisle Vanem Date: Mon, 7 Dec 2015 14:27:29 -0500 Subject: [PATCH] lwip: Fix compatibility issues with later versions The name of the header guard in lwIP's has changed from '__LWIP_OPT_H__' to 'LWIP_HDR_OPT_H' (bug #35874 in May 2015). Other fixes: - In curl_setup.h, the problem with an old PSDK doesn't apply if lwIP is used. - In memdebug.h, the 'socket' should be undefined first due to lwIP's lwip_socket() macro. - In curl_addrinfo.c lwIP's getaddrinfo() + freeaddrinfo() macros need special handling because they were undef'ed in memdebug.h. - In select.c we can't use preprocessor conditionals inside select if MSVC and select is a macro, as it is with lwIP. http://curl.haxx.se/mail/lib-2015-12/0023.html http://curl.haxx.se/mail/lib-2015-12/0024.html --- include/curl/curl.h | 5 +++-- lib/curl_addrinfo.c | 8 ++++++++ lib/curl_setup.h | 5 +++-- lib/memdebug.h | 1 + lib/select.c | 20 ++++++++++---------- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/include/curl/curl.h b/include/curl/curl.h index 26d178e13..7fd533e51 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -56,7 +56,8 @@ #include #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) -#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || defined(__LWIP_OPT_H__)) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ + defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) /* The check above prevents the winsock2 inclusion if winsock.h already was included, since they can't co-exist without problems */ #include @@ -112,7 +113,7 @@ typedef void CURL; #ifndef curl_socket_typedef /* socket typedef */ -#if defined(WIN32) && !defined(__LWIP_OPT_H__) +#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) typedef SOCKET curl_socket_t; #define CURL_SOCKET_BAD INVALID_SOCKET #else diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c index 6627a6b96..17ee95858 100644 --- a/lib/curl_addrinfo.c +++ b/lib/curl_addrinfo.c @@ -521,7 +521,11 @@ void curl_dofreeaddrinfo(struct addrinfo *freethis, int line, const char *source) { +#ifdef USE_LWIPSOCK + lwip_freeaddrinfo(freethis); +#else (freeaddrinfo)(freethis); +#endif curl_memlog("ADDR %s:%d freeaddrinfo(%p)\n", source, line, (void *)freethis); } @@ -544,7 +548,11 @@ curl_dogetaddrinfo(const char *hostname, struct addrinfo **result, int line, const char *source) { +#ifdef USE_LWIPSOCK + int res=lwip_getaddrinfo(hostname, service, hints, result); +#else int res=(getaddrinfo)(hostname, service, hints, result); +#endif if(0 == res) /* success */ curl_memlog("ADDR %s:%d getaddrinfo() = %p\n", diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 9f511f228..5f85b4fba 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -481,9 +481,10 @@ /* * msvc 6.0 requires PSDK in order to have INET6_ADDRSTRLEN * defined in ws2tcpip.h as well as to provide IPv6 support. + * Does not apply if lwIP is used. */ -#if defined(_MSC_VER) && !defined(__POCC__) +#if defined(_MSC_VER) && !defined(__POCC__) && !defined(USE_LWIPSOCK) # if !defined(HAVE_WS2TCPIP_H) || \ ((_MSC_VER < 1300) && !defined(INET6_ADDRSTRLEN)) # undef HAVE_GETADDRINFO_THREADSAFE @@ -675,7 +676,7 @@ int netware_init(void); * Ensure that Winsock and lwIP TCP/IP stacks are not mixed. */ -#if defined(__LWIP_OPT_H__) +#if defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H) # if defined(SOCKET) || \ defined(USE_WINSOCK) || \ defined(HAVE_WINSOCK_H) || \ diff --git a/lib/memdebug.h b/lib/memdebug.h index cfac1e077..8f2ffc240 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -103,6 +103,7 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source); # endif #endif +#undef socket #define socket(domain,type,protocol)\ curl_socket(domain, type, protocol, __LINE__, __FILE__) #undef accept /* for those with accept as a macro */ diff --git a/lib/select.c b/lib/select.c index 24dc5fd79..5d1639747 100644 --- a/lib/select.c +++ b/lib/select.c @@ -316,15 +316,15 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ curl_socket_t is unsigned in such cases and thus -1 is the largest value). */ +#ifdef USE_WINSOCK r = select((int)maxfd + 1, -#ifndef USE_WINSOCK - &fds_read, - &fds_write, -#else fds_read.fd_count ? &fds_read : NULL, fds_write.fd_count ? &fds_write : NULL, -#endif &fds_err, ptimeout); +#else + r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); +#endif + if(r != -1) break; error = SOCKERRNO; @@ -505,19 +505,19 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) pending_tv.tv_sec = 0; pending_tv.tv_usec = 0; } + +#ifdef USE_WINSOCK r = select((int)maxfd + 1, -#ifndef USE_WINSOCK - &fds_read, &fds_write, &fds_err, -#else /* WinSock select() can't handle fd_sets with zero bits set, so don't give it such arguments. See the comment about this in Curl_check_socket(). */ fds_read.fd_count ? &fds_read : NULL, fds_write.fd_count ? &fds_write : NULL, - fds_err.fd_count ? &fds_err : NULL, + fds_err.fd_count ? &fds_err : NULL, ptimeout); +#else + r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); #endif - ptimeout); if(r != -1) break; error = SOCKERRNO;