W dniu 05.01.2019 o 20:59, Johannes Pfau pisze:
> Am 05.01.19 um 18:56 schrieb Mateusz:
>> ucrtbase.dll is affected too (msvcr100 works OK), so maybe it is better to 
>> add your access() function to msvcr110/120 and ucrtbase (as a replacement) 
>> instead of patching GCC.
>>
>> Regards,
>> Mateusz
>>
>>
> Maybe it would make sense to add this in crt/io.h? There's already a 
> __USE_MINGW_ACCESS guarded __mingw_access wrapper function which could be 
> extended. And as far as I can see, GCC already sets the __USE_MINGW_ACCESS 
> define, so it likely wouldn't need any changes.
I've attached patch to mingw-w64 that replaces _access in msvcr110/120 and 
ucrtbase with Liu Hao version (for me it is too big for inline).

After patching mingw-w64 (and before building) please go to mingw-w64-crt 
folder and execute
aclocal
automake
to regenerate makefiles.

This patch changes only lib files -- it should work.

Regards,
Mateusz
From 71f1504a4181d38118b4d7924f6b6fee0b3d275e Mon Sep 17 00:00:00 2001
From: Mateusz Brzostek <mateu...@poczta.onet.pl>
Date: Sun, 6 Jan 2019 00:54:25 +0100
Subject: [PATCH] Add _access function that works for nul file to msvcr110/120
 and ucrtbase libs

Original implementation
Liu Hao <lh_mo...@126.com>

Signed-off-by: Mateusz Brzostek <mateu...@poczta.onet.pl>
---
 mingw-w64-crt/Makefile.am                        |  23 ++--
 mingw-w64-crt/def-include/msvcr110-common.def.in | 144 +++++++++++++++++++++++
 mingw-w64-crt/lib-common/ucrtbase.def.in         |   4 +-
 mingw-w64-crt/lib32/msvcr110.def.in              |   4 +-
 mingw-w64-crt/lib32/msvcr120.def.in              |   4 +-
 mingw-w64-crt/lib32/msvcr120_app.def.in          |   4 +-
 mingw-w64-crt/lib32/msvcr120d.def.in             |   4 +-
 mingw-w64-crt/lib64/msvcr110.def.in              |   4 +-
 mingw-w64-crt/lib64/msvcr120.def.in              |   4 +-
 mingw-w64-crt/lib64/msvcr120_app.def.in          |   4 +-
 mingw-w64-crt/lib64/msvcr120d.def.in             |   4 +-
 mingw-w64-crt/stdio/access.c                     |  65 ++++++++++
 12 files changed, 241 insertions(+), 27 deletions(-)
 create mode 100644 mingw-w64-crt/def-include/msvcr110-common.def.in
 create mode 100644 mingw-w64-crt/stdio/access.c

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index f8b0623..5c0b421 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -213,6 +213,10 @@ src_msvcrt=\
   stdio/fseeki64.c \
   stdio/mingw_lock.c
 
+src_msvcr110=\
+  $(src_msvcrt_common) \
+  stdio/access.c
+
 src_ucrtbase=\
   crt/ucrtbase_compat.c \
   stdio/ucrt_fprintf.c \
@@ -226,7 +230,8 @@ src_ucrtbase=\
   stdio/ucrt_vfprintf.c \
   stdio/ucrt_vprintf.c \
   stdio/ucrt_vsnprintf.c \
-  stdio/ucrt_vsprintf.c
+  stdio/ucrt_vsprintf.c \
+  stdio/access.c
 
 src_msvcrt32=\
   $(src_msvcrt) \
