SF patch [ #455137 ] Makes popen work with COMMAND.COM on WNT, from

Brian Quinlan.
This commit is contained in:
Tim Peters 2001-08-27 06:37:48 +00:00
parent 7c47beb860
commit 402d5985d8
3 changed files with 26 additions and 9 deletions

View File

@ -317,6 +317,7 @@ Fran
John Popplewell John Popplewell
Amrit Prem Amrit Prem
Paul Prescod Paul Prescod
Brian Quinlan
Eric Raymond Eric Raymond
John Redford John Redford
Terry Reedy Terry Reedy

View File

@ -15,6 +15,9 @@ Tests
Windows Windows
+ The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC
points to command.com (patch from Brian Quinlan).
What's New in Python 2.2a2? What's New in Python 2.2a2?
=========================== ===========================

View File

@ -2403,13 +2403,23 @@ _PyPopenCreateProcess(char *cmdstring,
int x; int x;
if (i = GetEnvironmentVariable("COMSPEC",NULL,0)) { if (i = GetEnvironmentVariable("COMSPEC",NULL,0)) {
char *comshell;
s1 = (char *)_alloca(i); s1 = (char *)_alloca(i);
if (!(x = GetEnvironmentVariable("COMSPEC", s1, i))) if (!(x = GetEnvironmentVariable("COMSPEC", s1, i)))
return x; return x;
if (GetVersion() < 0x80000000) {
/* /* Explicitly check if we are using COMMAND.COM. If we are
* NT/2000 * then use the w9xpopen hack.
*/ */
comshell = s1 + x;
while (comshell >= s1 && *comshell != '\\')
--comshell;
++comshell;
if (GetVersion() < 0x80000000 &&
_stricmp(comshell, "command.com") != 0) {
/* NT/2000 and not using command.com. */
x = i + strlen(s3) + strlen(cmdstring) + 1; x = i + strlen(s3) + strlen(cmdstring) + 1;
s2 = (char *)_alloca(x); s2 = (char *)_alloca(x);
ZeroMemory(s2, x); ZeroMemory(s2, x);
@ -2417,8 +2427,8 @@ _PyPopenCreateProcess(char *cmdstring,
} }
else { else {
/* /*
* Oh gag, we're on Win9x. Use the workaround listed in * Oh gag, we're on Win9x or using COMMAND.COM. Use
* KB: Q150956 * the workaround listed in KB: Q150956
*/ */
char modulepath[_MAX_PATH]; char modulepath[_MAX_PATH];
struct stat statinfo; struct stat statinfo;
@ -2454,7 +2464,8 @@ _PyPopenCreateProcess(char *cmdstring,
if (stat(modulepath, &statinfo) != 0) { if (stat(modulepath, &statinfo) != 0) {
PyErr_Format(PyExc_RuntimeError, PyErr_Format(PyExc_RuntimeError,
"Can not locate '%s' which is needed " "Can not locate '%s' which is needed "
"for popen to work on this platform.", "for popen to work with your shell "
"or platform.",
szConsoleSpawn); szConsoleSpawn);
return FALSE; return FALSE;
} }
@ -2478,7 +2489,9 @@ _PyPopenCreateProcess(char *cmdstring,
/* Could be an else here to try cmd.exe / command.com in the path /* Could be an else here to try cmd.exe / command.com in the path
Now we'll just error out.. */ Now we'll just error out.. */
else { else {
PyErr_SetString(PyExc_RuntimeError, "Can not locate a COMSPEC environment variable to use as the shell"); PyErr_SetString(PyExc_RuntimeError,
"Cannot locate a COMSPEC environment variable to "
"use as the shell");
return FALSE; return FALSE;
} }
@ -2507,7 +2520,7 @@ _PyPopenCreateProcess(char *cmdstring,
*hProcess = piProcInfo.hProcess; *hProcess = piProcInfo.hProcess;
return TRUE; return TRUE;
} }
win32_error("CreateProcess", NULL); win32_error("CreateProcess", s2);
return FALSE; return FALSE;
} }