| /* Error handling for Windows | |
| Copyright (C) 1996-2025 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 <https://www.gnu.org/licenses/>. */ | |
| #include <stdlib.h> | |
| #include <windows.h> | |
| #include "makeint.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]; | |
| DWORD ret; | |
| /* Fill message buffer with a default message in | |
| * case FormatMessage fails | |
| */ | |
| wsprintf (szMessageBuffer, "Error %ld", ercode); | |
| /* | |
| * Special code for winsock error handling. | |
| */ | |
| if (ercode > WSABASEERR) { | |
| OS (fatal, NILF, "%s", szMessageBuffer); | |
| } | |
| /* | |
| * Default system message handling | |
| */ | |
| ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, | |
| NULL, | |
| ercode, | |
| LANG_NEUTRAL, | |
| szMessageBuffer, | |
| sizeof(szMessageBuffer), | |
| NULL); | |
| if (ret) | |
| { | |
| char *cp; | |
| for (cp = szMessageBuffer + ret - 1; cp >= szMessageBuffer; --cp) | |
| { | |
| if (*cp != '\r' && *cp != '\n') | |
| break; | |
| *cp = '\0'; | |
| } | |
| } | |
| return szMessageBuffer; | |
| } |