@@ -709,25 +714,25 @@ lib32_libmsvcr100_a_CPPFLAGS=$(CPPFLAGS32) 
-D__LIBMSVCRT__ $(extra_include) $(sy
 EXTRA_lib32_libmsvcr100_a_DEPENDENCIES=lib32/msvcr100.def
 
 lib32_LIBRARIES += lib32/libmsvcr110.a
-lib32_libmsvcr110_a_SOURCES = $(src_msvcrt_common) lib32/msvcr110.def.in
+lib32_libmsvcr110_a_SOURCES = $(src_msvcr110) lib32/msvcr110.def.in
 lib32_libmsvcr110_a_AR = $(DTDEF32) lib32/msvcr110.def && $(AR) $(ARFLAGS)
 lib32_libmsvcr110_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
 EXTRA_lib32_libmsvcr110_a_DEPENDENCIES=lib32/msvcr110.def
 
 lib32_LIBRARIES += lib32/libmsvcr120.a
-lib32_libmsvcr120_a_SOURCES = $(src_msvcrt_common) lib32/msvcr120.def.in
+lib32_libmsvcr120_a_SOURCES = $(src_msvcr110) lib32/msvcr120.def.in
 lib32_libmsvcr120_a_AR = $(DTDEF32) lib32/msvcr120.def && $(AR) $(ARFLAGS)
 lib32_libmsvcr120_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
 EXTRA_lib32_libmsvcr120_a_DEPENDENCIES=lib32/msvcr120.def
 
 lib32_LIBRARIES += lib32/libmsvcr120d.a
-lib32_libmsvcr120d_a_SOURCES = $(src_msvcrt_common) lib32/msvcr120d.def.in
+lib32_libmsvcr120d_a_SOURCES = $(src_msvcr110) lib32/msvcr120d.def.in
 lib32_libmsvcr120d_a_AR = $(DTDEF32) lib32/msvcr120d.def && $(AR) $(ARFLAGS)
 lib32_libmsvcr120d_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
 EXTRA_lib32_libmsvcr120d_a_DEPENDENCIES=lib32/msvcr120d.def
 
 lib32_LIBRARIES += lib32/libmsvcr120_app.a
-lib32_libmsvcr120_app_a_SOURCES = $(src_msvcrt_common) 
lib32/msvcr120_app.def.in
+lib32_libmsvcr120_app_a_SOURCES = $(src_msvcr110) lib32/msvcr120_app.def.in
 lib32_libmsvcr120_app_a_AR = $(DTDEF32) lib32/msvcr120_app.def && $(AR) 
$(ARFLAGS)
 lib32_libmsvcr120_app_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ 
$(extra_include) $(sysincludes)
 EXTRA_lib32_libmsvcr120_app_a_DEPENDENCIES=lib32/msvcr120_app.def
@@ -1046,25 +1051,25 @@ lib64_libmsvcr100_a_CPPFLAGS=$(CPPFLAGS64) 
-D__LIBMSVCRT__ $(extra_include) $(sy
 EXTRA_lib64_libmsvcr100_a_DEPENDENCIES=lib64/msvcr100.def
 
 lib64_LIBRARIES += lib64/libmsvcr110.a
-lib64_libmsvcr110_a_SOURCES = $(src_msvcrt_common) lib64/msvcr110.def.in
+lib64_libmsvcr110_a_SOURCES = $(src_msvcr110) lib64/msvcr110.def.in
 lib64_libmsvcr110_a_AR = $(DTDEF64) lib64/msvcr110.def && $(AR) $(ARFLAGS)
 lib64_libmsvcr110_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
 EXTRA_lib64_libmsvcr110_a_DEPENDENCIES=lib64/msvcr110.def
 
 lib64_LIBRARIES += lib64/libmsvcr120.a
-lib64_libmsvcr120_a_SOURCES = $(src_msvcrt_common) lib64/msvcr120.def.in
+lib64_libmsvcr120_a_SOURCES = $(src_msvcr110) lib64/msvcr120.def.in
 lib64_libmsvcr120_a_AR = $(DTDEF64) lib64/msvcr120.def && $(AR) $(ARFLAGS)
 lib64_libmsvcr120_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
 EXTRA_lib64_libmsvcr120_a_DEPENDENCIES=lib64/msvcr120.def
 
 lib64_LIBRARIES += lib64/libmsvcr120d.a
-lib64_libmsvcr120d_a_SOURCES = $(src_msvcrt_common) lib64/msvcr120d.def.in
+lib64_libmsvcr120d_a_SOURCES = $(src_msvcr110) lib64/msvcr120d.def.in
 lib64_libmsvcr120d_a_AR = $(DTDEF64) lib64/msvcr120d.def && $(AR) $(ARFLAGS)
 lib64_libmsvcr120d_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
 EXTRA_lib64_libmsvcr120d_a_DEPENDENCIES=lib64/msvcr120d.def
 
 lib64_LIBRARIES += lib64/libmsvcr120_app.a
-lib64_libmsvcr120_app_a_SOURCES = $(src_msvcrt_common) 
lib64/msvcr120_app.def.in
+lib64_libmsvcr120_app_a_SOURCES = $(src_msvcr110) lib64/msvcr120_app.def.in
 lib64_libmsvcr120_app_a_AR = $(DTDEF64) lib64/msvcr120_app.def && $(AR) 
$(ARFLAGS)
 lib64_libmsvcr120_app_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ 
$(extra_include) $(sysincludes)
 EXTRA_lib64_libmsvcr120_app_a_DEPENDENCIES=lib64/msvcr120_app.def
diff --git a/mingw-w64-crt/def-include/msvcr110-common.def.in 
b/mingw-w64-crt/def-include/msvcr110-common.def.in
new file mode 100644
index 0000000..6819382
--- /dev/null
+++ b/mingw-w64-crt/def-include/msvcr110-common.def.in
@@ -0,0 +1,144 @@
+#define ADD_UNDERSCORE(symbol) symbol == _ ## symbol
+#define ADD_DOUBLE_UNDERSCORE(symbol) symbol == __ ## symbol
+
+ADD_DOUBLE_UNDERSCORE(iscsymf)
+ADD_DOUBLE_UNDERSCORE(iscsym)
+ADD_DOUBLE_UNDERSCORE(isascii)
+ADD_DOUBLE_UNDERSCORE(toascii)
+
+wcscmpi == _wcsicmp
+strcasecmp == _stricmp
+strncasecmp == _strnicmp
+
+ADD_UNDERSCORE(chdir)
+ADD_UNDERSCORE(chmod)
+ADD_UNDERSCORE(chsize)
+ADD_UNDERSCORE(close)
+ADD_UNDERSCORE(creat)
+ADD_UNDERSCORE(cwait)
+ADD_UNDERSCORE(dup)
+ADD_UNDERSCORE(dup2)
+ADD_UNDERSCORE(ecvt)
+ADD_UNDERSCORE(eof)
+ADD_UNDERSCORE(execl)
+ADD_UNDERSCORE(execle)
+ADD_UNDERSCORE(execlp)
+ADD_UNDERSCORE(execlpe)
+ADD_UNDERSCORE(execv)
+ADD_UNDERSCORE(execve)
+ADD_UNDERSCORE(execvp)
+ADD_UNDERSCORE(execvpe)
+ADD_UNDERSCORE(fcvt)
+ADD_UNDERSCORE(fdopen)
+ADD_UNDERSCORE(fgetchar)
+ADD_UNDERSCORE(fgetwchar)
+ADD_UNDERSCORE(filelength)
+ADD_UNDERSCORE(fileno)
+; fpreset)
+ADD_UNDERSCORE(fputchar)
+ADD_UNDERSCORE(fputwchar)
+;fstat)
+;ftime)
+ADD_UNDERSCORE(gcvt)
+ADD_UNDERSCORE(getch)
+ADD_UNDERSCORE(getche)
+ADD_UNDERSCORE(getcwd)
+ADD_UNDERSCORE(getpid)
+ADD_UNDERSCORE(getw)
+ADD_UNDERSCORE(heapwalk)
+ADD_UNDERSCORE(isatty)
+ADD_UNDERSCORE(itoa)
+ADD_UNDERSCORE(kbhit)
+ADD_UNDERSCORE(lfind)
+ADD_UNDERSCORE(lsearch)
+ADD_UNDERSCORE(lseek)
+ADD_UNDERSCORE(ltoa)
+ADD_UNDERSCORE(memccpy)
+ADD_UNDERSCORE(memicmp)
+ADD_UNDERSCORE(mkdir)
+ADD_UNDERSCORE(mktemp)
+ADD_UNDERSCORE(open)
+ADD_UNDERSCORE(pclose)
+ADD_UNDERSCORE(popen)
+ADD_UNDERSCORE(putch)
+ADD_UNDERSCORE(putenv)
+ADD_UNDERSCORE(putw)
+ADD_UNDERSCORE(read)
+ADD_UNDERSCORE(rmdir)
+ADD_UNDERSCORE(rmtmp)
+ADD_UNDERSCORE(searchenv)
+ADD_UNDERSCORE(setmode)
+ADD_UNDERSCORE(sopen)
+ADD_UNDERSCORE(spawnl)
+ADD_UNDERSCORE(spawnle)
+ADD_UNDERSCORE(spawnlp)
+ADD_UNDERSCORE(spawnlpe)
+ADD_UNDERSCORE(spawnv)
+ADD_UNDERSCORE(spawnve)
+ADD_UNDERSCORE(spawnvp)
+ADD_UNDERSCORE(spawnvpe)
+;stat)
+#ifndef UCRTBASE
+ADD_UNDERSCORE(strcmpi)
+#endif
+ADD_UNDERSCORE(strdup)
+ADD_UNDERSCORE(stricmp)
+ADD_UNDERSCORE(stricoll)
+ADD_UNDERSCORE(strlwr)
+ADD_UNDERSCORE(strnicmp)
+ADD_UNDERSCORE(strnset)
+ADD_UNDERSCORE(strrev)
+ADD_UNDERSCORE(strset)
+ADD_UNDERSCORE(strupr)
+ADD_UNDERSCORE(swab)
+ADD_UNDERSCORE(tell)
+ADD_UNDERSCORE(tempnam)
+#ifndef UCRTBASE
+ADD_UNDERSCORE(tzset)
+#endif
+ADD_UNDERSCORE(umask)
+ADD_UNDERSCORE(ungetch)
+ADD_UNDERSCORE(unlink)
+#ifndef UCRTBASE
+ADD_UNDERSCORE(utime)
+#endif
+ADD_UNDERSCORE(wcsdup)
+ADD_UNDERSCORE(wcsicmp)
+ADD_UNDERSCORE(wcsicoll)
+ADD_UNDERSCORE(wcslwr)
+ADD_UNDERSCORE(wcsnicmp)
+ADD_UNDERSCORE(wcsnset)
+ADD_UNDERSCORE(wcsrev)
+ADD_UNDERSCORE(wcsset)
+ADD_UNDERSCORE(wcsupr)
+ADD_UNDERSCORE(wpopen)
+ADD_UNDERSCORE(write)
+; non-ANSI functions declared in math.h
+ADD_UNDERSCORE(j0)
+ADD_UNDERSCORE(j1)
+ADD_UNDERSCORE(jn)
+ADD_UNDERSCORE(y0)
+ADD_UNDERSCORE(y1)
+ADD_UNDERSCORE(yn)
+ADD_UNDERSCORE(chgsign)
+;scalb
+ADD_UNDERSCORE(finite)
+ADD_UNDERSCORE(fpclass)
+; C99 functions
+;cabs
+ADD_UNDERSCORE(hypot)
+;logb
+ADD_UNDERSCORE(nextafter)
+
+#ifndef UCRTBASE
+_daylight DATA
+_timezone DATA
+_tzname DATA
+ADD_UNDERSCORE(daylight)
+ADD_UNDERSCORE(timezone)
+ADD_UNDERSCORE(tzname)
+
+ADD_UNDERSCORE(vsnprintf_s)
+
+longjmp DATA
+#endif
diff --git a/mingw-w64-crt/lib-common/ucrtbase.def.in 
b/mingw-w64-crt/lib-common/ucrtbase.def.in
index d5e7a63..7a75e05 100644
--- a/mingw-w64-crt/lib-common/ucrtbase.def.in
+++ b/mingw-w64-crt/lib-common/ucrtbase.def.in
@@ -3,7 +3,7 @@ EXPORTS
 
 #include "func.def.in"
 #define UCRTBASE
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 #ifdef DEF_I386
 _CIacos
