[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2] win32: don't force _WIN32_WINNT to a lower version
From: |
Bruno Haible |
Subject: |
Re: [PATCH v2] win32: don't force _WIN32_WINNT to a lower version |
Date: |
Thu, 28 May 2020 02:12:30 +0200 |
User-agent: |
KMail/5.1.3 (Linux/4.4.0-177-generic; KDE/5.18.0; x86_64; ; ) |
Hi Steve,
> When building for UWP it's particularly important as a lot of APIs may
> be hidden if you use the proper values and they are hidden because you
> shouldn't use them. Forcing to use them when they shouldn't will lead to
> apps that don't run.
Oh, so Microsoft is not only adding new APIs from one version to the next,
but sometimes also removing APIs. Indeed, the Microsoft doc says this:
"Over the years, Windows APIs and data types have been added, and
sometimes changed or removed."
<https://docs.microsoft.com/en-us/cpp/porting/overview-of-potential-upgrade-issues-visual-cpp>
Applied like this. (I couldn't take your patch as-is, because in Gnulib
we indent preprocessor lines in a particular way.)
2020-05-27 Bruno Haible <bruno@clisp.org>
Improve pattern for defining _WIN32_WINNT.
Newer versions of the Windows API may not only add, but also remove API
functions. Therefore, when the user is e.g. building for Windows 10, we
should not set _WIN32_WINNT to e.g. Windows 8, as this may enable the
use of APIs that were present in Windows 8 but removed in Windows 10.
Suggested by Steve Lhomme <robux4@ycbcr.xyz> in
<https://lists.gnu.org/archive/html/bug-gnulib/2020-05/msg00318.html>.
* lib/ftruncate.c (_WIN32_WINNT): Don't set to a smaller value.
* lib/sethostname.c (_WIN32_WINNT): Likewise.
* lib/stat-w32.c (_WIN32_WINNT): Likewise.
diff --git a/lib/ftruncate.c b/lib/ftruncate.c
index a185637..2514075 100644
--- a/lib/ftruncate.c
+++ b/lib/ftruncate.c
@@ -30,8 +30,10 @@
argument. So, define a 64-bit safe SetFileSize function ourselves. */
/* Ensure that <windows.h> declares GetFileSizeEx. */
-# undef _WIN32_WINNT
-# define _WIN32_WINNT _WIN32_WINNT_WIN2K
+# if !defined _WIN32_WINNT || (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
+# undef _WIN32_WINNT
+# define _WIN32_WINNT _WIN32_WINNT_WIN2K
+# endif
/* Get declarations of the native Windows API functions. */
# define WIN32_LEAN_AND_MEAN
diff --git a/lib/sethostname.c b/lib/sethostname.c
index 1be69be..96318fb 100644
--- a/lib/sethostname.c
+++ b/lib/sethostname.c
@@ -23,11 +23,11 @@
/* Unix API. */
/* Specification. */
-#include <unistd.h>
+# include <unistd.h>
-#include <errno.h>
-#include <stdio.h>
-#include <limits.h>
+# include <errno.h>
+# include <stdio.h>
+# include <limits.h>
/* Set up to LEN chars of NAME as system hostname.
Return 0 if ok, set errno and return -1 on error. */
@@ -43,7 +43,7 @@ sethostname (const char *name, size_t len)
return -1;
}
-#ifdef __minix /* Minix */
+# ifdef __minix /* Minix */
{
FILE *hostf;
int r = 0;
@@ -76,38 +76,40 @@ sethostname (const char *name, size_t len)
return r;
}
-#else
+# else
/* For platforms that we don't have a better option for, simply bail
out. */
errno = ENOSYS;
return -1;
-#endif
+# endif
}
#else
/* Native Windows API. Also used on Cygwin. */
/* Ensure that <windows.h> declares SetComputerNameEx. */
-#undef _WIN32_WINNT
-#define _WIN32_WINNT _WIN32_WINNT_WIN2K
+# if !defined _WIN32_WINNT || (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
+# undef _WIN32_WINNT
+# define _WIN32_WINNT _WIN32_WINNT_WIN2K
+# endif
-#define WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
/* Specification. */
-#include <unistd.h>
+# include <unistd.h>
-#include <errno.h>
-#include <limits.h>
-#include <string.h>
+# include <errno.h>
+# include <limits.h>
+# include <string.h>
-#include <windows.h>
+# include <windows.h>
/* The mingw header files don't define GetComputerNameEx, SetComputerNameEx.
*/
-#ifndef GetComputerNameEx
-# define GetComputerNameEx GetComputerNameExA
-#endif
-#ifndef SetComputerNameEx
-# define SetComputerNameEx SetComputerNameExA
-#endif
+# ifndef GetComputerNameEx
+# define GetComputerNameEx GetComputerNameExA
+# endif
+# ifndef SetComputerNameEx
+# define SetComputerNameEx SetComputerNameExA
+# endif
/* Set up to LEN chars of NAME as system hostname.
Return 0 if ok, set errno and return -1 on error. */
diff --git a/lib/stat-w32.c b/lib/stat-w32.c
index 296ccf1..c4b5de9 100644
--- a/lib/stat-w32.c
+++ b/lib/stat-w32.c
@@ -21,8 +21,10 @@
#if defined _WIN32 && ! defined __CYGWIN__
/* Ensure that <windows.h> defines FILE_ID_INFO. */
-#undef _WIN32_WINNT
-#define _WIN32_WINNT _WIN32_WINNT_WIN8
+#if !defined _WIN32_WINNT || (_WIN32_WINNT < _WIN32_WINNT_WIN8)
+# undef _WIN32_WINNT
+# define _WIN32_WINNT _WIN32_WINNT_WIN8
+#endif
#include <sys/types.h>
#include <sys/stat.h>