Changeset 3029 in kBuild
- Timestamp:
- Apr 13, 2017 1:32:42 PM (8 years ago)
- Location:
- trunk/src/kmk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/Makefile.am
r2723 r3029 57 57 ../lib/md5.c \ 58 58 ../lib/kDep.c \ 59 ../lib/kbuild_version.c \ 60 ../lib/maybe_con_fwrite.c \ 59 61 \ 60 62 kmkbuiltin.c \ … … 76 78 kmkbuiltin/mv.c \ 77 79 kmkbuiltin/printf.c \ 80 kmkbuiltin/redirect.c \ 78 81 kmkbuiltin/rm.c \ 79 82 kmkbuiltin/rmdir.c \ … … 87 90 kmkbuiltin/osdep.c \ 88 91 kmkbuiltin/kbuild_protection.c \ 89 kmkbuiltin/kbuild_version.c 90 91 kmk_redirect_SOURCES = kmkbuiltin/redirect.c 92 kmkbuiltin/common-env-and-cwd-opt.c 93 94 kmk_redirect_SOURCES = kmkbuiltin/redirect.c \ 95 kmkbuiltin/common-env-and-cwd-opt.c \ 96 kmkbuiltin/err.c \ 97 ../lib/kbuild_version.c 98 kmk_redirect_CFLAGS = -UKMK 99 92 100 93 101 EXTRA_kmk_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c … … 172 180 @DEFS@ 173 181 174 AM_CPPFLAGS = $(GLOBINC) -I$(srcdir)/../lib 182 AM_CPPFLAGS = $(GLOBINC) -I$(srcdir)/../lib -I$(srcdir)/../lib/kStuff/include 175 183 # Only process if target is MS-Windows 176 184 if WINDOWSENV -
trunk/src/kmk/kmkbuiltin/redirect.c
r2916 r3029 27 27 * Header Files * 28 28 *******************************************************************************/ 29 #if def __APPLE__30 # define _POSIX_C_SOURCE 1 /* 10.4 sdk and unsetenv*/29 #if defined(__APPLE__) 30 /*# define _POSIX_C_SOURCE 1 / * 10.4 sdk and unsetenv * / - breaks O_CLOEXEC on 10.8 */ 31 31 #endif 32 32 #include "make.h" … … 90 90 #endif /* _MSC_VER */ 91 91 92 92 #if 0 /* unused */ 93 93 /** 94 94 * Safely works around MS CRT's pedantic close() function. … … 107 107 #endif 108 108 } 109 #endif /* unused */ 109 110 110 111 … … 176 177 kRedirectOrder_Close, 177 178 kRedirectOrder_Open, 178 kRedirectOrder_Dup ,179 kRedirectOrder_Dup 179 180 } enmOrder; 180 181 /** The target file handle. */ … … 386 387 #endif 387 388 int aFdTries[32]; 388 intcTries;389 unsigned cTries; 389 390 int fdOpened; 390 391 … … 456 457 return -1; 457 458 } 459 460 461 /** 462 * Cleans up the file operation orders. 463 * 464 * This does not restore stuff, just closes handles we've opened for the child. 465 * 466 * @param cOrders Number of file operation orders. 467 * @param paOrders The file operation orders. 468 * @param fFailed Set if it's a failure. 469 */ 470 static void kRedirectCleanupFdOrders(unsigned cOrders, REDIRECTORDERS *paOrders, KBOOL fFailure) 471 { 472 unsigned i = cOrders; 473 while (i-- > 0) 474 { 475 if ( paOrders[i].enmOrder == kRedirectOrder_Open 476 && paOrders[i].fdSource != -1) 477 { 478 close(paOrders[i].fdSource); 479 paOrders[i].fdSource = -1; 480 if ( fFailure 481 && paOrders[i].fRemoveOnFailure 482 && paOrders[i].pszFilename) 483 remove(paOrders[i].pszFilename); 484 } 485 } 486 } 487 458 488 459 489 #ifndef USE_POSIX_SPAWN … … 574 604 575 605 /** 576 * Cleans up the file operation orders.577 *578 * This does not restore stuff, just closes handles we've opened for the guest.579 *580 * @param cOrders Number of file operation orders.581 * @param paOrders The file operation orders.582 * @param fFailed Set if it's a failure.583 */584 static void kRedirectCleanupFdOrders(unsigned cOrders, REDIRECTORDERS *paOrders, KBOOL fFailure)585 {586 unsigned i = cOrders;587 while (i-- > 0)588 {589 if ( paOrders[i].enmOrder == kRedirectOrder_Open590 && paOrders[i].fdSource != -1)591 {592 close(paOrders[i].fdSource);593 paOrders[i].fdSource = -1;594 if ( fFailure595 && paOrders[i].fRemoveOnFailure596 && paOrders[i].pszFilename)597 remove(paOrders[i].pszFilename);598 }599 }600 }601 602 603 /**604 606 * Restores the target file descriptors affected by the file operation orders. 605 607 * … … 763 765 * @param fWatcomBrainDamage Whether MSC need to do quoting according to 764 766 * weird Watcom WCC rules. 765 * @param papszEnv 767 * @param papszEnvVars The child environment vector. 766 768 * @param pszCwd The current working directory of the child. 767 769 * @param pszSavedCwd The saved current working directory. This is … … 777 779 * is from the child or from our setup efforts. 778 780 */ 779 static int kRedirectDoSpawn(const char *pszExecutable, int cArgs, char **papszArgs, int fWatcomBrainDamage, char **papszEnv ,781 static int kRedirectDoSpawn(const char *pszExecutable, int cArgs, char **papszArgs, int fWatcomBrainDamage, char **papszEnvVars, 780 782 const char *pszCwd, const char *pszSavedCwd, unsigned cOrders, REDIRECTORDERS *paOrders, 781 783 #ifdef USE_POSIX_SPAWN … … 863 865 #if defined(KBUILD_OS_WINDOWS) 864 866 /* Windows is slightly complicated due to handles and sub_proc.c. */ 865 HANDLE hProcess = (HANDLE)_spawnvpe(_P_NOWAIT, pszExecutable, papszArgs, papszEnv );867 HANDLE hProcess = (HANDLE)_spawnvpe(_P_NOWAIT, pszExecutable, papszArgs, papszEnvVars); 866 868 kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr); 867 869 if ((intptr_t)hProcess != -1) … … 898 900 899 901 # elif defined(KBUILD_OS_OS2) 900 *pPidSpawned = _spawnve(_P_NOWAIT, pszExecutable, papszArgs, papszEnv );902 *pPidSpawned = _spawnve(_P_NOWAIT, pszExecutable, papszArgs, papszEnvVars); 901 903 kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr); 902 904 if (*pPidSpawned != -1) … … 930 932 # if defined(KBUILD_OS_WINDOWS) || defined(KBUILD_OS_OS2) 931 933 errno = 0; 932 rcExit = (int)_spawnvpe(_P_WAIT, pszExecutable, papszArgs, papszEnv );934 rcExit = (int)_spawnvpe(_P_WAIT, pszExecutable, papszArgs, papszEnvVars); 933 935 kRedirectRestoreFdOrders(cOrders, paOrders, &pWorkingStdErr); 934 936 if (rcExit != -1 || errno == 0) … … 1023 1025 int iArg; 1024 1026 const char *pszExecutable = NULL; 1025 char **papszEnv 1027 char **papszEnvVars = NULL; 1026 1028 unsigned cAllocatedEnvVars; 1027 1029 unsigned iEnvVar; … … 1057 1059 #if defined(KMK) 1058 1060 /* We get it from kmk and just count it: */ 1059 papszEnv = pChild->environment;1060 if (!papszEnv )1061 pChild->environment = papszEnv = target_environment(pChild->file);1061 papszEnvVars = pChild->environment; 1062 if (!papszEnvVars) 1063 pChild->environment = papszEnvVars = target_environment(pChild->file); 1062 1064 cEnvVars = 0; 1063 while (papszEnv [cEnvVars] != NULL)1065 while (papszEnvVars[cEnvVars] != NULL) 1064 1066 cEnvVars++; 1065 1067 cAllocatedEnvVars = cEnvVars; … … 1071 1073 1072 1074 cAllocatedEnvVars = cEnvVars + 4; 1073 papszEnv = malloc((cAllocatedEnvVars + 1) * sizeof(papszEnv));1074 if (!papszEnv )1075 papszEnvVars = malloc((cAllocatedEnvVars + 1) * sizeof(papszEnvVars)); 1076 if (!papszEnvVars) 1075 1077 return errx(9, "out of memory!"); 1076 1078 1077 1079 iEnvVar = cEnvVars; 1078 papszEnv [iEnvVar] = NULL;1080 papszEnvVars[iEnvVar] = NULL; 1079 1081 while (iEnvVar-- > 0) 1080 1082 { 1081 papszEnv [iEnvVar] = strdup(envp[iEnvVar]);1082 if (!papszEnv [iEnvVar])1083 papszEnvVars[iEnvVar] = strdup(envp[iEnvVar]); 1084 if (!papszEnvVars[iEnvVar]) 1083 1085 { 1084 1086 while (iEnvVar-- > 0) 1085 free(papszEnv [iEnvVar]);1086 free(papszEnv );1087 free(papszEnvVars[iEnvVar]); 1088 free(papszEnvVars); 1087 1089 return errx(9, "out of memory!"); 1088 1090 } … … 1245 1247 if (pchEqual[1] != '\0') 1246 1248 { 1247 rcExit = kBuiltinOptEnvSet(&papszEnv , &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue);1249 rcExit = kBuiltinOptEnvSet(&papszEnvVars, &cEnvVars, &cAllocatedEnvVars, cVerbosity, pszValue); 1248 1250 #ifdef KMK 1249 pChild->environment = papszEnv ;1251 pChild->environment = papszEnvVars; 1250 1252 #endif 1251 1253 } … … 1256 1258 { 1257 1259 pszCopy[pchEqual - pszValue] = '\0'; 1258 rcExit = kBuiltinOptEnvUnset(papszEnv , &cEnvVars, cVerbosity, pszCopy);1260 rcExit = kBuiltinOptEnvUnset(papszEnvVars, &cEnvVars, cVerbosity, pszCopy); 1259 1261 free(pszCopy); 1260 1262 } … … 1280 1282 else 1281 1283 #endif 1282 rcExit = kBuiltinOptEnvUnset(papszEnv , &cEnvVars, cVerbosity, pszValue);1284 rcExit = kBuiltinOptEnvUnset(papszEnvVars, &cEnvVars, cVerbosity, pszValue); 1283 1285 continue; 1284 1286 } … … 1291 1293 { 1292 1294 for (iEnvVar = 0; iEnvVar < cEnvVars; iEnvVar++) 1293 free(papszEnv [iEnvVar]);1294 papszEnv [0] = NULL;1295 free(papszEnvVars[iEnvVar]); 1296 papszEnvVars[0] = NULL; 1295 1297 cEnvVars = 0; 1296 1298 continue; … … 1577 1579 1578 1580 #ifdef USE_POSIX_SPAWN 1579 if (fdOpened != fd Source)1581 if (fdOpened != fd) 1580 1582 { 1581 1583 rcExit = posix_spawn_file_actions_adddup2(&FileActions, fdOpened, fd); … … 1607 1609 * Do the spawning in a separate function (main is far to large as it is by now). 1608 1610 */ 1609 rcExit = kRedirectDoSpawn(pszExecutable, argc - iArg, &argv[iArg], fWatcomBrainDamage, papszEnv , szCwd, pszSavedCwd,1611 rcExit = kRedirectDoSpawn(pszExecutable, argc - iArg, &argv[iArg], fWatcomBrainDamage, papszEnvVars, szCwd, pszSavedCwd, 1610 1612 #ifdef USE_POSIX_SPAWN 1611 1613 cOrders, aOrders, &FileActions, cVerbosity, … … 1639 1641 iEnvVar = cEnvVars; 1640 1642 while (iEnvVar-- > 0) 1641 free(papszEnv [iEnvVar]);1642 free(papszEnv );1643 free(papszEnvVars[iEnvVar]); 1644 free(papszEnvVars); 1643 1645 #endif 1644 1646 #ifdef KBUILD_OS_OS2
Note:
See TracChangeset
for help on using the changeset viewer.