Mailing-List: contact cygwin-developers-help AT sourceware DOT cygnus DOT com; run by ezmlm Sender: cygwin-developers-owner AT sourceware DOT cygnus DOT com Delivered-To: mailing list cygwin-developers AT sourceware DOT cygnus DOT com Message-Id: <199905031744.MAA00299@modi.xraylith.wisc.edu> X-Authentication-Warning: modi.xraylith.wisc.edu: localhost.xraylith.wisc.edu [127.0.0.1] didn't use HELO protocol To: cygwin-developers AT sourceware DOT cygnus DOT com Subject: (patch) "%E" formatting for the humans Date: Mon, 03 May 1999 12:44:01 -0500 From: Mumit Khan This is a trivial, but useful change that tells you things like: dlopen: The specified module could not be found. instead of dlopen: Win32 error 127. Note the comment about the buffer size issue in __small_vsprintf. Anyone more familiar with how the various message buffers are allocated in winsup, please take a look. Mon May 3 11:32:32 1999 Mumit Khan * smallprint.c (__small_vsprintf): Properly format win32 error messages. * dlfcn.cc (set_dl_error): Lose the "Win32 ". Index: smallprint.c =================================================================== RCS file: /homes/khan/src/CVSROOT/cygwin-dev/winsup/smallprint.c,v retrieving revision 1.1.1.1 diff -u -3 -p -r1.1.1.1 smallprint.c --- smallprint.c 1999/05/03 15:22:19 1.1.1.1 +++ smallprint.c 1999/05/03 16:20:03 @@ -97,8 +97,40 @@ __small_vsprintf (char *dst, const char } break; case 'E': - strcpy (dst, "error "); - dst = rn (dst + 6, 10, 1, GetLastError (), len, pad); + { + /* + * NOTE: Currently there is no policy for how long the + * the buffers are, and looks like 256 is a smallest one + * (dlfcn.cc). Other than error 1395 (length 213) and + * error 1015 (length 249), the rest are all under 188 + * characters, and so I'll use 189 as the buffer length. + * For those longer error messages, we FormatMessage will + * return FALSE, and we'll get the old behaviour such as + * ``Win32 error 1395'' etc. + */ + const int bufferlen = 189; + const int errnum = GetLastError (); + if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + errnum, + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) dst, + bufferlen, + NULL)) + { + /* Get rid the trailing CR/NL pair. */ + int msglen = strlen (dst); + dst += msglen - 2; + } + else + { + /* Fallback in case buffer is too small or some other + error. */ + strcpy (dst, "Win32 error "); + dst = rn (dst + 6, 10, 1, GetLastError (), len, pad); + } + } break; case 'd': dst = rn (dst, 10, 1, va_arg (ap, int), len, pad); Index: dlfcn.cc =================================================================== RCS file: /homes/khan/src/CVSROOT/cygwin-dev/winsup/dlfcn.cc,v retrieving revision 1.1.1.1 diff -u -3 -p -r1.1.1.1 dlfcn.cc --- dlfcn.cc 1999/05/03 15:22:19 1.1.1.1 +++ dlfcn.cc 1999/05/03 16:29:57 @@ -27,7 +27,7 @@ static char _dl_buffer[256]; static void set_dl_error (const char *str) { - __small_sprintf (_dl_buffer, "%s: Win32 %E", str); + __small_sprintf (_dl_buffer, "%s: %E", str); _dl_error = 1; }