@@ -192,7 +192,7 @@ __wcserror
 __wcserror_s
 __wcsncnt
 _abs64
-_access
+; _access
 _access_s
 _aligned_free
 _aligned_malloc
diff --git a/mingw-w64-crt/lib32/msvcr110.def.in 
b/mingw-w64-crt/lib32/msvcr110.def.in
index 920677b..94154b7 100644
--- a/mingw-w64-crt/lib32/msvcr110.def.in
+++ b/mingw-w64-crt/lib32/msvcr110.def.in
@@ -6,7 +6,7 @@
 LIBRARY "MSVCR110.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 ; public: __thiscall Concurrency::details::<0x1ULL>::<0x1ULL>(void(__cdecl 
*)(void))
 ??0?$_SpinWait@$00@details@Concurrency@@QAE@P6AXXZ@Z ; has WINAPI (@4)
@@ -843,7 +843,7 @@ __wgetmainargs
 __winitenv DATA
 _abnormal_termination
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib32/msvcr120.def.in 
b/mingw-w64-crt/lib32/msvcr120.def.in
index c1e2af8..c7edc9e 100644
--- a/mingw-w64-crt/lib32/msvcr120.def.in
+++ b/mingw-w64-crt/lib32/msvcr120.def.in
@@ -6,7 +6,7 @@
 LIBRARY "MSVCR120.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 ; public: __thiscall Concurrency::details::<0x1ULL>::<0x1ULL>(void(__cdecl 
