From a164390d1fffb43a0bf5a321a2ea03e92ed6cdeb Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 27 Jan 2021 08:20:05 +0100 Subject: [PATCH] w32: Modernize for MinGW 6.0.0, and clean up We provide gettimeofday() only #ifdef _MSC_VER, but declare it unconditionally in our own sys/time.h. This is asking for trouble. Declare it only #ifdef _MSC_VER, else pull in MinGW's sys/time.h with #include_next. Likewise, define macros ftruncate(), S_IRUSR & friends in our own unistd.h only #ifdef _MSC_VER, else pull in MinGW's unistd.h with #include_next. The #include is now useless, drop. src/lib/commands/info.c relies on sys/time.h including windows.h. Unclean, and no longer the case with MinGW. Include it directly. MinGW provides EWOULDBLOCK. Drop our replacement. MinGW provides inet_ntop() in ws2tcpip.h, but only if feature test macro _WIN32_WINNT >= 0x600, i.e. Windows Vista or later. It defaults to 0x0502 (Windows Server 2003). Make configure #define _WIN32_WINNT 0x0601 in config.h. This requests Windows 7. Trying to support Vista feels unwise. Include ws2tcpip.h, and drop our replacement. Signed-off-by: Markus Armbruster --- m4/my_windows_api.m4 | 2 ++ src/lib/commands/info.c | 4 +++- src/lib/w32/arpa/inet.h | 5 +---- src/lib/w32/getrusage.c | 2 +- src/lib/w32/sys/time.h | 6 ++++++ src/lib/w32/unistd.h | 14 ++++++++++---- src/lib/w32/w32misc.h | 9 +++------ src/lib/w32/w32sockets.c | 37 ------------------------------------- 8 files changed, 26 insertions(+), 53 deletions(-) diff --git a/m4/my_windows_api.m4 b/m4/my_windows_api.m4 index 63a2af622..7bcabfc6f 100644 --- a/m4/my_windows_api.m4 +++ b/m4/my_windows_api.m4 @@ -12,6 +12,8 @@ AC_DEFUN([MY_WINDOWS_API], AC_DEFINE([WINDOWS], 1, [Define if compiling for Windows API]) AC_DEFINE([WIN32_LEAN_AND_MEAN], 1, [Define to make Windows includes pull in less junk]) + AC_DEFINE([_WIN32_WINNT], 0x0601, + [Request Windows 7]) LIBS_SOCKETS="-lws2_32" else LIBS_SOCKETS= diff --git a/src/lib/commands/info.c b/src/lib/commands/info.c index 39842159e..0cac8d159 100644 --- a/src/lib/commands/info.c +++ b/src/lib/commands/info.c @@ -40,7 +40,9 @@ #include #include #include -#if !defined(_WIN32) +#ifdef _WIN32 +#include +#else #include #include #endif diff --git a/src/lib/w32/arpa/inet.h b/src/lib/w32/arpa/inet.h index 97a19a4ce..de78f4340 100644 --- a/src/lib/w32/arpa/inet.h +++ b/src/lib/w32/arpa/inet.h @@ -33,9 +33,6 @@ #ifndef ARPA_INET_H #define ARPA_INET_H -#include "sys/socket.h" - -extern const char *inet_ntop(int af, const void *src, char *dst, - socklen_t cnt); +#include "ws2tcpip.h" #endif /* ARPA_INET_H */ diff --git a/src/lib/w32/getrusage.c b/src/lib/w32/getrusage.c index 4a657aa20..8c3a0bbce 100644 --- a/src/lib/w32/getrusage.c +++ b/src/lib/w32/getrusage.c @@ -33,7 +33,7 @@ #include -#include +#include #include "sys/resource.h" int diff --git a/src/lib/w32/sys/time.h b/src/lib/w32/sys/time.h index cdc6b67b5..4e3c12445 100644 --- a/src/lib/w32/sys/time.h +++ b/src/lib/w32/sys/time.h @@ -33,9 +33,15 @@ #ifndef SYS_TIME_H #define SYS_TIME_H +#ifdef _MSC_VER + /* include winsock2.h thru sys/socket.h to get struct timeval */ #include "sys/socket.h" extern int gettimeofday(struct timeval *tv, void *tz); +#else /* !_MSC_VER */ +#include_next +#endif + #endif /* SYS_TIME_H */ diff --git a/src/lib/w32/unistd.h b/src/lib/w32/unistd.h index 2e24d49eb..8e594ad85 100644 --- a/src/lib/w32/unistd.h +++ b/src/lib/w32/unistd.h @@ -46,7 +46,6 @@ * here. Major name space pollution, can't be helped. */ #include -#include #include #include #include @@ -60,6 +59,7 @@ extern int w32_mkdir(const char *dirname, mode_t perm); /* Should be in sys/stat.h */ +#ifdef _MSC_VER #ifndef S_IRUSR #define S_IRUSR _S_IREAD #define S_IWUSR _S_IWRITE @@ -78,22 +78,28 @@ extern int w32_mkdir(const char *dirname, mode_t perm); #define S_IXOTH 0 #define S_IRWXO S_IROTH | S_IWOTH | S_IXOTH #endif +#endif /* Should be in fcntl.h */ +/* HACK, for use with fcntl() on a socket only, see w32sockets.c */ #define O_NONBLOCK 1 - #define F_GETFL 1 #define F_SETFL 2 - extern int fcntl(int fd, int cmd, ...); /* Stuff that actually belongs here */ #define close(fd) w32_close_function((fd)) extern int (*w32_close_function)(int); -#define ftruncate(fd, length) _chsize((fd), (length)) #define read(fd, buf, sz) w32_read_function((fd), (buf), (sz)) extern int (*w32_read_function)(int, void *, unsigned); #define write(fd, buf, sz) w32_write_function((fd), (buf), (sz)) extern int (*w32_write_function)(int, const void *, unsigned); +#ifdef _MSC_VER +#define ftruncate(fd, length) _chsize((fd), (length)) +#endif + +#ifndef _MSC_VER +#include_next +#endif #endif /* UNISTD_H */ diff --git a/src/lib/w32/w32misc.h b/src/lib/w32/w32misc.h index 8a27a384e..fb3346682 100644 --- a/src/lib/w32/w32misc.h +++ b/src/lib/w32/w32misc.h @@ -28,7 +28,7 @@ * * Known contributors to this file: * Ron Koenderink, 2007 - * Markus Armbruster, 2007-2013 + * Markus Armbruster, 2007-2021 */ /* @@ -44,16 +44,13 @@ #ifdef _MSC_VER /* integral mismatch, due to misuse of sector short */ #pragma warning (disable : 4761 ) +#endif /* strings.h */ +#ifdef _MSC_VER #define strncasecmp(s1, s2, s3) _strnicmp((s1), (s2), (s3)) #endif /* _MSC_VER */ -/* errno.h */ -#ifndef EWOULDBLOCK -#define EWOULDBLOCK EAGAIN -#endif - /* fcntl.h */ #ifdef _MSC_VER #define O_ACCMODE (_O_RDONLY|_O_WRONLY|_O_RDWR) diff --git a/src/lib/w32/w32sockets.c b/src/lib/w32/w32sockets.c index 3d80a2dae..f1c36ccef 100644 --- a/src/lib/w32/w32sockets.c +++ b/src/lib/w32/w32sockets.c @@ -232,43 +232,6 @@ w32_socket(int domain, int type, int protocol) return W32_SOCKET_TO_FD(sock); } -#ifdef HAVE_GETADDRINFO -const char * -inet_ntop(int af, const void *src, char *dst, socklen_t len) -{ - struct sockaddr *sa; - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - size_t salen; - - if (af == AF_INET) { - memset(&sin, 0, sizeof(sin)); - sin.sin_family = af; - memcpy(&sin.sin_addr, src, sizeof(sin.sin_addr)); - sa = (struct sockaddr *)&sin; - salen = sizeof(sin); - } else if (af == AF_INET6) { - memset(&sin6, 0, sizeof(sin6)); - sin6.sin6_family = af; - memcpy(&sin6.sin6_addr, src, sizeof(sin6.sin6_addr)); - sa = (struct sockaddr *)&sin6; - salen = sizeof(sin6); - } else { - WSASetLastError(WSAEAFNOSUPPORT); - w32_set_winsock_errno(); - return NULL; - } - - if (getnameinfo(sa, salen, dst, len, NULL, 0, NI_NUMERICHOST)) { - WSASetLastError(WSAEAFNOSUPPORT); - w32_set_winsock_errno(); - return NULL; - } - - return dst; -} -#endif - /* * POSIX equivalent for fcntl(). * Horrible hacks, just good enough support Empire's use of fcntl(). -- 2.43.0