Changeset: b3190f961601 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b3190f961601
Modified Files:
        gdk/gdk_posix.c
        gdk/gdk_private.h
        gdk/gdk_utils.c
Branch: Nov2019
Log Message:

Try not to confuse Windows and Unix error numbers.
Use GDKsyserror exclusively for errno-based errors, and introduce
GDKwinerror for errors obtained with GetLastError().
This should fix bug 6779.


diffs (138 lines):

diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -795,8 +795,7 @@ MT_mmap(const char *path, int mode, size
                (void) SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL);
                h1 = CreateFile(path, mode0, mode1, &sa, OPEN_ALWAYS, mode2, 
NULL);
                if (h1 == INVALID_HANDLE_VALUE) {
-                       errno = winerror(GetLastError());
-                       GDKsyserror("MT_mmap: CreateFile('%s', %lu, %lu, &sa, 
%lu, %lu, NULL) failed\n",
+                       GDKwinerror("MT_mmap: CreateFile('%s', %lu, %lu, &sa, 
%lu, %lu, NULL) failed\n",
                                    path, mode0, mode1, (DWORD) OPEN_ALWAYS, 
mode2);
                        return NULL;
                }
@@ -804,8 +803,7 @@ MT_mmap(const char *path, int mode, size
 
        h2 = CreateFileMapping(h1, &sa, mode3, (DWORD) (((__int64) len >> 32) & 
LL_CONSTANT(0xFFFFFFFF)), (DWORD) (len & LL_CONSTANT(0xFFFFFFFF)), NULL);
        if (h2 == NULL) {
-               errno = winerror(GetLastError());
-               GDKsyserror("MT_mmap: CreateFileMapping(%p, &sa, %lu, %lu, %lu, 
NULL) failed\n",
+               GDKwinerror("MT_mmap: CreateFileMapping(%p, &sa, %lu, %lu, %lu, 
NULL) failed\n",
                            h1, mode3,
                            (DWORD) (((__int64) len >> 32) & 
LL_CONSTANT(0xFFFFFFFF)),
                            (DWORD) (len & LL_CONSTANT(0xFFFFFFFF)));
@@ -832,8 +830,7 @@ MT_munmap(void *p, size_t dummy)
         * while Unix's   munmap          returns success==0, error==-1. */
        ret = UnmapViewOfFile(p);
        if (ret == 0) {
-               errno = winerror(GetLastError());
-               GDKsyserror("MT_munmap failed\n");
+               GDKwinerror("MT_munmap failed\n");
                return -1;
        }
        return 0;
@@ -882,8 +879,7 @@ MT_msync(void *p, size_t len)
         * while Unix's   munmap          returns success==0, error==-1. */
        ret = FlushViewOfFile(p, len);
        if (ret == 0) {
-               errno = winerror(GetLastError());
-               GDKsyserror("MT_msync: FlushViewOfFile failed\n");
+               GDKwinerror("MT_msync: FlushViewOfFile failed\n");
                return -1;
        }
        return 0;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -160,6 +160,11 @@ void BBPdump(void)         /* never called: for
        __attribute__((__visibility__("hidden")));
 __hidden gdk_return GDKunlink(int farmid, const char *dir, const char *nme, 
const char *extension)
        __attribute__((__visibility__("hidden")));
+#ifdef NATIVE_WIN32
+__hidden void GDKwinerror(_In_z_ _Printf_format_string_ const char *format, 
...)
+       __attribute__((__format__(__printf__, 1, 2)))
+       __attribute__((__visibility__("hidden")));
+#endif
 __hidden void HASHfree(BAT *b)
        __attribute__((__visibility__("hidden")));
 __hidden bool HASHgonebad(BAT *b, const void *v)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1177,23 +1177,12 @@ GDKsyserror(const char *format, ...)
        va_start(ap, format);
        vsnprintf(message + len, sizeof(message) - (len + 2), format, ap);
        va_end(ap);
-#ifndef NATIVE_WIN32
-       if (err > 0 && err < 1024)
-#endif
-       {
+       if (err > 0 && err < 1024) {
                size_t len1;
                size_t len2;
                size_t len3;
                char *osmsg;
-#ifdef NATIVE_WIN32
-               char osmsgbuf[256];
-               osmsg = osmsgbuf;
-               FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
-                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                             (LPTSTR) osmsgbuf, sizeof(osmsgbuf), NULL);
-#else
                osmsg = strerror(err);
-#endif
                len1 = strlen(message);
                len2 = len1 + strlen(GDKMESSAGE);
                len3 = len2 + strlen(osmsg);
@@ -1212,6 +1201,51 @@ GDKsyserror(const char *format, ...)
        errno = 0;
 }
 
+#ifdef NATIVE_WIN32
+void
+GDKwinerror(const char *format, ...)
+{
+       int err = GetLastError();
+       char message[GDKERRLEN];
+       size_t len = strlen(GDKERROR);
+       va_list ap;
+
+       if (strncmp(format, GDKERROR, len) == 0) {
+               len = 0;
+       } else {
+               strncpy(message, GDKERROR, sizeof(message));
+       }
+       va_start(ap, format);
+       vsnprintf(message + len, sizeof(message) - (len + 2), format, ap);
+       va_end(ap);
+
+       size_t len1;
+       size_t len2;
+       size_t len3;
+       char *osmsg;
+       char osmsgbuf[256];
+       osmsg = osmsgbuf;
+       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                     (LPTSTR) osmsgbuf, sizeof(osmsgbuf), NULL);
+       len1 = strlen(message);
+       len2 = len1 + strlen(GDKMESSAGE);
+       len3 = len2 + strlen(osmsg);
+
+       if (len3 + 2 < sizeof(message)) {
+               strcpy(message + len1, GDKMESSAGE);
+               strcpy(message + len2, osmsg);
+               if (len3 > 0 && message[len3 - 1] != '\n') {
+                       message[len3] = '\n';
+                       message[len3 + 1] = 0;
+               }
+       }
+       GDKaddbuf(message);
+
+       SetLastError(0);
+}
+#endif
+
 void
 GDKclrerr(void)
 {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to