*)(void))
 ??0?$_SpinWait@$00@details@Concurrency@@QAE@P6AXXZ@Z ; has WINAPI (@4)
@@ -855,7 +855,7 @@ __wgetmainargs
 __winitenv DATA
 _abnormal_termination
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib32/msvcr120_app.def.in 
b/mingw-w64-crt/lib32/msvcr120_app.def.in
index b13d9a6..b031ea9 100644
--- a/mingw-w64-crt/lib32/msvcr120_app.def.in
+++ b/mingw-w64-crt/lib32/msvcr120_app.def.in
@@ -6,7 +6,7 @@
 LIBRARY "msvcr120_app.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 ??0?$_SpinWait@$00@details@Concurrency@@QAE@P6AXXZ@Z ; has WINAPI (@4)
 ??0?$_SpinWait@$0A@@details@Concurrency@@QAE@P6AXXZ@Z ; has WINAPI (@4)
@@ -507,7 +507,7 @@ __wgetmainargs
 __winitenv DATA
 _abnormal_termination
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib32/msvcr120d.def.in 
b/mingw-w64-crt/lib32/msvcr120d.def.in
index 385d491..30f58f6 100644
--- a/mingw-w64-crt/lib32/msvcr120d.def.in
+++ b/mingw-w64-crt/lib32/msvcr120d.def.in
@@ -6,7 +6,7 @@
 LIBRARY "MSVCR120D.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 ; public: __thiscall Concurrency::details::<0x1ULL>::<0x1ULL>(void(__cdecl 
