Kaydet (Commit) 402d5985 authored tarafından Tim Peters's avatar Tim Peters

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

Brian Quinlan.
üst 7c47beb8
...@@ -317,6 +317,7 @@ Fran ...@@ -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
......
...@@ -15,6 +15,9 @@ Tests ...@@ -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?
=========================== ===========================
......
...@@ -2403,13 +2403,23 @@ _PyPopenCreateProcess(char *cmdstring, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment