(root)/
make-4.4/
src/
w32/
subproc/
w32err.c
       1  /* Error handling for Windows
       2  Copyright (C) 1996-2022 Free Software Foundation, Inc.
       3  This file is part of GNU Make.
       4  
       5  GNU Make is free software; you can redistribute it and/or modify it under the
       6  terms of the GNU General Public License as published by the Free Software
       7  Foundation; either version 3 of the License, or (at your option) any later
       8  version.
       9  
      10  GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
      11  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
      12  A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
      13  
      14  You should have received a copy of the GNU General Public License along with
      15  this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <stdlib.h>
      18  #include <windows.h>
      19  #include "makeint.h"
      20  #include "w32err.h"
      21  
      22  /*
      23   * Description: the windows32 version of perror()
      24   *
      25   * Returns:  a pointer to a static error
      26   *
      27   * Notes/Dependencies:  I got this from
      28   *      comp.os.ms-windows.programmer.win32
      29   */
      30  const char *
      31  map_windows32_error_to_string (DWORD ercode) {
      32  /*
      33   * We used to have an MSVC-specific '__declspec (thread)' qualifier
      34   * here, with the following comment:
      35   *
      36   * __declspec (thread) necessary if you will use multiple threads on MSVC
      37   *
      38   * However, Make was never multithreaded on Windows (except when
      39   * Ctrl-C is hit, in which case the main thread is stopped
      40   * immediately, so it doesn't matter in this context).  The functions
      41   * on sub_proc.c that started and stopped additional threads were
      42   * never used, and are now #ifdef'ed away.  Until we need more than
      43   * one thread, we have no problems with the following buffer being
      44   * static.  (If and when we do need it to be in thread-local storage,
      45   * the corresponding GCC qualifier is '__thread'.)
      46   */
      47      static char szMessageBuffer[128];
      48          /* Fill message buffer with a default message in
      49           * case FormatMessage fails
      50           */
      51      wsprintf (szMessageBuffer, "Error %ld\n", ercode);
      52  
      53          /*
      54           *  Special code for winsock error handling.
      55           */
      56          if (ercode > WSABASEERR) {
      57  #if 0
      58                  HMODULE hModule = GetModuleHandle("wsock32");
      59                  if (hModule != NULL) {
      60                          FormatMessage(FORMAT_MESSAGE_FROM_HMODULE,
      61                                  hModule,
      62                                  ercode,
      63                                  LANG_NEUTRAL,
      64                                  szMessageBuffer,
      65                                  sizeof(szMessageBuffer),
      66                                  NULL);
      67                          FreeLibrary(hModule);
      68                  }
      69  #else
      70                  O (fatal, NILF, szMessageBuffer);
      71  #endif
      72          } else {
      73                  /*
      74                   *  Default system message handling
      75                   */
      76                  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
      77                          NULL,
      78                          ercode,
      79                          LANG_NEUTRAL,
      80                          szMessageBuffer,
      81                          sizeof(szMessageBuffer),
      82                          NULL);
      83          }
      84      return szMessageBuffer;
      85  }