*)(void))
 ??0?$_SpinWait@$00@details@Concurrency@@QAE@P6AXXZ@Z ; has WINAPI (@4)
@@ -894,7 +894,7 @@ __wgetmainargs
 __winitenv DATA
 _abnormal_termination
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib64/msvcr110.def.in 
b/mingw-w64-crt/lib64/msvcr110.def.in
index a412997..f2c3ecd 100644
--- a/mingw-w64-crt/lib64/msvcr110.def.in
+++ b/mingw-w64-crt/lib64/msvcr110.def.in
@@ -6,7 +6,7 @@
 LIBRARY "MSVCR110.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 $I10_OUTPUT
 ; public: __cdecl Concurrency::details::<0x1ULL>::<0x1ULL>(void(__cdecl 
*)(void))__ptr64 
@@ -803,7 +803,7 @@ __wcsncnt
 __wgetmainargs
 __winitenv DATA
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib64/msvcr120.def.in 
b/mingw-w64-crt/lib64/msvcr120.def.in
index 38d5af2..8276f53 100644
--- a/mingw-w64-crt/lib64/msvcr120.def.in
+++ b/mingw-w64-crt/lib64/msvcr120.def.in
@@ -6,7 +6,7 @@
 LIBRARY "MSVCR120.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 $I10_OUTPUT
 ; public: __cdecl Concurrency::details::<0x1ULL>::<0x1ULL>(void(__cdecl 
*)(void))__ptr64 
@@ -815,7 +815,7 @@ __wcsncnt
 __wgetmainargs
 __winitenv DATA
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib64/msvcr120_app.def.in 
b/mingw-w64-crt/lib64/msvcr120_app.def.in
index a5f6f77..f7a5793 100644
--- a/mingw-w64-crt/lib64/msvcr120_app.def.in
+++ b/mingw-w64-crt/lib64/msvcr120_app.def.in
@@ -6,7 +6,7 @@
 LIBRARY "msvcr120_app.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 $I10_OUTPUT
 ??0?$_SpinWait@$00@details@Concurrency@@QEAA@P6AXXZ@Z
