diff options
author | Tom Tromey <tromey@adacore.com> | 2022-07-20 12:46:08 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-08-16 08:04:37 -0600 |
commit | 02d04eac24f497e34ac9869bac5bfb1e044a6b62 (patch) | |
tree | 5dbf104d58fe1abec6fe1338fb823c78a443de06 /gdbsupport | |
parent | ec29a63c80602056bfc8533d230394d0db14b982 (diff) | |
download | gdb-02d04eac24f497e34ac9869bac5bfb1e044a6b62.zip gdb-02d04eac24f497e34ac9869bac5bfb1e044a6b62.tar.gz gdb-02d04eac24f497e34ac9869bac5bfb1e044a6b62.tar.bz2 |
Use strwinerror in gdb/windows-nat.c
When working on windows-nat.c, it's useful to see an error message in
addition to the error number given by GetLastError. This patch moves
strwinerror from gdbserver to gdbsupport, and then updates
windows-nat.c to use it. A couple of minor changes to strwinerror
(constify the return type and use the ARRAY_SIZE macro) are also
included.
Diffstat (limited to 'gdbsupport')
-rw-r--r-- | gdbsupport/errors.cc | 54 | ||||
-rw-r--r-- | gdbsupport/errors.h | 16 |
2 files changed, 70 insertions, 0 deletions
diff --git a/gdbsupport/errors.cc b/gdbsupport/errors.cc index 703b221..b98d015 100644 --- a/gdbsupport/errors.cc +++ b/gdbsupport/errors.cc @@ -19,6 +19,9 @@ #include "common-defs.h" #include "errors.h" +#ifdef USE_WIN32API +#include <windows.h> +#endif /* USE_WIN32API */ /* See gdbsupport/errors.h. */ @@ -67,3 +70,54 @@ internal_warning (const char *file, int line, const char *fmt, ...) internal_vwarning (file, line, fmt, ap); va_end (ap); } + +#ifdef USE_WIN32API + +/* See errors.h. */ + +const char * +strwinerror (ULONGEST error) +{ + static char buf[1024]; + TCHAR *msgbuf; + DWORD lasterr = GetLastError (); + DWORD chars = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPTSTR) &msgbuf, + 0, + NULL); + if (chars != 0) + { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' + && msgbuf[chars - 1] == '\n') + { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > ARRAY_SIZE (buf) - 1) + { + chars = ARRAY_SIZE (buf) - 1; + msgbuf [chars] = 0; + } + +#ifdef UNICODE + wcstombs (buf, msgbuf, chars + 1); +#else + strncpy (buf, msgbuf, chars + 1); +#endif + LocalFree (msgbuf); + } + else + sprintf (buf, "unknown win32 error (%u)", (unsigned) error); + + SetLastError (lasterr); + return buf; +} + +#endif /* USE_WIN32API */ diff --git a/gdbsupport/errors.h b/gdbsupport/errors.h index 47965ea..9a671d3 100644 --- a/gdbsupport/errors.h +++ b/gdbsupport/errors.h @@ -91,4 +91,20 @@ extern void malloc_failure (long size) ATTRIBUTE_NORETURN; extern void flush_streams (); +#ifdef USE_WIN32API + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +extern const char *strwinerror (ULONGEST error); + +#endif /* USE_WIN32API */ + #endif /* COMMON_ERRORS_H */ |