mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	SF patch [ #455137 ] Makes popen work with COMMAND.COM on WNT, from
Brian Quinlan.
This commit is contained in:
		
							parent
							
								
									7c47beb860
								
							
						
					
					
						commit
						402d5985d8
					
				
					 3 changed files with 26 additions and 9 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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,
 | 
				
			||||||
	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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue