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