@@ -468,7 +468,7 @@ __wcsncnt
 __wgetmainargs
 __winitenv DATA
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/lib64/msvcr120d.def.in 
b/mingw-w64-crt/lib64/msvcr120d.def.in
index df0425a..199cd7e 100644
--- a/mingw-w64-crt/lib64/msvcr120d.def.in
+++ b/mingw-w64-crt/lib64/msvcr120d.def.in
@@ -6,7 +6,7 @@
 LIBRARY "MSVCR120D.dll"
 EXPORTS
 
-#include "msvcrt-common.def.in"
+#include "msvcr110-common.def.in"
 
 $I10_OUTPUT
 ; public: __cdecl Concurrency::details::<0x1ULL>::<0x1ULL>(void(__cdecl 
*)(void))__ptr64 
@@ -852,7 +852,7 @@ __wcsncnt
 __wgetmainargs
 __winitenv DATA
 _abs64
-_access
+; _access
 _access_s
 _acmdln DATA
 _aligned_free
diff --git a/mingw-w64-crt/stdio/access.c b/mingw-w64-crt/stdio/access.c
new file mode 100644
index 0000000..b6dc0df
--- /dev/null
+++ b/mingw-w64-crt/stdio/access.c
@@ -0,0 +1,65 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <windows.h>
+#include <internal.h>
+
+#define        F_OK    0       /* Check for file existence */
+#define        X_OK    1       /* Check for execute permission. */
+#define        W_OK    2       /* Check for write permission */
+#define        R_OK    4       /* Check for read permission */
+
+int __cdecl _access(const char *pathname, int mode);
+
+int __cdecl _access(const char *pathname, int mode)
+{
+  DWORD attr = GetFileAttributesA(pathname);
+  if (attr == INVALID_FILE_ATTRIBUTES)
+    {
+      // Set `errno` accordingly.
+      switch (GetLastError())
+        {
+        case ERROR_FILE_NOT_FOUND:
+        case ERROR_PATH_NOT_FOUND:
+          errno = ENOENT;
+          break;
+        case ERROR_ACCESS_DENIED:
+          errno = EACCES;
+          break;
+        default:
+          errno = EINVAL;
+        }
+      return -1;
+    }
+  switch (mode)
+    {
+    case F_OK:
+    case R_OK:
+      // It is always existent and readable.
+      return 0;
+    case W_OK:
+      // Directories are always writeable.
+      if (attr & FILE_ATTRIBUTE_DIRECTORY)
+        return 0;
+      // Read-only files are not writeable.
+      if (attr & FILE_ATTRIBUTE_READONLY)
+        {
+          errno = EACCES;
+          return -1;
+        }
+      return 0;
+    case X_OK:
+      // On Windows all files are presumed to be executable.
+      // They can be opened in a command prompt without any arguments.
+      return 0;
+    default:
+      errno = EINVAL;
+      return -1;
+    }
+}
+
+int __cdecl (*__MINGW_IMP_SYMBOL(_access))(const char *, int) = _access;
+int __cdecl (*__MINGW_IMP_SYMBOL(access))(const char *, int) = _access;
+
-- 
2.7.4

_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to