aboutsummaryrefslogtreecommitdiff
path: root/src/include/port/win32.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/port/win32.h')
-rw-r--r--src/include/port/win32.h27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index f88ef11a548..ef515fd48b3 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.67 2007/01/22 18:32:57 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.68 2007/01/23 01:45:11 momjian Exp $ */
#if defined(_MSC_VER) || defined(__BORLANDC__)
#define WIN32_ONLY_COMPILER
@@ -140,13 +140,26 @@ int semop(int semId, struct sembuf * sops, int flag);
* Descriptions - http://www.comp.nus.edu.sg/~wuyongzh/my_doc/ntstatus.txt
* MS SDK - http://www.nologs.com/ntstatus.html
*
- * Some day we might want to print descriptions for the most common
- * exceptions, rather than printing a URL.
+ * Because FormatMessage only handles NT_ERROR strings, and assumes they
+ * do not have the 0xC prefix, we strip it to match this list:
+ * http://msdn2.microsoft.com/en-us/library/ms681381.aspx
+ *
+ * When using FormatMessage():
+ *
+ * On MinGW, system() returns STATUS_* values. MSVC might be
+ * different. To test, create a binary that does *(NULL), and
+ * then create a second binary that calls it via system(),
+ * and check the return value of system(). On MinGW, it is
+ * 0xC0000005 == STATUS_ACCESS_VIOLATION, and 0x5 is a value
+ * FormatMessage() can look up. GetLastError() does not work;
+ * always zero.
*/
-#define WIFEXITED(w) (((w) & 0XFFFFFF00) == 0)
-#define WIFSIGNALED(w) (!WIFEXITED(w))
-#define WEXITSTATUS(w) (w)
-#define WTERMSIG(w) (w)
+#define STATUS_ERROR_MASK 0xC0000000
+#define WIFEXITED(w) (((w) & 0XFFFFFF00) == 0)
+#define WIFSIGNALED(w) (!WIFEXITED(w))
+#define WEXITSTATUS(w) (w)
+#define WERRORCODE(w) ((((w) & STATUS_ERROR_MASK) == STATUS_ERROR_MASK) ? \
+ ((w) & ~STATUS_ERROR_MASK) : 0)
#define sigmask(sig) ( 1 << ((sig)-1) )