Changeset 3173 in kBuild for trunk/src/kmk/kmkbuiltin/redirect.c
- Timestamp:
- Mar 21, 2018 9:37:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/redirect.c
r3164 r3173 74 74 #include "kmkbuiltin.h" 75 75 #ifdef KMK 76 # include "job.h"77 # include "variable.h"78 76 # ifdef KBUILD_OS_WINDOWS 79 77 # ifndef CONFIG_NEW_WIN_CHILDREN … … 1161 1159 /* Windows is slightly complicated due to handles and winchildren.c. */ 1162 1160 HANDLE hProcess = INVALID_HANDLE_VALUE; 1163 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, pszCwd,1164 cOrders, paOrders, &hProcess);1161 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, 1162 pszSavedCwd ? pszCwd : NULL, cOrders, paOrders, &hProcess); 1165 1163 if (rcExit == 0) 1166 1164 { … … 1168 1166 if (process_kmk_register_redirect(hProcess, pPidSpawned) == 0) 1169 1167 # else 1170 if (MkWinChildCreateRedirect((intptr_t)hProcess, pPidSpawned) == 0) 1168 if ( pPidSpawned 1169 && MkWinChildCreateRedirect((intptr_t)hProcess, pPidSpawned) == 0) 1171 1170 # endif 1172 1171 { … … 1180 1179 warn("sub_proc is out of slots, waiting for child..."); 1181 1180 # else 1182 warn("MkWinChildCreateRedirect failed..."); 1181 if (pPidSpawned) 1182 warn("MkWinChildCreateRedirect failed..."); 1183 1183 # endif 1184 1184 dwTmp = WaitForSingleObject(hProcess, INFINITE); … … 1196 1196 1197 1197 CloseHandle(hProcess); 1198 *pPidSpawned = 0; 1198 if (pPidSpawned) 1199 *pPidSpawned = 0; 1199 1200 *pfIsChildExitCode = K_TRUE; 1200 1201 } … … 1234 1235 # ifdef KBUILD_OS_WINDOWS 1235 1236 HANDLE hProcess = INVALID_HANDLE_VALUE; 1236 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, pszCwd,1237 cOrders, paOrders, &hProcess);1237 rcExit = kRedirectCreateProcessWindows(pszExecutable, cArgs, papszArgs, papszEnvVars, 1238 pszSavedCwd ? pszCwd : NULL, cOrders, paOrders, &hProcess); 1238 1239 if (rcExit == 0) 1239 1240 { … … 1348 1349 char **papszEnvVars = NULL; 1349 1350 unsigned cAllocatedEnvVars; 1350 unsigned iEnvVar;1351 1351 unsigned cEnvVars; 1352 1352 int fWatcomBrainDamage = 0; … … 1378 1378 return err(9, "getcwd failed"); 1379 1379 1380 #if defined(KMK) 1381 /* We get it from kmk and just count it: */ 1382 papszEnvVars = pChild->environment; 1383 if (!papszEnvVars) 1384 pChild->environment = papszEnvVars = target_environment(pChild->file); 1380 /* We start out with a read-only enviornment from kmk or the crt, and will 1381 duplicate it if we make changes to it. */ 1382 cAllocatedEnvVars = 0; 1383 papszEnvVars = envp; 1385 1384 cEnvVars = 0; 1386 1385 while (papszEnvVars[cEnvVars] != NULL) 1387 1386 cEnvVars++; 1388 cAllocatedEnvVars = cEnvVars;1389 #else1390 /* We make a copy and we manage ourselves: */1391 cEnvVars = 0;1392 while (envp[cEnvVars] != NULL)1393 cEnvVars++;1394 1395 cAllocatedEnvVars = cEnvVars + 4;1396 papszEnvVars = malloc((cAllocatedEnvVars + 1) * sizeof(papszEnvVars));1397 if (!papszEnvVars)1398 return errx(9, "out of memory!");1399 1400 iEnvVar = cEnvVars;1401 papszEnvVars[iEnvVar] = NULL;1402 while (iEnvVar-- > 0)1403 {1404 papszEnvVars[iEnvVar] = strdup(envp[iEnvVar]);1405 if (!papszEnvVars[iEnvVar])1406 {1407 while (iEnvVar-- > 0)1408 free(papszEnvVars[iEnvVar]);1409 free(papszEnvVars);1410 return errx(9, "out of memory!");1411 }1412 }1413 #endif1414 1387 1415 1388 #ifdef USE_POSIX_SPAWN … … 1578 1551 { 1579 1552 if (pchEqual[1] != '\0') 1580 {1581 1553 rcExit = kBuiltinOptEnvSet(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1582 #ifdef KMK1583 pChild->environment = papszEnvVars;1584 #endif1585 }1586 1554 else 1587 1555 { … … 1590 1558 { 1591 1559 pszCopy[pchEqual - pszValue] = '\0'; 1592 rcExit = kBuiltinOptEnvUnset( papszEnvVars, &cEnvVars, cVerbosity, pszCopy);1560 rcExit = kBuiltinOptEnvUnset(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszCopy); 1593 1561 free(pszCopy); 1594 1562 } … … 1633 1601 else 1634 1602 #endif 1635 rcExit = kBuiltinOptEnvUnset( papszEnvVars, &cEnvVars, cVerbosity, pszValue);1603 rcExit = kBuiltinOptEnvUnset(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1636 1604 continue; 1637 1605 } … … 1643 1611 || chOpt == 'i' /* GNU env compatibility. */ ) 1644 1612 { 1645 for (iEnvVar = 0; iEnvVar < cEnvVars; iEnvVar++) 1646 free(papszEnvVars[iEnvVar]); 1647 papszEnvVars[0] = NULL; 1648 cEnvVars = 0; 1613 rcExit = kBuiltinOptEnvZap(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity); 1649 1614 continue; 1650 1615 } … … 1998 1963 * Cleanup. 1999 1964 */ 1965 kBuiltinOptEnvCleanup(&papszEnvVars, cEnvVars, &cAllocatedEnvVars); 2000 1966 if (pszSavedCwd) 2001 1967 free(pszSavedCwd); … … 2004 1970 posix_spawn_file_actions_destroy(&FileActions); 2005 1971 #endif 2006 #ifndef KMK2007 iEnvVar = cEnvVars;2008 while (iEnvVar-- > 0)2009 free(papszEnvVars[iEnvVar]);2010 free(papszEnvVars);2011 #endif2012 1972 #ifdef KBUILD_OS_OS2 2013 1973 for (ulLibPath = 0; ulLibPath < K_ELEMENTS(apszSavedLibPaths); ulLibPath++)
Note:
See TracChangeset
for help on using the changeset viewer.