108 lines
3.1 KiB
Plaintext
108 lines
3.1 KiB
Plaintext
From: tismer at appliedbiometrics.com (Christian Tismer)
|
|
Date: Wed, 21 Apr 1999 10:51:24 GMT
|
|
Subject: WINNT/9X patch for errors.c
|
|
References: <371CF528.532DB5C@appliedbiometrics.com> <199904202239.SAA11014@eric.cnri.reston.va.us>
|
|
Message-ID: <371DADAC.AF549EC0@appliedbiometrics.com>
|
|
Content-Length: 2797
|
|
X-UID: 57
|
|
|
|
This is a patch to errors.c which gives the correct POSIX
|
|
error messages for WinNT/9X.
|
|
|
|
Reason: os.listdir("nonexistent") gave
|
|
OSError: [Errno 3] No such process
|
|
|
|
Problem caused by:
|
|
The standard function strerror is supposed to give an error message for
|
|
a system error. Under Windows, these are DOS messages, not POSIX.
|
|
They don't match completely.
|
|
|
|
Solution:
|
|
Instead of strerror, FormatMessage is used. This function
|
|
has an option to return standard system messages.
|
|
|
|
This will now give the correct message.
|
|
The messages are those which appear to be natural under
|
|
Windows: kernel32.dll defines them all in the default
|
|
language of your operating system
|
|
|
|
Guido van Rossum wrote:
|
|
>
|
|
> Christian,
|
|
>
|
|
> I just tried your code on Windows, and I noticed a missing feature.
|
|
> Python now adds the filename (when it is known) to the error message;
|
|
> your code doesn't do this.
|
|
|
|
Solved this, too. My code was ok, but the filename moved into
|
|
the next line. The returned message contains a CR/LF sequence
|
|
and also a dot. I'm removing this now, and it looks good.
|
|
|
|
ciao - chris
|
|
|
|
--
|
|
Christian Tismer :^) <mailto:tismer at appliedbiometrics.com>
|
|
Applied Biometrics GmbH : Have a break! Take a ride on Python's
|
|
Kaiserin-Augusta-Allee 101 : *Starship* http://starship.python.net
|
|
10553 Berlin : PGP key -> http://wwwkeys.pgp.net
|
|
PGP Fingerprint E182 71C7 1A9D 66E9 9D15 D3CC D4D7 93E2 1FAE F6DF
|
|
we're tired of banana software - shipped green, ripens at home
|
|
-------------- next part --------------
|
|
*** /w/orion/install/cvsroot/python/dist/src/python/errors.c Mon Dec 21 19:33:30 1998
|
|
--- /w/orion/install/python1.5/errors.c Wed Apr 21 12:13:40 1999
|
|
***************
|
|
*** 49,54 ****
|
|
--- 49,59 ----
|
|
#endif
|
|
#endif
|
|
|
|
+ #ifdef _WIN32
|
|
+ #include "windows.h"
|
|
+ #include "winbase.h"
|
|
+ #endif
|
|
+
|
|
void
|
|
PyErr_Restore(type, value, traceback)
|
|
PyObject *type;
|
|
***************
|
|
*** 291,297 ****
|
|
--- 296,319 ----
|
|
if (i == 0)
|
|
s = "Error"; /* Sometimes errno didn't get set */
|
|
else
|
|
+ #ifndef _WIN32
|
|
s = strerror(i);
|
|
+ #else
|
|
+ {
|
|
+ int len = FormatMessage(
|
|
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
+ FORMAT_MESSAGE_FROM_SYSTEM |
|
|
+ FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
+ NULL, // no message source
|
|
+ i,
|
|
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
+ (LPTSTR) &s,
|
|
+ 0, // size not used
|
|
+ NULL ); // no args
|
|
+ // remove trailing cr/lf and dots
|
|
+ while(len && s[len-1] <= '.') s[--len] = '\0' ;
|
|
+ }
|
|
+ #endif
|
|
if (filename != NULL && Py_UseClassExceptionsFlag)
|
|
v = Py_BuildValue("(iss)", i, s, filename);
|
|
else
|
|
***************
|
|
*** 300,305 ****
|
|
--- 322,330 ----
|
|
PyErr_SetObject(exc, v);
|
|
Py_DECREF(v);
|
|
}
|
|
+ #ifdef _WIN32
|
|
+ LocalFree(s);
|
|
+ #endif
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|