This is the mail archive of the cygwin-developers@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

(patch) "%E" formatting for the humans



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  <khan@xraylith.wisc.edu>

	* 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;
 }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]