bug-gnulib
[Top][All Lists]
Advanced

[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>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]