summaryrefslogtreecommitdiff
path: root/w32/subproc/w32err.c
blob: 7f68f5919a4ea1bf43a4623668c1960f9473cb5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* Error handling for Windows
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3 of the License, or (at your option) any later
version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <stdlib.h>
#include <windows.h>
#include "make.h"
#include "w32err.h"

/*
 * Description: the windows32 version of perror()
 *
 * Returns:  a pointer to a static error
 *
 * Notes/Dependencies:  I got this from
 *      comp.os.ms-windows.programmer.win32
 */
const char *
map_windows32_error_to_string (DWORD ercode) {
/*
 * We used to have an MSVC-specific `__declspec (thread)' qualifier
 * here, with the following comment:
 *
 * __declspec (thread) necessary if you will use multiple threads on MSVC
 *
 * However, Make was never multithreaded on Windows (except when
 * Ctrl-C is hit, in which case the main thread is stopped
 * immediately, so it doesn't matter in this context).  The functions
 * on sub_proc.c that started and stopped additional threads were
 * never used, and are now #ifdef'ed away.  Until we need more than
 * one thread, we have no problems with the following buffer being
 * static.  (If and when we do need it to be in thread-local storage,
 * the corresponding GCC qualifier is `__thread'.)
 */
    static char szMessageBuffer[128];
	/* Fill message buffer with a default message in
	 * case FormatMessage fails
	 */
    wsprintf (szMessageBuffer, "Error %ld\n", ercode);

	/*
	 *  Special code for winsock error handling.
	 */
	if (ercode > WSABASEERR) {
#if 0
		HMODULE hModule = GetModuleHandle("wsock32");
		if (hModule != NULL) {
			FormatMessage(FORMAT_MESSAGE_FROM_HMODULE,
				hModule,
				ercode,
				LANG_NEUTRAL,
				szMessageBuffer,
				sizeof(szMessageBuffer),
				NULL);
			FreeLibrary(hModule);
		}
#else
		fatal(NILF, szMessageBuffer);
#endif
	} else {
		/*
		 *  Default system message handling
		 */
    	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                  NULL,
                  ercode,
                  LANG_NEUTRAL,
                  szMessageBuffer,
                  sizeof(szMessageBuffer),
                  NULL);
	}
    return szMessageBuffer;
}